Skip to content

Commit

Permalink
Merge pull request #86 from hellokitty-coding-club/feature/#78-member…
Browse files Browse the repository at this point in the history
…-profile
  • Loading branch information
great-park committed Sep 6, 2023
2 parents 0890a8e + 424466c commit e5acde5
Show file tree
Hide file tree
Showing 13 changed files with 650 additions and 14 deletions.
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
package swm.hkcc.LGTM.app.modules.member.controller;

import jakarta.validation.constraints.NotBlank;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import swm.hkcc.LGTM.app.global.dto.ApiDataResponse;
import swm.hkcc.LGTM.app.modules.auth.constants.MemberType;
import swm.hkcc.LGTM.app.modules.member.domain.custom.CustomUserDetails;
import swm.hkcc.LGTM.app.modules.member.dto.MemberDetailProfile;
import swm.hkcc.LGTM.app.modules.member.service.MemberService;

import java.util.Optional;
Expand All @@ -31,4 +29,18 @@ public ApiDataResponse<Boolean> updateDeviceToken(
Long memberId = customUserDetails.getMemberId();
return ApiDataResponse.of(memberService.updateDeviceToken(memberId, deviceToken));
}

@GetMapping("/profile")
public ApiDataResponse<MemberDetailProfile> getMemberProfile(
@AuthenticationPrincipal CustomUserDetails customUserDetails
) {
Long memberId = customUserDetails.getMemberId();
MemberType memberType = memberService.getMemberType(memberId);

if (memberType == MemberType.JUNIOR) {
return ApiDataResponse.of(memberService.getJuniorProfile(memberId));
}

return ApiDataResponse.of(memberService.getSeniorProfile(memberId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package swm.hkcc.LGTM.app.modules.member.domain.mapper;

import swm.hkcc.LGTM.app.modules.member.domain.Member;
import swm.hkcc.LGTM.app.modules.member.dto.MemberDetailInfo;
import swm.hkcc.LGTM.app.modules.member.dto.MemberDetailProfile;
import swm.hkcc.LGTM.app.modules.mission.dto.MissionDto;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTag;

import java.util.List;

public class MemberMapper {

public static MemberDetailProfile toMemberDetailProfile(Member member, MemberDetailInfo memberDetailInfo, List<TechTag> techTagList, List<MissionDto> missionDtos) {
return MemberDetailProfile.builder()
.memberId(member.getMemberId())
.githubId(member.getGithubId())
.nickName(member.getNickName())
.profileImageUrl(member.getProfileImageUrl())
.introduction(member.getIntroduction())
.techTagList(techTagList)
.isAgreeWithEventInfo(member.isAgreeWithEventInfo())
.memberDetailInfo(memberDetailInfo)
.memberMissionHistory(missionDtos)
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package swm.hkcc.LGTM.app.modules.member.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class JuniorDetailInfo implements MemberDetailInfo {
private String educationalHistory;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package swm.hkcc.LGTM.app.modules.member.dto;

public interface MemberDetailInfo {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package swm.hkcc.LGTM.app.modules.member.dto;

import lombok.*;
import swm.hkcc.LGTM.app.modules.mission.dto.MissionDto;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTag;

import java.util.List;

@Builder
@Getter
@AllArgsConstructor
public class MemberDetailProfile {
private Long memberId;
private String githubId;
private String nickName;
private String profileImageUrl;
private String introduction;
private List<TechTag> techTagList;
private boolean isAgreeWithEventInfo;
private MemberDetailInfo memberDetailInfo;
private List<MissionDto> memberMissionHistory;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package swm.hkcc.LGTM.app.modules.member.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;

@Getter
@Builder
@AllArgsConstructor
public class SeniorDetailInfo implements MemberDetailInfo {
private String companyInfo;
private int careerPeriod;
private String position;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,12 @@
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import swm.hkcc.LGTM.app.modules.member.domain.Junior;
import swm.hkcc.LGTM.app.modules.member.domain.Senior;

import java.util.Optional;

@Repository
public interface JuniorRepository extends JpaRepository<Junior, Long> {
boolean existsByMember_MemberId(Long memberId);
Optional<Junior> findByMember_MemberId(Long memberId);
}
Original file line number Diff line number Diff line change
@@ -1,23 +1,44 @@
package swm.hkcc.LGTM.app.modules.member.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import swm.hkcc.LGTM.app.modules.auth.constants.MemberType;
import swm.hkcc.LGTM.app.modules.member.domain.Junior;
import swm.hkcc.LGTM.app.modules.member.domain.Member;
import swm.hkcc.LGTM.app.modules.member.domain.Senior;
import swm.hkcc.LGTM.app.modules.member.dto.JuniorDetailInfo;
import swm.hkcc.LGTM.app.modules.member.dto.MemberDetailProfile;
import swm.hkcc.LGTM.app.modules.member.dto.SeniorDetailInfo;
import swm.hkcc.LGTM.app.modules.member.exception.NotExistMember;
import swm.hkcc.LGTM.app.modules.member.repository.MemberRepository;
import swm.hkcc.LGTM.app.modules.mission.domain.Mission;
import swm.hkcc.LGTM.app.modules.mission.domain.mapper.MissionMapper;
import swm.hkcc.LGTM.app.modules.mission.dto.MissionDto;
import swm.hkcc.LGTM.app.modules.mission.repository.MissionRepository;
import swm.hkcc.LGTM.app.modules.registration.domain.MissionRegistration;
import swm.hkcc.LGTM.app.modules.registration.repository.MissionRegistrationRepository;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTag;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTagPerMember;
import swm.hkcc.LGTM.app.modules.tag.repository.TechTagPerMemberRepository;
import swm.hkcc.LGTM.app.modules.tag.repository.TechTagPerMissionRepository;

import java.util.List;
import java.util.Optional;

import static swm.hkcc.LGTM.app.modules.member.domain.mapper.MemberMapper.toMemberDetailProfile;

@RequiredArgsConstructor
@Service
@Transactional
@Slf4j
public class MemberService {
private static final String JUNIOR = "JUNIOR";
private static final String SENIOR = "SENIOR";

private final MemberRepository memberRepository;
private final TechTagPerMemberRepository techTagPerMemberRepository;
private final MissionRegistrationRepository missionRegistrationRepository;
private final MissionRepository missionRepository;
private final TechTagPerMissionRepository techTagPerMissionRepository;

public Boolean updateDeviceToken(Long memberId, Optional<String> deviceToken) {
deviceToken.ifPresent(memberRepository::eraseDeviceToken);
Expand All @@ -37,4 +58,58 @@ public MemberType getMemberType(Long memberId) {

return MemberType.getType(member);
}

public MemberDetailProfile getJuniorProfile(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(NotExistMember::new);
List<TechTag> techTagList = getTechTagList(memberId);

Junior junior = member.getJunior();
List<MissionRegistration> juniorMissionHistory = missionRegistrationRepository.findAllByJuniorMemberIdWithMission(memberId); // N+1 문제 방지를 위해 fetch join 사용

JuniorDetailInfo juniorDetailInfo = JuniorDetailInfo.builder()
.educationalHistory(junior.getEducationalHistory())
.build();

List<MissionDto> missionDtos = juniorMissionHistory.stream()
.map(MissionRegistration::getMission)
.map(mission -> MissionMapper.missionToMissionDto(
mission,
techTagPerMissionRepository.findTechTagsByMissionId(mission.getMissionId())
))
.toList();

return toMemberDetailProfile(member, juniorDetailInfo, techTagList, missionDtos);
}

public MemberDetailProfile getSeniorProfile(Long memberId) {
Member member = memberRepository.findById(memberId)
.orElseThrow(NotExistMember::new);
List<TechTag> techTagList = getTechTagList(memberId);

Senior senior = member.getSenior();
List<Mission> seniorMissionHistory = missionRepository.findAllByWriter_MemberId(memberId);

SeniorDetailInfo seniorDetailInfo = SeniorDetailInfo.builder()
.companyInfo(senior.getCompanyInfo())
.careerPeriod(senior.getCareerPeriod())
.position(senior.getPosition())
.build();

List<MissionDto> missionDtos = seniorMissionHistory.stream()
.map(mission -> MissionMapper.missionToMissionDto(
mission,
techTagPerMissionRepository.findTechTagsByMissionId(mission.getMissionId())
))
.toList();

return toMemberDetailProfile(member, seniorDetailInfo, techTagList, missionDtos);
}

private List<TechTag> getTechTagList(Long memberId) {
return techTagPerMemberRepository.findWithTechTagByMemberId(memberId) // N+1 문제 방지를 위해 fetch join 사용
.stream()
.map(TechTagPerMember::getTechTag)
.toList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@
import static swm.hkcc.LGTM.app.modules.mission.domain.MissionStatus.MISSION_FINISHED;

public class MissionMapper {
public static MissionDto missionToMissionDto(Mission ongoingMission, List<TechTag> techTags) {
public static MissionDto missionToMissionDto(Mission mission, List<TechTag> techTags) {
return MissionDto.builder()
.missionId(ongoingMission.getMissionId())
.missionTitle(ongoingMission.getTitle())
.missionId(mission.getMissionId())
.missionTitle(mission.getTitle())
.techTagList(techTags)
.build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package swm.hkcc.LGTM.app.modules.mission.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import swm.hkcc.LGTM.app.modules.mission.domain.Mission;

import java.util.List;

public interface MissionRepository extends JpaRepository<Mission, Long>, MissionCustomRepository {
// @Query("SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END FROM Mission m WHERE m.missionId = :missionId AND m.writer.memberId = :memberId")
// boolean existsByMissionIdAndMemberId(Long missionId, Long memberId);
boolean existsByMissionIdAndWriter_MemberId(Long missionId, Long memberId);

List<Mission> findAllByWriter_MemberId(Long memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import swm.hkcc.LGTM.app.modules.mission.domain.Mission;
import swm.hkcc.LGTM.app.modules.registration.domain.MissionRegistration;

import java.util.List;
Expand All @@ -16,4 +18,7 @@ public interface MissionRegistrationRepository extends JpaRepository<MissionRegi

@Query("SELECT CASE WHEN COUNT(m) > 0 THEN true ELSE false END FROM MissionRegistration m WHERE m.mission.missionId = :missionId AND m.junior.memberId = :memberId")
boolean existsByMissionIdAndMemberId(Long missionId, Long memberId);

@Query("SELECT mr FROM MissionRegistration mr JOIN FETCH mr.mission WHERE mr.junior.memberId = :memberId")
List<MissionRegistration> findAllByJuniorMemberIdWithMission(@Param("memberId") Long memberId);
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
package swm.hkcc.LGTM.app.modules.tag.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import swm.hkcc.LGTM.app.modules.member.domain.Member;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTag;
import swm.hkcc.LGTM.app.modules.tag.domain.TechTagPerMember;

import java.util.List;

@Repository
public interface TechTagPerMemberRepository extends JpaRepository<TechTagPerMember, Long> {
List<TechTagPerMember> findByMember(Member member);

@Query("SELECT t FROM TechTagPerMember t JOIN FETCH t.techTag WHERE t.member.memberId = :memberId")
List<TechTagPerMember> findWithTechTagByMemberId(@Param("memberId") Long memberId);
}
Loading

0 comments on commit e5acde5

Please sign in to comment.