Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
5e6551b
Feat : (Domain) 관심사 비즈니스 로직 구현(#63)
uoo6uoow May 18, 2025
9a8d7b4
Refactor : (Domain) 컨트롤러 응답 형태 변경(#63)
uoo6uoow May 18, 2025
bc1d9a0
Refactor : (Domain) 엔티티 간 잘못된 참조 관계 수정(#63)
uoo6uoow May 18, 2025
1219093
Refactor : (Domain) 관심사 수정 메서드 최적화(#63)
uoo6uoow May 18, 2025
f7ec440
Refactor : (Config) /error 경로 permitAll 추가
uoo6uoow May 19, 2025
aa772ed
Merge branch 'develop' into feature/mg-user
uoo6uoow May 19, 2025
ed86cc4
Refactor : (Config) /error 경로 permitAll 추가
uoo6uoow May 19, 2025
b6ed35f
Refactor : (Config) /error 경로 permitAll 추가
uoo6uoow May 19, 2025
1dd6ce4
Feat : (Domain) 캐릭터, 닉네임 관련 api구현 (#66)
uoo6uoow May 21, 2025
933e654
Refactor : (Domain) 사용자 디폴트 매칭 허용여부 추가
uoo6uoow May 21, 2025
735b15d
Refactor : (Domain)프로필 조회 dto 반환 방식 변경
uoo6uoow May 22, 2025
5058ace
Refactor : (Domain)프로필 조회 dto 반환 방식 재변경
uoo6uoow May 22, 2025
c9abc03
Refactor : (Domain)프로필 조회 dto 데이터 추가
uoo6uoow May 22, 2025
a47bed5
Refactor : (Domain)프로필 조회 api 응답 방식 변경
uoo6uoow May 22, 2025
1cf342c
Refactor : (Domain)프로필 조회 api 응답 방식 변경
uoo6uoow May 22, 2025
f5e636c
Refactor : (Domain)컨트롤러 dto적용 안된 부분 적용
uoo6uoow Jun 4, 2025
76151ed
Refactor : (Domain)이메일 발송 요청 방식 변경
uoo6uoow Jun 4, 2025
a78be45
Feat : (Domain)비밀번호 변경, 회원 탈퇴 구현
uoo6uoow Jun 4, 2025
1a77337
Merge branch 'develop' into feature/mg-user
uoo6uoow Jun 4, 2025
c950d14
Refactor : (Domain) 인증 완료 api 요청 방식 변경
uoo6uoow Jun 4, 2025
499a0a7
[Feat] 이미지 업로드 압축 로직 삭제 (#73)
jay91537 Jun 4, 2025
3a03ff6
Refactor : (Domain) 유저 프로필 관련 api 요청 방식 변경(#71) (#72)
uoo6uoow Jun 4, 2025
c1e1378
54 이미지업로드 리팩토링 (#74)
jay91537 Jun 4, 2025
8f7eee2
[Hotfix] application.yml 다시 추가
jay91537 Jun 4, 2025
d50cead
[Hotfix] application.yml 추가
jay91537 Jun 4, 2025
01aa26a
Merge branch 'develop' into feature/mg-user
uoo6uoow Jun 4, 2025
d00455c
Refactor : (Domain) 인증 메일 발송 비즈니스 로직 수정(#76)
uoo6uoow Jun 5, 2025
63963a0
Refactor : (Domain) 인증 메일 발송 비즈니스 로직 수정(#76)
uoo6uoow Jun 5, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
.requestMatchers(HttpMethod.POST, "/user").permitAll()
.requestMatchers(HttpMethod.POST, "/user/email-verification").permitAll()
.requestMatchers(HttpMethod.POST, "/user/check-login-id").permitAll()
.requestMatchers(HttpMethod.PATCH, "/user/*/complete").permitAll()
.requestMatchers(HttpMethod.PATCH, "/user/complete").permitAll()
.requestMatchers(HttpMethod.POST, "/auth/login").permitAll()
.requestMatchers(HttpMethod.DELETE, "/user/email-verification").permitAll()
.requestMatchers("/auth/**", "/swagger-ui/**", "/v3/api-docs/**", "/env", "/hc", "/error").permitAll()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ protected boolean shouldNotFilter(HttpServletRequest request) {
return true;
}
// 4) PATCH /user/{id}/complete (코드검증+가입완료)
if (path.matches("^/user/\\d+/complete$") && "PATCH".equals(method)) {
if (path.matches("^/user/complete$") && "PATCH".equals(method)) {
return true;
}
// 5) POST /auth/login (로그인)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
import org.example.wowelang_backend.security.custom.CustomUserDetails;
import org.example.wowelang_backend.user.dto.*;
import org.example.wowelang_backend.user.service.UserService;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

Expand Down Expand Up @@ -44,17 +43,17 @@ public ApiResponse<String> sendEmail(
}

// 3단계: 인증 코드 검증 및 가입 완료
@PatchMapping("/{userId}/complete")
@PatchMapping("/complete")
@Operation(description = "발급받은 코드를 유저가 입력 후 회원가입 완료", summary = "인증 코드 검증")
public ApiResponse<Long> verifyAndComplete(
@PathVariable Long userId,
@RequestBody Map<String, Integer> body
@RequestBody VerifyReqDto dto
) {
int code = body.get("code");
Long finalUserId = userService.verifyAndCompleteSignUp(userId, code);
Long finalUserId = userService.verifyAndCompleteSignUp(
dto.getEmail(),
dto.getCode()
);
return ApiResponse.onSuccess(finalUserId);
}

// 이메일 인증 초기화
@DeleteMapping("/email-verification")
@Operation(description = "이메일 인증을 초기화", summary = "메일 인증 초기화")
Expand Down Expand Up @@ -151,11 +150,11 @@ public ApiResponse<Void> changePassword(
//회원탈퇴
@DeleteMapping("/me")
@Operation(description = "회원탈퇴", summary = "탈퇴")
public ResponseEntity<Void> deleteAccount(
public ApiResponse<Object> deleteAccount(
@AuthenticationPrincipal CustomUserDetails me
) {
userService.deleteAccount(me.getId());
return ResponseEntity.noContent().build(); // HTTP 204
return ApiResponse.onSuccess(null);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package org.example.wowelang_backend.user.dto;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class VerifyReqDto {
private String email;
private Integer code;
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,5 @@ public interface UserRepository extends JpaRepository<User, Long> {
boolean existsByLoginId(String loginId);

// 논리 삭제된 유저를 제외하고 찾기
@Query("SELECT u FROM User u WHERE u.id = :id AND u.isDelete = false")
Optional<User> findActiveById(@Param("id") Long id);

@Query("SELECT u FROM User u WHERE u.loginId = :loginId AND u.isDelete = false")
Optional<User> findActiveByLoginId(@Param("loginId") String loginId);
Optional<User> findByIdAndIsDeleteFalse(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -82,43 +82,22 @@ public Long createTempUser(UserSignupReqDto dto) {
return user.getId();
}

// 2단계: 재학생 튜터일 경우, 인증 진행
// 2단계: 인증 메일 발송
public boolean sendVerificationEmail(String email) {
// 1) 이메일로 사용자 확인
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException(
ErrorStatus.USER_NOT_FOUND.getMessage()
));

// 2) 유학생(Foreign)은 인증 메일 발송 없이 바로 true 반환
if (user.getUsertype() == Usertype.FOREIGN) {
return true;
}

// 3) 재학생(Native)이고 아직 인증되지 않은 경우에만 처리
if (!user.getIsEmailVerified()) {
if (univcertService.hasCertificationRequest(user.getEmail())) {
clearCertification(user.getEmail());
}
//새 인증 메일 발송
boolean mailSent = univcertService.sendCertifyMail(user.getEmail());
if (!mailSent) {
throw new IllegalStateException(
ErrorStatus.CERTIFICATION_MAIL_FAILED.getMessage()
);
}
return true;
//새 인증 메일 발송
boolean mailSent = univcertService.sendCertifyMail(email);
if (!mailSent) {
throw new IllegalStateException(
ErrorStatus.CERTIFICATION_MAIL_FAILED.getMessage()
);
}

// 4) 이미 인증이 완료된 경우에는 별도 발송 없이 false 반환 (또는 예외 처리)
throw new IllegalStateException(
ErrorStatus.EMAIL_ALREADY_VERIFIED.getMessage()
);
return true;
}

//3단계: 인증코드 검증 및 가입 완료
public Long verifyAndCompleteSignUp(Long userId, int code) {
User user = userRepository.findById(userId)
public Long verifyAndCompleteSignUp(String email, int code) {
// 1) 이메일 기준으로 User 조회
User user = userRepository.findByEmail(email)
.orElseThrow(() -> new IllegalArgumentException(ErrorStatus.USER_NOT_FOUND.getMessage()));

if (user.getUsertype() == Usertype.NATIVE) {
Expand Down Expand Up @@ -258,7 +237,7 @@ public CharacterInfoDto updateCharacter(Long userId, int colorId, int maskId) {

//비밀번호 변경
public void changePassword(Long userId, String currentPassword, String newPassword) {
User user = userRepository.findActiveById(userId)
User user = userRepository.findByIdAndIsDeleteFalse(userId)
.orElseThrow(() -> new IllegalArgumentException(ErrorStatus.USER_NOT_FOUND.getMessage()));

// 1) 현재 비밀번호 검증
Expand All @@ -275,14 +254,13 @@ public void changePassword(Long userId, String currentPassword, String newPasswo
//회원탈퇴
public void deleteAccount(Long userId) {
// 1) 실제 DB에서 삭제하지 않고, isDeleted=true 로 마킹
User user = userRepository.findActiveById(userId)
User user = userRepository.findByIdAndIsDeleteFalse(userId)
.orElseThrow(() -> new IllegalArgumentException(ErrorStatus.INVALID_USER.getMessage()));

// (선택) 관심사, ForeignTutee, KoreanTutor 등 연관 객체도 논리 삭제를 원하면 각각의 엔티티에 isDeleted 필드를 추가하고 여기서 또 마킹하세요.
// 만약 완전 삭제가 필요하다면 userInterestRepository.deleteByUserId(userId) 등을 그대로 호출해도 됩니다.
// 예시: userInterestRepository.deleteByUserId(userId);

user.delete(); // 엔티티에 정의한 delete() 호출 → isDeleted=true
userRepository.save(user);
}
}
Loading