Skip to content

Commit f7dc4cb

Browse files
authored
Merge pull request vatri#1 from vatri/refactoring-to-cache-redis-
Refactoring the redis to the app's cache interface
2 parents d3adc1c + e570a27 commit f7dc4cb

File tree

9 files changed

+278
-59
lines changed

9 files changed

+278
-59
lines changed

src/main/java/net/vatri/ecommerce/EcommerceStarterApplication.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,15 @@
11
package net.vatri.ecommerce;
22

3+
import net.vatri.ecommerce.cache.Cache;
4+
import net.vatri.ecommerce.cache.JacksonObjectMappper;
5+
import net.vatri.ecommerce.cache.ObjectMapper;
6+
import net.vatri.ecommerce.cache.RedisCache;
37
import net.vatri.ecommerce.storage.StorageProperties;
48
import net.vatri.ecommerce.storage.StorageService;
59
import net.vatri.ecommerce.validators.GroupValidator;
610
import net.vatri.ecommerce.validators.OrderValidator;
711
import net.vatri.ecommerce.validators.ProductValidator;
12+
import org.springframework.beans.factory.annotation.Autowired;
813
import org.springframework.beans.factory.annotation.Value;
914
import org.springframework.boot.CommandLineRunner;
1015
import org.springframework.boot.SpringApplication;
@@ -49,6 +54,15 @@ public Validator orderValidator(){
4954
return new OrderValidator();
5055
}
5156

