From 350f7ae735bfd46cf951983cbb9116be5be3c582 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Mon, 8 Apr 2024 17:53:13 +0200 Subject: [PATCH 1/6] fix: add user caching in rocketchat --- .../cob/userservice/api/AccountManager.java | 2 +- .../rocketchat/RocketChatService.java | 46 ++++++++++++------- .../api/config/CacheManagerConfig.java | 26 +++++++++++ .../api/port/out/MessageClient.java | 2 + src/main/resources/application.properties | 6 +++ 5 files changed, 64 insertions(+), 18 deletions(-) diff --git a/src/main/java/de/caritas/cob/userservice/api/AccountManager.java b/src/main/java/de/caritas/cob/userservice/api/AccountManager.java index 25d4b7887..cf945c646 100644 --- a/src/main/java/de/caritas/cob/userservice/api/AccountManager.java +++ b/src/main/java/de/caritas/cob/userservice/api/AccountManager.java @@ -185,7 +185,7 @@ private Map findByDbConsultant(Consultant dbConsultant) { var userMap = new HashMap(); messageClient - .findUser(dbConsultant.getRocketChatId()) + .findUserAndAddToCache(dbConsultant.getRocketChatId()) .ifPresentOrElse( chatUserMap -> userMap.putAll(userServiceMapper.mapOf(dbConsultant, chatUserMap)), throwPersistenceConflict(dbConsultant.getId(), dbConsultant.getRocketChatId())); diff --git a/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/RocketChatService.java b/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/RocketChatService.java index 182a6ddb3..ee3d590b4 100644 --- a/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/RocketChatService.java +++ b/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/RocketChatService.java @@ -72,6 +72,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.Document; +import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; @@ -309,6 +310,12 @@ public Optional> findUser(String chatUserId) { } } + @Override + @Cacheable(key = "#chatUserId", value = "rocketChatUserCache") + public Optional> findUserAndAddToCache(String chatUserId) { + return findUser(chatUserId); + } + @Override public Optional> getChatInfo(String roomId) { var url = rocketChatConfig.getApiUrl(ENDPOINT_ROOM_INFO + roomId); @@ -1202,12 +1209,14 @@ private List getGroupsListAll(DBObject mongoDbQuery) } } - private List getGroupListAllCombiningPages(DBObject mongoDbQuery, - HttpEntity request) throws RocketChatGetGroupsListAllException { + private List getGroupListAllCombiningPages( + DBObject mongoDbQuery, HttpEntity request) + throws RocketChatGetGroupsListAllException { List result = Lists.newArrayList(); int currentOffset = 0; - var pageResponse = getGroupsListAllResponseDTOResponseEntityForCurrentOffset(mongoDbQuery, - request, currentOffset); + var pageResponse = + getGroupsListAllResponseDTOResponseEntityForCurrentOffset( + mongoDbQuery, request, currentOffset); var totalResultSize = 0; if (isResponseSuccessful(pageResponse)) { @@ -1217,15 +1226,19 @@ private List getGroupListAllCombiningPages(DBObject mongoDbQuery, while (isResponseSuccessful(pageResponse) && currentOffset < totalResultSize) { result.addAll(asList(pageResponse.getBody().getGroups())); currentOffset += PAGE_SIZE; - pageResponse = getGroupsListAllResponseDTOResponseEntityForCurrentOffset(mongoDbQuery, - request, currentOffset); + pageResponse = + getGroupsListAllResponseDTOResponseEntityForCurrentOffset( + mongoDbQuery, request, currentOffset); } if (pageResponse.getStatusCode() != HttpStatus.OK || isNull(pageResponse.getBody())) { - log.error("Could not get Rocket.Chat groups list all. Reason {} {}. Url {}", pageResponse.getStatusCode(), pageResponse.getBody(), getGroupAllPaginatedUrl(currentOffset)); + log.error( + "Could not get Rocket.Chat groups list all. Reason {} {}. Url {}", + pageResponse.getStatusCode(), + pageResponse.getBody(), + getGroupAllPaginatedUrl(currentOffset)); throw new RocketChatGetGroupsListAllException(GROUPS_LIST_ALL_ERROR_MESSAGE); } - return result; } @@ -1233,24 +1246,23 @@ private boolean isResponseSuccessful(ResponseEntity pa return pageResponse.getStatusCode() == HttpStatus.OK && nonNull(pageResponse.getBody()); } - private ResponseEntity getGroupsListAllResponseDTOResponseEntityForCurrentOffset( - DBObject mongoDbQuery, HttpEntity request, int currentOffset) { + private ResponseEntity + getGroupsListAllResponseDTOResponseEntityForCurrentOffset( + DBObject mongoDbQuery, HttpEntity request, int currentOffset) { ResponseEntity response; var url = getGroupAllPaginatedUrl(currentOffset); response = restTemplate.exchange( - url, - HttpMethod.GET, - request, - GroupsListAllResponseDTO.class, - mongoDbQuery.toString()); + url, HttpMethod.GET, request, GroupsListAllResponseDTO.class, mongoDbQuery.toString()); return response; } private String getGroupAllPaginatedUrl(int currentOffset) { - return rocketChatConfig.getApiUrl(ENDPOINT_GROUP_LIST) + "?query={query}&offset=" + return rocketChatConfig.getApiUrl(ENDPOINT_GROUP_LIST) + + "?query={query}&offset=" + currentOffset - + "&count=" + PAGE_SIZE; + + "&count=" + + PAGE_SIZE; } /** diff --git a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java index 20b994625..d0d23bad8 100644 --- a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java +++ b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java @@ -20,6 +20,8 @@ public class CacheManagerConfig { public static final String TENANT_ADMIN_CACHE = "tenantAdminCache"; public static final String TOPICS_CACHE = "topicsCache"; + public static final String ROCKET_CHAT_USER_CACHE = "rocketchatUserCache"; + @Value("${cache.agencies.configuration.maxEntriesLocalHeap}") private long agenciesMaxEntriesLocalHeap; @@ -80,6 +82,18 @@ public class CacheManagerConfig { @Value("${cache.appsettings.configuration.timeToLiveSeconds}") private long appSettingsTimeToLiveSeconds; + @Value("${cache.rocketchat.configuration.maxEntriesLocalHeap}") + private long rocketchatCacheMaxEntriesLocalHeap; + + @Value("${cache.rocketchat.configuration.eternal}") + private boolean rocketchatCacheEternal; + + @Value("${cache.rocketchat.configuration.timeToIdleSeconds}") + private long rocketchatCacheTimeToIdleSeconds; + + @Value("${cache.rocketchat.configuration.timeToLiveSeconds}") + private long rocketchatCacheTimeToLiveSeconds; + @Bean public CacheManager cacheManager() { return new EhCacheCacheManager(ehCacheManager()); @@ -94,6 +108,8 @@ public net.sf.ehcache.CacheManager ehCacheManager() { config.addCache(buildTenantAdminCacheConfiguration()); config.addCache(buildTopicCacheConfiguration()); config.addCache(buildApplicationSettingsCacheConfiguration()); + + config.addCache(buildRocketchatUserCacheConfiguration()); return net.sf.ehcache.CacheManager.newInstance(config); } @@ -156,4 +172,14 @@ private CacheConfiguration buildApplicationSettingsCacheConfiguration() { appSettingsCacheConfiguration.setTimeToLiveSeconds(appSettingsTimeToLiveSeconds); return appSettingsCacheConfiguration; } + + private CacheConfiguration buildRocketchatUserCacheConfiguration() { + var appSettingsCacheConfiguration = new CacheConfiguration(); + appSettingsCacheConfiguration.setName(ROCKET_CHAT_USER_CACHE); + appSettingsCacheConfiguration.setMaxEntriesLocalHeap(rocketchatCacheMaxEntriesLocalHeap); + appSettingsCacheConfiguration.setEternal(rocketchatCacheEternal); + appSettingsCacheConfiguration.setTimeToIdleSeconds(rocketchatCacheTimeToIdleSeconds); + appSettingsCacheConfiguration.setTimeToLiveSeconds(rocketchatCacheTimeToLiveSeconds); + return appSettingsCacheConfiguration; + } } diff --git a/src/main/java/de/caritas/cob/userservice/api/port/out/MessageClient.java b/src/main/java/de/caritas/cob/userservice/api/port/out/MessageClient.java index fa2cf0157..c1ebf8f8b 100644 --- a/src/main/java/de/caritas/cob/userservice/api/port/out/MessageClient.java +++ b/src/main/java/de/caritas/cob/userservice/api/port/out/MessageClient.java @@ -27,6 +27,8 @@ public interface MessageClient { Optional> findUser(String chatUserId); + Optional> findUserAndAddToCache(String chatUserId); + Optional>> findAllChats(String chatUserId); boolean updateChatE2eKey(String chatUserId, String roomId, String key); diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 2f92877ad..0725bd578 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -144,6 +144,12 @@ cache.appsettings.configuration.eternal=false cache.appsettings.configuration.timeToIdleSeconds=0 cache.appsettings.configuration.timeToLiveSeconds=60 + +cache.rocketchat.configuration.maxEntriesLocalHeap=100 +cache.rocketchat.configuration.eternal=false +cache.rocketchat.configuration.timeToIdleSeconds=0 +cache.rocketchat.configuration.timeToLiveSeconds=900 + # MailService API mail.service.api.url=http://mailservice:8080/service From 750af1b83f5bbcfa7292aa7d3d867be2a221b0f1 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Tue, 9 Apr 2024 08:19:27 +0200 Subject: [PATCH 2/6] fix: spotless --- .../dto/group/GroupsListAllResponseDTO.java | 1 - .../api/service/RocketChatServiceTest.java | 48 ++++++++++--------- 2 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/dto/group/GroupsListAllResponseDTO.java b/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/dto/group/GroupsListAllResponseDTO.java index 9a0684196..52f46e867 100644 --- a/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/dto/group/GroupsListAllResponseDTO.java +++ b/src/main/java/de/caritas/cob/userservice/api/adapters/rocketchat/dto/group/GroupsListAllResponseDTO.java @@ -22,5 +22,4 @@ public class GroupsListAllResponseDTO { private Integer offset; private Integer count; private Integer total; - } diff --git a/src/test/java/de/caritas/cob/userservice/api/service/RocketChatServiceTest.java b/src/test/java/de/caritas/cob/userservice/api/service/RocketChatServiceTest.java index 28da0fae2..f04954fef 100644 --- a/src/test/java/de/caritas/cob/userservice/api/service/RocketChatServiceTest.java +++ b/src/test/java/de/caritas/cob/userservice/api/service/RocketChatServiceTest.java @@ -165,15 +165,16 @@ public class RocketChatServiceTest { new UsersListReponseDTO( new RocketChatUserDTO[] {ROCKET_CHAT_USER_DTO, ROCKET_CHAT_USER_DTO_2}); private final GroupsListAllResponseDTO GROUPS_LIST_ALL_RESPONSE_DTO_EMPTY = - new GroupsListAllResponseDTO(new GroupDTO[0], 1,0,0); + new GroupsListAllResponseDTO(new GroupDTO[0], 1, 0, 0); private final GroupsListAllResponseDTO GROUPS_LIST_ALL_RESPONSE_DTO = - new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0,2,10); + new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0, 2, 10); private final GroupsListAllResponseDTO GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED = - new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0,100,1000); + new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0, 100, 1000); - private final GroupsListAllResponseDTO GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED_WITH_TOTAL_ZERO_ELEMENTS = - new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0,0,0); + private final GroupsListAllResponseDTO + GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED_WITH_TOTAL_ZERO_ELEMENTS = + new GroupsListAllResponseDTO(new GroupDTO[] {GROUP_DTO, GROUP_DTO_2}, 0, 0, 0); private final LocalDateTime DATETIME_OLDEST = nowInUtc(); private final LocalDateTime DATETIME_LATEST = nowInUtc(); private final String PASSWORD = "password"; @@ -1114,20 +1115,20 @@ public void fetchAllInactivePrivateGroupsSinceGivenDate_Should_UseCorrectMongoQu eq(correctMongoQuery)); } - @Test - public void fetchAllInactivePrivateGroupsSinceGivenDate_Should_CallRocketChatApiMultipleTimes_When_ResultIsPaginated() - throws RocketChatUserNotInitializedException, RocketChatGetGroupsListAllException { + public void + fetchAllInactivePrivateGroupsSinceGivenDate_Should_CallRocketChatApiMultipleTimes_When_ResultIsPaginated() + throws RocketChatUserNotInitializedException, RocketChatGetGroupsListAllException { LocalDateTime dateToCheck = LocalDateTime.of(2021, 1, 1, 0, 0, 0); when(rcCredentialsHelper.getTechnicalUser()).thenReturn(RC_CREDENTIALS_TECHNICAL_A); when(restTemplate.exchange( - anyString(), - eq(HttpMethod.GET), - any(), - eq(GroupsListAllResponseDTO.class), - anyString())) + anyString(), + eq(HttpMethod.GET), + any(), + eq(GroupsListAllResponseDTO.class), + anyString())) .thenReturn(new ResponseEntity<>(GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED, HttpStatus.OK)); this.rocketChatService.fetchAllInactivePrivateGroupsSinceGivenDate(dateToCheck); @@ -1144,22 +1145,23 @@ public void fetchAllInactivePrivateGroupsSinceGivenDate_Should_CallRocketChatApi eq(correctMongoQuery)); } - @Test - public void fetchAllInactivePrivateGroupsSinceGivenDate_Should_CallRocketChatApiOnlyOnce_When_ResponseContainsTotalOfZeroElements() - throws RocketChatUserNotInitializedException, RocketChatGetGroupsListAllException { + public void + fetchAllInactivePrivateGroupsSinceGivenDate_Should_CallRocketChatApiOnlyOnce_When_ResponseContainsTotalOfZeroElements() + throws RocketChatUserNotInitializedException, RocketChatGetGroupsListAllException { LocalDateTime dateToCheck = LocalDateTime.of(2021, 1, 1, 0, 0, 0); when(rcCredentialsHelper.getTechnicalUser()).thenReturn(RC_CREDENTIALS_TECHNICAL_A); when(restTemplate.exchange( - anyString(), - eq(HttpMethod.GET), - any(), - eq(GroupsListAllResponseDTO.class), - anyString())) - .thenReturn(new ResponseEntity<>( - GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED_WITH_TOTAL_ZERO_ELEMENTS, HttpStatus.OK)); + anyString(), + eq(HttpMethod.GET), + any(), + eq(GroupsListAllResponseDTO.class), + anyString())) + .thenReturn( + new ResponseEntity<>( + GROUPS_LIST_ALL_RESPONSE_DTO_PAGINATED_WITH_TOTAL_ZERO_ELEMENTS, HttpStatus.OK)); this.rocketChatService.fetchAllInactivePrivateGroupsSinceGivenDate(dateToCheck); From 933aa4ecc91f4609ddce85a05aaf29d5bfa6e819 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Tue, 9 Apr 2024 12:36:00 +0200 Subject: [PATCH 3/6] fix: typo in cache name --- .../caritas/cob/userservice/api/config/CacheManagerConfig.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java index d0d23bad8..0ec29cfc9 100644 --- a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java +++ b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java @@ -20,7 +20,7 @@ public class CacheManagerConfig { public static final String TENANT_ADMIN_CACHE = "tenantAdminCache"; public static final String TOPICS_CACHE = "topicsCache"; - public static final String ROCKET_CHAT_USER_CACHE = "rocketchatUserCache"; + public static final String ROCKET_CHAT_USER_CACHE = "rocketChatUserCache"; @Value("${cache.agencies.configuration.maxEntriesLocalHeap}") private long agenciesMaxEntriesLocalHeap; From 34f549ddcaf6484ce1266dc290d5e953ead80e65 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Tue, 9 Apr 2024 13:15:12 +0200 Subject: [PATCH 4/6] fix: cache variable name --- .../userservice/api/config/CacheManagerConfig.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java index 0ec29cfc9..ead53328d 100644 --- a/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java +++ b/src/main/java/de/caritas/cob/userservice/api/config/CacheManagerConfig.java @@ -174,12 +174,12 @@ private CacheConfiguration buildApplicationSettingsCacheConfiguration() { } private CacheConfiguration buildRocketchatUserCacheConfiguration() { - var appSettingsCacheConfiguration = new CacheConfiguration(); - appSettingsCacheConfiguration.setName(ROCKET_CHAT_USER_CACHE); - appSettingsCacheConfiguration.setMaxEntriesLocalHeap(rocketchatCacheMaxEntriesLocalHeap); - appSettingsCacheConfiguration.setEternal(rocketchatCacheEternal); - appSettingsCacheConfiguration.setTimeToIdleSeconds(rocketchatCacheTimeToIdleSeconds); - appSettingsCacheConfiguration.setTimeToLiveSeconds(rocketchatCacheTimeToLiveSeconds); - return appSettingsCacheConfiguration; + var rocketchatCacheConfiguration = new CacheConfiguration(); + rocketchatCacheConfiguration.setName(ROCKET_CHAT_USER_CACHE); + rocketchatCacheConfiguration.setMaxEntriesLocalHeap(rocketchatCacheMaxEntriesLocalHeap); + rocketchatCacheConfiguration.setEternal(rocketchatCacheEternal); + rocketchatCacheConfiguration.setTimeToIdleSeconds(rocketchatCacheTimeToIdleSeconds); + rocketchatCacheConfiguration.setTimeToLiveSeconds(rocketchatCacheTimeToLiveSeconds); + return rocketchatCacheConfiguration; } } From 665cb8678cd5f41b1331f5e384f7b6c9c4687657 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Tue, 9 Apr 2024 13:18:33 +0200 Subject: [PATCH 5/6] fix: tests --- .../api/adapters/web/controller/UserControllerChatE2EIT.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java b/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java index 92542d8c1..148c471a0 100644 --- a/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java +++ b/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java @@ -102,6 +102,7 @@ import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.system.CapturedOutput; import org.springframework.boot.test.system.OutputCaptureExtension; +import org.springframework.cache.CacheManager; import org.springframework.http.HttpEntity; import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; @@ -154,6 +155,9 @@ class UserControllerChatE2EIT { @MockBean private AgencyServiceApiControllerFactory agencyServiceApiControllerFactory; + @Autowired + private CacheManager cacheManager; + @MockBean @Qualifier("restTemplate") private RestTemplate restTemplate; @@ -207,6 +211,7 @@ void reset() { subscriptionsGetResponse = null; groupDeleteResponse = null; identityConfig.setDisplayNameAllowedForConsultants(false); + cacheManager.getCache("rocketChatUserCache").clear(); } @BeforeEach From f100116e8426178ee2c974519909f096f88d3118 Mon Sep 17 00:00:00 2001 From: tkuzynow Date: Tue, 9 Apr 2024 13:37:08 +0200 Subject: [PATCH 6/6] fix: tests --- .../api/adapters/web/controller/UserControllerChatE2EIT.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java b/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java index 148c471a0..25a3f9f52 100644 --- a/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java +++ b/src/test/java/de/caritas/cob/userservice/api/adapters/web/controller/UserControllerChatE2EIT.java @@ -155,8 +155,7 @@ class UserControllerChatE2EIT { @MockBean private AgencyServiceApiControllerFactory agencyServiceApiControllerFactory; - @Autowired - private CacheManager cacheManager; + @Autowired private CacheManager cacheManager; @MockBean @Qualifier("restTemplate")