Skip to content

Commit 29836bb

Browse files
authored
Merge pull request #15 from CapstoneProjectCMC/profile-service/add-event
Profile service/add event
2 parents 5b79c70 + 595ca03 commit 29836bb

File tree

35 files changed

+1068
-206
lines changed

35 files changed

+1068
-206
lines changed
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package events.user;
2+
3+
import events.user.data.UserPayload;
4+
import lombok.AccessLevel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import lombok.experimental.FieldDefaults;
10+
11+
@Data
12+
@NoArgsConstructor
13+
@AllArgsConstructor
14+
@Builder
15+
@FieldDefaults(level = AccessLevel.PRIVATE)
16+
public class UserEvent {
17+
Type type;
18+
String id; // userId
19+
UserPayload payload; // null nếu DELETED
20+
21+
public enum Type { CREATED, UPDATED, DELETED, RESTORED }
22+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package events.user;
2+
3+
import events.user.data.UserPayload;
4+
import events.user.data.UserProfileCreationPayload;
5+
import lombok.AccessLevel;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Builder;
8+
import lombok.Data;
9+
import lombok.NoArgsConstructor;
10+
import lombok.experimental.FieldDefaults;
11+
12+
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Builder
16+
@FieldDefaults(level = AccessLevel.PRIVATE)
17+
public class UserRegisteredEvent {
18+
String id;
19+
UserPayload user;
20+
UserProfileCreationPayload profile;
21+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package events.user.data;
2+
3+
import lombok.AccessLevel;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import lombok.experimental.FieldDefaults;
9+
10+
import java.time.Instant;
11+
import java.util.Set;
12+
13+
@Data
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Builder
17+
@FieldDefaults(level = AccessLevel.PRIVATE)
18+
public class UserPayload {
19+
String userId; // id của identity -> dùng làm @Id trong profile
20+
String username;
21+
String email;
22+
boolean active; // enabled của identity
23+
24+
Set<String> roles; // ["ADMIN","USER",...]
25+
Instant createdAt;
26+
Instant updatedAt;
27+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package events.user.data;
2+
3+
import lombok.AccessLevel;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import lombok.experimental.FieldDefaults;
9+
10+
import java.time.Instant;
11+
12+
@Data
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@Builder
16+
@FieldDefaults(level = AccessLevel.PRIVATE)
17+
public class UserProfileCreationPayload {
18+
String firstName;
19+
String lastName;
20+
Instant dob;
21+
String bio;
22+
Boolean gender;
23+
String displayName;
24+
Integer education;
25+
String[] links;
26+
String city;
27+
}

identity-service/pom.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@
212212
<artifactId>spring-security-test</artifactId>
213213
<scope>test</scope>
214214
</dependency>
215+
216+
<dependency>
217+
<groupId>com.codecampus</groupId>
218+
<artifactId>common-events</artifactId>
219+
<version>${project.version}</version>
220+
</dependency>
215221
</dependencies>
216222

217223
<dependencyManagement>

identity-service/src/main/java/com/codecampus/identity/configuration/config/init/ApplicationInitializationService.java

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
package com.codecampus.identity.configuration.config.init;
22

3-
import com.codecampus.identity.dto.request.profile.UserProfileCreationRequest;
43
import com.codecampus.identity.entity.account.Role;
54
import com.codecampus.identity.entity.account.User;
5+
import com.codecampus.identity.mapper.kafka.UserPayloadMapper;
66
import com.codecampus.identity.repository.account.PermissionRepository;
77
import com.codecampus.identity.repository.account.RoleRepository;
88
import com.codecampus.identity.repository.account.UserRepository;
99
import com.codecampus.identity.repository.httpclient.profile.ProfileClient;
10+
import com.codecampus.identity.service.kafka.UserEventProducer;
1011
import com.codecampus.identity.utils.ConvertUtils;
12+
import events.user.data.UserProfileCreationPayload;
1113
import lombok.AccessLevel;
1214
import lombok.Builder;
1315
import lombok.RequiredArgsConstructor;
@@ -32,11 +34,19 @@ public class ApplicationInitializationService {
3234
RoleRepository roleRepository;
3335
PermissionRepository permissionRepository;
3436
UserRepository userRepository;
37+
3538
PasswordEncoder passwordEncoder;
3639
ProfileClient profileClient;
3740

41+
UserPayloadMapper userPayloadMapper;
42+
43+
UserEventProducer userEventProducer;
44+
3845
@Transactional
39-
void createAdminUser(String username, String password, String email) {
46+
void createAdminUser(
47+
String username,
48+
String password,
49+
String email) {
4050
Role adminRole = checkRoleAndCreate(ADMIN_ROLE);
4151

4252
Set<Role> roles = new HashSet<>();
@@ -50,9 +60,10 @@ void createAdminUser(String username, String password, String email) {
5060
.roles(roles)
5161
.build());
5262

53-
profileClient.internalCreateUserProfile(
54-
UserProfileCreationRequest.builder()
55-
.userId(user.getId())
63+
userEventProducer.publishCreatedUserEvent(user);
64+
65+
UserProfileCreationPayload payload =
66+
UserProfileCreationPayload.builder()
5667
.firstName("Admin")
5768
.lastName("Sys")
5869
.dob(ConvertUtils.parseDdMmYyyyToInstant("28/03/2004"))
@@ -63,8 +74,9 @@ void createAdminUser(String username, String password, String email) {
6374
.links(new String[] {"https://github.com/yunomix2834",
6475
"https://github.com/CapstoneProjectCMC/backend"})
6576
.city("Vietnam")
66-
.build()
67-
);
77+
.build();
78+
79+
userEventProducer.publishRegisteredUserEvent(user, payload);
6880
}
6981

7082
@Transactional
@@ -82,9 +94,10 @@ void createUser(String username, String password, String email) {
8294
.roles(roles)
8395
.build());
8496

85-
profileClient.internalCreateUserProfile(
86-
UserProfileCreationRequest.builder()
87-
.userId(user.getId())
97+
userEventProducer.publishCreatedUserEvent(user);
98+
99+
UserProfileCreationPayload payload =
100+
UserProfileCreationPayload.builder()
88101
.firstName("Code")
89102
.lastName("Campus")
90103
.dob(ConvertUtils.parseDdMmYyyyToInstant("28/03/2004"))
@@ -95,8 +108,9 @@ void createUser(String username, String password, String email) {
95108
.links(new String[] {"https://github.com/yunomix2834",
96109
"https://github.com/CapstoneProjectCMC/backend"})
97110
.city("Vietnam")
98-
.build()
99-
);
111+
.build();
112+
113+
userEventProducer.publishRegisteredUserEvent(user, payload);
100114
}
101115

102116
Role checkRoleAndCreate(String roleName) {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.codecampus.identity.configuration.kafka;
2+
3+
import lombok.AccessLevel;
4+
import lombok.RequiredArgsConstructor;
5+
import lombok.experimental.FieldDefaults;
6+
import org.apache.kafka.clients.producer.ProducerConfig;
7+
import org.apache.kafka.common.serialization.StringSerializer;
8+
import org.springframework.context.annotation.Bean;
9+
import org.springframework.context.annotation.Configuration;
10+
import org.springframework.core.env.Environment;
11+
import org.springframework.kafka.annotation.EnableKafka;
12+
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
13+
import org.springframework.kafka.core.KafkaTemplate;
14+
import org.springframework.kafka.core.ProducerFactory;
15+
16+
import java.util.HashMap;
17+
import java.util.Map;
18+
19+
@Configuration
20+
@EnableKafka
21+
@RequiredArgsConstructor
22+
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
23+
public class KafkaProducerConfig {
24+
Environment env;
25+
26+
@Bean
27+
public ProducerFactory<String, String> producerFactory() {
28+
Map<String, Object> props = new HashMap<>();
29+
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
30+
env.getProperty("spring.kafka.bootstrap-servers",
31+
"localhost:9092"));
32+
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
33+
StringSerializer.class);
34+
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
35+
StringSerializer.class);
36+
props.put(ProducerConfig.ACKS_CONFIG, "all");
37+
return new DefaultKafkaProducerFactory<>(props);
38+
}
39+
40+
@Bean
41+
public KafkaTemplate<String, String> kafkaTemplate(
42+
ProducerFactory<String, String> factory) {
43+
return new KafkaTemplate<>(factory);
44+
}
45+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package com.codecampus.identity.controller.authentication;
2+
3+
import com.codecampus.identity.dto.common.ApiResponse;
4+
import com.codecampus.identity.dto.request.authentication.ChangeEmailRequest;
5+
import com.codecampus.identity.dto.request.authentication.ChangeEmailVerifyRequest;
6+
import com.codecampus.identity.service.authentication.EmailChangeService;
7+
import lombok.AccessLevel;
8+
import lombok.Builder;
9+
import lombok.RequiredArgsConstructor;
10+
import lombok.experimental.FieldDefaults;
11+
import lombok.extern.slf4j.Slf4j;
12+
import org.springframework.web.bind.annotation.PostMapping;
13+
import org.springframework.web.bind.annotation.RequestBody;
14+
import org.springframework.web.bind.annotation.RequestMapping;
15+
import org.springframework.web.bind.annotation.RestController;
16+
17+
@RestController
18+
@RequiredArgsConstructor
19+
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
20+
@Builder
21+
@Slf4j
22+
@RequestMapping("/user/email")
23+
public class EmailChangeController {
24+
25+
EmailChangeService emailChangeService;
26+
27+
@PostMapping("/change/request")
28+
public ApiResponse<Void> request(
29+
@RequestBody ChangeEmailRequest changeEmailRequest) {
30+
emailChangeService.requestChangeEmail(changeEmailRequest);
31+
return ApiResponse.<Void>builder()
32+
.message("OTP đã gửi tới email mới")
33+
.build();
34+
}
35+
36+
@PostMapping("/change/verify")
37+
public ApiResponse<Void> verify(
38+
@RequestBody ChangeEmailVerifyRequest changeEmailVerifyRequest) {
39+
emailChangeService.verifyOtp(changeEmailVerifyRequest);
40+
emailChangeService.verifyOtp(changeEmailVerifyRequest);
41+
return ApiResponse.<Void>builder()
42+
.message("Đổi email thành công")
43+
.build();
44+
}
45+
}

identity-service/src/main/java/com/codecampus/identity/controller/authentication/UserController.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public class UserController {
3333

3434
@PreAuthorize("hasRole('ADMIN')")
3535
@PostMapping("/user")
36-
ApiResponse<UserResponse> createUser(
36+
ApiResponse<Void> createUser(
3737
@RequestBody @Valid UserCreationRequest request) {
38-
return ApiResponse.<UserResponse>builder()
39-
.result(userService.createUser(request))
38+
userService.createUser(request);
39+
return ApiResponse.<Void>builder()
4040
.message("Create User successful")
4141
.build();
4242
}
@@ -92,20 +92,20 @@ ApiResponse<String> deleteUser(
9292

9393
@PreAuthorize("hasRole('ADMIN')")
9494
@PutMapping("/user/{userId}")
95-
ApiResponse<UserResponse> updateUser(
95+
ApiResponse<Void> updateUser(
9696
@PathVariable("userId") String userId,
9797
@RequestBody UserUpdateRequest request) {
98-
return ApiResponse.<UserResponse>builder()
99-
.result(userService.updateUser(userId, request))
98+
userService.updateUserById(userId, request);
99+
return ApiResponse.<Void>builder()
100100
.message("Update User successful")
101101
.build();
102102
}
103103

104104
@PutMapping("/user/my-info")
105-
ApiResponse<UserResponse> updateMyInfo(
105+
ApiResponse<Void> updateMyInfo(
106106
UserUpdateRequest request) {
107-
return ApiResponse.<UserResponse>builder()
108-
.result(userService.updateMyInfo(request))
107+
userService.updateMyInfo(request);
108+
return ApiResponse.<Void>builder()
109109
.message("Update My Info successful")
110110
.build();
111111
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package com.codecampus.identity.dto.request.authentication;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
7+
@Data
8+
@NoArgsConstructor
9+
@AllArgsConstructor
10+
public class ChangeEmailRequest {
11+
String newEmail;
12+
}

0 commit comments

Comments
 (0)