1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package de.kaiserpfalzedv.services.sms77.client;
19
20 import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
21
22 import java.util.Set;
23
24 import org.springframework.cloud.openfeign.FeignClient;
25 import org.springframework.web.bind.annotation.GetMapping;
26 import org.springframework.web.bind.annotation.PostMapping;
27 import org.springframework.web.bind.annotation.RequestParam;
28
29 import de.kaiserpfalzedv.services.sms77.model.Balance;
30 import de.kaiserpfalzedv.services.sms77.model.NumberFormatCheckResult;
31 import de.kaiserpfalzedv.services.sms77.model.Sms;
32 import de.kaiserpfalzedv.services.sms77.model.SmsResult;
33 import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
34 import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
35 import io.github.resilience4j.retry.annotation.Retry;
36 import io.micrometer.core.annotation.Counted;
37 import io.micrometer.core.annotation.Timed;
38 import jakarta.validation.constraints.NotBlank;
39 import jakarta.validation.constraints.NotNull;
40 import jakarta.validation.constraints.Size;
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 @FeignClient(name = "sms77", configuration = Sms77ClientConfig.class, path = "/api")
67 @SuppressWarnings("JavadocLinkAsPlainText")
68 @RateLimiter(name = "sms77client")
69 public interface Sms77Client {
70
71
72
73
74
75
76 @Timed("sms77.send-sms-json.time")
77 @Counted("sms77.send-sms-json.count")
78 @Retry(name = "sendSMS")
79 @CircuitBreaker(name = "sendSMS")
80 @PostMapping(value = "/sms", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
81 SmsResult sendSMS(@NotNull final Sms sms);
82
83
84
85
86
87
88
89
90 @Timed("sms77.send-sms-query.time")
91 @Counted("sms77.send-sms-query.count")
92 @Retry(name = "sendSMS")
93 @CircuitBreaker(name = "sendSMS")
94 @PostMapping(value = "/sms", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
95 SmsResult sendSMS(
96 @Size(min = 1, max = 10) @RequestParam("to") @NotNull final Set<String> number,
97
98 @Size(max = 1520) @RequestParam("text") @NotNull final String text);
99
100
101
102
103
104
105
106 @Timed("sms77.balance.time")
107 @Counted("sms77.balance.count")
108 @Retry(name = "balanceSMS")
109 @CircuitBreaker(name = "balanceSMS")
110 @GetMapping(value = "/balance", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
111 Balance balance();
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135 @Timed("sms77.number-format-check.multi.time")
136 @Counted("sms77.number-format-check.multi.count")
137 @Retry(name = "lookupSMS")
138 @CircuitBreaker(name = "lookupSMS")
139 @GetMapping(value = "/lookup", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
140 Set<NumberFormatCheckResult> checkMultipleNumberFormats(
141 @RequestParam("number") @NotBlank final String numbersWithComma);
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157 @Timed("sms77.number-format-check.multi.time")
158 @Counted("sms77.number-format-check.multi.count")
159 @Retry(name = "checkNumberFormatSMS")
160 @CircuitBreaker(name = "checkNumberFormatSMS")
161 @GetMapping(value = "/lookup", consumes = APPLICATION_JSON_VALUE, produces = APPLICATION_JSON_VALUE)
162 NumberFormatCheckResult checkNumberFormat(@RequestParam("number") @NotBlank final String number);
163 }