Skip to content

Commit 595ca03

Browse files
committed
Add Profile
1 parent 23e8aef commit 595ca03

File tree

9 files changed

+202
-39
lines changed

9 files changed

+202
-39
lines changed

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) {

identity-service/src/main/java/com/codecampus/identity/mapper/authentication/UserMapper.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@
1313
@Mapper(componentModel = "spring",
1414
nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
1515
public interface UserMapper {
16-
User toUser(UserCreationRequest userCreationRequest);
16+
User toUserFromUserCreationRequest(UserCreationRequest userCreationRequest);
1717

1818
@Mapping(target = "userId", ignore = true)
19-
UserProfileCreationRequest toUserProfileCreationRequest(
20-
UserCreationRequest req);
19+
UserProfileCreationRequest toUserProfileCreationRequestFromUserCreationRequest(
20+
UserCreationRequest userCreationRequest);
2121

22-
UserResponse toUserResponse(User user);
22+
UserResponse toUserResponseFromUser(
23+
User user);
2324

2425
@Mapping(target = "roles", ignore = true)
25-
void updateUser(
26+
void updateUserUpdateRequestToUser(
2627
@MappingTarget User user,
2728
UserUpdateRequest userUpdateRequest
2829
);

identity-service/src/main/java/com/codecampus/identity/mapper/kafka/UserPayloadMapper.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.codecampus.identity.mapper.kafka;
22

3+
import com.codecampus.identity.dto.request.authentication.UserCreationRequest;
34
import com.codecampus.identity.entity.account.Role;
45
import com.codecampus.identity.entity.account.User;
56
import events.user.data.UserPayload;
7+
import events.user.data.UserProfileCreationPayload;
68
import org.mapstruct.Mapper;
79

810
import java.time.Instant;
@@ -11,6 +13,9 @@
1113
@Mapper(componentModel = "spring")
1214
public interface UserPayloadMapper {
1315

16+
UserProfileCreationPayload toUserProfileCreationPayloadFromUserCreationRequest(
17+
UserCreationRequest userCreationRequest);
18+
1419
default UserPayload toUserPayloadFromUser(User user) {
1520
return UserPayload.builder()
1621
.userId(user.getId())

identity-service/src/main/java/com/codecampus/identity/service/account/UserService.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,13 @@
1313
import com.codecampus.identity.helper.ProfileSyncHelper;
1414
import com.codecampus.identity.mapper.authentication.UserMapper;
1515
import com.codecampus.identity.mapper.client.UserProfileMapper;
16+
import com.codecampus.identity.mapper.kafka.UserPayloadMapper;
1617
import com.codecampus.identity.repository.account.RoleRepository;
1718
import com.codecampus.identity.repository.account.UserRepository;
1819
import com.codecampus.identity.repository.httpclient.profile.ProfileClient;
1920
import com.codecampus.identity.service.authentication.OtpService;
2021
import com.codecampus.identity.service.kafka.UserEventProducer;
22+
import events.user.data.UserProfileCreationPayload;
2123
import lombok.AccessLevel;
2224
import lombok.Builder;
2325
import lombok.RequiredArgsConstructor;
@@ -63,6 +65,7 @@ public class UserService {
6365

6466
UserMapper userMapper;
6567
UserProfileMapper userProfileMapper;
68+
UserPayloadMapper userPayloadMapper;
6669

6770
PasswordEncoder passwordEncoder;
6871
ProfileClient profileClient;
@@ -91,9 +94,8 @@ public void createUser(UserCreationRequest request) {
9194
request.getEmail()
9295
);
9396

94-
User user = userMapper.toUser(request);
97+
User user = userMapper.toUserFromUserCreationRequest(request);
9598
user.setPassword(passwordEncoder.encode(user.getPassword()));
96-
9799
HashSet<Role> roles = new HashSet<>();
98100
roleRepository.findById(USER_ROLE)
99101
.ifPresent(roles::add);
@@ -103,6 +105,11 @@ public void createUser(UserCreationRequest request) {
103105
try {
104106
user = userRepository.save(user);
105107
userEventProducer.publishCreatedUserEvent(user);
108+
UserProfileCreationPayload profilePayload =
109+
userPayloadMapper.toUserProfileCreationPayloadFromUserCreationRequest(
110+
request);
111+
userEventProducer.publishRegisteredUserEvent(
112+
user, profilePayload);
106113
} catch (DataIntegrityViolationException e) {
107114
throw new AppException(ErrorCode.USER_ALREADY_EXISTS);
108115
}
@@ -170,7 +177,7 @@ public void updateMyInfo(
170177
private void updateUser(
171178
UserUpdateRequest request,
172179
User user) {
173-
userMapper.updateUser(user, request);
180+
userMapper.updateUserUpdateRequestToUser(user, request);
174181
user.setPassword(passwordEncoder.encode(user.getPassword()));
175182

176183
// List<Role> roles = roleRepository.findAllById(request.getRoles());
@@ -197,6 +204,19 @@ public void deleteUser(String userId) {
197204
userEventProducer.publishDeletedUserEvent(user);
198205
}
199206

207+
@PreAuthorize("hasRole('ADMIN')")
208+
@Transactional
209+
public void restoreUser(String userId) {
210+
User user = userRepository.findById(userId)
211+
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
212+
if (user.getDeletedAt() != null) {
213+
user.setDeletedAt(null);
214+
user.setDeletedBy(null);
215+
userRepository.save(user);
216+
userEventProducer.publishRestoredUserEvent(user);
217+
}
218+
}
219+
200220
/**
201221
* Lấy danh sách người dùng với phân trang.
202222
*
@@ -212,7 +232,7 @@ public PageResponse<UserResponse> getUsers(
212232
Pageable pageable = PageRequest.of(page - 1, size);
213233
Page<UserResponse> pageData = userRepository
214234
.findAll(pageable)
215-
.map(userMapper::toUserResponse);
235+
.map(userMapper::toUserResponseFromUser);
216236

217237
return toPageResponse(pageData, page);
218238
}
@@ -225,7 +245,7 @@ public PageResponse<UserResponse> getUsers(
225245
* @throws AppException nếu không tìm thấy
226246
*/
227247
public UserResponse getUser(String userId) {
228-
return userMapper.toUserResponse(
248+
return userMapper.toUserResponseFromUser(
229249
userRepository.findById(userId)
230250
.orElseThrow(() -> new AppException(
231251
ErrorCode.USER_NOT_FOUND))

identity-service/src/main/java/com/codecampus/identity/service/authentication/AuthenticationService.java

Lines changed: 19 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,8 @@
1616
import com.codecampus.identity.exception.AppException;
1717
import com.codecampus.identity.exception.ErrorCode;
1818
import com.codecampus.identity.helper.AuthenticationHelper;
19-
import com.codecampus.identity.helper.ProfileSyncHelper;
2019
import com.codecampus.identity.mapper.authentication.UserMapper;
20+
import com.codecampus.identity.mapper.kafka.UserPayloadMapper;
2121
import com.codecampus.identity.repository.account.InvalidatedTokenRepository;
2222
import com.codecampus.identity.repository.account.RoleRepository;
2323
import com.codecampus.identity.repository.account.UserRepository;
@@ -34,6 +34,7 @@
3434
import com.nimbusds.jose.crypto.MACVerifier;
3535
import com.nimbusds.jwt.JWTClaimsSet;
3636
import com.nimbusds.jwt.SignedJWT;
37+
import events.user.data.UserProfileCreationPayload;
3738
import lombok.AccessLevel;
3839
import lombok.RequiredArgsConstructor;
3940
import lombok.experimental.FieldDefaults;
@@ -85,13 +86,13 @@ public class AuthenticationService {
8586
OtpService otpService;
8687

8788
UserMapper userMapper;
89+
UserPayloadMapper userPayloadMapper;
8890

8991
PasswordEncoder passwordEncoder;
9092

9193
OutboundGoogleIdentityClient outboundGoogleIdentityClient;
9294
OutboundGoogleUserClient outboundGoogleUserClient;
9395
AuthenticationHelper authenticationHelper;
94-
ProfileSyncHelper profileSyncHelper;
9596
UserEventProducer userEventProducer;
9697

9798
@NonFinal
@@ -192,6 +193,11 @@ public AuthenticationResponse outboundGoogleLogin(
192193
.build();
193194

194195
userEventProducer.publishCreatedUserEvent(newUser);
196+
UserProfileCreationPayload profilePayload =
197+
userPayloadMapper.toUserProfileCreationPayloadFromUserCreationRequest(
198+
googleRequest);
199+
userEventProducer.publishRegisteredUserEvent(newUser,
200+
profilePayload);
195201
return newUser;
196202
}
197203
);
@@ -267,18 +273,22 @@ public void register(UserCreationRequest request) {
267273
);
268274

269275
// Tạo user nhưng chưa kích hoạt
270-
User user = userMapper.toUser(request);
276+
User user = userMapper.toUserFromUserCreationRequest(request);
271277
user.setPassword(passwordEncoder.encode(user.getPassword()));
272278
user.setEnabled(false); // Chưa kích hoạt
273-
274-
// Gán role mặc định
275-
HashSet<Role> roles = new HashSet<>();
276-
roleRepository.findById(USER_ROLE).ifPresent(roles::add);
277-
user.setRoles(roles);
279+
user.setRoles(new HashSet<>());
280+
roleRepository.findById(USER_ROLE)
281+
.ifPresent(r -> user.getRoles().add(r));
278282

279283
try {
280284
userRepository.save(user);
281-
profileSyncHelper.createProfile(user, request);
285+
// Sự kiện định danh
286+
userEventProducer.publishCreatedUserEvent(user);
287+
// Sự kiện khởi tạo profile giàu dữ liệu
288+
var profilePayload =
289+
userPayloadMapper.toUserProfileCreationPayloadFromUserCreationRequest(
290+
request);
291+
userEventProducer.publishRegisteredUserEvent(user, profilePayload);
282292
} catch (DataIntegrityViolationException e) {
283293
throw new AppException(ErrorCode.USER_ALREADY_EXISTS);
284294
}

identity-service/src/main/java/com/codecampus/identity/service/kafka/UserEventProducer.java

Lines changed: 41 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import com.fasterxml.jackson.core.JsonProcessingException;
66
import com.fasterxml.jackson.databind.ObjectMapper;
77
import events.user.UserEvent;
8+
import events.user.UserRegisteredEvent;
9+
import events.user.data.UserProfileCreationPayload;
810
import lombok.AccessLevel;
911
import lombok.RequiredArgsConstructor;
1012
import lombok.experimental.FieldDefaults;
@@ -20,14 +22,17 @@
2022
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
2123
public class UserEventProducer {
2224

23-
@Value("${app.event.user-events}")
24-
@NonFinal
25-
static String USER_EVENTS_TOPIC;
26-
2725
KafkaTemplate<String, String> kafkaTemplate;
2826
ObjectMapper objectMapper;
2927
UserPayloadMapper userPayloadMapper;
3028

29+
@NonFinal
30+
@Value("${app.event.user-registrations}")
31+
String USER_REGISTRATIONS_TOPIC;
32+
@Value("${app.event.user-events}")
33+
@NonFinal
34+
String USER_EVENTS_TOPIC;
35+
3136
public void publishCreatedUserEvent(
3237
User user) {
3338
publishEvent(UserEvent.Type.CREATED, user);
@@ -41,6 +46,10 @@ public void publishDeletedUserEvent(User user) {
4146
publishEvent(UserEvent.Type.DELETED, user);
4247
}
4348

49+
public void publishRestoredUserEvent(User user) {
50+
publishEvent(UserEvent.Type.RESTORED, user);
51+
}
52+
4453
void publishEvent(
4554
UserEvent.Type type,
4655
User user) {
@@ -52,13 +61,38 @@ void publishEvent(
5261
user))
5362
.build();
5463

64+
sendEvent(USER_EVENTS_TOPIC,
65+
user.getId(),
66+
userEvent
67+
);
68+
}
69+
70+
public void publishRegisteredUserEvent(
71+
User user,
72+
UserProfileCreationPayload profilePayload) {
73+
UserRegisteredEvent userRegisteredEvent = UserRegisteredEvent.builder()
74+
.id(user.getId())
75+
.user(userPayloadMapper.toUserPayloadFromUser(user))
76+
.profile(profilePayload)
77+
.build();
78+
79+
sendEvent(USER_REGISTRATIONS_TOPIC,
80+
user.getId(),
81+
userRegisteredEvent
82+
);
83+
}
84+
85+
private void sendEvent(
86+
String topic,
87+
String key,
88+
Object event) {
5589
try {
5690
String jsonObject = objectMapper.writeValueAsString(
57-
userEvent);
91+
event);
5892

5993
kafkaTemplate.send(
60-
USER_EVENTS_TOPIC,
61-
user.getId(),
94+
topic,
95+
key,
6296
jsonObject);
6397
} catch (JsonProcessingException exception) {
6498
log.error("[Kafka] Serialize thất bại", exception);

identity-service/src/main/resources/application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,4 +65,5 @@ app:
6565
redirect-uri: "http://localhost:4200/auth/identity/authenticate"
6666
event:
6767
user-events: "user-events"
68+
user-registrations: "user-registrations"
6869

profile-service/src/main/java/com/codecampus/profile/service/kafka/UserEventListener.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public class UserEventListener {
2525
UserProfileRepository userProfileRepository;
2626
ObjectMapper objectMapper;
2727

28-
@KafkaListener(topics = "user-events",
28+
@KafkaListener(topics = "${app.event.user-events}",
2929
groupId = "profile-service"
3030
)
3131
public void onMessageUser(String raw) {

0 commit comments

Comments
 (0)