diff --git a/nacos_config/rc-gateway/application.yml b/nacos_config/rc-gateway/application.yml index 9f733162..65962133 100644 --- a/nacos_config/rc-gateway/application.yml +++ b/nacos_config/rc-gateway/application.yml @@ -1,6 +1,8 @@ spring: cloud: gateway: + default-filters: + - DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_LAST globalcors: add-to-simple-url-handler-mapping: true, cors-configurations: diff --git a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExe.java b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExe.java index 949e3c51..795715aa 100644 --- a/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExe.java +++ b/rc-service/rc-service-other/other-application/src/main/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExe.java @@ -2,21 +2,26 @@ package com.red.circle.other.app.command.team.query; import com.red.circle.common.business.dto.cmd.app.AppIdLongCmd; import com.red.circle.framework.core.asserts.ResponseAssert; +import com.red.circle.other.infra.common.sys.CountryCodeAliasSupport; import com.red.circle.other.app.convertor.team.TeamAppConvertor; import com.red.circle.other.app.dto.clientobject.team.TeamPolicyManagerCO; -import com.red.circle.other.app.service.user.user.UserProfileService; import com.red.circle.other.domain.gateway.user.UserProfileGateway; import com.red.circle.other.domain.model.user.UserProfile; import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager; import com.red.circle.other.infra.database.mongo.entity.team.team.TeamProfile; +import com.red.circle.other.infra.database.mongo.entity.user.region.SysRegionConfig; import com.red.circle.other.infra.database.mongo.service.team.TeamBillCycleUtils; import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService; import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService; +import com.red.circle.other.infra.database.mongo.service.user.region.SysRegionConfigService; import com.red.circle.other.inner.asserts.team.TeamErrorCode; +import com.red.circle.tool.core.text.StringUtils; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Component; +import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; /** @@ -32,17 +37,45 @@ public class TeamReleasePolicyQryExe { private final TeamProfileService teamProfileService; private final TeamPolicyManagerService teamPolicyManagerService; private final UserProfileGateway userProfileGateway; + private final SysRegionConfigService sysRegionConfigService; + private final CountryCodeAliasSupport countryCodeAliasSupport; public TeamPolicyManagerCO execute(AppIdLongCmd cmd) { TeamProfile teamProfile = teamProfileService.getById(cmd.getId()); ResponseAssert.notNull(TeamErrorCode.TEAM_NOT_FOUND, teamProfile); UserProfile userProfile = userProfileGateway.getByUserId(teamProfile.getOwnUserId()); + String countryCode = Objects.nonNull(userProfile) ? userProfile.getCountryCode() : null; + String policyRegion = resolveOwnerCountryRegion(teamProfile, countryCode); - Map policyManagerMap = teamPolicyManagerService.mapRegionReleaseWithCountry(Set.of(teamProfile.getRegion())); - TeamPolicyManager teamPolicyManager = TeamBillCycleUtils.getPolicyFromMap(policyManagerMap, teamProfile.getRegion(), userProfile.getCountryCode()); + Map policyManagerMap = teamPolicyManagerService.mapRegionReleaseWithCountry(Set.of(policyRegion)); + TeamPolicyManager teamPolicyManager = TeamBillCycleUtils.getPolicyFromMap(policyManagerMap, policyRegion, countryCode); return teamAppConvertor.toTeamPolicyManagerCO(teamPolicyManager); } + private String resolveOwnerCountryRegion(TeamProfile teamProfile, String countryCode) { + List regionConfigs = sysRegionConfigService.listAvailable(teamProfile.getSysOrigin()); + if (regionConfigs == null || regionConfigs.isEmpty()) { + return teamProfile.getRegion(); + } + + if (StringUtils.isNotBlank(countryCode)) { + SysRegionConfig countryRegion = regionConfigs.stream() + .filter(region -> StringUtils.isNotBlank(region.getCountryCodes())) + .filter(region -> countryCodeAliasSupport.containsCode(region.getCountryCodes(), countryCode)) + .findFirst() + .orElse(null); + if (Objects.nonNull(countryRegion)) { + return countryRegion.getId(); + } + } + + return regionConfigs.stream() + .filter(region -> StringUtils.equalsIgnoreCase("OTHER", region.getRegionCode())) + .findFirst() + .map(SysRegionConfig::getId) + .orElse(teamProfile.getRegion()); + } + } diff --git a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExeTest.java b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExeTest.java new file mode 100644 index 00000000..b50aa8c2 --- /dev/null +++ b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/team/query/TeamReleasePolicyQryExeTest.java @@ -0,0 +1,89 @@ +package com.red.circle.other.app.command.team.query; + +import static org.junit.jupiter.api.Assertions.assertSame; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import com.red.circle.common.business.dto.cmd.app.AppIdLongCmd; +import com.red.circle.other.app.convertor.team.TeamAppConvertor; +import com.red.circle.other.app.dto.clientobject.team.TeamPolicyManagerCO; +import com.red.circle.other.domain.gateway.user.UserProfileGateway; +import com.red.circle.other.domain.model.user.UserProfile; +import com.red.circle.other.infra.common.sys.CountryCodeAliasSupport; +import com.red.circle.other.infra.database.mongo.entity.team.team.TeamPolicyManager; +import com.red.circle.other.infra.database.mongo.entity.team.team.TeamProfile; +import com.red.circle.other.infra.database.mongo.entity.user.region.SysRegionConfig; +import com.red.circle.other.infra.database.mongo.service.team.team.TeamPolicyManagerService; +import com.red.circle.other.infra.database.mongo.service.team.team.TeamProfileService; +import com.red.circle.other.infra.database.mongo.service.user.region.SysRegionConfigService; +import java.util.List; +import java.util.Map; +import java.util.Set; +import org.junit.jupiter.api.Test; + +class TeamReleasePolicyQryExeTest { + + @Test + void executeShouldResolvePolicyByTeamOwnerCountryRegion() { + TeamAppConvertor teamAppConvertor = mock(TeamAppConvertor.class); + TeamProfileService teamProfileService = mock(TeamProfileService.class); + TeamPolicyManagerService teamPolicyManagerService = mock(TeamPolicyManagerService.class); + UserProfileGateway userProfileGateway = mock(UserProfileGateway.class); + SysRegionConfigService sysRegionConfigService = mock(SysRegionConfigService.class); + CountryCodeAliasSupport countryCodeAliasSupport = mock(CountryCodeAliasSupport.class); + TeamReleasePolicyQryExe exe = new TeamReleasePolicyQryExe( + teamAppConvertor, + teamProfileService, + teamPolicyManagerService, + userProfileGateway, + sysRegionConfigService, + countryCodeAliasSupport + ); + + AppIdLongCmd cmd = new AppIdLongCmd(); + cmd.setId(2047235247724072961L); + + TeamProfile teamProfile = new TeamProfile() + .setId(2047235247724072961L) + .setOwnUserId(2047206645188063233L) + .setSysOrigin("LIKEI") + .setRegion("jp-region"); + UserProfile ownerProfile = new UserProfile(); + ownerProfile.setId(2047206645188063233L); + ownerProfile.setCountryCode("PK"); + SysRegionConfig jpRegion = new SysRegionConfig() + .setId("jp-region") + .setSysOrigin("LIKEI") + .setRegionCode("JP") + .setCountryCodes("JP"); + SysRegionConfig pkRegion = new SysRegionConfig() + .setId("pk-region") + .setSysOrigin("LIKEI") + .setRegionCode("PK") + .setCountryCodes("PK"); + TeamPolicyManager policyManager = new TeamPolicyManager() + .setId(1L) + .setRegion("pk-region") + .setCountryCode("PK"); + TeamPolicyManagerCO policyManagerCO = new TeamPolicyManagerCO() + .setId(1L) + .setRegion("pk-region"); + + when(teamProfileService.getById(2047235247724072961L)).thenReturn(teamProfile); + when(userProfileGateway.getByUserId(2047206645188063233L)).thenReturn(ownerProfile); + when(sysRegionConfigService.listAvailable("LIKEI")).thenReturn(List.of(jpRegion, pkRegion)); + when(countryCodeAliasSupport.containsCode("JP", "PK")).thenReturn(false); + when(countryCodeAliasSupport.containsCode("PK", "PK")).thenReturn(true); + when(teamPolicyManagerService.mapRegionReleaseWithCountry(Set.of("pk-region"))).thenReturn( + Map.of("pk-region_PK", policyManager) + ); + when(teamAppConvertor.toTeamPolicyManagerCO(policyManager)).thenReturn(policyManagerCO); + + TeamPolicyManagerCO result = exe.execute(cmd); + + assertSame(policyManagerCO, result); + verify(teamPolicyManagerService).mapRegionReleaseWithCountry(Set.of("pk-region")); + verify(teamAppConvertor).toTeamPolicyManagerCO(policyManager); + } +} diff --git a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/user/UpdateUserProfileCmdExeTest.java b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/user/UpdateUserProfileCmdExeTest.java index 88e0a83f..67196ddd 100644 --- a/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/user/UpdateUserProfileCmdExeTest.java +++ b/rc-service/rc-service-other/other-application/src/test/java/com/red/circle/other/app/command/user/UpdateUserProfileCmdExeTest.java @@ -52,11 +52,11 @@ class UpdateUserProfileCmdExeTest { cmd.setReqSysOrigin(ReqSysOrigin.of("LIKEI", "LIKEI")); cmd.setCountryId(2L); - UserProfile currentUserProfile = new UserProfile() - .setId(1L) - .setCountryId(1L) - .setCountryCode("KSA") - .setCountryName("KSA"); + UserProfile currentUserProfile = new UserProfile(); + currentUserProfile.setId(1L); + currentUserProfile.setCountryId(1L); + currentUserProfile.setCountryCode("KSA"); + currentUserProfile.setCountryName("KSA"); UserProfile updateUserProfile = new UserProfile(); SysCountryCode newCountry = new SysCountryCode() .setId(2L)