Skip to content

Commit

Permalink
feat: 프로필 조회 API 구현 (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
gahyuun committed Feb 13, 2025
1 parent efcc2a1 commit 2043b02
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -109,4 +110,11 @@ public ResponseEntity<AcornCountResponse> getAcornCount() {
memberService.fetchAcornCount()
);
}
}

@GetMapping(path = "/members/me", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<ProfileResponse> getProfile() {
return ResponseEntity.ok(
memberService.fetchProfile()
);
}
}
Original file line number Diff line number Diff line change
@@ -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> verifiedArea
) {

public record VerifiedArea(
@NonNull
Long id,
@NonNull
String name
) {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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<MemberEntity> 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);

Expand Down Expand Up @@ -216,5 +210,23 @@ public AcornCountResponse fetchAcornCount() {
return new AcornCountResponse(acornCount);
}

@Transactional(readOnly = true)
public ProfileResponse fetchProfile() {
MemberEntity memberEntity = memberRepository.findByIdOrElseThrow(principalHandler.getUserIdFromPrincipal());
List<VerifiedAreaEntity> 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: 최근 길 안내 장소 지우는 스케줄러 추가
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -9,4 +10,6 @@ public interface VerifiedAreaRepository extends JpaRepository<VerifiedAreaEntity
boolean existsByMemberIdAndName(Long memberId, String name);

Optional<VerifiedAreaEntity> findByMemberIdAndName(Long memberId, String name);
}

List<VerifiedAreaEntity> findAllByMemberId(Long memberId);
}

0 comments on commit 2043b02

Please sign in to comment.