diff --git a/src/main/java/com/onebridge/ouch/controller/mypage/MypageController.java b/src/main/java/com/onebridge/ouch/controller/mypage/MypageController.java new file mode 100644 index 0000000..d977f71 --- /dev/null +++ b/src/main/java/com/onebridge/ouch/controller/mypage/MypageController.java @@ -0,0 +1,47 @@ +package com.onebridge.ouch.controller.mypage; + +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.onebridge.ouch.apiPayload.ApiResponse; +import com.onebridge.ouch.dto.mypage.request.MypageProfileUpdateRequest; +import com.onebridge.ouch.dto.mypage.response.MypageGetProfileResponse; +import com.onebridge.ouch.security.authorization.UserId; +import com.onebridge.ouch.service.mypage.MypageService; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; + +@Tag(name = "마이페이지 API", description = "마이페이지 API") +@RestController +@RequestMapping("/mypage") +@RequiredArgsConstructor +public class MypageController { + + private final MypageService mypageService; + + //마이페이지-프로필 조회 + @Operation(summary = "프로필 조회 API", description = "프로필 조회 API 입니다.") + @GetMapping("/profile") + public ResponseEntity> mypageGetProfile(@UserId Long userId) { + MypageGetProfileResponse response = mypageService.mypageGetProfile(userId); + return ResponseEntity.ok(ApiResponse.success(response)); + } + + //마이페이지-프로필 수정 + @Operation(summary = "프로필 수정 API", description = "프로필 수정 API 입니다.") + @PutMapping("/profile") + public ResponseEntity> mypageUpdateProfile( + @RequestBody @Valid MypageProfileUpdateRequest request, + @UserId Long userId + ) { + mypageService.mypageUpdateProfile(userId, request); + return ResponseEntity.ok(ApiResponse.successWithNoData()); + } +} diff --git a/src/main/java/com/onebridge/ouch/converter/MypageConverter.java b/src/main/java/com/onebridge/ouch/converter/MypageConverter.java new file mode 100644 index 0000000..ead3482 --- /dev/null +++ b/src/main/java/com/onebridge/ouch/converter/MypageConverter.java @@ -0,0 +1,30 @@ +package com.onebridge.ouch.converter; + +import org.springframework.stereotype.Component; + +import com.onebridge.ouch.domain.Language; +import com.onebridge.ouch.domain.Nation; +import com.onebridge.ouch.domain.User; +import com.onebridge.ouch.dto.mypage.request.MypageProfileUpdateRequest; +import com.onebridge.ouch.dto.mypage.response.MypageGetProfileResponse; + +@Component +public class MypageConverter { + + public MypageGetProfileResponse userToMypageGetProfileResponse(User user) { + return new MypageGetProfileResponse(user.getNickname(), user.getGender(), user.getNation().getName(), + user.getPhoneNumber(), user.getEmail(), user.getLanguage().getName()); + } + + public User updateUserByUpdateProfileRequest(User user, MypageProfileUpdateRequest request, Nation nation, + Language language) { + return user.toBuilder() + .nickname(request.getNickname()) + .phoneNumber(request.getPhoneNumber()) + .gender(request.getGender()) + .email(request.getEmail()) + .nation(nation) + .language(language) + .build(); + } +} diff --git a/src/main/java/com/onebridge/ouch/dto/mypage/request/MypageProfileUpdateRequest.java b/src/main/java/com/onebridge/ouch/dto/mypage/request/MypageProfileUpdateRequest.java new file mode 100644 index 0000000..82622f0 --- /dev/null +++ b/src/main/java/com/onebridge/ouch/dto/mypage/request/MypageProfileUpdateRequest.java @@ -0,0 +1,34 @@ +package com.onebridge.ouch.dto.mypage.request; + +import com.onebridge.ouch.domain.enums.Gender; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class MypageProfileUpdateRequest { + + @NotBlank(message = "Nickname is mandatory.") + private String nickname; + + @NotNull(message = "Gender is mandatory.") + private Gender gender; + + @NotNull(message = "Nation is mandatory.") + @Schema(example = "KO") + private String nationCode; + + @NotBlank(message = "Phone number is mandatory.") + private String phoneNumber; + + @NotBlank(message = "Email is mandatory.") + private String email; + + @NotNull(message = "Language is mandatory.") + @Schema(example = "kr") + private String languageCode; +} diff --git a/src/main/java/com/onebridge/ouch/dto/mypage/response/MypageGetProfileResponse.java b/src/main/java/com/onebridge/ouch/dto/mypage/response/MypageGetProfileResponse.java new file mode 100644 index 0000000..3c1fad3 --- /dev/null +++ b/src/main/java/com/onebridge/ouch/dto/mypage/response/MypageGetProfileResponse.java @@ -0,0 +1,23 @@ +package com.onebridge.ouch.dto.mypage.response; + +import com.onebridge.ouch.domain.enums.Gender; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public class MypageGetProfileResponse { + + private String nickname; + + private Gender gender; + + private String nation; + + private String phoneNumber; + + private String email; + + private String language; +} diff --git a/src/main/java/com/onebridge/ouch/dto/user/request/MypageUserInfoUpdateRequest.java b/src/main/java/com/onebridge/ouch/dto/user/request/MypageUserInfoUpdateRequest.java deleted file mode 100644 index ae24c97..0000000 --- a/src/main/java/com/onebridge/ouch/dto/user/request/MypageUserInfoUpdateRequest.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.onebridge.ouch.dto.user.request; - -import com.onebridge.ouch.domain.enums.Gender; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@AllArgsConstructor -@Getter -public class MypageUserInfoUpdateRequest { - - @NotBlank(message = "Nickname is mandatory") - @Size(max = 20, message = "Nickname must be 20 characters or less") - private String nickname; - - @NotBlank(message = "Phone number is mandatory") - @Size(max = 15, message = "Phone number must be 15 characters or less") - private String phoneNumber; - - @NotNull(message = "Gender is mandatory") - private Gender gender; - - @NotBlank(message = "Email is mandatory") - @Size(max = 30, message = "Email must be 30 characters or less") - private String email; - - private Long nationId; -} diff --git a/src/main/java/com/onebridge/ouch/service/mypage/MypageService.java b/src/main/java/com/onebridge/ouch/service/mypage/MypageService.java new file mode 100644 index 0000000..c20e2ed --- /dev/null +++ b/src/main/java/com/onebridge/ouch/service/mypage/MypageService.java @@ -0,0 +1,51 @@ +package com.onebridge.ouch.service.mypage; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.onebridge.ouch.apiPayload.code.error.CommonErrorCode; +import com.onebridge.ouch.apiPayload.exception.OuchException; +import com.onebridge.ouch.converter.MypageConverter; +import com.onebridge.ouch.domain.Language; +import com.onebridge.ouch.domain.Nation; +import com.onebridge.ouch.domain.User; +import com.onebridge.ouch.dto.mypage.request.MypageProfileUpdateRequest; +import com.onebridge.ouch.dto.mypage.response.MypageGetProfileResponse; +import com.onebridge.ouch.repository.language.LanguageRepository; +import com.onebridge.ouch.repository.nation.NationRepository; +import com.onebridge.ouch.repository.user.UserRepository; + +import lombok.RequiredArgsConstructor; + +@Service +@RequiredArgsConstructor +public class MypageService { + + private final UserRepository userRepository; + private final NationRepository nationRepository; + private final MypageConverter mypageConverter; + private final LanguageRepository languageRepository; + + @Transactional(readOnly = true) + public MypageGetProfileResponse mypageGetProfile(Long userId) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new OuchException(CommonErrorCode.MEMBER_NOT_FOUND)); + return mypageConverter.userToMypageGetProfileResponse(user); + } + + @Transactional + public void mypageUpdateProfile(Long userId, MypageProfileUpdateRequest request) { + User user = userRepository.findById(userId) + .orElseThrow(() -> new OuchException(CommonErrorCode.MEMBER_NOT_FOUND)); + + Nation nation = nationRepository.findByCode(request.getNationCode()) + .orElseThrow(() -> new OuchException(CommonErrorCode.NATION_NOT_FOUND)); + + Language language = languageRepository.findByCode(request.getLanguageCode()) + .orElseThrow(() -> new OuchException(CommonErrorCode.LANGUAGE_NOT_FOUND)); + + User updatedUser = mypageConverter.updateUserByUpdateProfileRequest(user, request, nation, language); + userRepository.save(updatedUser); + } + +}