57+
@Bean
58+
@Autowired
59+
public Cache cacheObject(Jedis jedis){
60+
ObjectMapper om = new JacksonObjectMappper( new com.fasterxml.jackson.databind.ObjectMapper() );
61+
Cache cache = new RedisCache(om, jedis);
62+
return cache;
63+
}
64+
65+
5266
@Value("${redis.host}")
5367
private String redisHost;
5468
@Value("${redis.port}")
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package net.vatri.ecommerce.cache;
2+
3+
import java.util.Collection;
4+
5+
public interface Cache {
6+
7+
public Object getItem(String key, Class type);
8+
public Object setItem(String key, Object item);
9+
public void removeItem(String key, Object item);
10+
11+
public Collection<Object> getList(String key, Class type);
12+
public Collection<Object> addItemToList(String key, Object item);
13+
public Collection<Object> removeItemFromList(String key, Object item);
14+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package net.vatri.ecommerce.cache;
2+
3+
public class JacksonObjectMappper implements ObjectMapper{
4+
5+
private com.fasterxml.jackson.databind.ObjectMapper objectMapper;
6+
7+
public JacksonObjectMappper(com.fasterxml.jackson.databind.ObjectMapper objectMapper){
8+
this.objectMapper = objectMapper;
9+
}
10+
11+
@Override
12+
public String writeValueAsString(Object obj) {
13+
try {
14+
return objectMapper.writeValueAsString(obj);
15+
} catch (Exception e){
16+
return "";
17+
}
18+
}
19+
20+
@Override
21+
public Object readValue(String json, Class type) {
22+
try {
23+
return objectMapper.readValue(json, type);
24+
} catch (Exception e){
25+
return null;
26+
}
27+
}
28+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package net.vatri.ecommerce.cache;
2+
3+
public interface ObjectMapper {
4+
public String writeValueAsString(Object obj);
5+
public Object readValue(String json, Class type);
6+
}
Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package net.vatri.ecommerce.cache;
2+
3+
import org.springframework.beans.factory.annotation.Autowired;
4+
import redis.clients.jedis.Jedis;
5+
6+
import java.util.*;
7+
8+
public class RedisCache implements Cache{
9+
10+
private ObjectMapper objectMapper;
11+
private Jedis jedis;
12+
13+
public RedisCache(ObjectMapper objectMapper, Jedis jedis){
14+
this.objectMapper = objectMapper;
15+
this.jedis = jedis;
16+
}
17+
18+
public ObjectMapper getObjectMapper() {
19+
return objectMapper;
20+
}
21+
22+
public void setObjectMapper(ObjectMapper objectMapper) {
23+
this.objectMapper = objectMapper;
24+
}
25+
26+
public Jedis getJedis() {
27+
return jedis;
28+
}
29+
30+
public void setJedis(Jedis jedis) {
31+
this.jedis = jedis;
32+
}
33+
34+
@Override
35+
public Object getItem(String key, Class type) {
36+
String jsonObject = jedis.get(key);
37+
return objectMapper.readValue(jsonObject, type);
38+
}
39+
40+
@Override
41+
public Object setItem(String key, Object item) {
42+
String jsonItem = objectMapper.writeValueAsString(item);
43+
String out = jedis.set(key, jsonItem);
44+
45+
return objectMapper.readValue(out, Object.class);
46+
}
47+
48+
@Override
49+
public void removeItem(String key, Object item) {
50+
String jsonItem = objectMapper.writeValueAsString(item);
51+
jedis.del(key);
52+
}
53+
54+
@Override
55+
public Collection<Object> getList(String key, Class type) {
56+
return getListFromRedis(key, type);
57+
}
58+
59+
@Override
60+
public Collection<Object> addItemToList(String key, Object item) {
61+
String jsonItem = objectMapper.writeValueAsString(item);
62+
jedis.sadd(key, jsonItem);
63+
64+
return this.getListFromRedis(key, item.getClass());
65+
}
66+
67+
@Override
68+
public Collection<Object> removeItemFromList(String key, Object item) {
69+
getListFromRedis(key, item.getClass()).forEach( row -> {
70+
if(row == item){
71+
String jsonItem = objectMapper.writeValueAsString(item);
72+
jedis.srem(key, jsonItem);
73+
}
74+
});
75+
76+
return getListFromRedis(key, item.getClass());
77+
}
78+
79+
80+
private Collection<Object> getListFromRedis(String key, Class type){
81+
Collection<Object> list = new ArrayList<Object>();
82+
jedis.smembers(key).forEach(jsonItem -> {
83+
list.add(objectMapper.readValue(jsonItem, Object.class));
84+
});
85+
return list;
86+
}
87+
}

src/main/java/net/vatri/ecommerce/cart/CartServiceImpl.java

Lines changed: 17 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,24 @@
11
package net.vatri.ecommerce.cart;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
3+
import net.vatri.ecommerce.cache.Cache;
44
import net.vatri.ecommerce.models.Product;
55
import net.vatri.ecommerce.services.EcommerceService;
66
import org.springframework.beans.factory.annotation.Autowired;
77
import org.springframework.stereotype.Service;
8-
import redis.clients.jedis.Jedis;
98

109
import java.util.HashSet;
10+
import java.util.List;
1111
import java.util.Set;
1212
import java.util.UUID;
1313

1414
@Service
1515
public class CartServiceImpl implements CartService{
1616

17-
@Autowired
18-
private Jedis redis;
19-
2017
@Autowired
2118
private EcommerceService ecommerceService;
2219

2320
@Autowired
24-
private ObjectMapper objectMapper;
21+
private Cache cache;
2522

2623
@Override
2724
public String createNewCart() {
@@ -30,47 +27,27 @@ public String createNewCart() {
3027

3128
@Override
3229
public void addProduct(String cartId, CartItem cartItem) {
33-
34-
String itemJson = null;
35-
try {
36-
itemJson = objectMapper.writeValueAsString(cartItem);
37-
} catch (Exception e){
38-
System.out.println(e.getMessage());
39-
}
40-
System.out.println("Adding item:" + itemJson);
41-
redis.sadd(generateCartRedisId(cartId), itemJson);
30+
cache.addItemToList(cartId, cartItem);
4231
}
4332

4433
@Override
4534
public void removeProduct(String cartId, String productId) {
46-
Set<String> items = redis.smembers(generateCartRedisId(cartId));
47-
48-
items.forEach( jsonItem -> {
49-
CartItem cartItem = null;
50-
try{
51-
cartItem = objectMapper.readValue(jsonItem, CartItem.class);
52-
53-
if(cartItem.getProductId() == Long.parseLong(productId) ){
54-
redis.srem(generateCartRedisId(cartId), jsonItem );
55-
}
56-
} catch (Exception e){
57-
System.out.println(e.getMessage());
58-
}
59-
} );
35+
Product product = new Product();
36+
product.setId(Long.parseLong(productId));
37+
cache.removeItemFromList(cartId, product);
6038
}
6139

6240
@Override
6341
public void setProductQuantity(String cartId, String productId, int quantity){
64-
redis.smembers(generateCartRedisId(cartId)).forEach( jsonItem -> {
65-
CartItem cartItem = null;
66-
try{
67-
cartItem = objectMapper.readValue(jsonItem, CartItem.class);
6842

43+
List<CartItem> list = (List<CartItem>) cache.getItem(cartId, CartItem.class);
44+
45+
list.forEach( cartItem -> {
46+
try{
6947
if(cartItem.getProductId() == Long.parseLong(productId) ){
7048
cartItem.setQuantity( quantity );
71-
String newJsonItem = objectMapper.writeValueAsString(cartItem);
72-
redis.srem(generateCartRedisId(cartId), jsonItem );
73-
redis.sadd(generateCartRedisId(cartId), newJsonItem);
49+
cache.removeItemFromList(cartId, cartItem);
50+
cache.addItemToList(cartId, cartItem);
7451
}
7552
} catch (Exception e){
7653
System.out.println(e.getMessage());
@@ -80,32 +57,15 @@ public void setProductQuantity(String cartId, String productId, int quantity){
8057

8158
@Override
8259
public Set<CartItem> getItems(String cartId){
83-
84-
Set<CartItem> output = new HashSet<CartItem>();
85-
86-
redis.smembers(generateCartRedisId(cartId)).forEach( cartItemJson -> {
87-
// System.out.println("cartItemJson " + cartItemJson );
88-
try{
89-
CartItem item = objectMapper.readValue(cartItemJson, CartItem.class);
90-
output.add(item);
91-
} catch (Exception e){
92-
// System.out.println( "GetItems() ERROR: " + e.getMessage() );
93-
e.printStackTrace();
94-
}
95-
} );
96-
return output;
60+
return new HashSet<CartItem>( (List) cache.getList(cartId, CartItem.class));
9761
}
9862

9963
@Override
10064
public void createOrder(String cartId) {
101-
redis.smembers(generateCartRedisId(cartId)).forEach( cartItemJson -> {
10265

103-
CartItem cartItem = null;
104-
try{
105-
cartItem = objectMapper.readValue(cartItemJson, CartItem.class);
106-
} catch (Exception e){
107-
System.out.println(e.getMessage());
108-
}
66+
Set<CartItem> list = (Set) cache.getList(cartId, CartItem.class);
67+
68+
list.forEach(cartItem -> {
10969

11070
if (cartItem != null) {
11171
Product prod = ecommerceService.getProduct(cartItem.getProductId());

src/main/java/net/vatri/ecommerce/cart/CartController.java renamed to src/main/java/net/vatri/ecommerce/controllers/CartController.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
package net.vatri.ecommerce.cart;
1+
package net.vatri.ecommerce.controllers;
22

3+
import net.vatri.ecommerce.cart.CartItem;
4+
import net.vatri.ecommerce.cart.CartService;
35
import org.springframework.beans.factory.annotation.Autowired;
46
import org.springframework.web.bind.annotation.*;
57

@@ -26,7 +28,6 @@ public String addProduct(@PathVariable("id") String cartId, @RequestBody CartIte
2628

2729
@GetMapping("/{id}")
2830
public Set<CartItem> getCartItems(@PathVariable("id") String cartId){
29-
System.out.println("getting cart items. Cart id:"+cartId);
3031
return cartService.getItems(cartId);
3132
}
3233

src/main/java/net/vatri/ecommerce/services/UserDetailServiceImpl.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package net.vatri.ecommerce.services;
22

3+
import com.fasterxml.jackson.databind.ObjectMapper;
34
import net.vatri.ecommerce.models.User;
45
import net.vatri.ecommerce.repositories.UserRepository;
56
import org.springframework.beans.factory.annotation.Autowired;
@@ -9,6 +10,7 @@
910
import org.springframework.security.core.userdetails.UserDetailsService;
1011
import org.springframework.security.core.userdetails.UsernameNotFoundException;
1112
import org.springframework.stereotype.Service;
13+
import redis.clients.jedis.Jedis;
1214

1315
import java.util.HashSet;
1416
import java.util.Set;
@@ -19,6 +21,12 @@ public class UserDetailServiceImpl implements UserDetailsService {
1921
@Autowired
2022
private UserRepository userRepository;
2123

24+
@Autowired
25+
private Jedis redis;
26+
27+
@Autowired
28+
private ObjectMapper objectMapper;
29+
2230
@Override
2331
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
2432
User user = userRepository.findByEmail(s);
@@ -31,4 +39,19 @@ public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException
3139

3240
return new org.springframework.security.core.userdetails.User(user.getEmail(), user.getPassword(), grantedAuthorities);
3341
}
42+
/*
43+
* Get user from Redis
44+
* */
45+
private User getUserFromCache(String username){
46+
47+
String userJson = redis.get("user/"+username);
48+
User user = null;
49+
try{
50+
user = objectMapper.readValue(userJson, User.class);
51+
} catch (Exception e){
52+
System.out.println(e.getMessage());
53+
}
54+
55+
return user;
56+
}
3457
}

0 commit comments

Comments
 (0)