Skip to content

Commit 9fa0f03

Browse files
Added Caching for findByEmail and fixed the bug with email uniquness (#102)
* Base code for caching and improvign login at user. * Added Caching using redis and fix bug with email uniquness * Added log messages * Added REDIS_URL in env --------- Co-authored-by: Ahmed Elwasefi <a.m.elwasefi@gmail.com>
1 parent 1f6230c commit 9fa0f03

File tree

11 files changed

+64
-3
lines changed

11 files changed

+64
-3
lines changed

services/users/.env

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ USERS_SECRET_KEY=j4#BbFGfoc^2k*Bz
55

66
ADMIN_EMAIL=admin@workup.com
77
ADMIN_PASSWORD=admin
8-
ADMIN_ID=admin
8+
ADMIN_ID=admin
9+
10+
REDIS_URL=service_redis
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.workup.users;
2+
3+
import org.springframework.context.annotation.Configuration;
4+
import org.springframework.context.annotation.Import;
5+
6+
@Configuration
7+
@Import(com.workup.shared.redis.RedisConfig.class)
8+
public class RedisConfig {}

services/users/src/main/java/com/workup/users/UsersApplication.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,14 @@
1111
import org.springframework.amqp.support.converter.MessageConverter;
1212
import org.springframework.boot.SpringApplication;
1313
import org.springframework.boot.autoconfigure.SpringBootApplication;
14+
import org.springframework.cache.annotation.EnableCaching;
1415
import org.springframework.context.annotation.Bean;
1516
import org.springframework.scheduling.annotation.EnableAsync;
1617
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
1718

1819
@SpringBootApplication
1920
@EnableAsync
21+
@EnableCaching
2022
// @EnableMongoRepositories(basePackageClasses = ClientRepository.class)
2123
public class UsersApplication {
2224

services/users/src/main/java/com/workup/users/commands/ClientRegisterCommand.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,16 @@ public SignUpAndInResponse Run(ClientRegisterRequest request) {
2727
.build();
2828
}
2929
try {
30+
// check if registered already as freelancer
31+
if (freelancerRepository.findByEmail(request.getEmail()).isPresent()) {
32+
logger.error(
33+
"[x] User with email" + request.getEmail() + " already registered as freelancer");
34+
return SignUpAndInResponse.builder()
35+
.withStatusCode(HttpStatusCode.BAD_REQUEST)
36+
.withSuccess(false)
37+
.withErrorMessage("User already registered as freelancer")
38+
.build();
39+
}
3040
Client client =
3141
Client.builder()
3242
.withEmail(request.getEmail())

services/users/src/main/java/com/workup/users/commands/FreelancerRegisterCommand.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,15 @@ public SignUpAndInResponse Run(FreelancerRegisterRequest request) {
3030
.build();
3131
}
3232
try {
33+
// check if registered already as client
34+
if (clientRepository.findByEmail(request.getEmail()).isPresent()) {
35+
logger.error("[x] User with email" + request.getEmail() + " already registered as client");
36+
return SignUpAndInResponse.builder()
37+
.withStatusCode(HttpStatusCode.BAD_REQUEST)
38+
.withSuccess(false)
39+
.withErrorMessage("User already registered as client")
40+
.build();
41+
}
3342
Freelancer freelancer =
3443
Freelancer.builder()
3544
.withEmail(request.getEmail())
@@ -58,6 +67,7 @@ public SignUpAndInResponse Run(FreelancerRegisterRequest request) {
5867
logger.error("[x] Error Registering Freelancer: " + e.getMessage());
5968
return SignUpAndInResponse.builder()
6069
.withStatusCode(HttpStatusCode.INTERNAL_SERVER_ERROR)
70+
.withErrorMessage(e.getMessage())
6171
.withSuccess(false)
6272
.build();
6373
}

services/users/src/main/java/com/workup/users/db/Client.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.workup.users.db;
22

3+
import java.io.Serializable;
34
import java.util.Date;
45
import lombok.Builder;
56
import lombok.Getter;
@@ -13,7 +14,7 @@
1314
@Getter
1415
@Setter
1516
@Document
16-
public class Client {
17+
public class Client implements Serializable {
1718
@Id private ObjectId id;
1819

1920
@Indexed(unique = true)

services/users/src/main/java/com/workup/users/db/Freelancer.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.workup.users.db;
22

3+
import java.io.Serializable;
34
import java.util.Date;
45
import java.util.List;
56
import lombok.Builder;
@@ -15,7 +16,7 @@
1516
@Getter
1617
@Setter
1718
@Document(collection = "Freelancer")
18-
public class Freelancer {
19+
public class Freelancer implements Serializable {
1920
@Id private ObjectId id;
2021

2122
@Indexed(unique = true)

services/users/src/main/java/com/workup/users/repositories/ClientRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
import com.workup.users.db.Client;
44
import java.util.Optional;
5+
import org.springframework.cache.annotation.CacheEvict;
6+
import org.springframework.cache.annotation.Cacheable;
57
import org.springframework.data.mongodb.repository.MongoRepository;
68

79
public interface ClientRepository extends MongoRepository<Client, String> {
810
// find by clientEmail
11+
@Cacheable(value = "clients", key = "#email")
912
Optional<Client> findByEmail(String email);
13+
14+
@CacheEvict(value = "clients", key = "#entity.email")
15+
<S extends Client> S save(S entity);
1016
}

services/users/src/main/java/com/workup/users/repositories/FreelancerRepository.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@
22

33
import com.workup.users.db.Freelancer;
44
import java.util.Optional;
5+
import org.springframework.cache.annotation.CacheEvict;
6+
import org.springframework.cache.annotation.Cacheable;
57
import org.springframework.data.mongodb.repository.MongoRepository;
68

79
public interface FreelancerRepository extends MongoRepository<Freelancer, String> {
810
// find by freelancerEmail
11+
@Cacheable(value = "freelancers", key = "#email")
912
Optional<Freelancer> findByEmail(String email);
13+
14+
@CacheEvict(value = "freelancers", key = "#entity.email")
15+
<S extends Freelancer> S save(S entity);
1016
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
spring.data.mongodb.uri=${USERS_DB_URI}
22
spring.data.mongodb.database=mydatabase
3+
spring.data.mongodb.auto-index-creation=true
34

45
spring.rabbitmq.host=${USERS_MQ_HOST}
56
spring.rabbitmq.port=5672
67
spring.rabbitmq.username=guest
78
spring.rabbitmq.password=guest
89
SECRET_KEY=${USERS_SECRET_KEY}
10+
11+
spring.cache.type=redis
12+
spring.cache.host=${REDIS_URL}
13+
spring.cache.port=6379
14+
spring.cache.redis.time-to-live=60000

services/users/src/test/java/com/workup/users/UsersApplicationTests.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.springframework.context.annotation.Import;
2828
import org.springframework.test.context.DynamicPropertyRegistry;
2929
import org.springframework.test.context.DynamicPropertySource;
30+
import org.testcontainers.containers.GenericContainer;
3031
import org.testcontainers.containers.MongoDBContainer;
3132
import org.testcontainers.containers.RabbitMQContainer;
3233
import org.testcontainers.junit.jupiter.Container;
@@ -45,6 +46,11 @@ class UsersApplicationTests {
4546
static final MongoDBContainer mongoDBContainer =
4647
new MongoDBContainer("mongo:7.0").withExposedPorts(27017);
4748

49+
// redis container
50+
@Container
51+
static final GenericContainer redisContainer =
52+
new GenericContainer("redis:7.2.4").withExposedPorts(6379);
53+
4854
@Autowired private AmqpTemplate template;
4955
@Autowired private ClientRepository paymentRequestRepository;
5056
@Autowired private ExperienceRepository experienceRepository;
@@ -78,6 +84,9 @@ static void setDatasourceProperties(DynamicPropertyRegistry registry) {
7884
registry.add("spring.rabbitmq.port", rabbitMQContainer::getFirstMappedPort);
7985
registry.add("spring.rabbitmq.username", rabbitMQContainer::getAdminUsername);
8086
registry.add("spring.rabbitmq.password", rabbitMQContainer::getAdminPassword);
87+
// add redis properties
88+
registry.add("spring.cache.host", redisContainer::getHost);
89+
registry.add("spring.cache.port", redisContainer::getFirstMappedPort);
8190
}
8291

8392
@Test

0 commit comments

Comments
 (0)