diff --git a/src/main/java/com/acon/server/member/api/controller/MemberController.java b/src/main/java/com/acon/server/member/api/controller/MemberController.java index 368c039..7619070 100644 --- a/src/main/java/com/acon/server/member/api/controller/MemberController.java +++ b/src/main/java/com/acon/server/member/api/controller/MemberController.java @@ -7,6 +7,7 @@ import com.acon.server.member.api.response.AcornCountResponse; import com.acon.server.member.api.response.LoginResponse; import com.acon.server.member.api.response.MemberAreaResponse; +import com.acon.server.member.api.response.ProfileResponse; import com.acon.server.member.application.service.MemberService; import com.acon.server.member.domain.enums.Cuisine; import com.acon.server.member.domain.enums.DislikeFood; @@ -109,4 +110,11 @@ public ResponseEntity getAcornCount() { memberService.fetchAcornCount() ); } -} + + @GetMapping(path = "/members/me", produces = MediaType.APPLICATION_JSON_VALUE) + public ResponseEntity getProfile() { + return ResponseEntity.ok( + memberService.fetchProfile() + ); + } +} \ No newline at end of file diff --git a/src/main/java/com/acon/server/member/api/response/ProfileResponse.java b/src/main/java/com/acon/server/member/api/response/ProfileResponse.java new file mode 100644 index 0000000..51de5b5 --- /dev/null +++ b/src/main/java/com/acon/server/member/api/response/ProfileResponse.java @@ -0,0 +1,31 @@ +package com.acon.server.member.api.response; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonInclude.Include; +import jakarta.validation.constraints.NotNull; +import java.util.List; +import lombok.Builder; +import lombok.NonNull; + +@Builder +@JsonInclude(Include.NON_NULL) +public record ProfileResponse( + @NotNull + String image, + @NotNull + String nickname, + int leftAcornCount, + String birthDate, + @NotNull + List verifiedArea +) { + + public record VerifiedArea( + @NonNull + Long id, + @NonNull + String name + ) { + + } +} \ No newline at end of file diff --git a/src/main/java/com/acon/server/member/application/service/MemberService.java b/src/main/java/com/acon/server/member/application/service/MemberService.java index 76594f4..ffca5dc 100644 --- a/src/main/java/com/acon/server/member/application/service/MemberService.java +++ b/src/main/java/com/acon/server/member/application/service/MemberService.java @@ -8,6 +8,7 @@ import com.acon.server.global.external.NaverMapsAdapter; import com.acon.server.member.api.response.AcornCountResponse; import com.acon.server.member.api.response.LoginResponse; +import com.acon.server.member.api.response.ProfileResponse; import com.acon.server.member.application.mapper.GuidedSpotMapper; import com.acon.server.member.application.mapper.MemberMapper; import com.acon.server.member.application.mapper.PreferenceMapper; @@ -37,6 +38,8 @@ import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.UUID; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -89,31 +92,22 @@ public LoginResponse login( return LoginResponse.of(accessToken, refreshToken); } - private boolean isExistingMember( - final SocialType socialType, - final String socialId - ) { - return memberRepository.findBySocialTypeAndSocialId(socialType, socialId).isPresent(); - } - protected Long fetchMemberId( final SocialType socialType, final String socialId ) { - MemberEntity memberEntity; - - if (isExistingMember(socialType, socialId)) { - memberEntity = memberRepository.findBySocialTypeAndSocialId( - socialType, - socialId - ).orElse(null); - } else { - memberEntity = memberRepository.save(MemberEntity.builder() - .socialType(socialType) - .socialId(socialId) - .leftAcornCount(25) - .build()); - } + Optional optionalMemberEntity = memberRepository.findBySocialTypeAndSocialId(socialType, + socialId); + MemberEntity memberEntity = optionalMemberEntity.orElseGet(() -> + memberRepository.save(MemberEntity.builder() + .socialType(socialType) + .socialId(socialId) + .leftAcornCount(25) + .nickname(UUID.randomUUID().toString()) + // TODO: 기본 이미지 구현 전까지 임의로 이미지 할당 + .profileImage("https://avatars.githubusercontent.com/u/81469686?v=4") + .build()) + ); Member member = memberMapper.toDomain(memberEntity); @@ -216,5 +210,23 @@ public AcornCountResponse fetchAcornCount() { return new AcornCountResponse(acornCount); } + @Transactional(readOnly = true) + public ProfileResponse fetchProfile() { + MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal()); + List verifiedAreaEntityList = verifiedAreaRepository.findAllByMemberId( + memberEntity.getId()); + + return ProfileResponse.builder(). + image(memberEntity.getProfileImage()) + .nickname(memberEntity.getNickname()) + .birthDate(memberEntity.getBirthDate() != null ? memberEntity.getBirthDate().toString() : null) + .leftAcornCount(memberEntity.getLeftAcornCount()) + .verifiedArea(verifiedAreaEntityList.stream() + .map(verifiedAreaEntity -> new ProfileResponse.VerifiedArea(verifiedAreaEntity.getId(), + verifiedAreaEntity.getName())) + .collect(Collectors.toList())) + .build(); + } + // TODO: 최근 길 안내 장소 지우는 스케줄러 추가 -} +} \ No newline at end of file diff --git a/src/main/java/com/acon/server/member/infra/entity/MemberEntity.java b/src/main/java/com/acon/server/member/infra/entity/MemberEntity.java index 01db933..7e473da 100644 --- a/src/main/java/com/acon/server/member/infra/entity/MemberEntity.java +++ b/src/main/java/com/acon/server/member/infra/entity/MemberEntity.java @@ -42,7 +42,7 @@ public class MemberEntity extends BaseTimeEntity { @Column(name = "profile_image") private String profileImage; - @Column(name = "nickname", unique = true) + @Column(name = "nickname", unique = true, nullable = false) private String nickname; @Column(name = "nickname_updated_at") diff --git a/src/main/java/com/acon/server/member/infra/repository/VerifiedAreaRepository.java b/src/main/java/com/acon/server/member/infra/repository/VerifiedAreaRepository.java index 291a742..4e6b7f6 100644 --- a/src/main/java/com/acon/server/member/infra/repository/VerifiedAreaRepository.java +++ b/src/main/java/com/acon/server/member/infra/repository/VerifiedAreaRepository.java @@ -1,6 +1,7 @@ package com.acon.server.member.infra.repository; import com.acon.server.member.infra.entity.VerifiedAreaEntity; +import java.util.List; import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; @@ -9,4 +10,6 @@ public interface VerifiedAreaRepository extends JpaRepository findByMemberIdAndName(Long memberId, String name); -} + + List findAllByMemberId(Long memberId); +} \ No newline at end of file