package com.paymentlink.controller.api; import com.paymentlink.model.entity.ExchangeRate; import com.paymentlink.service.CurrencyService; 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; import java.util.Set; @RestController @RequestMapping("/api/currency") public class CurrencyApiController { private final CurrencyService currencyService; public CurrencyApiController(CurrencyService currencyService) { this.currencyService = currencyService; } /** * GET /api/currency/rates - Get all current exchange rates */ @GetMapping("/rates") public ResponseEntity> getExchangeRates() { try { List rates = currencyService.getAllRates(); Map response = new HashMap<>(); response.put("success", true); response.put("rates", rates); response.put("total", rates.size()); return ResponseEntity.ok(response); } catch (Exception e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } } /** * GET /api/currency/convert - Convert an amount between currencies */ @GetMapping("/convert") public ResponseEntity> convertCurrency( @RequestParam Long amount, @RequestParam String from, @RequestParam String to) { try { Long converted = currencyService.convertPrice(amount, from, to); Double rate = currencyService.getRate(from, to); Map response = new HashMap<>(); response.put("success", true); response.put("fromAmount", amount); response.put("fromCurrency", from); response.put("toAmount", converted); response.put("toCurrency", to); response.put("rate", rate); return ResponseEntity.ok(response); } catch (Exception e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } } /** * GET /api/currency/supported - Get list of supported currencies */ @GetMapping("/supported") public ResponseEntity> getSupportedCurrencies() { try { Set currencies = currencyService.getSupportedCurrencies(); Map response = new HashMap<>(); response.put("success", true); response.put("currencies", currencies); response.put("total", currencies.size()); return ResponseEntity.ok(response); } catch (Exception e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } } /** * POST /api/admin/currency/refresh - Manually trigger exchange rate refresh */ @PostMapping("/admin/refresh") public ResponseEntity> refreshRates() { try { currencyService.manualRefresh(); Map response = new HashMap<>(); response.put("success", true); response.put("message", "Exchange rates refreshed successfully"); return ResponseEntity.ok(response); } catch (IllegalStateException e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.CONFLICT).body(error); } catch (Exception e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } } /** * GET /api/currency/rate/{from}/{to} - Get specific exchange rate */ @GetMapping("/rate/{from}/{to}") public ResponseEntity> getSpecificRate( @PathVariable String from, @PathVariable String to) { try { Double rate = currencyService.getRate(from, to); Map response = new HashMap<>(); response.put("success", true); response.put("fromCurrency", from); response.put("toCurrency", to); response.put("rate", rate); return ResponseEntity.ok(response); } catch (Exception e) { Map error = new HashMap<>(); error.put("success", false); error.put("error", e.getMessage()); return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(error); } } }