Skip to content

Commit 25c72ec

Browse files
authored
Merge pull request #130 from My-Medi/develop
Merge to main from develop
2 parents 624ea3a + 90645cb commit 25c72ec

12 files changed

Lines changed: 65 additions & 22 deletions

File tree

src/main/java/com/my_medi/api/common/service/SseService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,9 @@
55

66
public interface SseService {
77

8-
SseEmitter connectUser(Long userId);
8+
SseEmitter connectUser(String userUsername);
99

10-
SseEmitter connectExpert(Long expertId);
10+
SseEmitter connectExpert(String expertUsername);
1111

1212
void sendToUser(Long userId, Object notification);
1313

src/main/java/com/my_medi/api/common/service/SseServiceImpl.java

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,14 @@ public class SseServiceImpl implements SseService{
1919
@Qualifier("expertEmitters")
2020
private final Map<String, SseEmitter> expertEmitters;
2121
@Override
22-
public SseEmitter connectUser(Long userId) {
23-
String key = "user_" + userId;
22+
public SseEmitter connectUser(String userUsername) {
23+
String key = "user_" + userUsername;
2424
SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);
2525

2626
emitter.onCompletion(() -> userEmitters.remove(key));
2727
emitter.onTimeout(() -> userEmitters.remove(key));
2828
emitter.onError((e) -> {
29-
log.error("SSE error for user {}: {}", userId, e.getMessage());
29+
log.error("SSE error for user {}: {}", userUsername, e.getMessage());
3030
userEmitters.remove(key);
3131
});
3232

@@ -38,7 +38,7 @@ public SseEmitter connectUser(Long userId) {
3838
.name("connected")
3939
.data("SSE 연결이 성공했습니다"));
4040
} catch (IOException e) {
41-
log.error("Failed to send connection message to user {}", userId, e);
41+
log.error("Failed to send connection message to user {}", userUsername, e);
4242
userEmitters.remove(key);
4343
emitter.completeWithError(e);
4444
}
@@ -47,14 +47,14 @@ public SseEmitter connectUser(Long userId) {
4747
}
4848

4949
@Override
50-
public SseEmitter connectExpert(Long expertId) {
51-
String key = "expert_" + expertId;
50+
public SseEmitter connectExpert(String expertUsername) {
51+
String key = "expert_" + expertUsername;
5252
SseEmitter emitter = new SseEmitter(Long.MAX_VALUE);
5353

5454
emitter.onCompletion(() -> expertEmitters.remove(key));
5555
emitter.onTimeout(() -> expertEmitters.remove(key));
5656
emitter.onError((e) -> {
57-
log.error("SSE error for expert {}: {}", expertId, e.getMessage());
57+
log.error("SSE error for expert {}: {}", expertUsername, e.getMessage());
5858
expertEmitters.remove(key);
5959
});
6060

@@ -65,7 +65,7 @@ public SseEmitter connectExpert(Long expertId) {
6565
.name("connected")
6666
.data("SSE 연결이 성공했습니다"));
6767
} catch (IOException e) {
68-
log.error("Failed to send connection message to expert {}", expertId, e);
68+
log.error("Failed to send connection message to expert {}", expertUsername, e);
6969
expertEmitters.remove(key);
7070
emitter.completeWithError(e);
7171
}

src/main/java/com/my_medi/api/expert/controller/ExpertApiController.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import com.my_medi.domain.expert.service.ExpertCommandService;
1212
import io.swagger.v3.oas.annotations.Operation;
1313
import io.swagger.v3.oas.annotations.tags.Tag;
14+
import jakarta.validation.Valid;
1415
import lombok.RequiredArgsConstructor;
1516
import org.springframework.web.bind.annotation.*;
1617

@@ -24,7 +25,7 @@ public class ExpertApiController {
2425

2526
@Operation(summary = "전문가 계정을 생성합니다.[회원가입 플로우 전문가 ver.]")
2627
@PostMapping
27-
public ApiResponseDto<Long> registerExpertAccount(@RequestBody RegisterExpertDto registerExpertDto) {
28+
public ApiResponseDto<Long> registerExpertAccount(@RequestBody @Valid RegisterExpertDto registerExpertDto) {
2829
return ApiResponseDto.onSuccess(expertCommandService.registerExpert(registerExpertDto));
2930
}
3031

src/main/java/com/my_medi/api/expert/dto/RegisterExpertDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.my_medi.api.licenseImage.dto.LicenseImageRequestDto;
55
import com.my_medi.api.member.dto.RegisterMemberDto;
66
import com.my_medi.domain.expert.entity.Specialty;
7+
import jakarta.validation.Valid;
78
import lombok.AllArgsConstructor;
89
import lombok.Builder;
910
import lombok.Data;
@@ -20,6 +21,7 @@
2021
public class RegisterExpertDto {
2122

2223
// 회원 공통 정보
24+
@Valid
2325
private RegisterMemberDto member;
2426

2527
// Expert 정보

src/main/java/com/my_medi/api/expertNotification/controller/ExpertNotificationApiController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.springframework.data.domain.Page;
1818
import org.springframework.http.HttpStatus;
1919
import org.springframework.http.MediaType;
20+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
21+
import org.springframework.security.core.userdetails.UserDetails;
2022
import org.springframework.web.bind.annotation.*;
2123
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
2224

@@ -64,7 +66,7 @@ public ApiResponseDto<Void> deleteExpertNotifications(@RequestParam List<Long> n
6466

6567
@Operation(summary = "사용자 알림 실시간 조회를 위해 sse 연결을 합니다.")
6668
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
67-
public SseEmitter linkExpertAtSse(@AuthExpert Expert expert) {
68-
return sseService.connectExpert(expert.getId());
69+
public SseEmitter linkExpertAtSse(@AuthenticationPrincipal UserDetails userDetails) {
70+
return sseService.connectExpert(userDetails.getUsername());
6971
}
7072
}

src/main/java/com/my_medi/api/member/dto/RegisterMemberDto.java

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

33
import com.my_medi.domain.member.entity.Gender;
44
import com.my_medi.domain.member.entity.Role;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import jakarta.validation.constraints.Email;
7+
import jakarta.validation.constraints.NotBlank;
8+
import jakarta.validation.constraints.NotNull;
9+
import jakarta.validation.constraints.Pattern;
510
import lombok.Builder;
611
import lombok.Data;
712

@@ -10,14 +15,39 @@
1015
@Data
1116
@Builder
1217
public class RegisterMemberDto {
18+
@NotNull(message = "성명을 입력하세요.")
1319
private String name;
20+
21+
@NotBlank(message = "생년월일은 필수입니다.")
22+
@Pattern(
23+
regexp = "^(\\d{6})$", //숫자 6자리 고정
24+
message = "생년월일은 yymmdd 형식의 6자리 숫자여야 합니다. (예: 970101)"
25+
)
26+
@Schema(example = "000102")
1427
private String birthDate;
28+
29+
@NotNull(message = "성별은 필수입니다.")
1530
private Gender gender;
31+
32+
@NotBlank(message = "닉네임은 필수입니다.")
1633
private String nickname;
34+
35+
@NotBlank(message = "이메일은 필수입니다.")
36+
@Email(message = "이메일 형식이 아닙니다.")
1737
private String email;
38+
39+
@NotBlank(message = "전화번호는 필수입니다.")
40+
@Schema(example = "01012345678")
41+
@Pattern(
42+
regexp = "^(01[016789])[-]?\\d{3,4}[-]?\\d{4}$", // 010-1234-5678 또는 01012345678 허용
43+
message = "전화번호 형식이 올바르지 않습니다."
44+
)
1845
private String phoneNumber;
46+
1947
private String profileImgUrl;
48+
2049
private String loginId;
50+
2151
private String password;
2252

2353

src/main/java/com/my_medi/api/user/controller/UserApiController.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import io.swagger.v3.oas.annotations.Operation;
1919
import io.swagger.v3.oas.annotations.tags.Tag;
2020

21+
import jakarta.validation.Valid;
2122
import lombok.RequiredArgsConstructor;
2223
import org.springframework.web.bind.annotation.*;
2324

@@ -30,11 +31,10 @@ public class UserApiController {
3031

3132
private final UserCommandService userCommandService;
3233
private final ReportQueryService reportQueryService;
33-
private final ExpertQueryService expertQueryService;
3434

3535
@Operation(summary = "사용자 계정을 생성합니다.")
3636
@PostMapping
37-
public ApiResponseDto<Long> registerUserAccount(@RequestBody RegisterMemberDto registerMemberDto) {
37+
public ApiResponseDto<Long> registerUserAccount(@RequestBody @Valid RegisterMemberDto registerMemberDto) {
3838
return ApiResponseDto.onSuccess(userCommandService.registerUser(registerMemberDto));
3939
}
4040

src/main/java/com/my_medi/api/userNotification/controller/UserNotificationApiController.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.springframework.data.domain.Page;
1818
import org.springframework.http.HttpStatus;
1919
import org.springframework.http.MediaType;
20+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
21+
import org.springframework.security.core.userdetails.UserDetails;
2022
import org.springframework.web.bind.annotation.*;
2123
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
2224

@@ -67,7 +69,7 @@ public ApiResponseDto<Void> deleteUserNotifications(@RequestParam(required = fal
6769

6870
@Operation(summary = "사용자 알림 실시간 조회를 위해 sse 연결을 합니다.")
6971
@GetMapping(value = "/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
70-
public SseEmitter linkUserAtSse(@AuthUser User user) {
71-
return sseService.connectUser(user.getId());
72+
public SseEmitter linkUserAtSse(@AuthenticationPrincipal UserDetails userDetails) {
73+
return sseService.connectUser(userDetails.getUsername());
7274
}
7375
}

src/main/java/com/my_medi/domain/member/entity/Member.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,14 @@ public abstract class Member extends BaseTimeEntity implements UserDetails {
5858
private String nickname;
5959

6060
//이메일
61-
// TODO: email, password : 검증 어노테이션, presentation(web 혹은 api) 레이어에 좀 더 적합하므로 추후 수정
6261
@Column(name = "email", nullable = false, unique = true)
6362
private String email;
6463

64+
//아이디 : 소문자, 대문자, 특수문자 포함 8글자 이상
6565
@Column(name = "login_id", unique = true)
6666
private String loginId;
6767

68+
//비밀번호 : 소문자, 대문자, 특수문자 포함 8글자 이상
6869
private String password;
6970

7071
//연락처

src/main/java/com/my_medi/security/config/SecurityConfig.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ private String[] permitAllGetPaths() {
8888
"/api/v1/test/health-check",
8989
"/api/v1/examples/user",
9090
"/api/v1/examples/global",
91-
"/api/v1/tokens/**"
91+
"/api/v1/tokens/**",
92+
"/actuator/**"
9293
};
9394
}
9495

0 commit comments

Comments
 (0)