Commit: 4617f76

Commit Details

SHA4617f76246bf039920879ae5497436d31494ed7c
Treee78bcb155880b8c167af124554a6db724c41264e
Author<f69e50@finnacloud.com> 1766442953 +0300
Committer<f69e50@finnacloud.com> 1766442953 +0300
Message
rename branch from main to master oops
GPG Signature
-----BEGIN PGP SIGNATURE-----

iQJSBAABCAA8FiEEWJb139mJI+vZ81KkoAIVSUsXI0oFAmlJx8keHHNvcGhpYS5l
cmFzbGFuQGZpbm5hY2xvdWQuY29tAAoJEKACFUlLFyNK2BQP/3EfkXtKsmQoqa4E
e9jdO5BKWUnHwF31PdpxExXwoogkZg2hSjSc0jB9htAKSbQspx+Pst7f9yj2Gf2u
ENGTEQHqqVeLEve2IPc1YJ+F+yedI3NE2PCZJ0+rh1/S14vQTT0kWMSqs6d8Te4K
x4hiTNNjfWidOXQ1vHMXl9iUnevmnko8XqNe3aBZ3JUSRLhhCvehsiPwSjfKGqB8
Sm9i1Y/HaTizFfl4WG5f6MppDgzV2I7Bm/c6K1oDIviO/Wken5vk4TXgLUWDfHJ5
d9m9gh4N9unX4Ivf5G22JVRzxPgox0Y0yFQwpj4IqQ9LzjT2Vz2s+hXoV6HZkfUW
BCLc/6oRmImcSflxOgV/TGaZrvysQ0pz32H8lyLoOI1QAS3o4u1icPFjfHlc5298
zpjGAqPjlVEx4Sjghrow4pb7sb/OyFihTwfjxlLgVfR4tXfb/l5rRt2f9vsm1HJB
qc9F/Qqc6xpb9ECyYZtuuCMToS0MRNkqy2KifrvOaKi2EznhcJu2VcLmjQJookFY
meevIkRenUvjwbs+aoDOa76HmycWkw1NtTtE9M+NSZ9SCBOD+Gp1rqO66z758bUQ
NmISh50GPDiZw5AKDrtsygWRZumLbrWHBleHm935V5O3gYkEKo9kb40Zf2sDsvlS
/wXQCTVz3XuSby3pyaMGgd3ol6gk
=YOD1
-----END PGP SIGNATURE-----

✓ Verified

File: src/main/java/com/paymentlink/config/LocalizationInterceptor.java

1 package com.paymentlink.config;
2
3 import com.paymentlink.exception.RegionBlockedException;
4 import com.paymentlink.model.dto.CountryInfo;
5 import com.paymentlink.service.GeoIpService;
6 import com.paymentlink.service.RegionService;
7 import jakarta.servlet.http.HttpServletRequest;
8 import jakarta.servlet.http.HttpServletResponse;
9 import org.slf4j.Logger;
10 import org.slf4j.LoggerFactory;
11 import org.springframework.beans.factory.annotation.Value;
12 import org.springframework.stereotype.Component;
13 import org.springframework.web.servlet.HandlerInterceptor;
14
15 @Component
16 public class LocalizationInterceptor implements HandlerInterceptor {
17
18 private static final Logger logger = LoggerFactory.getLogger(LocalizationInterceptor.class);
19
20 private final GeoIpService geoIpService;
21 private final RegionService regionService;
22
23 @Value("${region.blocking.enabled:true}")
24 private boolean regionBlockingEnabled;
25
26 public LocalizationInterceptor(GeoIpService geoIpService, RegionService regionService) {
27 this.geoIpService = geoIpService;
28 this.regionService = regionService;
29 }
30
31 @Override
32 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
33 // Check if client already has region preference (from cookie or header)
34 String clientRegion = request.getHeader("X-User-Region");
35
36 CountryInfo countryInfo;
37
38 if (clientRegion != null && !clientRegion.isEmpty()) {
39 // Client already selected a region, use that instead of GeoIP
40 logger.debug("Using client-selected region: {}", clientRegion);
41 countryInfo = regionService.getRegion(clientRegion) != null
42 ? buildCountryInfoFromRegion(regionService.getRegion(clientRegion))
43 : geoIpService.getCountryFromRequest(request);
44 } else {
45 // Only do GeoIP lookup if no region preference exists
46 // This typically happens once on first visit
47 countryInfo = geoIpService.getCountryFromRequest(request);
48 logger.debug("GeoIP lookup performed for first-time visitor from IP");
49 }
50
51 // Set country info in request attributes for controllers to use
52 request.setAttribute("countryCode", countryInfo.getCountryCode());
53 request.setAttribute("countryName", countryInfo.getCountryName());
54 request.setAttribute("languageCode", countryInfo.getLanguageCode());
55 request.setAttribute("currencyCode", countryInfo.getCurrencyCode());
56
57 logger.debug("Request from country: {} ({}), language: {}, currency: {}",
58 countryInfo.getCountryName(),
59 countryInfo.getCountryCode(),
60 countryInfo.getLanguageCode(),
61 countryInfo.getCurrencyCode());
62
63 // Check if region blocking is enabled
64 if (regionBlockingEnabled) {
65 // Check if country is enabled
66 if (countryInfo.getEnabled() == null || !countryInfo.getEnabled()) {
67 boolean isEnabled = regionService.isCountryEnabled(countryInfo.getCountryCode());
68 if (!isEnabled) {
69 logger.warn("Blocked request from disabled region: {} ({})",
70 countryInfo.getCountryName(),
71 countryInfo.getCountryCode());
72 throw new RegionBlockedException(countryInfo.getCountryCode(), countryInfo.getCountryName());
73 }
74 }
75 }
76
77 return true;
78 }
79
80 private CountryInfo buildCountryInfoFromRegion(com.paymentlink.model.entity.Region region) {
81 return CountryInfo.builder()
82 .countryCode(region.getCountryCode())
83 .countryName(region.getCountryName())
84 .languageCode(region.getLanguageCode())
85 .currencyCode(region.getCurrencyCode())
86 .enabled(region.getEnabled())
87 .build();
88 }
89 }
90