diff --git a/build.gradle.kts b/build.gradle.kts index 5dc03649..61533ecf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -31,7 +31,7 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-oauth2-client") - implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.6.0") + implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0") implementation("io.jsonwebtoken:jjwt-api:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3") diff --git a/src/main/java/com/back/domain/profile/controller/ProfileController.java b/src/main/java/com/back/domain/profile/controller/ProfileController.java index 2bd8e66f..c572924e 100644 --- a/src/main/java/com/back/domain/profile/controller/ProfileController.java +++ b/src/main/java/com/back/domain/profile/controller/ProfileController.java @@ -1,14 +1,14 @@ package com.back.domain.profile.controller; import com.back.domain.profile.dto.ProfileResponseDto; +import com.back.domain.profile.dto.ProfileUpdateRequestDto; import com.back.domain.profile.service.ProfileService; import com.back.domain.user.service.UserService; import com.back.global.rsData.RsData; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/me/profile") @@ -23,4 +23,10 @@ public RsData getProfile(@AuthenticationPrincipal(expression ProfileResponseDto body = profileService.getProfile(userId); return RsData.successOf(body); // code=200, message="success" } + + @PutMapping + public RsData updateProfile(@AuthenticationPrincipal(expression = "id") Long userId, @Valid @RequestBody ProfileUpdateRequestDto profileUpdateRequestDto) { + ProfileResponseDto body = profileService.updateProfile(userId, profileUpdateRequestDto); + return RsData.successOf(body); // code=200 + } } diff --git a/src/main/java/com/back/domain/profile/dto/ProfileUpdateRequestDto.java b/src/main/java/com/back/domain/profile/dto/ProfileUpdateRequestDto.java new file mode 100644 index 00000000..1a1cf1aa --- /dev/null +++ b/src/main/java/com/back/domain/profile/dto/ProfileUpdateRequestDto.java @@ -0,0 +1,17 @@ +package com.back.domain.profile.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.Size; +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ProfileUpdateRequestDto { + + @Size(min = 1, max = 10, message = "닉네임은 1~10자") + private String nickname; + + @Email(message = "이메일 형식이 아닙니다") + private String email; +} diff --git a/src/main/java/com/back/domain/profile/service/ProfileService.java b/src/main/java/com/back/domain/profile/service/ProfileService.java index 5fe694d2..c48cd155 100644 --- a/src/main/java/com/back/domain/profile/service/ProfileService.java +++ b/src/main/java/com/back/domain/profile/service/ProfileService.java @@ -1,6 +1,7 @@ package com.back.domain.profile.service; import com.back.domain.profile.dto.ProfileResponseDto; +import com.back.domain.profile.dto.ProfileUpdateRequestDto; import com.back.domain.user.entity.User; import com.back.domain.user.repository.UserRepository; import com.back.domain.user.support.AbvView; @@ -31,4 +32,31 @@ public ProfileResponseDto getProfile(Long id) { .abvLabel(label) .build(); } + + @Transactional + public ProfileResponseDto updateProfile(Long id, ProfileUpdateRequestDto profileUpdateRequestDto) { + User user = userRepository.findById(id).orElseThrow(() -> new ServiceException(404, "사용자를 찾을 수 없습니다.")); + + if (profileUpdateRequestDto.getNickname() != null) { + String nickname = profileUpdateRequestDto.getNickname().trim(); + if (nickname.isEmpty() || nickname.length() > 10) { + throw new ServiceException(400, "닉네임은 1~10자"); + } + + if (userRepository.existsByNicknameAndIdNot(nickname, id)) { + throw new ServiceException(409, "이미 사용중인 닉네임"); + } + + user.setNickname(nickname); + } + + if (profileUpdateRequestDto.getEmail() != null) { + String email = profileUpdateRequestDto.getEmail().trim(); + user.setEmail(email.isEmpty() ? null : email); + } + + userRepository.save(user); + + return getProfile(id); + } }