Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 1 addition & 9 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 2 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,14 +36,15 @@ services:
image: redislabs/redisinsight:latest
container_name: redisinsight
ports:
- "8001:8001"
- "5540:5540"
environment:
- REDIS_HOST=redis
- REDIS_PORT=6379
depends_on:
- redis
restart: unless-stopped


rabbitmq:
image: rabbitmq:management
container_name: rabbitmq
Expand Down
32 changes: 21 additions & 11 deletions src/main/java/com/podzilla/warehouse/Config/RedisConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> 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<Object> 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());
Expand All @@ -44,19 +52,21 @@ public RedisTemplate<Object, Object> 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);

Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class);
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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@

@Slf4j
@RestController
@RequestMapping("/assign")
@RequestMapping("warehouse/assign")
public class AssignerController {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

@Slf4j
@RestController
@RequestMapping("/stock")
@RequestMapping("warehouse/stock")
public class StockController {

@Autowired
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,6 @@ public Optional<Assigner> 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<Assigner> getAllAssigners(Pageable pageable) {
return assignerRepository.findAll(pageable);
}
Expand Down
36 changes: 12 additions & 24 deletions src/main/java/com/podzilla/warehouse/Services/ManagerService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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
Expand All @@ -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<Manager> getAllManagers() {
return managerRepository.findAll();
}

@Cacheable(value = "activeManagers")
@Cacheable(key = "'active'")
public List<Manager> getActiveManagers() {
return managerRepository.findByIsActiveTrue();
}

@Cacheable(value = "inactiveManagers")
@Cacheable(key = "'inactive'")
public List<Manager> getInactiveManagers() {
return managerRepository.findByIsActiveFalse();
}

@Cacheable(key = "#id")
@Cacheable(key = "'manager:id:' + #id")
public Optional<Manager> getManagerById(UUID id) {
return managerRepository.findById(id);
}

@Cacheable(key = "'email:' + #email")
@Cacheable(key = "'manager:email:' + #email")
public Optional<Manager> getManagerByEmail(String email) {
return managerRepository.findByEmail(email);
}

@Cacheable(key = "'department:' + #department")
public List<Manager> getManagersByDepartment(String department) {
return managerRepository.findByDepartment(department);
}

@CachePut(key = "#id")
@CachePut(key = "'manager:id:' + #id")
public Optional<Manager> updateManager(UUID id, Manager managerDetails) {
return managerRepository.findById(id)
.map(manager -> {
Expand All @@ -77,12 +67,11 @@ public Optional<Manager> 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<Manager> activateManager(UUID id) {
return managerRepository.findById(id)
.map(manager -> {
Expand All @@ -91,7 +80,7 @@ public Optional<Manager> activateManager(UUID id) {
});
}

@CachePut(key = "#id")
@CachePut(key = "'manager:id:' + #id")
public Optional<Manager> deactivateManager(UUID id) {
return managerRepository.findById(id)
.map(manager -> {
Expand All @@ -100,7 +89,7 @@ public Optional<Manager> deactivateManager(UUID id) {
});
}

@CacheEvict(key = "#id")
@CacheEvict(key = "'manager:id:' + #id")
public boolean deleteManager(UUID id) {
if (managerRepository.existsById(id)) {
managerRepository.deleteById(id);
Expand All @@ -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'
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,6 @@ public Optional<Packager> getPackagerById(UUID id) {
return packagerRepository.findById(id);
}

@Cacheable(value = "allPackagers", key = "#pageable.pageNumber + '-' + #pageable.pageSize")
public Page<Packager> getAllPackagers(Pageable pageable) {
return packagerRepository.findAll(pageable);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ public Stock createStock(String name, Integer quantity, Integer threshold, Strin
return saved;
}

@Cacheable(value = "stocksAll")
public List<Stock> getAllStocks() {
return stockRepository.findAll();
}
Expand All @@ -61,14 +60,10 @@ public List<Stock> getStocksByName(String name) {
return stockRepository.findByName(name);
}

@Cacheable(value = "stocksBelowQuantity", key = "#quantity")

public List<Stock> getStocksBelowQuantity(Integer quantity) {
return stockRepository.findByQuantityLessThanEqual(quantity);
}

@Cacheable("stocksBelowThreshold")

public List<Stock> getStocksBelowThreshold() {
return stockRepository.findByQuantityLessThanOrEqualToThreshold();
}
Expand Down Expand Up @@ -108,7 +103,7 @@ public Optional<Stock> 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);
Expand Down