Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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")
Expand All @@ -23,4 +23,10 @@ public RsData<ProfileResponseDto> getProfile(@AuthenticationPrincipal(expression
ProfileResponseDto body = profileService.getProfile(userId);
return RsData.successOf(body); // code=200, message="success"
}

@PutMapping
public RsData<ProfileResponseDto> updateProfile(@AuthenticationPrincipal(expression = "id") Long userId, @Valid @RequestBody ProfileUpdateRequestDto profileUpdateRequestDto) {
ProfileResponseDto body = profileService.updateProfile(userId, profileUpdateRequestDto);
return RsData.successOf(body); // code=200
}
}
Original file line number Diff line number Diff line change
@@ -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;
}
28 changes: 28 additions & 0 deletions src/main/java/com/back/domain/profile/service/ProfileService.java
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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);
}
}