package com.paymentlink.controller.api; import com.paymentlink.service.FlagService; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.HashMap; import java.util.List; import java.util.Map; /** * REST API for country flags */ @RestController @RequestMapping("/api/flags") public class FlagApiController { private final FlagService flagService; public FlagApiController(FlagService flagService) { this.flagService = flagService; } /** * Get flag for a specific country * * GET /api/flags/{countryCode} * Example: /api/flags/US, /api/flags/TR * * @param countryCode ISO 3166-1 alpha-2 country code * @return Flag as base64 data URL */ @GetMapping("/{countryCode}") public ResponseEntity> getFlag( @PathVariable String countryCode) { String flag = flagService.getFlag(countryCode); Map response = new HashMap<>(); if (flag != null) { response.put("success", true); response.put("countryCode", countryCode.toUpperCase()); response.put("flag", flag); response.put("type", "image"); return ResponseEntity.ok(response); } else { response.put("success", false); response.put("countryCode", countryCode.toUpperCase()); response.put("flag", flagService.getFallbackIcon()); response.put("type", "svg"); response.put("message", "Flag not found, returning fallback icon"); return ResponseEntity.ok(response); } } /** * Get multiple flags at once * * POST /api/flags/batch * Body: { "countryCodes": ["US", "GB", "TR"] } * * @param request Request containing list of country codes * @return Map of country codes to flags */ @PostMapping("/batch") public ResponseEntity> getFlags( @RequestBody BatchFlagRequest request) { Map flags = new HashMap<>(); for (String code : request.countryCodes()) { String flag = flagService.getFlag(code); if (flag != null) { flags.put(code.toUpperCase(), flag); } else { flags.put(code.toUpperCase(), flagService.getFallbackIcon()); } } Map response = new HashMap<>(); response.put("success", true); response.put("count", flags.size()); response.put("flags", flags); return ResponseEntity.ok(response); } /** * Get cache statistics * * GET /api/flags/stats */ @GetMapping("/stats") public ResponseEntity> getCacheStats() { FlagService.CacheStats stats = flagService.getCacheStats(); Map response = new HashMap<>(); response.put("success", true); response.put("cache", Map.of( "memorySize", stats.memorySize(), "diskFiles", stats.diskFiles(), "hitCount", stats.hitCount(), "missCount", stats.missCount(), "hitRate", stats.hitCount() + stats.missCount() > 0 ? (double) stats.hitCount() / (stats.hitCount() + stats.missCount()) : 0.0 )); return ResponseEntity.ok(response); } /** * Clear flag cache (admin only) * * DELETE /api/flags/cache */ @DeleteMapping("/cache") public ResponseEntity> clearCache() { flagService.clearCache(); Map response = new HashMap<>(); response.put("success", true); response.put("message", "Flag cache cleared successfully"); return ResponseEntity.ok(response); } /** * Prefetch flags for common countries * * POST /api/flags/prefetch */ @PostMapping("/prefetch") public ResponseEntity> prefetchFlags( @RequestBody(required = false) BatchFlagRequest request) { String[] codes; if (request != null && request.countryCodes() != null) { codes = request.countryCodes().toArray(new String[0]); } else { // Default popular countries codes = new String[]{"US", "GB", "CA", "AU", "DE", "FR", "IT", "ES", "BR", "MX", "JP", "CN", "IN", "TR", "RU", "KR"}; } flagService.prefetchFlags(codes); Map response = new HashMap<>(); response.put("success", true); response.put("message", "Prefetched " + codes.length + " flags"); response.put("countryCodes", codes); return ResponseEntity.ok(response); } public record BatchFlagRequest(List countryCodes) {} }