Commit: e6d1548

Commit Details

SHAe6d1548c463d8763fb5547ff07a35c521f15c296
Tree2d2b62527861022ccf13eb205ea2bf7c0e4013fd
Author<f69e50@finnacloud.com> 1766442769 +0300
Committer<f69e50@finnacloud.com> 1766442769 +0300
Message
add initial test workflow file
GPG Signature
-----BEGIN PGP SIGNATURE-----

iQJSBAABCAA8FiEEWJb139mJI+vZ81KkoAIVSUsXI0oFAmlJxxEeHHNvcGhpYS5l
cmFzbGFuQGZpbm5hY2xvdWQuY29tAAoJEKACFUlLFyNKb7YP/2QctdaPuHu4+vFn
fh0Opgqt1brKy9JQxV9JZ9tF5XA+rWVi6pyIZK4lywX+a4er+h29sQY7TEHZt9Xn
meAyRUhPbRPmIpRJMMCgstfILUpjNMkMcPE80kJfpp6+ZmLtO8vC4TnW3ATCK1tv
XISV00T4ajCAhZUmYTveNsvSiMMv/Tq4sF9Is4ix+JN7O/lSLseRtuUE1Vv7T7nY
citxLPwR42Eb/1CYhy0JbRYXP816cbe6dGeDeiDZp7EHKx5D8VAqULKRsAL19tSX
hup8N7owBXieuzNQ4RyaDfDJAfNoN3o9pFeD6vQPq8s7x6AloN625g58p0ssxfK+
CGhR0YHR7atR0pEens22p7g2dVJ7NsrKqDBE3TTeUOpfXfjOwqpVh1Bn/v7a2Vg9
o9mhIClSOLfYv2SXJ06+fn8l6oc70nLJkBfcTevmeF//Z9yGH7TXZNUcedxuBbFg
xfEHeJibTamiE3Z1SfHW1YLwe7QqbBogCIxq4RrpYtN15a65vT5HxyLHDJDGG20V
7z34QJhKXIni/AIGscZqx2kE/C42KSD2fBvqvA4YnPwEUQyMvnSSDSKuJ6flXPTv
RsPZMdNsWWWyJ8P/NTo0Y/PPwA/28p9pX064H2lHFNvSEzUYJdKyQXNV3pGWYAvc
PR8Z+nHfbK/EF5jOVJ8+erXzzXUN
=COmA
-----END PGP SIGNATURE-----

✓ Verified

File: src/main/java/com/paymentlink/controller/api/FlagApiController.java

1 package com.paymentlink.controller.api;
2
3 import com.paymentlink.service.FlagService;
4 import org.springframework.http.HttpStatus;
5 import org.springframework.http.ResponseEntity;
6 import org.springframework.web.bind.annotation.*;
7
8 import java.util.HashMap;
9 import java.util.List;
10 import java.util.Map;
11
12 /**
13 * REST API for country flags
14 */
15 @RestController
16 @RequestMapping("/api/flags")
17 public class FlagApiController {
18
19 private final FlagService flagService;
20
21 public FlagApiController(FlagService flagService) {
22 this.flagService = flagService;
23 }
24
25 /**
26 * Get flag for a specific country
27 *
28 * GET /api/flags/{countryCode}
29 * Example: /api/flags/US, /api/flags/TR
30 *
31 * @param countryCode ISO 3166-1 alpha-2 country code
32 * @return Flag as base64 data URL
33 */
34 @GetMapping("/{countryCode}")
35 public ResponseEntity<Map<String, Object>> getFlag(
36 @PathVariable String countryCode) {
37
38 String flag = flagService.getFlag(countryCode);
39
40 Map<String, Object> response = new HashMap<>();
41
42 if (flag != null) {
43 response.put("success", true);
44 response.put("countryCode", countryCode.toUpperCase());
45 response.put("flag", flag);
46 response.put("type", "image");
47 return ResponseEntity.ok(response);
48 } else {
49 response.put("success", false);
50 response.put("countryCode", countryCode.toUpperCase());
51 response.put("flag", flagService.getFallbackIcon());
52 response.put("type", "svg");
53 response.put("message", "Flag not found, returning fallback icon");
54 return ResponseEntity.ok(response);
55 }
56 }
57
58 /**
59 * Get multiple flags at once
60 *
61 * POST /api/flags/batch
62 * Body: { "countryCodes": ["US", "GB", "TR"] }
63 *
64 * @param request Request containing list of country codes
65 * @return Map of country codes to flags
66 */
67 @PostMapping("/batch")
68 public ResponseEntity<Map<String, Object>> getFlags(
69 @RequestBody BatchFlagRequest request) {
70
71 Map<String, String> flags = new HashMap<>();
72
73 for (String code : request.countryCodes()) {
74 String flag = flagService.getFlag(code);
75 if (flag != null) {
76 flags.put(code.toUpperCase(), flag);
77 } else {
78 flags.put(code.toUpperCase(), flagService.getFallbackIcon());
79 }
80 }
81
82 Map<String, Object> response = new HashMap<>();
83 response.put("success", true);
84 response.put("count", flags.size());
85 response.put("flags", flags);
86
87 return ResponseEntity.ok(response);
88 }
89
90 /**
91 * Get cache statistics
92 *
93 * GET /api/flags/stats
94 */
95 @GetMapping("/stats")
96 public ResponseEntity<Map<String, Object>> getCacheStats() {
97 FlagService.CacheStats stats = flagService.getCacheStats();
98
99 Map<String, Object> response = new HashMap<>();
100 response.put("success", true);
101 response.put("cache", Map.of(
102 "memorySize", stats.memorySize(),
103 "diskFiles", stats.diskFiles(),
104 "hitCount", stats.hitCount(),
105 "missCount", stats.missCount(),
106 "hitRate", stats.hitCount() + stats.missCount() > 0
107 ? (double) stats.hitCount() / (stats.hitCount() + stats.missCount())
108 : 0.0
109 ));
110
111 return ResponseEntity.ok(response);
112 }
113
114 /**
115 * Clear flag cache (admin only)
116 *
117 * DELETE /api/flags/cache
118 */
119 @DeleteMapping("/cache")
120 public ResponseEntity<Map<String, Object>> clearCache() {
121 flagService.clearCache();
122
123 Map<String, Object> response = new HashMap<>();
124 response.put("success", true);
125 response.put("message", "Flag cache cleared successfully");
126
127 return ResponseEntity.ok(response);
128 }
129
130 /**
131 * Prefetch flags for common countries
132 *
133 * POST /api/flags/prefetch
134 */
135 @PostMapping("/prefetch")
136 public ResponseEntity<Map<String, Object>> prefetchFlags(
137 @RequestBody(required = false) BatchFlagRequest request) {
138
139 String[] codes;
140 if (request != null && request.countryCodes() != null) {
141 codes = request.countryCodes().toArray(new String[0]);
142 } else {
143 // Default popular countries
144 codes = new String[]{"US", "GB", "CA", "AU", "DE", "FR", "IT", "ES",
145 "BR", "MX", "JP", "CN", "IN", "TR", "RU", "KR"};
146 }
147
148 flagService.prefetchFlags(codes);
149
150 Map<String, Object> response = new HashMap<>();
151 response.put("success", true);
152 response.put("message", "Prefetched " + codes.length + " flags");
153 response.put("countryCodes", codes);
154
155 return ResponseEntity.ok(response);
156 }
157
158 public record BatchFlagRequest(List<String> countryCodes) {}
159 }
160