diff --git a/src/main/java/liaison/linkit/profile/business/ProfileMapper.java b/src/main/java/liaison/linkit/profile/business/ProfileMapper.java new file mode 100644 index 00000000..c178411f --- /dev/null +++ b/src/main/java/liaison/linkit/profile/business/ProfileMapper.java @@ -0,0 +1,4 @@ +package liaison.linkit.profile.business; + +public class ProfileMapper { +} diff --git a/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java b/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java new file mode 100644 index 00000000..69aeca83 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/exception/ProfileErrorCode.java @@ -0,0 +1,33 @@ +package liaison.linkit.profile.exception; + +import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; + +import java.lang.reflect.Field; +import java.util.Objects; +import liaison.linkit.common.annotation.ExplainError; +import liaison.linkit.common.exception.BaseErrorCode; +import liaison.linkit.common.exception.ErrorReason; +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ProfileErrorCode implements BaseErrorCode { + PROFILE_NOT_FOUND(NOT_FOUND, "PROFILE_404_1", "프로필을 찾을 수 없습니다."); + + private final Integer status; + private final String code; + private final String reason; + + @Override + public ErrorReason getErrorReason() { + return ErrorReason.builder().reason(reason).code(code).status(status).build(); + } + + @Override + public String getExplainError() throws NoSuchFieldException { + Field field = this.getClass().getField(this.name()); + ExplainError annotation = field.getAnnotation(ExplainError.class); + return Objects.nonNull(annotation) ? annotation.value() : this.getReason(); + } +} diff --git a/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java b/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java new file mode 100644 index 00000000..e56bc18d --- /dev/null +++ b/src/main/java/liaison/linkit/profile/exception/ProfileNotFoundException.java @@ -0,0 +1,11 @@ +package liaison.linkit.profile.exception; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ProfileNotFoundException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ProfileNotFoundException(); + + private ProfileNotFoundException() { + super(ProfileErrorCode.PROFILE_NOT_FOUND); + } +} diff --git a/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java b/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java new file mode 100644 index 00000000..37dfce86 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/implement/ProfileCommandAdapter.java @@ -0,0 +1,4 @@ +package liaison.linkit.profile.implement; + +public class ProfileCommandAdapter { +} diff --git a/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java b/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java new file mode 100644 index 00000000..25747ae9 --- /dev/null +++ b/src/main/java/liaison/linkit/profile/implement/ProfileQueryAdapter.java @@ -0,0 +1,23 @@ +package liaison.linkit.profile.implement; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.profile.domain.Profile; +import liaison.linkit.profile.domain.repository.profile.ProfileRepository; +import liaison.linkit.profile.exception.ProfileNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class ProfileQueryAdapter { + private final ProfileRepository profileRepository; + + public Profile findById(final Long profileId) { + return profileRepository.findById(profileId) + .orElseThrow(() -> ProfileNotFoundException.EXCEPTION); + } + + public Profile findByMemberId(final Long memberId) { + return profileRepository.findByMemberId(memberId) + .orElseThrow(() -> ProfileNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/liaison/linkit/profile/service/MiniProfileService.java b/src/main/java/liaison/linkit/profile/service/MiniProfileService.java index 332b233c..06f55ef9 100644 --- a/src/main/java/liaison/linkit/profile/service/MiniProfileService.java +++ b/src/main/java/liaison/linkit/profile/service/MiniProfileService.java @@ -192,7 +192,8 @@ public MiniProfileResponse getPersonalMiniProfile(final Long memberId) { final List jobRoleNames = getJobRoleNames(memberId); log.info("대상 객체의 희망 직무 및 역할을 조회하였습니다."); - return MiniProfileResponse.personalMiniProfile(miniProfile, miniProfileKeywordList, memberBasicInform.getMemberName(), jobRoleNames); + return MiniProfileResponse.personalMiniProfile(miniProfile, miniProfileKeywordList, + memberBasicInform.getMemberName(), jobRoleNames); } @Transactional(readOnly = true) @@ -213,9 +214,11 @@ public MiniProfileResponse getBrowsePersonalMiniProfile(final Long memberId, fin final List jobRoleNames = getJobRoleNames(profile.getMember().getId()); log.info("대상 객체의 희망 직무 및 역할을 조회하였습니다."); - final boolean isPrivateSaved = privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + final boolean isPrivateSaved = privateWishRepository.existsByMemberIdAndProfileId(memberId, + miniProfile.getProfile().getId()); - return MiniProfileResponse.personalBrowseMiniProfile(miniProfile, miniProfileKeywordList, memberBasicInform.getMemberName(), jobRoleNames, isPrivateSaved); + return MiniProfileResponse.personalBrowseMiniProfile(miniProfile, miniProfileKeywordList, + memberBasicInform.getMemberName(), jobRoleNames, isPrivateSaved); } private List getProfileJobRoleList(final Long profileId) { @@ -228,12 +231,12 @@ private List getMiniProfileKeywords(final Long miniProfileId private boolean getSavedImageUrl(final Profile profile) { - final MiniProfile miniProfile = getMiniProfile(profile.getId()); - if (miniProfile.getMiniProfileImg() != null) { - return true; - } else { - return false; - } + final MiniProfile miniProfile = getMiniProfile(profile.getId()); + if (miniProfile.getMiniProfileImg() != null) { + return true; + } else { + return false; + } } // 나중에 리팩토링 필요한 부분 @@ -282,7 +285,7 @@ public List getJobRoleNames(final Long memberId) { public boolean getIsPrivateSaved(final Long memberId, final Long profileId) { final MiniProfile miniProfile = getMiniProfile(profileId); - return privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + return privateWishRepository.existsByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); } // 미니 프로필의 유효성 검증이 끝난 후 수정한다. diff --git a/src/main/java/liaison/linkit/search/service/SearchService.java b/src/main/java/liaison/linkit/search/service/SearchService.java index 509861be..0a08f245 100644 --- a/src/main/java/liaison/linkit/search/service/SearchService.java +++ b/src/main/java/liaison/linkit/search/service/SearchService.java @@ -89,7 +89,8 @@ public Page findPrivateMiniProfile( log.info("cityName={}", cityName); log.info("divisionName={}", divisionName); - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; @@ -121,7 +122,8 @@ public Page findPrivateMiniProfileLogin( String divisionName ) { - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; @@ -162,12 +164,12 @@ public Page findTeamMemberAnnouncementsWithTeamMiniPr // 해당 팀원 공고들을 찾는다. // 해당 팀원 공고와 연결된 팀 미니 프로필을 같이 반환한다. - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; final Long activityTagCount = (activityTagName != null) ? (long) activityTagName.size() : null; - // 해당되는 모든 팀원 공고를 조회한다. Page teamMemberAnnouncements = teamMemberAnnouncementRepository.findAllByOrderByCreatedDateDesc( teamBuildingFieldName, @@ -198,7 +200,8 @@ public Page findTeamMemberAnnouncementsWithTeam String divisionName, final List activityTagName ) { - final Long teamBuildingFieldCount = (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; + final Long teamBuildingFieldCount = + (teamBuildingFieldName != null) ? (long) teamBuildingFieldName.size() : null; final Long jobRoleCount = (jobRoleName != null) ? (long) jobRoleName.size() : null; final Long skillCount = (skillName != null) ? (long) skillName.size() : null; final Long activityTagCount = (activityTagName != null) ? (long) activityTagName.size() : null; @@ -217,40 +220,54 @@ public Page findTeamMemberAnnouncementsWithTeam activityTagCount, pageable ); - return teamMemberAnnouncements.map(teamMemberAnnouncement -> convertToSearchTeamProfileResponseAfterLogin(teamMemberAnnouncement, memberId)); + return teamMemberAnnouncements.map( + teamMemberAnnouncement -> convertToSearchTeamProfileResponseAfterLogin(teamMemberAnnouncement, + memberId)); } - private SearchTeamProfileResponse convertToSearchTeamProfileResponse(final TeamMemberAnnouncement teamMemberAnnouncement) { + private SearchTeamProfileResponse convertToSearchTeamProfileResponse( + final TeamMemberAnnouncement teamMemberAnnouncement) { // 각각의 개별 팀원 공고를 찾아냈다. - final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId(teamMemberAnnouncement.getTeamProfile().getId()); - final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()); - - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId( + teamMemberAnnouncement.getTeamProfile().getId()); + final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()); + + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - return new SearchTeamProfileResponse( TeamMiniProfileResponse.personalTeamMiniProfile(teamMiniProfile, teamMiniProfileKeyword), TeamMemberAnnouncementResponse.of( - teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList) + teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, + teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList) ); } - private SearchBrowseTeamProfileResponse convertToSearchTeamProfileResponseAfterLogin(final TeamMemberAnnouncement teamMemberAnnouncement, final Long memberId) { - final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId(teamMemberAnnouncement.getTeamProfile().getId()); - final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()); - - final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole(teamMemberAnnouncement.getId()); - final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills(teamMemberAnnouncement.getId()); + private SearchBrowseTeamProfileResponse convertToSearchTeamProfileResponseAfterLogin( + final TeamMemberAnnouncement teamMemberAnnouncement, final Long memberId) { + final TeamMiniProfile teamMiniProfile = getTeamMiniProfileByTeamProfileId( + teamMemberAnnouncement.getTeamProfile().getId()); + final List teamMiniProfileKeyword = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()); + + final TeamMemberAnnouncementJobRole teamMemberAnnouncementJobRole = getTeamMemberAnnouncementJobRole( + teamMemberAnnouncement.getId()); + final List teamMemberAnnouncementSkillList = getTeamMemberAnnouncementSkills( + teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - final boolean isTeamSaved = teamWishRepository.findByTeamMemberAnnouncementIdAndMemberId(teamMemberAnnouncement.getId(), memberId); + final boolean isTeamSaved = teamWishRepository.existsByTeamMemberAnnouncementIdAndMemberId( + teamMemberAnnouncement.getId(), memberId); log.info("isTeamSaved={}", isTeamSaved); return new SearchBrowseTeamProfileResponse( TeamMiniProfileResponse.personalTeamMiniProfile(teamMiniProfile, teamMiniProfileKeyword), - TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) + TeamMemberAnnouncementResponse.afterLogin(teamMiniProfile.getTeamLogoImageUrl(), teamMemberAnnouncement, + teamName, teamMemberAnnouncementJobRole, teamMemberAnnouncementSkillList, isTeamSaved) ); } @@ -282,7 +299,8 @@ public Page findTeamMiniProfile( } private TeamMiniProfileResponse convertToTeamMiniProfileResponse(final TeamMiniProfile teamMiniProfile) { - List teamKeywordNames = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId(teamMiniProfile.getId()).stream() + List teamKeywordNames = teamMiniProfileKeywordRepository.findAllByTeamMiniProfileId( + teamMiniProfile.getId()).stream() .map(TeamMiniProfileKeyword::getTeamKeywordNames) .toList(); @@ -327,7 +345,8 @@ private MiniProfileResponse convertToMiniProfileResponse(final MiniProfile miniP ); } - private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniProfile miniProfile, final Long memberId) { + private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniProfile miniProfile, + final Long memberId) { final String memberName = getMemberNameByMiniProfile(miniProfile.getId()); List myKeywordNames = miniProfileKeywordRepository.findAllByMiniProfileId(miniProfile.getId()).stream() .map(MiniProfileKeyword::getMyKeywordNames) @@ -343,7 +362,8 @@ private BrowseMiniProfileResponse convertToBrowseMiniProfileResponse(final MiniP .toList(); // privateWish -> 찾아야함 (내가 이 해당 미니 프로필을 찜해뒀는지?) - final boolean isPrivateWish = privateWishRepository.findByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); + final boolean isPrivateWish = privateWishRepository.existsByMemberIdAndProfileId(memberId, + miniProfile.getProfile().getId()); return new BrowseMiniProfileResponse( miniProfile.getId(), @@ -381,7 +401,6 @@ private Profile getProfileIdByMiniProfile(final Long miniProfileId) { // 회원 기본 정보를 가져오는 메서드 private MemberBasicInform getMemberBasicInform(final Long memberId) { - return memberBasicInformRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); } diff --git a/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java b/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java index e6117453..7930d106 100644 --- a/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java +++ b/src/main/java/liaison/linkit/wish/business/PrivateWishMapper.java @@ -15,4 +15,8 @@ public PrivateWish toPrivate(final Profile profile, final Member member) { public PrivateWishResponseDTO.AddPrivateWish toAddPrivateWish() { return PrivateWishResponseDTO.AddPrivateWish.builder().build(); } + + public PrivateWishResponseDTO.RemovePrivateWish toRemovePrivateWish() { + return PrivateWishResponseDTO.RemovePrivateWish.builder().build(); + } } diff --git a/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java b/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java index a67e70c1..2883baca 100644 --- a/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java +++ b/src/main/java/liaison/linkit/wish/business/TeamWishMapper.java @@ -15,4 +15,9 @@ public TeamWish toTeam(final TeamMemberAnnouncement teamMemberAnnouncement, fina public TeamWishResponseDTO.AddTeamWish toAddTeamWish() { return TeamWishResponseDTO.AddTeamWish.builder().build(); } + + public TeamWishResponseDTO.RemoveTeamWish toRemoveTeamWish() { + return TeamWishResponseDTO.RemoveTeamWish.builder() + .build(); + } } diff --git a/src/main/java/liaison/linkit/wish/service/WishService.java b/src/main/java/liaison/linkit/wish/business/WishService.java similarity index 70% rename from src/main/java/liaison/linkit/wish/service/WishService.java rename to src/main/java/liaison/linkit/wish/business/WishService.java index a6b0b1ef..97e05efa 100644 --- a/src/main/java/liaison/linkit/wish/service/WishService.java +++ b/src/main/java/liaison/linkit/wish/business/WishService.java @@ -1,33 +1,25 @@ -package liaison.linkit.wish.service; - -import static liaison.linkit.global.exception.ExceptionCode.NOT_ALLOW_P2P_WISH; -import static liaison.linkit.global.exception.ExceptionCode.NOT_ALLOW_P2T_WISH; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_MINI_PROFILE_BY_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_PROFILE_BY_MEMBER_ID; +package liaison.linkit.wish.business; + import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_ID; import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_JOB_ROLE; import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_MINI_PROFILE_BY_TEAM_PROFILE_ID; import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_PROFILE_ID; -import static liaison.linkit.global.exception.ExceptionCode.NOT_FOUND_TEAM_WISH_BY_TEAM_MEMBER_ANNOUNCEMENT_ID; import java.util.List; import java.util.Objects; import liaison.linkit.global.exception.BadRequestException; import liaison.linkit.member.domain.Member; import liaison.linkit.member.domain.MemberBasicInform; -import liaison.linkit.member.domain.repository.memberBasicInform.MemberBasicInformRepository; +import liaison.linkit.member.implement.MemberBasicInformQueryAdapter; import liaison.linkit.member.implement.MemberQueryAdapter; import liaison.linkit.profile.domain.Profile; import liaison.linkit.profile.domain.miniProfile.MiniProfile; import liaison.linkit.profile.domain.miniProfile.MiniProfileKeyword; import liaison.linkit.profile.domain.repository.jobRole.ProfileJobRoleRepository; import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileKeywordRepository; -import liaison.linkit.profile.domain.repository.miniProfile.MiniProfileRepository; -import liaison.linkit.profile.domain.repository.profile.ProfileRepository; import liaison.linkit.profile.domain.role.JobRole; import liaison.linkit.profile.domain.role.ProfileJobRole; +import liaison.linkit.profile.implement.ProfileQueryAdapter; import liaison.linkit.search.dto.response.browseAfterLogin.BrowseMiniProfileResponse; import liaison.linkit.team.domain.TeamProfile; import liaison.linkit.team.domain.announcement.TeamMemberAnnouncement; @@ -43,14 +35,18 @@ import liaison.linkit.team.domain.repository.teamProfile.TeamProfileRepository; import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; -import liaison.linkit.wish.business.PrivateWishMapper; -import liaison.linkit.wish.business.TeamWishMapper; import liaison.linkit.wish.domain.PrivateWish; import liaison.linkit.wish.domain.TeamWish; import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; +import liaison.linkit.wish.exception.privateWish.ForbiddenPrivateWishException; import liaison.linkit.wish.exception.privateWish.PrivateWishManyRequestException; +import liaison.linkit.wish.exception.teamWish.ForbiddenTeamWishException; import liaison.linkit.wish.exception.teamWish.TeamWishManyRequestException; +import liaison.linkit.wish.implement.privateWish.PrivateWishCommandAdapter; +import liaison.linkit.wish.implement.privateWish.PrivateWishQueryAdapter; +import liaison.linkit.wish.implement.teamWish.TeamWishCommandAdapter; +import liaison.linkit.wish.implement.teamWish.TeamWishQueryAdapter; import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO; import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; import liaison.linkit.wish.presentation.dto.teamWish.TeamWishResponseDTO; @@ -61,19 +57,27 @@ @Service @RequiredArgsConstructor +@Transactional @Slf4j public class WishService { private final MemberQueryAdapter memberQueryAdapter; + + private final MemberBasicInformQueryAdapter memberBasicInformQueryAdapter; + private final PrivateWishMapper privateWishMapper; + private final PrivateWishQueryAdapter privateWishQueryAdapter; + private final PrivateWishCommandAdapter privateWishCommandAdapter; + private final TeamWishMapper teamWishMapper; + private final TeamWishQueryAdapter teamWishQueryAdapter; + private final TeamWishCommandAdapter teamWishCommandAdapter; + + private final ProfileQueryAdapter profileQueryAdapter; - private final ProfileRepository profileRepository; - private final MiniProfileRepository miniProfileRepository; private final TeamMiniProfileRepository teamMiniProfileRepository; private final PrivateWishRepository privateWishRepository; private final TeamWishRepository teamWishRepository; - private final MemberBasicInformRepository memberBasicInformRepository; private final ProfileJobRoleRepository profileJobRoleRepository; private final MiniProfileKeywordRepository miniProfileKeywordRepository; private final TeamMiniProfileKeywordRepository teamMiniProfileKeywordRepository; @@ -83,130 +87,69 @@ public class WishService { private final TeamMemberAnnouncementJobRoleRepository teamMemberAnnouncementJobRoleRepository; private final TeamMemberAnnouncementSkillRepository teamMemberAnnouncementSkillRepository; - - // 모든 "내 이력서" 서비스 계층에 필요한 profile 조회 메서드 - private Profile getProfile(final Long memberId) { - return profileRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_MEMBER_ID)); - } - private TeamProfile getTeamProfile(final Long memberId) { return teamProfileRepository.findByMemberId(memberId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_PROFILE_ID)); } - private Profile getProfileByMiniProfileId( - final Long miniProfileId - ) { - final MiniProfile miniProfile = miniProfileRepository.findById(miniProfileId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MINI_PROFILE_BY_ID)); - - return miniProfile.getProfile(); - } - @Transactional - public PrivateWishResponseDTO.AddPrivateWish createWishToPrivateProfile( - final Long memberId, - final Long profileId - ) { + public PrivateWishResponseDTO.AddPrivateWish createWishToPrivateProfile(final Long memberId, final Long profileId) { final Member member = memberQueryAdapter.findById(memberId); - final Profile profile = profileRepository.findById(profileId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_PROFILE_BY_ID)); - - if (Objects.equals(getProfile(memberId).getId(), profile.getId())) { - throw new BadRequestException(NOT_ALLOW_P2P_WISH); + final Profile profile = profileQueryAdapter.findById(profileId); + if (Objects.equals(profileQueryAdapter.findByMemberId(memberId).getId(), profile.getId())) { + throw ForbiddenPrivateWishException.EXCEPTION; } - - // 찜한다 - final PrivateWish privateWish = new PrivateWish( - null, - member, - profile - ); - - privateWishRepository.save(privateWish); - // 내 이력서 찜하기 카운트 + 1 + privateWishCommandAdapter.create(new PrivateWish(null, member, profile)); member.addPrivateWishCount(); return privateWishMapper.toAddPrivateWish(); } - // 찜하기 취소 메서드 - public void cancelWishToPrivateProfile( - final Long memberId, - final Long miniProfileId - ) { - final Member member = memberQueryAdapter.findById(memberId); - final Profile profile = getProfileByMiniProfileId(miniProfileId); - // 내 이력서 찜하기 객체 삭제 - privateWishRepository.deleteByMemberIdAndProfileId(memberId, profile.getId()); - member.subPrivateWishCount(); - } - // 팀 소개서 찜하기 메서드 - public TeamWishResponseDTO.AddTeamWish createWishToTeamProfile( - final Long memberId, - final Long teamMemberAnnouncementId - ) { + // 팀원 공고 찜하기 메서드 + public TeamWishResponseDTO.AddTeamWish createWishToTeamProfile(final Long memberId, final Long teamMemberAnnouncementId) { final Member member = memberQueryAdapter.findById(memberId); - final TeamMemberAnnouncement teamMemberAnnouncement = teamMemberAnnouncementRepository.findById( teamMemberAnnouncementId) .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_MEMBER_ANNOUNCEMENT_ID)); // 나의 팀 프로필의 ID -> 내가 찜한 팀원 공고의 팀 프로필과 같은지 if (Objects.equals(getTeamProfile(memberId).getId(), teamMemberAnnouncement.getTeamProfile().getId())) { - throw new BadRequestException(NOT_ALLOW_P2T_WISH); + throw ForbiddenTeamWishException.EXCEPTION; } - - final TeamWish teamWish = new TeamWish( - null, - member, - teamMemberAnnouncement - ); - - // DB에 저장 - teamWishRepository.save(teamWish); - - // 팀 소개서 찜하기 카운트 + 1 + teamWishCommandAdapter.create(new TeamWish(null, member, teamMemberAnnouncement)); member.addTeamWishCount(); return teamWishMapper.toAddTeamWish(); } - public void cancelWishToTeamProfile( - final Long memberId, - final Long teamMemberAnnouncementId - ) { + // 찜하기 취소 메서드 + public PrivateWishResponseDTO.RemovePrivateWish cancelWishToPrivateProfile(final Long memberId, final Long profileId) { + privateWishCommandAdapter.deleteByMemberIdAndProfileId(memberId, profileId); final Member member = memberQueryAdapter.findById(memberId); + member.subPrivateWishCount(); + return privateWishMapper.toRemovePrivateWish(); + } - // 삭제하고자 하는 팀 찜하기 객체 조회 - final TeamWish teamWish = teamWishRepository.findByMemberIdAndTeamMemberAnnouncementId(teamMemberAnnouncementId, - memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_TEAM_WISH_BY_TEAM_MEMBER_ANNOUNCEMENT_ID)); - - // 바로 삭제 - teamWishRepository.delete(teamWish); - - // 삭제 이후 -1 + // 팀원 공고 찜하기 취소 메서드 + public TeamWishResponseDTO.RemoveTeamWish cancelWishToTeamProfile(final Long memberId, final Long teamMemberAnnouncementId) { + teamWishCommandAdapter.deleteByMemberIdAndTeamMemberAnnouncementId(memberId, teamMemberAnnouncementId); + final Member member = memberQueryAdapter.findById(memberId); member.subTeamWishCount(); + return teamWishMapper.toRemoveTeamWish(); } public List getPrivateProfileWishList(final Long memberId) { - // 주체 객체 조회 - final Member member = memberQueryAdapter.findById(memberId); - - final List privateWishList = privateWishRepository.findAllByMemberId(member.getId()); + final List privateWishList = privateWishQueryAdapter.findAllPrivateWish(memberId); return privateWishList.stream() .map(privateWish -> { // 상대의 미니 프로필 객체를 가져온다. final MiniProfile miniProfile = privateWish.getProfile().getMiniProfile(); final List miniProfileKeywords = getMiniProfileKeywords(miniProfile.getId()); // 상대 회원의 기본 정보를 가져와야 한다. - final MemberBasicInform memberBasicInform = getMemberBasicInform( - miniProfile.getProfile().getMember().getId()); + final MemberBasicInform memberBasicInform = memberBasicInformQueryAdapter.findByMemberId(memberId); final List jobRoleNames = getJobRoleNames(miniProfile.getProfile().getMember().getId()); // privateWish -> 찾아야함 (내가 이 해당 미니 프로필을 찜해뒀는지?) - final boolean isPrivateWish = privateWishRepository.findByMemberIdAndProfileId(memberId, + final boolean isPrivateWish = privateWishRepository.existsByMemberIdAndProfileId(memberId, miniProfile.getProfile().getId()); return BrowseMiniProfileResponse.personalBrowseMiniProfile( @@ -223,9 +166,7 @@ public List getPrivateProfileWishList(final Long memb // 찜한 상대 팀 (팀원 공고)를 찾아야 한다. public List getTeamProfileWishList(final Long memberId) { - // 찜한 주체 객체 조회 final Member member = memberQueryAdapter.findById(memberId); - // 팀 찜 목록 객체 조회 final List teamWishList = teamWishRepository.findAllByMemberId(member.getId()); log.info("teamWishList={}", teamWishList); @@ -250,7 +191,7 @@ private WishTeamProfileResponse convertToWishTeamProfileResponse(final TeamWish teamMemberAnnouncement.getId()); final String teamName = teamMemberAnnouncement.getTeamProfile().getTeamMiniProfile().getTeamName(); - final boolean isTeamSaved = teamWishRepository.findByTeamMemberAnnouncementIdAndMemberId( + final boolean isTeamSaved = teamWishRepository.existsByTeamMemberAnnouncementIdAndMemberId( teamMemberAnnouncement.getId(), memberId); return new WishTeamProfileResponse( @@ -260,15 +201,8 @@ private WishTeamProfileResponse convertToWishTeamProfileResponse(final TeamWish ); } - - // 회원 기본 정보를 가져오는 메서드 - private MemberBasicInform getMemberBasicInform(final Long memberId) { - return memberBasicInformRepository.findByMemberId(memberId) - .orElseThrow(() -> new BadRequestException(NOT_FOUND_MEMBER_BASIC_INFORM_BY_MEMBER_ID)); - } - public List getJobRoleNames(final Long memberId) { - final Profile profile = getProfile(memberId); + final Profile profile = profileQueryAdapter.findByMemberId(memberId); final List profileJobRoleList = getProfileJobRoleList(profile.getId()); List jobRoleList = profileJobRoleList.stream() diff --git a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java index 0fe5a22c..ed784388 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustom.java @@ -6,11 +6,17 @@ public interface PrivateWishRepositoryCustom { List findAllByMemberId(final Long memberId); + void deleteByMemberId(final Long memberId); + void deleteByProfileId(final Long profileId); + void deleteByMemberIdAndProfileId(final Long memberId, final Long profileId); + boolean existsByMemberId(final Long memberId); + boolean existsByProfileId(final Long profileId); - boolean findByMemberIdAndProfileId(final Long memberId, final Long profileId); + + boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId); } diff --git a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java index 09cd87d0..b1d76a56 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/privateWish/PrivateWishRepositoryCustomImpl.java @@ -12,7 +12,7 @@ @RequiredArgsConstructor @Slf4j -public class PrivateWishRepositoryCustomImpl implements PrivateWishRepositoryCustom{ +public class PrivateWishRepositoryCustomImpl implements PrivateWishRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; @@ -89,7 +89,7 @@ public boolean existsByProfileId(final Long profileId) { } @Override - public boolean findByMemberIdAndProfileId(final Long memberId, final Long profileId) { + public boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId) { QPrivateWish privateWish = QPrivateWish.privateWish; Integer count = jpaQueryFactory diff --git a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java index 24588bfe..13de293c 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustom.java @@ -8,16 +8,27 @@ public interface TeamWishRepositoryCustom { List findAllByMemberId(final Long memberId); + Optional findByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); - Optional findByMemberIdAndTeamMemberAnnouncementId(final Long teamMemberAnnouncementId, final Long memberId); - boolean findByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId); + + Optional findByMemberIdAndTeamMemberAnnouncementId( + final Long memberId, + final Long teamMemberAnnouncementId + ); + + boolean existsByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId); boolean existsByMemberId(final Long memberId); + boolean existsByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); + boolean existsByTeamMemberAnnouncementIds(final List teamMemberAnnouncementIds); void deleteByMemberId(final Long memberId); + void deleteByMemberIdAndTeamMemberAnnouncementId(final Long memberId, final Long teamMemberAnnouncementId); + void deleteByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId); + void deleteByTeamMemberAnnouncementIds(final List teamMemberAnnouncementIds); } diff --git a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java index ff5376a7..2b0d95c6 100644 --- a/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java +++ b/src/main/java/liaison/linkit/wish/domain/repository/teamWish/TeamWishRepositoryCustomImpl.java @@ -13,7 +13,7 @@ @RequiredArgsConstructor @Slf4j -public class TeamWishRepositoryCustomImpl implements TeamWishRepositoryCustom{ +public class TeamWishRepositoryCustomImpl implements TeamWishRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; @@ -37,7 +37,7 @@ public Optional findByTeamMemberAnnouncementId(Long teamMemberAnnounce } @Override - public Optional findByMemberIdAndTeamMemberAnnouncementId(Long teamMemberAnnouncementId, Long memberId) { + public Optional findByMemberIdAndTeamMemberAnnouncementId(Long memberId, Long teamMemberAnnouncementId) { QTeamWish teamWish = QTeamWish.teamWish; TeamWish result = jpaQueryFactory .selectFrom(teamWish) @@ -48,7 +48,8 @@ public Optional findByMemberIdAndTeamMemberAnnouncementId(Long teamMem } @Override - public boolean findByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, final Long memberId) { + public boolean existsByTeamMemberAnnouncementIdAndMemberId(final Long teamMemberAnnouncementId, + final Long memberId) { QTeamWish teamWish = QTeamWish.teamWish; Integer count = jpaQueryFactory .selectOne() diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java b/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java new file mode 100644 index 00000000..ab954bfc --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/ForbiddenPrivateWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.privateWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ForbiddenPrivateWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ForbiddenPrivateWishException(); + + private ForbiddenPrivateWishException() { + super(PrivateWishErrorCode.FORBIDDEN_PRIVATE_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java index 657af918..bfb60582 100644 --- a/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java +++ b/src/main/java/liaison/linkit/wish/exception/privateWish/PrivateWishErrorCode.java @@ -1,6 +1,7 @@ package liaison.linkit.wish.exception.privateWish; import static liaison.linkit.common.consts.LinkitStatic.DUPLICATE; +import static liaison.linkit.common.consts.LinkitStatic.FORBIDDEN; import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; import static liaison.linkit.common.consts.LinkitStatic.TOO_MANY_REQUESTS; @@ -16,6 +17,7 @@ @AllArgsConstructor public enum PrivateWishErrorCode implements BaseErrorCode { + FORBIDDEN_PRIVATE_WISH(FORBIDDEN, "PRIVATE_WISH_403_1", "내 프로필을 찜하기 할 수 없습니다."), PRIVATE_WISH_NOT_FOUND(NOT_FOUND, "PRIVATE_WISH_404_1", "프로필에 대한 좋아요 기록이 없습니다."), DUPLICATE_PRIVATE_WISH(DUPLICATE, "PRIVATE_WISH_409_1", "이미 좋아요한 프로필입니다."), TOO_MANY_PRIVATE_WISH_REQUEST(TOO_MANY_REQUESTS, "PRIVATE_WISH_429_1", "프로필 최대 찜하기 개수를 초과하였습니다"); diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java b/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java new file mode 100644 index 00000000..be467c25 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/ForbiddenTeamWishException.java @@ -0,0 +1,11 @@ +package liaison.linkit.wish.exception.teamWish; + +import liaison.linkit.common.exception.BaseCodeException; + +public class ForbiddenTeamWishException extends BaseCodeException { + public static BaseCodeException EXCEPTION = new ForbiddenTeamWishException(); + + private ForbiddenTeamWishException() { + super(TeamWishErrorCode.FORBIDDEN_TEAM_WISH); + } +} diff --git a/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java index 1a41623f..2863c5ea 100644 --- a/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java +++ b/src/main/java/liaison/linkit/wish/exception/teamWish/TeamWishErrorCode.java @@ -1,6 +1,7 @@ package liaison.linkit.wish.exception.teamWish; import static liaison.linkit.common.consts.LinkitStatic.DUPLICATE; +import static liaison.linkit.common.consts.LinkitStatic.FORBIDDEN; import static liaison.linkit.common.consts.LinkitStatic.NOT_FOUND; import static liaison.linkit.common.consts.LinkitStatic.TOO_MANY_REQUESTS; @@ -15,6 +16,7 @@ @Getter @AllArgsConstructor public enum TeamWishErrorCode implements BaseErrorCode { + FORBIDDEN_TEAM_WISH(FORBIDDEN, "TEAM_WISH_403_1", "내가 올린 팀원 공고를 찜할 수 없습니다"), TEAM_WISH_NOT_FOUND(NOT_FOUND, "TEAM_WISH_404_1", "팀원 공고에 대한 좋아요 기록이 없습니다."), DUPLICATE_TEAM_WISH(DUPLICATE, "TEAM_WISH_409_1", "이미 좋아요한 팀원 공고입니다."), TOO_MANY_TEAM_WISH_REQUEST(TOO_MANY_REQUESTS, "TEAM_WISH_429_1", "팀원 공고 최대 찜하기 개수를 초과하였습니다."); diff --git a/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java new file mode 100644 index 00000000..0a67d99d --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishCommandAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.privateWish; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.PrivateWish; +import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class PrivateWishCommandAdapter { + private final PrivateWishRepository privateWishRepository; + + public PrivateWish create(final PrivateWish privateWish) { + return privateWishRepository.save(privateWish); + } + + public void deleteByMemberId(final Long memberId) { + privateWishRepository.deleteByMemberId(memberId); + } + + public void deleteByProfileId(final Long profileId) { + privateWishRepository.deleteByProfileId(profileId); + } + + public void deleteByMemberIdAndProfileId(final Long memberId, final Long profileId) { + privateWishRepository.deleteByMemberIdAndProfileId(memberId, profileId); + } + +} diff --git a/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java new file mode 100644 index 00000000..dfc04173 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/privateWish/PrivateWishQueryAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.privateWish; + +import java.util.List; +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.PrivateWish; +import liaison.linkit.wish.domain.repository.privateWish.PrivateWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class PrivateWishQueryAdapter { + private final PrivateWishRepository privateWishRepository; + + public List findAllPrivateWish(final Long memberId) { + return privateWishRepository.findAllByMemberId(memberId); + } + + public boolean existsByMemberId(final Long memberId) { + return privateWishRepository.existsByMemberId(memberId); + } + + public boolean existsByProfileId(final Long profileId) { + return privateWishRepository.existsByProfileId(profileId); + } + + public boolean existsByMemberIdAndProfileId(final Long memberId, final Long profileId) { + return privateWishRepository.existsByMemberIdAndProfileId(memberId, profileId); + } +} diff --git a/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java new file mode 100644 index 00000000..a89632d5 --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishCommandAdapter.java @@ -0,0 +1,24 @@ +package liaison.linkit.wish.implement.teamWish; + +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.TeamWish; +import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class TeamWishCommandAdapter { + private TeamWishRepository teamWishRepository; + + public TeamWish create(final TeamWish teamWish) { + return teamWishRepository.save(teamWish); + } + + public void delete(final TeamWish teamWish) { + teamWishRepository.delete(teamWish); + } + + public void deleteByMemberIdAndTeamMemberAnnouncementId(final Long memberId, final Long teamMemberAnnouncementId) { + teamWishRepository.deleteByMemberIdAndTeamMemberAnnouncementId(memberId, teamMemberAnnouncementId); + } +} diff --git a/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java new file mode 100644 index 00000000..96b6396d --- /dev/null +++ b/src/main/java/liaison/linkit/wish/implement/teamWish/TeamWishQueryAdapter.java @@ -0,0 +1,29 @@ +package liaison.linkit.wish.implement.teamWish; + +import java.util.List; +import liaison.linkit.common.annotation.Adapter; +import liaison.linkit.wish.domain.TeamWish; +import liaison.linkit.wish.domain.repository.teamWish.TeamWishRepository; +import liaison.linkit.wish.exception.teamWish.TeamWishNotFoundException; +import lombok.RequiredArgsConstructor; + +@Adapter +@RequiredArgsConstructor +public class TeamWishQueryAdapter { + private final TeamWishRepository teamWishRepository; + + public List findAllByMemberId(final Long memberId) { + return teamWishRepository.findAllByMemberId(memberId); + } + + public TeamWish findByTeamMemberAnnouncementId(final Long teamMemberAnnouncementId) { + return teamWishRepository.findByTeamMemberAnnouncementId(teamMemberAnnouncementId) + .orElseThrow(() -> TeamWishNotFoundException.EXCEPTION); + } + + public TeamWish findByMemberIdAndTeamMemberAnnouncementId(final Long memberId, + final Long teamMemberAnnouncementId) { + return teamWishRepository.findByMemberIdAndTeamMemberAnnouncementId(teamMemberAnnouncementId, memberId) + .orElseThrow(() -> TeamWishNotFoundException.EXCEPTION); + } +} diff --git a/src/main/java/liaison/linkit/wish/presentation/WishController.java b/src/main/java/liaison/linkit/wish/presentation/WishController.java index 4089cf8a..84d8e721 100644 --- a/src/main/java/liaison/linkit/wish/presentation/WishController.java +++ b/src/main/java/liaison/linkit/wish/presentation/WishController.java @@ -6,14 +6,12 @@ import liaison.linkit.auth.domain.Accessor; import liaison.linkit.common.presentation.CommonResponse; import liaison.linkit.search.dto.response.browseAfterLogin.BrowseMiniProfileResponse; +import liaison.linkit.wish.business.WishService; import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO; -import liaison.linkit.wish.presentation.dto.privateWish.PrivateWishResponseDTO.AddPrivateWish; import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; import liaison.linkit.wish.presentation.dto.teamWish.TeamWishResponseDTO; -import liaison.linkit.wish.service.WishService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; @@ -30,72 +28,50 @@ public class WishController { public final WishService wishService; + // 내 프로필 찜하기 @PostMapping("/wish/private/profile/{profileId}") @MemberOnly - public CommonResponse createWishToPrivateProfile( - @Auth final Accessor accessor, - @PathVariable final Long profileId - ) { + public CommonResponse createWishToPrivateProfile(@Auth final Accessor accessor, @PathVariable final Long profileId) { wishService.validateMemberMaxPrivateWish(accessor.getMemberId()); return CommonResponse.onSuccess(wishService.createWishToPrivateProfile(accessor.getMemberId(), profileId)); } + // 팀원 공고 찜하기 (미확정 09.20) @PostMapping("/wish/team/profile/{teamMemberAnnouncementId}") @MemberOnly - public CommonResponse createWishToTeamProfile( - @Auth final Accessor accessor, - @PathVariable final Long teamMemberAnnouncementId - ) { + public CommonResponse createWishToTeamProfile(@Auth final Accessor accessor, @PathVariable final Long teamMemberAnnouncementId) { wishService.validateMemberMaxTeamWish(accessor.getMemberId()); - return CommonResponse.onSuccess( - wishService.createWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId)); + return CommonResponse.onSuccess(wishService.createWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId)); } - // 내 이력서 찜하기 취소 - @DeleteMapping("/wish/private/profile/{miniProfileId}") + // 내 프로필 찜하기 취소 + @DeleteMapping("/wish/private/profile/{profileId}") @MemberOnly - public ResponseEntity cancelWishToPrivateProfile( - @Auth final Accessor accessor, - @PathVariable final Long miniProfileId - ) { - log.info("miniProfileId={} 을 memberId={}가 찜 취소하는 요청이 발생했습니다.", miniProfileId, accessor.getMemberId()); - wishService.cancelWishToPrivateProfile(accessor.getMemberId(), miniProfileId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + public CommonResponse removeWishToPrivateProfile(@Auth final Accessor accessor, @PathVariable final Long profileId) { + return CommonResponse.onSuccess(wishService.cancelWishToPrivateProfile(accessor.getMemberId(), profileId)); } - // 팀 소개서 찜하기 취소 + // 팀원 공고 찜하기 취소 (미확정 09.20) @DeleteMapping("/wish/team/profile/{teamMemberAnnouncementId}") @MemberOnly - public ResponseEntity cancelWishToTeamProfile( - @Auth final Accessor accessor, - @PathVariable final Long teamMemberAnnouncementId - ) { - log.info("teamMemberAnnouncementId={} 을 memberId={}가 찜하는 요청이 발생했습니다.", teamMemberAnnouncementId, - accessor.getMemberId()); - wishService.cancelWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).build(); + public CommonResponse cancelWishToTeamProfile(@Auth final Accessor accessor, @PathVariable final Long teamMemberAnnouncementId) { + return CommonResponse.onSuccess(wishService.cancelWishToTeamProfile(accessor.getMemberId(), teamMemberAnnouncementId)); } - // 내 이력서 찜한 목록 조회 + // 내 이력서 찜한 목록 조회 (미확정 09.20) @GetMapping("/wish/private/profile/list") @MemberOnly - public ResponseEntity> getPrivateProfileWishList( - @Auth final Accessor accessor - ) { - log.info("memberId={}의 내 이력서 찜하기 목록을 가져옵니다.", accessor.getMemberId()); - // 찜한 주체의 ID를 전달한다. - final List browseMiniProfileResponseList = wishService.getPrivateProfileWishList( - accessor.getMemberId()); + public ResponseEntity> getPrivateProfileWishList(@Auth final Accessor accessor) { + final List browseMiniProfileResponseList = wishService.getPrivateProfileWishList(accessor.getMemberId()); return ResponseEntity.ok(browseMiniProfileResponseList); } - // 팀 소개서 찜한 목록 조회 + // 팀 소개서 찜한 목록 조회 (미확정 09.20) @GetMapping("/wish/team/profile/list") @MemberOnly public ResponseEntity> getTeamProfileWishList( @Auth final Accessor accessor ) { - log.info("memberId={}의 팀 소개서 찜하기 목록을 가져옵니다.", accessor.getMemberId()); // 찜한 주체의 ID를 전달한다. final List wishTeamProfileResponseList = wishService.getTeamProfileWishList( accessor.getMemberId()); diff --git a/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java b/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java index be6d8f71..fd6b6ee1 100644 --- a/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java +++ b/src/main/java/liaison/linkit/wish/presentation/dto/privateWish/PrivateWishResponseDTO.java @@ -19,5 +19,14 @@ public static class AddPrivateWish { @JsonProperty("isPrivateWish") private boolean like = true; } - + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RemovePrivateWish { + @Builder.Default + @JsonProperty("isPrivateWish") + private boolean like = false; + } } diff --git a/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java b/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java index 44fcb140..d0da1343 100644 --- a/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java +++ b/src/main/java/liaison/linkit/wish/presentation/dto/teamWish/TeamWishResponseDTO.java @@ -16,7 +16,17 @@ public class TeamWishResponseDTO { @AllArgsConstructor public static class AddTeamWish { @Builder.Default - @JsonProperty("isPrivateWish") + @JsonProperty("isTeamWish") private boolean like = true; } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class RemoveTeamWish { + @Builder.Default + @JsonProperty("isTeamWish") + private boolean like = false; + } } diff --git a/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java b/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java index 8a0031e0..df600ac9 100644 --- a/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java +++ b/src/test/java/liaison/linkit/wish/presentation/WishControllerTest.java @@ -8,7 +8,7 @@ import liaison.linkit.team.dto.response.announcement.TeamMemberAnnouncementResponse; import liaison.linkit.team.dto.response.miniProfile.TeamMiniProfileResponse; import liaison.linkit.wish.presentation.dto.response.WishTeamProfileResponse; -import liaison.linkit.wish.service.WishService; +import liaison.linkit.wish.business.WishService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test;