diff --git a/.idea/compiler.xml b/.idea/compiler.xml index f1e20ad..bfdf789 100644 --- a/.idea/compiler.xml +++ b/.idea/compiler.xml @@ -10,16 +10,8 @@ - - - - - - - - - + diff --git a/docker-compose.yml b/docker-compose.yml index e60e27a..61d70ae 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: image: redislabs/redisinsight:latest container_name: redisinsight ports: - - "8001:8001" + - "5540:5540" environment: - REDIS_HOST=redis - REDIS_PORT=6379 @@ -44,6 +44,7 @@ services: - redis restart: unless-stopped + rabbitmq: image: rabbitmq:management container_name: rabbitmq diff --git a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java index 823f1bc..19f4253 100644 --- a/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java +++ b/src/main/java/com/podzilla/warehouse/Config/RedisConfig.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; +import com.fasterxml.jackson.databind.jsontype.BasicPolymorphicTypeValidator; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -12,26 +13,33 @@ import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.*; +import java.time.Duration; + @Configuration public class RedisConfig { + private static final long CACHE_TTL_SECONDS = 60 * 60; // 1 hour + @Bean public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); - // Configure ObjectMapper ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); - mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + // Use BasicPolymorphicTypeValidator instead of deprecated enableDefaultTyping + mapper.activateDefaultTyping( + BasicPolymorphicTypeValidator.builder() + .allowIfSubType(Object.class) + .build(), + ObjectMapper.DefaultTyping.NON_FINAL + ); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); - // Set the Jackson serializer with JavaTimeModule Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer<>(Object.class); serializer.setObjectMapper(mapper); - // Apply to both keys and values template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); template.setHashKeySerializer(new StringRedisSerializer()); @@ -44,9 +52,12 @@ public RedisTemplate redisTemplate(RedisConnectionFactory connec @Bean public RedisCacheConfiguration cacheConfiguration() { ObjectMapper mapper = new ObjectMapper(); - mapper.activateDefaultTyping(mapper.getPolymorphicTypeValidator(), ObjectMapper.DefaultTyping.NON_FINAL); - - // Register JavaTimeModule for LocalDateTime support + mapper.activateDefaultTyping( + BasicPolymorphicTypeValidator.builder() + .allowIfSubType(Object.class) + .build(), + ObjectMapper.DefaultTyping.NON_FINAL + ); mapper.registerModule(new JavaTimeModule()); mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); @@ -54,9 +65,8 @@ public RedisCacheConfiguration cacheConfiguration() { serializer.setObjectMapper(mapper); return RedisCacheConfiguration.defaultCacheConfig() - .serializeValuesWith( - RedisSerializationContext.SerializationPair.fromSerializer(serializer) - ); + .entryTtl(Duration.ofSeconds(CACHE_TTL_SECONDS)) // TTL set to 1 hour + .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(serializer)) + .disableCachingNullValues(); } - } diff --git a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java index f5dbfbf..7c744b8 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/AssignerController.java @@ -15,7 +15,7 @@ @Slf4j @RestController -@RequestMapping("/assign") +@RequestMapping("warehouse/assign") public class AssignerController { @Autowired diff --git a/src/main/java/com/podzilla/warehouse/Controllers/StockController.java b/src/main/java/com/podzilla/warehouse/Controllers/StockController.java index f9945fa..65001db 100644 --- a/src/main/java/com/podzilla/warehouse/Controllers/StockController.java +++ b/src/main/java/com/podzilla/warehouse/Controllers/StockController.java @@ -16,7 +16,7 @@ @Slf4j @RestController -@RequestMapping("/stock") +@RequestMapping("warehouse/stock") public class StockController { @Autowired diff --git a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java index b674c4a..42abd4a 100644 --- a/src/main/java/com/podzilla/warehouse/Services/AssignerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/AssignerService.java @@ -23,8 +23,6 @@ public Optional createAssigner(Assigner assigner) { return Optional.of(assignerRepository.save(assigner)); } - // We cache the page of assigners under a generic key (you could enhance this using pageable as a cache key input) - @Cacheable(value = "assignersList") public Page getAllAssigners(Pageable pageable) { return assignerRepository.findAll(pageable); } diff --git a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java index c633c49..bfd3ec0 100644 --- a/src/main/java/com/podzilla/warehouse/Services/ManagerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/ManagerService.java @@ -1,9 +1,5 @@ package com.podzilla.warehouse.Services; -import com.podzilla.mq.EventPublisher; -import com.podzilla.mq.EventsConstants; -import com.podzilla.mq.events.OrderItem; -import com.podzilla.mq.events.OrderPlacedEvent; import com.podzilla.warehouse.Models.Manager; import com.podzilla.warehouse.Repositories.ManagerRepository; import lombok.RequiredArgsConstructor; @@ -12,11 +8,7 @@ import org.springframework.cache.annotation.*; import org.springframework.stereotype.Service; -import java.math.BigDecimal; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.UUID; +import java.util.*; @RequiredArgsConstructor @Service @@ -26,49 +18,47 @@ public class ManagerService { @Autowired private ManagerRepository managerRepository; - @CachePut(key = "#result.id") + @CachePut(key = "'manager:id:' + #result.id") public Manager createManager(String name, String email, String department, String phoneNumber) { Manager manager = new Manager(name, email, department, phoneNumber); return managerRepository.save(manager); } - @CachePut(key = "#result.id") + @CachePut(key = "'manager:id:' + #result.id") public Manager createManager(String name, String email, String department) { Manager manager = new Manager(name, email, department); return managerRepository.save(manager); } - @Cacheable(value = "allManagers") public List getAllManagers() { return managerRepository.findAll(); } - @Cacheable(value = "activeManagers") + @Cacheable(key = "'active'") public List getActiveManagers() { return managerRepository.findByIsActiveTrue(); } - @Cacheable(value = "inactiveManagers") + @Cacheable(key = "'inactive'") public List getInactiveManagers() { return managerRepository.findByIsActiveFalse(); } - @Cacheable(key = "#id") + @Cacheable(key = "'manager:id:' + #id") public Optional getManagerById(UUID id) { return managerRepository.findById(id); } - @Cacheable(key = "'email:' + #email") + @Cacheable(key = "'manager:email:' + #email") public Optional getManagerByEmail(String email) { return managerRepository.findByEmail(email); } - @Cacheable(key = "'department:' + #department") public List getManagersByDepartment(String department) { return managerRepository.findByDepartment(department); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional updateManager(UUID id, Manager managerDetails) { return managerRepository.findById(id) .map(manager -> { @@ -77,12 +67,11 @@ public Optional updateManager(UUID id, Manager managerDetails) { if (managerDetails.getDepartment() != null) manager.setDepartment(managerDetails.getDepartment()); if (managerDetails.getPhoneNumber() != null) manager.setPhoneNumber(managerDetails.getPhoneNumber()); if (managerDetails.getIsActive() != null) manager.setIsActive(managerDetails.getIsActive()); - return managerRepository.save(manager); }); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional activateManager(UUID id) { return managerRepository.findById(id) .map(manager -> { @@ -91,7 +80,7 @@ public Optional activateManager(UUID id) { }); } - @CachePut(key = "#id") + @CachePut(key = "'manager:id:' + #id") public Optional deactivateManager(UUID id) { return managerRepository.findById(id) .map(manager -> { @@ -100,7 +89,7 @@ public Optional deactivateManager(UUID id) { }); } - @CacheEvict(key = "#id") + @CacheEvict(key = "'manager:id:' + #id") public boolean deleteManager(UUID id) { if (managerRepository.existsById(id)) { managerRepository.deleteById(id); @@ -109,9 +98,8 @@ public boolean deleteManager(UUID id) { return false; } - // Optional: clear all caches if needed @CacheEvict(allEntries = true) public void clearManagerCache() { - // Used to manually clear all manager-related caches + // Clears all cache entries under 'managers' } } diff --git a/src/main/java/com/podzilla/warehouse/Services/PackagerService.java b/src/main/java/com/podzilla/warehouse/Services/PackagerService.java index 815aafe..adef4ba 100644 --- a/src/main/java/com/podzilla/warehouse/Services/PackagerService.java +++ b/src/main/java/com/podzilla/warehouse/Services/PackagerService.java @@ -28,7 +28,6 @@ public Optional getPackagerById(UUID id) { return packagerRepository.findById(id); } - @Cacheable(value = "allPackagers", key = "#pageable.pageNumber + '-' + #pageable.pageSize") public Page getAllPackagers(Pageable pageable) { return packagerRepository.findAll(pageable); } diff --git a/src/main/java/com/podzilla/warehouse/Services/StockService.java b/src/main/java/com/podzilla/warehouse/Services/StockService.java index d30f038..5cfb4c9 100644 --- a/src/main/java/com/podzilla/warehouse/Services/StockService.java +++ b/src/main/java/com/podzilla/warehouse/Services/StockService.java @@ -45,7 +45,6 @@ public Stock createStock(String name, Integer quantity, Integer threshold, Strin return saved; } - @Cacheable(value = "stocksAll") public List getAllStocks() { return stockRepository.findAll(); } @@ -61,14 +60,10 @@ public List getStocksByName(String name) { return stockRepository.findByName(name); } - @Cacheable(value = "stocksBelowQuantity", key = "#quantity") - public List getStocksBelowQuantity(Integer quantity) { return stockRepository.findByQuantityLessThanEqual(quantity); } - @Cacheable("stocksBelowThreshold") - public List getStocksBelowThreshold() { return stockRepository.findByQuantityLessThanOrEqualToThreshold(); } @@ -108,7 +103,7 @@ public Optional updateStock(UUID id, String name, Integer quantity, Integ // return EventFactory.createInventorySnapshotEvent(LocalDateTime.now(), warehouseId, productSnapshots); // } - @CacheEvict(value = {"stockById", "stocksAll", "stocksByName", "stocksBelowQuantity", "stocksBelowThreshold"}, key = "#id", allEntries = true) + @CacheEvict(value = {"stockById", "stocksByName", "stocksBelowQuantity"}, key = "#id", allEntries = true) public boolean deleteStock(UUID id) { if (stockRepository.existsById(id)) { stockRepository.deleteById(id);