From cb0a127eb47d0642f4030a89036bac927e907bbd Mon Sep 17 00:00:00 2001 From: yumzen Date: Sun, 17 Mar 2024 16:08:01 +0900 Subject: [PATCH 01/13] =?UTF-8?q?fixed:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EA=B5=AC=EB=AC=B8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/post/service/PostService.java | 363 ++++++++---------- 1 file changed, 156 insertions(+), 207 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java index 0e38d9b1..9f2c1d56 100644 --- a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java +++ b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java @@ -39,93 +39,74 @@ public class PostService { @Transactional public PostRes create(Member member, PostReq req) { - try { - if (!req.postType() && postRepository.countByMemberAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatus(member, LocalDateTime.now(), RECRUITING) > 0) { //공모전 공고 모집 개수 제한 - throw new ApplicationException(NOT_POST_EXCEPTION); - } - if (req.postType() && postRepository.countByMemberAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatus(member, LocalDateTime.now(), RECRUITING) > 0) { //프로젝트 공고 모집 개수 제한 - throw new ApplicationException(NOT_POST_EXCEPTION); - } + if (!req.postType() && postRepository.countByMemberAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatus(member, LocalDateTime.now(), RECRUITING) > 0) { //공모전 공고 모집 개수 제한 + throw new ApplicationException(NOT_POST_EXCEPTION); + } + if (req.postType() && postRepository.countByMemberAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatus(member, LocalDateTime.now(), RECRUITING) > 0) { //프로젝트 공고 모집 개수 제한 + throw new ApplicationException(NOT_POST_EXCEPTION); + } - Post entity = new Post(req.title(), member, req.contents(), req.contestLink(), req.startDate(), req.endDate(), - req.finishDate(), req.maxPerson(), req.meetingMethod(), req.meetingArea(), req.questionMethod(), - req.questionLink(), req.postType(), new ArrayList<>(), new ArrayList<>()); + Post entity = new Post(req.title(), member, req.contents(), req.contestLink(), req.startDate(), req.endDate(), + req.finishDate(), req.maxPerson(), req.meetingMethod(), req.meetingArea(), req.questionMethod(), + req.questionLink(), req.postType(), new ArrayList<>(), new ArrayList<>()); - List stackNames = req.stackNames().stream() - .map(stackNameReq -> new StackName(entity, stackNameReq.getStackNameType())) - .toList(); - entity.getStackNames().addAll(stackNames); + List stackNames = req.stackNames().stream() + .map(stackNameReq -> new StackName(entity, stackNameReq.getStackNameType())) + .toList(); + entity.getStackNames().addAll(stackNames); - List categories = req.categories().stream() - .map(categoryReq -> new Category(entity, categoryReq.getCategoryType().toString(), categoryReq.getSize())) - .toList(); - entity.getCategories().addAll(categories); + List categories = req.categories().stream() + .map(categoryReq -> new Category(entity, categoryReq.getCategoryType().toString(), categoryReq.getSize())) + .toList(); + entity.getCategories().addAll(categories); - postRepository.save(entity); - return PostRes.of(entity); - } catch (ApplicationException e) { - throw new ApplicationException(NOT_POST_EXCEPTION); - } catch (Exception e){ - throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } + postRepository.save(entity); + return PostRes.of(entity); } @Transactional public PostDetailRes read(Long id) { - try { - Post post = postRepository.findById(id) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - int current_person = (int) applyRepository.countApplyByPost(post); - return PostDetailRes.of(post, current_person); - }catch (Exception e){ - throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } + Post post = postRepository.findById(id) + .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); + int current_person = (int) applyRepository.countApplyByPost(post); + return PostDetailRes.of(post, current_person); } @Transactional public PostRes modify(Member member, Long id, PostModifyReq req) { - try{ - Post entity = postRepository.findByPostIdAndDeletedAtIsNull(id) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - if(!member.getMemberId().equals(entity.getMember().getMemberId())){ - throw new ApplicationException(UNAUTHORIZED_EXCEPTION); - } - entity.modify(req); - - entity.getStackNames().clear(); - entity.getCategories().clear(); - List updatedStackNames = req.stackNames().stream() - .map(stackNameReq -> new StackName(entity, stackNameReq.getStackNameType())) - .toList(); - entity.getStackNames().addAll(updatedStackNames); + Post entity = postRepository.findByPostIdAndDeletedAtIsNull(id) + .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); + if(!member.getMemberId().equals(entity.getMember().getMemberId())){ + throw new ApplicationException(UNAUTHORIZED_EXCEPTION); + } + entity.modify(req); - List categories = req.categories().stream() - .map(categoryReq -> new Category(entity, categoryReq.getCategoryType().toString(), categoryReq.getSize())) - .toList(); - entity.getCategories().addAll(categories); + entity.getStackNames().clear(); + entity.getCategories().clear(); + List updatedStackNames = req.stackNames().stream() + .map(stackNameReq -> new StackName(entity, stackNameReq.getStackNameType())) + .toList(); + entity.getStackNames().addAll(updatedStackNames); + List categories = req.categories().stream() + .map(categoryReq -> new Category(entity, categoryReq.getCategoryType().toString(), categoryReq.getSize())) + .toList(); + entity.getCategories().addAll(categories); - return PostRes.of(entity); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } + return PostRes.of(entity); } @Transactional public PostDeleteRes delete(Member member, Long id) { - try{ - Post entity = postRepository.findByPostIdAndDeletedAtIsNull(id) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); + Post entity = postRepository.findByPostIdAndDeletedAtIsNull(id) + .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - if(!member.getMemberId().equals(entity.getMember().getMemberId())){ - throw new ApplicationException(UNAUTHORIZED_EXCEPTION); - } - - postRepository.delete(entity); - return PostDeleteRes.of(entity, member); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + if(!member.getMemberId().equals(entity.getMember().getMemberId())){ + throw new ApplicationException(UNAUTHORIZED_EXCEPTION); } + + postRepository.delete(entity); + return PostDeleteRes.of(entity, member); } /* @@ -134,39 +115,31 @@ public PostDeleteRes delete(Member member, Long id) { public Page getContests(String sort, Pageable p) throws ApplicationException { int page = p.getPageNumber(); int size = p.getPageSize(); - try { - Pagination pagination = new Pagination((int) postRepository.count(), page, size); - Pageable pageable = PageRequest.of(pagination.getPage(), size); - Page posts; - if(sort.equals("createdAt,desc")){ //최신순 - posts = postRepository.findAllByPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); - } else{ //스크랩순 - posts = postRepository.findAllByPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); - } - return posts.map(post -> GetContestRes.of(post)); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + Pagination pagination = new Pagination((int) postRepository.count(), page, size); + Pageable pageable = PageRequest.of(pagination.getPage(), size); + Page posts; + if(sort.equals("createdAt,desc")){ //최신순 + posts = postRepository.findAllByPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); + } else{ //스크랩순 + posts = postRepository.findAllByPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); } + return posts.map(post -> GetContestRes.of(post)); } /* 검색어 기반 공모전 공고 목록 조회 */ public Page getContestsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { - try { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); - searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); - } else{ - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); - } - return posts.map(post -> GetContestRes.of(post)); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); + Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); + } else{ + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); } + return posts.map(post -> GetContestRes.of(post)); } /* @@ -174,32 +147,28 @@ public Page getContestsBySearchWord(String sort, String searchWor */ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( String sort, String meetingArea, String category, String searchWord, Pageable page) throws ApplicationException { - try { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); - searchWord = searchWord.replaceAll(" ", ""); - if(!category.isBlank()) { - if (!CategoryType.isValid(category)){ - throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); - }else{ - posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); - } - return posts.map(post -> GetContestRes.of(post)); - } else{ - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); - }else{ - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); - } - return posts.map(post -> GetContestRes.of(post)); + Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); + Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + searchWord = searchWord.replaceAll(" ", ""); + if(!category.isBlank()) { + if (!CategoryType.isValid(category)){ + throw new ApplicationException(INVALID_VALUE_EXCEPTION); + } + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); + }else{ + posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); } - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + return posts.map(post -> GetContestRes.of(post)); + } else{ + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + }else{ + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + } + return posts.map(post -> GetContestRes.of(post)); } } @@ -209,39 +178,31 @@ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( public Page getProjects(String sort, Pageable p) throws ApplicationException { int page = p.getPageNumber(); int size = p.getPageSize(); - try { - Pagination pagination = new Pagination((int) postRepository.count(), page, size); - Pageable pageable = PageRequest.of(pagination.getPage(), size); - Page posts; - if(sort.equals("createdAt,desc")){ //최신순 - posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); - } else{ //스크랩순 - posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); - } - return posts.map(post -> GetProjectRes.of(post)); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + Pagination pagination = new Pagination((int) postRepository.count(), page, size); + Pageable pageable = PageRequest.of(pagination.getPage(), size); + Page posts; + if(sort.equals("createdAt,desc")){ //최신순 + posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); + } else{ //스크랩순 + posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); } + return posts.map(post -> GetProjectRes.of(post)); } /* 검색어 기반 프로젝트 공고 목록 조회 */ public Page getProjectsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { - try { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); - searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); - } else{ - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); - } - return posts.map(post -> GetProjectRes.of(post)); - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); + Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); + } else{ + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); } + return posts.map(post -> GetProjectRes.of(post)); } /* @@ -249,32 +210,28 @@ public Page getProjectsBySearchWord(String sort, String searchWor */ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( String sort, String meetingArea, String stackName, String searchWord, Pageable page) throws ApplicationException { - try { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); - searchWord = searchWord.replaceAll(" ", ""); - if(!stackName.isBlank()) { - if (!StackNameType.isValid(stackName)){ - throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); - }else{ - posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); - } - return posts.map(post -> GetProjectRes.of(post)); - } else{ - Page posts; - if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); - }else{ - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); - } - return posts.map(post -> GetProjectRes.of(post)); + Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); + Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + searchWord = searchWord.replaceAll(" ", ""); + if(!stackName.isBlank()) { + if (!StackNameType.isValid(stackName)){ + throw new ApplicationException(INVALID_VALUE_EXCEPTION); + } + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); + }else{ + posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); } - } catch (Exception e) { - throw new ApplicationException(INVALID_VALUE_EXCEPTION); + return posts.map(post -> GetProjectRes.of(post)); + } else{ + Page posts; + if (sort.equals("createdAt,desc")) { + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + }else{ + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + } + return posts.map(post -> GetProjectRes.of(post)); } } @@ -283,55 +240,47 @@ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( */ @Transactional public PostScrapRes scrapPost(Member member, Long postId) { - try { - Post post = postRepository.findByPostIdAndDeletedAtIsNull(postId) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - if (member.getMemberId() == null) { - throw new ApplicationException(UNAUTHORIZED_EXCEPTION); - } - - PostScrap postScrap = postScrapRepository.findByPostAndMember(post, member); + Post post = postRepository.findByPostIdAndDeletedAtIsNull(postId) + .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); + if (member.getMemberId() == null) { + throw new ApplicationException(UNAUTHORIZED_EXCEPTION); + } - if (postScrap == null) { //첫 스크랩 - postScrap = PostScrap.builder() - .post(post) - .member(member) - .scrapStatus(true) - .build(); + PostScrap postScrap = postScrapRepository.findByPostAndMember(post, member); + + if (postScrap == null) { //첫 스크랩 + postScrap = PostScrap.builder() + .post(post) + .member(member) + .scrapStatus(true) + .build(); + post.setScrapCount(post.getScrapCount() + 1); + } else { // 스크랩 한 적 있는 경우 + if (postScrap.getScrapStatus() == true) { //스크랩한 상태면 취소 + postScrap.setScrapStatus(false); + if (post.getScrapCount() > 0) post.setScrapCount(post.getScrapCount() - 1); + else throw new ApplicationException(INVALID_VALUE_EXCEPTION); + } else { //스크랩 안 한 경우 + postScrap.setScrapStatus(true); post.setScrapCount(post.getScrapCount() + 1); - } else { // 스크랩 한 적 있는 경우 - if (postScrap.getScrapStatus() == true) { //스크랩한 상태면 취소 - postScrap.setScrapStatus(false); - if (post.getScrapCount() > 0) post.setScrapCount(post.getScrapCount() - 1); - else throw new ApplicationException(INVALID_VALUE_EXCEPTION); - } else { //스크랩 안 한 경우 - postScrap.setScrapStatus(true); - post.setScrapCount(post.getScrapCount() + 1); - } } - postScrapRepository.save(postScrap); - postRepository.save(post); - return new PostScrapRes(postScrap.getPost().getPostId(), postScrap.getMember().getMemberId(), postScrap.getScrapStatus()); - }catch(Exception e){ - throw new ApplicationException(NOT_FOUNT_SCRAP_EXCEPTION); } + postScrapRepository.save(postScrap); + postRepository.save(post); + return new PostScrapRes(postScrap.getPost().getPostId(), postScrap.getMember().getMemberId(), postScrap.getScrapStatus()); } public PostScrapRes scrapGet(Member member, Long postId){ - try { - Post post = postRepository.findByPostIdAndDeletedAtIsNull(postId) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - if (member.getMemberId() == null) { - throw new ApplicationException(UNAUTHORIZED_EXCEPTION); - } - if(postScrapRepository.findByPostAndMember(post, member)==null){ //post, member 정보는 존재하되, scrap한적이 없는 경우 default false값 반환 - return new PostScrapRes(post.getPostId(), member.getMemberId(), false); - } - PostScrap postScrap = postScrapRepository.findByPostAndMember(post, member); - return new PostScrapRes(postScrap.getPost().getPostId(), postScrap.getMember().getMemberId(), postScrap.getScrapStatus()); - }catch(Exception e) { - throw new ApplicationException(NOT_FOUNT_SCRAP_EXCEPTION); + Post post = postRepository.findByPostIdAndDeletedAtIsNull(postId) + .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); + if (member.getMemberId() == null) { + throw new ApplicationException(UNAUTHORIZED_EXCEPTION); + } + if(postScrapRepository.findByPostAndMember(post, member)==null){ //post, member 정보는 존재하되, scrap한적이 없는 경우 default false값 반환 + return new PostScrapRes(post.getPostId(), member.getMemberId(), false); } + PostScrap postScrap = postScrapRepository.findByPostAndMember(post, member); + return new PostScrapRes(postScrap.getPost().getPostId(), postScrap.getMember().getMemberId(), postScrap.getScrapStatus()); } public List getMyPostList(Member member) { From 38a5dbbc84d474e2f6cfb1cd0098fed3aca2c206 Mon Sep 17 00:00:00 2001 From: yumzen Date: Sun, 17 Mar 2024 20:04:35 +0900 Subject: [PATCH 02/13] =?UTF-8?q?fixed:=20pagination=20class=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=B0=8F=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/post/common/Pagination.java | 52 ------------------- .../domain/post/service/PostService.java | 27 +++------- 2 files changed, 8 insertions(+), 71 deletions(-) delete mode 100644 src/main/java/com/gongjakso/server/domain/post/common/Pagination.java diff --git a/src/main/java/com/gongjakso/server/domain/post/common/Pagination.java b/src/main/java/com/gongjakso/server/domain/post/common/Pagination.java deleted file mode 100644 index f718f513..00000000 --- a/src/main/java/com/gongjakso/server/domain/post/common/Pagination.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.gongjakso.server.domain.post.common; - -public class Pagination { - - private int totalPostCount; // 전체 데이터 수 - private int totalPageCount; // 전체 페이지 수 - private int startPost; // 첫 페이지 번호 - private int endPost; // 끝 페이지 번호 - private int page; - private boolean existPrevPage; // 이전 페이지 존재여부 - private boolean existNextPage; // 다음 페이지 존재여부 - - public Pagination(int totalPostCount, int page, int size) { - if (totalPostCount > 0) { - this.totalPostCount = totalPostCount; - this.page = page; - calculation(page, size); - } - } - - private void calculation(int page, int size) { - // 전체 페이지 수 계산 - totalPageCount = (totalPostCount + size - 1) / size; - - // 현재 페이지가 전체 페이지 수보다 큰 경우, 현재 페이지를 전체 페이지 수로 설정 - this.page = (page > totalPageCount) ? totalPageCount : page; - - // 현재 페이지의 첫 post 번호 계산 - startPost = (this.page - 1) * size + 1; - - // 현재 페이지의 끝 post 번호 계산 - endPost = startPost + size - 1; - - // 끝 페이지가 전체 페이지 수보다 큰 경우, 끝 페이지를 전체 페이지 수로 설정 - if (endPost > totalPostCount) { - endPost = totalPostCount; - } - - // 이전 페이지 존재 여부 확인 - existPrevPage = this.page > 0; - - // 다음 페이지 존재 여부 확인 - existNextPage = endPost < totalPostCount; - } - - public int getPage() { - return page - 1; - } - - // 필요에 따라 getter 메서드 추가 - // 예: public int getTotalPageCount() { return totalPageCount; } -} diff --git a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java index 9f2c1d56..e62985cd 100644 --- a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java +++ b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java @@ -2,7 +2,6 @@ import com.gongjakso.server.domain.apply.repository.ApplyRepository; import com.gongjakso.server.domain.member.entity.Member; -import com.gongjakso.server.domain.post.common.Pagination; import com.gongjakso.server.domain.post.dto.*; import com.gongjakso.server.domain.post.entity.Category; import com.gongjakso.server.domain.post.entity.Post; @@ -112,11 +111,8 @@ public PostDeleteRes delete(Member member, Long id) { /* 전체 공모전 공고 목록 조회 */ - public Page getContests(String sort, Pageable p) throws ApplicationException { - int page = p.getPageNumber(); - int size = p.getPageSize(); - Pagination pagination = new Pagination((int) postRepository.count(), page, size); - Pageable pageable = PageRequest.of(pagination.getPage(), size); + public Page getContests(String sort, Pageable page) throws ApplicationException { + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); Page posts; if(sort.equals("createdAt,desc")){ //최신순 posts = postRepository.findAllByPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); @@ -130,8 +126,7 @@ public Page getContests(String sort, Pageable p) throws Applicati 검색어 기반 공모전 공고 목록 조회 */ public Page getContestsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 Page posts; if (sort.equals("createdAt,desc")) { @@ -147,8 +142,7 @@ public Page getContestsBySearchWord(String sort, String searchWor */ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( String sort, String meetingArea, String category, String searchWord, Pageable page) throws ApplicationException { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); if(!category.isBlank()) { if (!CategoryType.isValid(category)){ @@ -175,11 +169,8 @@ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( /* 전체 프로젝트 공고 목록 조회 */ - public Page getProjects(String sort, Pageable p) throws ApplicationException { - int page = p.getPageNumber(); - int size = p.getPageSize(); - Pagination pagination = new Pagination((int) postRepository.count(), page, size); - Pageable pageable = PageRequest.of(pagination.getPage(), size); + public Page getProjects(String sort, Pageable page) throws ApplicationException { + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); Page posts; if(sort.equals("createdAt,desc")){ //최신순 posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); @@ -193,8 +184,7 @@ public Page getProjects(String sort, Pageable p) throws Applicati 검색어 기반 프로젝트 공고 목록 조회 */ public Page getProjectsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 Page posts; if (sort.equals("createdAt,desc")) { @@ -210,8 +200,7 @@ public Page getProjectsBySearchWord(String sort, String searchWor */ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( String sort, String meetingArea, String stackName, String searchWord, Pageable page) throws ApplicationException { - Pagination pagination = new Pagination((int) postRepository.count(), page.getPageNumber(), page.getPageSize()); - Pageable pageable = PageRequest.of(pagination.getPage(), page.getPageSize()); + Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); if(!stackName.isBlank()) { if (!StackNameType.isValid(stackName)){ From 7f92c294b80c9ba93d1f79656901774360ff7c3e Mon Sep 17 00:00:00 2001 From: yumzen Date: Mon, 18 Mar 2024 13:03:33 +0900 Subject: [PATCH 03/13] =?UTF-8?q?fixed:=20post=20entity=20=EC=A7=80?= =?UTF-8?q?=EC=97=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/post/dto/PostDetailRes.java | 7 ++++--- .../server/domain/post/dto/PostModifyReq.java | 3 ++- .../gongjakso/server/domain/post/dto/PostReq.java | 6 ++++-- .../gongjakso/server/domain/post/dto/PostRes.java | 5 +++-- .../gongjakso/server/domain/post/entity/Post.java | 15 ++++++++++----- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java index 26007642..0b187156 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java @@ -1,7 +1,6 @@ package com.gongjakso.server.domain.post.dto; import com.fasterxml.jackson.annotation.JsonInclude; -import com.gongjakso.server.domain.member.entity.Member; import com.gongjakso.server.domain.post.entity.Category; import com.gongjakso.server.domain.post.entity.Post; import com.gongjakso.server.domain.post.entity.StackName; @@ -31,7 +30,8 @@ public record PostDetailRes( List stackNames, List categories, MeetingMethod meetingMethod, - String meetingArea, + String meetingCity, + String meetingTown, boolean questionMethod, String questionLink, boolean postType, @@ -56,7 +56,8 @@ public static PostDetailRes of(Post post, int currentPerson) { .stackNames(post.getStackNames()) .categories(post.getCategories()) .meetingMethod(post.getMeetingMethod()) - .meetingArea(post.getMeetingArea()) + .meetingCity(post.getMeetingCity()) + .meetingTown(post.getMeetingTown()) .questionMethod(post.isQuestionMethod()) .questionLink(post.getQuestionLink()) .postType(post.isPostType()) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java index 646cb6b1..0199a3ec 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java @@ -20,7 +20,8 @@ public record PostModifyReq ( List stackNames, List categories, MeetingMethod meetingMethod, - String meetingArea, + String meetingCity, + String meetingTown, boolean questionMethod, String questionLink, boolean postType diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java index 70e49d5b..964ae2ea 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java @@ -20,7 +20,8 @@ public record PostReq ( List stackNames, List categories, MeetingMethod meetingMethod, - String meetingArea, + String meetingCity, + String meetingTown, boolean questionMethod, String questionLink, boolean postType @@ -36,7 +37,8 @@ public Post from(){ .finishDate(this.finishDate) .maxPerson(this.maxPerson) .meetingMethod(this.meetingMethod) - .meetingArea(this.meetingArea) + .meetingCity(this.meetingCity) + .meetingTown(this.meetingTown) .questionMethod(this.questionMethod) .questionLink(this.questionLink) .postType(this.postType) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java index b2c3912b..e9404cd5 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java @@ -13,7 +13,7 @@ @Builder public record PostRes(Long postId, Long memberId, String title, String contents, String contestLink, PostStatus status, LocalDateTime startDate, LocalDateTime endDate, LocalDateTime finishDate, Long maxPerson, List stackNames, - List categories, MeetingMethod meetingMethod, String meetingArea, + List categories, MeetingMethod meetingMethod, String meetingCity, String meetingTown, boolean questionMethod, String questionLink, boolean postType, LocalDateTime createdAt, LocalDateTime modifiedAt, LocalDateTime deletedAt){ public static PostRes of(Post post){ return PostRes.builder() @@ -30,7 +30,8 @@ public static PostRes of(Post post){ .stackNames(post.getStackNames()) .categories(post.getCategories()) .meetingMethod(post.getMeetingMethod()) - .meetingArea(post.getMeetingArea()) + .meetingCity(post.getMeetingCity()) + .meetingTown(post.getMeetingTown()) .questionMethod(post.isQuestionMethod()) .questionLink(post.getQuestionLink()) .postType(post.isPostType()) diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java index 71d16fbf..552a89f0 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java @@ -63,8 +63,11 @@ public class Post extends BaseTimeEntity { @Enumerated(EnumType.STRING) private MeetingMethod meetingMethod; - @Column(name = "meeting_area", columnDefinition = "varchar(100)") - private String meetingArea; + @Column(name = "meeting_city", columnDefinition = "varchar(100)") + private String meetingCity; + + @Column(name = "meeting_town", columnDefinition = "varchar(100)") + private String meetingTown; @Column(name = "constest_link", columnDefinition = "varchar(100)") private String contestLink; @@ -91,7 +94,7 @@ public long getDaysRemaining(){ @Builder public Post(String title, Member member, String contents, String contestLink, LocalDateTime startDate, LocalDateTime endDate, LocalDateTime finishDate, Long maxPerson, MeetingMethod meetingMethod, - String meetingArea, boolean questionMethod, String questionLink, boolean postType, + String meetingCity, String meetingTown, boolean questionMethod, String questionLink, boolean postType, List stackNames, List categories) { this.title = title; this.member = member; @@ -103,7 +106,8 @@ public Post(String title, Member member, String contents, String contestLink, Lo this.endDate = endDate; this.maxPerson = maxPerson; this.meetingMethod = meetingMethod; - this.meetingArea = meetingArea; + this.meetingCity = meetingCity; + this.meetingTown = meetingTown; this.questionMethod = questionMethod; this.questionLink = questionLink; this.postType = postType; @@ -122,7 +126,8 @@ public void modify(PostModifyReq req) { this.finishDate = req.finishDate(); this.maxPerson = req.maxPerson(); this.meetingMethod = req.meetingMethod(); - this.meetingArea = req.meetingArea(); + this.meetingCity = req.meetingCity(); + this.meetingTown = req.meetingTown(); this.questionMethod = req.questionMethod(); this.questionLink = req.questionLink(); this.postType = req.postType(); From 22f833a1b71ae514179707f548c54c825c5c8696 Mon Sep 17 00:00:00 2001 From: yumzen Date: Tue, 19 Mar 2024 17:45:21 +0900 Subject: [PATCH 04/13] =?UTF-8?q?fixed:=20post=20=EC=A7=80=EC=97=AD=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=BF=BC=EB=A6=AC=20=ED=8F=AC=ED=95=A8=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/controller/PostController.java | 14 ++++---- .../post/repository/PostRepository.java | 32 +++++++++---------- .../domain/post/service/PostService.java | 28 +++++++++------- 3 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/controller/PostController.java b/src/main/java/com/gongjakso/server/domain/post/controller/PostController.java index eb7360fb..af501061 100644 --- a/src/main/java/com/gongjakso/server/domain/post/controller/PostController.java +++ b/src/main/java/com/gongjakso/server/domain/post/controller/PostController.java @@ -51,16 +51,17 @@ public ApplicationResponse delete(@AuthenticationPrincipal Princi public ApplicationResponse> contestList(@PageableDefault(size = 6) Pageable pageable, @RequestParam(value = "searchWord", required = false) String searchWord, @RequestParam(value = "category", required = false) String category, - @RequestParam(value = "meetingArea", required = false) String meetingArea, + @RequestParam(value = "meetingCity", required = false) String meetingCity, + @RequestParam(value = "meetingTown", required = false) String meetingTown, @RequestParam(value = "sort", required = false) String sort) { - if(category.isBlank() && meetingArea.isBlank()){ + if(category.isBlank() && meetingCity.isBlank()){ if(searchWord.isBlank()){ return ApplicationResponse.ok(postService.getContests(sort, pageable)); }else { return ApplicationResponse.ok(postService.getContestsBySearchWord(sort, searchWord, pageable)); } }else { - return ApplicationResponse.ok(postService.getContestsByMeetingAreaAndCategoryAndSearchWord(sort, meetingArea, category, searchWord, pageable)); + return ApplicationResponse.ok(postService.getContestsByMeetingAreaAndCategoryAndSearchWord(sort, meetingCity, meetingTown, category, searchWord, pageable)); } } @@ -69,16 +70,17 @@ public ApplicationResponse> contestList(@PageableDefault(siz public ApplicationResponse> projectList(@PageableDefault(size = 6) Pageable pageable, @RequestParam(value = "searchWord", required = false) String searchWord, @RequestParam(value = "stackName", required = false) String stackName, - @RequestParam(value = "meetingArea", required = false) String meetingArea, + @RequestParam(value = "meetingCity", required = false) String meetingCity, + @RequestParam(value = "meetingTown", required = false) String meetingTown, @RequestParam(value = "sort", required = false) String sort) { - if(stackName.isBlank() && meetingArea.isBlank()){ + if(stackName.isBlank() && meetingCity.isBlank()){ if(searchWord.isBlank()){ return ApplicationResponse.ok(postService.getProjects(sort, pageable)); }else { return ApplicationResponse.ok(postService.getProjectsBySearchWord(sort, searchWord, pageable)); } }else { - return ApplicationResponse.ok(postService.getProjectsByMeetingAreaAndStackNameAndSearchWord(sort, meetingArea, stackName, searchWord, pageable)); + return ApplicationResponse.ok(postService.getProjectsByMeetingAreaAndStackNameAndSearchWord(sort, meetingCity, meetingTown, stackName, searchWord, pageable)); } } diff --git a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java index 9f005038..524c9706 100644 --- a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java +++ b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java @@ -56,27 +56,27 @@ public interface PostRepository extends JpaRepository { /* 지역, 검색어 기반 공모전 공고 목록 조회 최신순 */ - Page findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, Pageable pageable); + Page findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, Pageable pageable); /* 지역, 검색어 기반 공모전 공고 목록 조회 스크랩순 */ - Page findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, Pageable pageable); + Page findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByScrapCountDescCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, Pageable pageable); /* 지역, 카테고리, 검색어 기반 공모전 공고 목록 조회 최신순 */ - Page findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, @Param("stackNameType") String categoryType,Pageable pageable); + Page findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, @Param("stackNameType") String categoryType,Pageable pageable); /* 지역, 카테고리, 검색어 기반 공모전 공고 목록 조회 최신순 */ - Page findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, @Param("stackNameType") String categoryType,Pageable pageable); + Page findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, @Param("stackNameType") String categoryType,Pageable pageable); /* @@ -106,27 +106,27 @@ public interface PostRepository extends JpaRepository { /* 지역, 검색어 기반 프로젝트 공고 목록 조회 최신순 */ - Page findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, Pageable pageable); + Page findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, Pageable pageable); /* 지역, 검색어 기반 프로젝트 공고 목록 조회 스크랩순 */ - Page findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, Pageable pageable); + Page findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByScrapCountDescCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, Pageable pageable); /* 지역, 스택, 검색어 기반 프로젝트 공고 목록 조회 최신순 */ - Page findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, @Param("stackNameType") String stackNameType,Pageable pageable); + Page findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, @Param("stackNameType") String stackNameType,Pageable pageable); /* 지역, 스택, 검색어 기반 프로젝트 공고 목록 조회 최신순 */ - Page findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc - (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingArea") String meetingArea, @Param("stackNameType") String stackNameType,Pageable pageable); + Page findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc + (@Param("searchWord") String searchWord, @Param("currentTimestamp") LocalDateTime currentTimestamp, @Param("status") PostStatus status, @Param("meetingCity") String meetingCity, @Param("meetingTown") String meetingTown, @Param("stackNameType") String stackNameType,Pageable pageable); List findAllByMemberAndStatusAndDeletedAtIsNull(Member member, PostStatus status); diff --git a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java index e62985cd..02d92315 100644 --- a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java +++ b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java @@ -46,7 +46,7 @@ public PostRes create(Member member, PostReq req) { } Post entity = new Post(req.title(), member, req.contents(), req.contestLink(), req.startDate(), req.endDate(), - req.finishDate(), req.maxPerson(), req.meetingMethod(), req.meetingArea(), req.questionMethod(), + req.finishDate(), req.maxPerson(), req.meetingMethod(), req.meetingCity(), req.meetingTown(), req.questionMethod(), req.questionLink(), req.postType(), new ArrayList<>(), new ArrayList<>()); List stackNames = req.stackNames().stream() @@ -141,26 +141,29 @@ public Page getContestsBySearchWord(String sort, String searchWor 지역, 카테고리 기반 공모전 공고 목록 조회 */ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( - String sort, String meetingArea, String category, String searchWord, Pageable page) throws ApplicationException { + String sort, String meetingCity, String meetingTown, String category, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); + if(meetingTown.equals("전체")){ + meetingTown = ""; + } if(!category.isBlank()) { if (!CategoryType.isValid(category)){ throw new ApplicationException(INVALID_VALUE_EXCEPTION); } Page posts; if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); + posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndCategoriesCategoryTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity, meetingTown, category.toString(), pageable); }else{ - posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, category.toString(), pageable); + posts = postRepository.findAllPostsJoinedWithCategoriesByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndCategoriesCategoryTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity, meetingTown, category.toString(), pageable); } return posts.map(post -> GetContestRes.of(post)); } else{ Page posts; if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity, meetingTown, pageable); }else{ - posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + posts = postRepository.findAllByTitleContainsAndPostTypeFalseAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity, meetingTown, pageable); } return posts.map(post -> GetContestRes.of(post)); } @@ -199,26 +202,29 @@ public Page getProjectsBySearchWord(String sort, String searchWor 지역, 스택 기반 프로젝트 공고 목록 조회 */ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( - String sort, String meetingArea, String stackName, String searchWord, Pageable page) throws ApplicationException { + String sort, String meetingCity, String meetingTown, String stackName, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); + if(meetingTown.equals("전체")){ + meetingTown = ""; + } if(!stackName.isBlank()) { if (!StackNameType.isValid(stackName)){ throw new ApplicationException(INVALID_VALUE_EXCEPTION); } Page posts; if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); + posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndStackNamesStackNameTypeContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, stackName.toString(), pageable); }else{ - posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, stackName.toString(), pageable); + posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, stackName.toString(), pageable); } return posts.map(post -> GetProjectRes.of(post)); } else{ Page posts; if (sort.equals("createdAt,desc")) { - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, pageable); }else{ - posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingAreaContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingArea, pageable); + posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, pageable); } return posts.map(post -> GetProjectRes.of(post)); } From da0f7d22da9b4c890723ade5a423646dd9a07d46 Mon Sep 17 00:00:00 2001 From: yumzen Date: Wed, 20 Mar 2024 04:24:48 +0900 Subject: [PATCH 05/13] =?UTF-8?q?fixed:=20basetimeentity=20=EB=B3=B5?= =?UTF-8?q?=EA=B5=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gongjakso/server/domain/post/entity/StackName.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java b/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java index b364a4da..8351c20d 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java @@ -12,14 +12,14 @@ @Entity @Table(name = "stack_name") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class StackName extends BaseTimeEntity { +public class StackName extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "stack_name_id", nullable = false, columnDefinition = "bigint") private Long stackNameId; - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id", nullable = false, columnDefinition = "bigint") @JsonIgnore private Post post; From 4b6a7bd8cff010abb6eba5ab78a3663a88fd11fd Mon Sep 17 00:00:00 2001 From: yumzen Date: Wed, 20 Mar 2024 05:00:50 +0900 Subject: [PATCH 06/13] =?UTF-8?q?fixed:=20Apply=20stackName=20Fetch=20Join?= =?UTF-8?q?=20=EB=A9=94=EC=86=8C=EB=93=9C=20=EC=9D=B4=EB=A6=84=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/apply/repository/ApplyRepository.java | 2 +- .../domain/apply/service/ApplyService.java | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java b/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java index 32408178..ee38e1d3 100644 --- a/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java +++ b/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java @@ -10,7 +10,7 @@ import java.util.List; public interface ApplyRepository extends JpaRepository { - long countApplyByPost(Post post); + long countApplyWithStackNameUsingFetchJoinByPost(Post post); boolean existsApplyByMemberAndPost(Member member,Post post); Page findAllByPost(Post post, Pageable pageable); diff --git a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java index aef7c438..64083f43 100644 --- a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java +++ b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java @@ -38,7 +38,7 @@ public class ApplyService { private final CategoryRepository categoryRepository; private final StackNameRepository stackNameRepository; public void save(Member member, Long post_id, ApplyReq req){ - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -58,11 +58,11 @@ public void save(Member member, Long post_id, ApplyReq req){ } public ApplyRes findApply(Long post_id){ - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ - int current_person = (int) applyRepository.countApplyByPost(post); + int current_person = (int) applyRepository.countApplyWithStackNameUsingFetchJoinByPost(post); List categoryList = categoryRepository.findCategoryByPost(post); List list = new ArrayList<>(); if(categoryList!=null) { @@ -86,7 +86,7 @@ public ApplyRes findApply(Long post_id){ } } public ApplyPageRes applyListPage(long post_id,int page,int size){ - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ @@ -113,7 +113,7 @@ public ParticipationPageRes myParticipationPostListPage(int page,int size){ return ParticipationPageRes.of(participationLists,pageNo,size,totalPages,last); } public CategoryRes findPostCategory(Long post_id){ - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -174,7 +174,7 @@ public void updateRecruit(Long apply_id, Boolean isRecruit){ } public void updatePostState(Long post_id,String state){ - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ @@ -191,7 +191,7 @@ public void updatePostState(Long post_id,String state){ } } public void updatePostPeriod(Long post_id, PeriodReq req) { - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -206,7 +206,7 @@ public void updatePostPeriod(Long post_id, PeriodReq req) { public ApplicationRes findApplication(Long apply_id,Long post_id){ Apply apply = applyRepository.findById(apply_id).orElseThrow(()->new ApplicationException(ErrorCode.NOT_FOUND_APPLY_EXCEPTION)); - Post post = postRepository.findByPostId(post_id); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ From 37af9c1a48567546240754fbe9eb311185009483 Mon Sep 17 00:00:00 2001 From: yumzen Date: Wed, 20 Mar 2024 05:02:11 +0900 Subject: [PATCH 07/13] =?UTF-8?q?fixed:=20stackName=20=EC=A7=80=EC=97=B0?= =?UTF-8?q?=EB=A1=9C=EB=94=A9+Fetch=20Join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/post/dto/PostDetailRes.java | 2 +- .../server/domain/post/entity/Post.java | 2 +- .../post/repository/PostRepository.java | 2 +- .../domain/post/service/PostService.java | 19 +++++++++++++++---- 4 files changed, 18 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java index 0b187156..09f722e6 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java @@ -46,7 +46,7 @@ public static PostDetailRes of(Post post, int currentPerson) { .memberName(post.getMember().getName()) .title(post.getTitle()) .contents(post.getContents()) - .urlLink("https://www.naver.com") + .urlLink(post.getContestLink()) .status(post.getStatus()) .startDate(post.getStartDate()) .endDate(post.getEndDate()) diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java index 552a89f0..ed2707d5 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java @@ -53,7 +53,7 @@ public class Post extends BaseTimeEntity { @Column(name = "max_person", nullable = false, columnDefinition = "bigint") private Long maxPerson; - @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private List stackNames = new ArrayList<>(); @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) diff --git a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java index 524c9706..c65058ee 100644 --- a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java +++ b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java @@ -13,7 +13,7 @@ import java.util.Optional; public interface PostRepository extends JpaRepository { - Post findByPostId(Long postId); + Post findWithStackNameUsingFetchJoinByPostId(Long postId); Optional findByPostIdAndDeletedAtIsNull(Long postId); List findAllByEndDateBetweenAndPostIdIn(LocalDateTime endDate, LocalDateTime endDate2, List postIdList); diff --git a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java index 02d92315..888861e1 100644 --- a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java +++ b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java @@ -11,8 +11,10 @@ import com.gongjakso.server.domain.post.enumerate.StackNameType; import com.gongjakso.server.domain.post.repository.PostRepository; import com.gongjakso.server.domain.post.repository.PostScrapRepository; +import com.gongjakso.server.domain.post.repository.StackNameRepository; import com.gongjakso.server.global.exception.ApplicationException; import lombok.RequiredArgsConstructor; +import org.hibernate.Hibernate; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -29,12 +31,12 @@ @Service -@Transactional(readOnly = true) @RequiredArgsConstructor public class PostService { private final PostRepository postRepository; private final PostScrapRepository postScrapRepository; private final ApplyRepository applyRepository; + private final StackNameRepository stackNameRepository; @Transactional public PostRes create(Member member, PostReq req) { @@ -65,9 +67,12 @@ public PostRes create(Member member, PostReq req) { @Transactional public PostDetailRes read(Long id) { - Post post = postRepository.findById(id) - .orElseThrow(() -> new ApplicationException(NOT_FOUND_POST_EXCEPTION)); - int current_person = (int) applyRepository.countApplyByPost(post); + Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(id); + if (post == null) { + throw new ApplicationException(NOT_FOUND_POST_EXCEPTION); + } + int current_person = (int) applyRepository.countApplyWithStackNameUsingFetchJoinByPost(post); + Hibernate.initialize(post.getStackNames()); return PostDetailRes.of(post, current_person); } @@ -111,6 +116,7 @@ public PostDeleteRes delete(Member member, Long id) { /* 전체 공모전 공고 목록 조회 */ + @Transactional public Page getContests(String sort, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); Page posts; @@ -125,6 +131,7 @@ public Page getContests(String sort, Pageable page) throws Applic /* 검색어 기반 공모전 공고 목록 조회 */ + @Transactional public Page getContestsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 @@ -140,6 +147,7 @@ public Page getContestsBySearchWord(String sort, String searchWor /* 지역, 카테고리 기반 공모전 공고 목록 조회 */ + @Transactional public Page getContestsByMeetingAreaAndCategoryAndSearchWord( String sort, String meetingCity, String meetingTown, String category, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); @@ -172,6 +180,7 @@ public Page getContestsByMeetingAreaAndCategoryAndSearchWord( /* 전체 프로젝트 공고 목록 조회 */ + @Transactional public Page getProjects(String sort, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); Page posts; @@ -186,6 +195,7 @@ public Page getProjects(String sort, Pageable page) throws Applic /* 검색어 기반 프로젝트 공고 목록 조회 */ + @Transactional public Page getProjectsBySearchWord(String sort, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); searchWord = searchWord.replaceAll(" ", ""); // 검색어에서 공백 제거 @@ -201,6 +211,7 @@ public Page getProjectsBySearchWord(String sort, String searchWor /* 지역, 스택 기반 프로젝트 공고 목록 조회 */ + @Transactional public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( String sort, String meetingCity, String meetingTown, String stackName, String searchWord, Pageable page) throws ApplicationException { Pageable pageable = PageRequest.of(page.getPageNumber(), page.getPageSize()); From 85af04be459b91303243e174e7e602c327f64000 Mon Sep 17 00:00:00 2001 From: yumzen Date: Fri, 22 Mar 2024 20:44:31 +0900 Subject: [PATCH 08/13] =?UTF-8?q?fixed:=20Category=20=EC=A7=80=EC=97=B0?= =?UTF-8?q?=EB=A1=9C=EB=94=A9+Fetch=20Join?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/apply/service/ApplyService.java | 14 +++++++------- .../server/domain/post/entity/Category.java | 2 +- .../gongjakso/server/domain/post/entity/Post.java | 2 +- .../domain/post/repository/PostRepository.java | 2 +- .../server/domain/post/service/PostService.java | 9 ++++++--- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java index 64083f43..a048d65b 100644 --- a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java +++ b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java @@ -38,7 +38,7 @@ public class ApplyService { private final CategoryRepository categoryRepository; private final StackNameRepository stackNameRepository; public void save(Member member, Long post_id, ApplyReq req){ - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -58,7 +58,7 @@ public void save(Member member, Long post_id, ApplyReq req){ } public ApplyRes findApply(Long post_id){ - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ @@ -86,7 +86,7 @@ public ApplyRes findApply(Long post_id){ } } public ApplyPageRes applyListPage(long post_id,int page,int size){ - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ @@ -113,7 +113,7 @@ public ParticipationPageRes myParticipationPostListPage(int page,int size){ return ParticipationPageRes.of(participationLists,pageNo,size,totalPages,last); } public CategoryRes findPostCategory(Long post_id){ - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -174,7 +174,7 @@ public void updateRecruit(Long apply_id, Boolean isRecruit){ } public void updatePostState(Long post_id,String state){ - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ @@ -191,7 +191,7 @@ public void updatePostState(Long post_id,String state){ } } public void updatePostPeriod(Long post_id, PeriodReq req) { - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else { @@ -206,7 +206,7 @@ public void updatePostPeriod(Long post_id, PeriodReq req) { public ApplicationRes findApplication(Long apply_id,Long post_id){ Apply apply = applyRepository.findById(apply_id).orElseThrow(()->new ApplicationException(ErrorCode.NOT_FOUND_APPLY_EXCEPTION)); - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(post_id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); }else{ diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/Category.java b/src/main/java/com/gongjakso/server/domain/post/entity/Category.java index 661075f2..66d1fa4b 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/Category.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/Category.java @@ -18,7 +18,7 @@ public class Category extends BaseTimeEntity { @Column(name = "category_id", nullable = false, columnDefinition = "bigint") private Long categoryId; - @ManyToOne(fetch = FetchType.EAGER) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "post_id", nullable = false, columnDefinition = "bigint") @JsonIgnore private Post post; diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java index ed2707d5..c759dec9 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/Post.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/Post.java @@ -56,7 +56,7 @@ public class Post extends BaseTimeEntity { @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private List stackNames = new ArrayList<>(); - @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY) private List categories = new ArrayList<>(); @Column(name = "meeting_method", columnDefinition = "varchar(10)") diff --git a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java index c65058ee..1bb96b23 100644 --- a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java +++ b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java @@ -13,7 +13,7 @@ import java.util.Optional; public interface PostRepository extends JpaRepository { - Post findWithStackNameUsingFetchJoinByPostId(Long postId); + Post findWithStackNameAndCategoryUsingFetchJoinByPostId(Long postId); Optional findByPostIdAndDeletedAtIsNull(Long postId); List findAllByEndDateBetweenAndPostIdIn(LocalDateTime endDate, LocalDateTime endDate2, List postIdList); diff --git a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java index 888861e1..41a43ab6 100644 --- a/src/main/java/com/gongjakso/server/domain/post/service/PostService.java +++ b/src/main/java/com/gongjakso/server/domain/post/service/PostService.java @@ -11,7 +11,6 @@ import com.gongjakso.server.domain.post.enumerate.StackNameType; import com.gongjakso.server.domain.post.repository.PostRepository; import com.gongjakso.server.domain.post.repository.PostScrapRepository; -import com.gongjakso.server.domain.post.repository.StackNameRepository; import com.gongjakso.server.global.exception.ApplicationException; import lombok.RequiredArgsConstructor; import org.hibernate.Hibernate; @@ -36,7 +35,6 @@ public class PostService { private final PostRepository postRepository; private final PostScrapRepository postScrapRepository; private final ApplyRepository applyRepository; - private final StackNameRepository stackNameRepository; @Transactional public PostRes create(Member member, PostReq req) { @@ -67,12 +65,13 @@ public PostRes create(Member member, PostReq req) { @Transactional public PostDetailRes read(Long id) { - Post post = postRepository.findWithStackNameUsingFetchJoinByPostId(id); + Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(id); if (post == null) { throw new ApplicationException(NOT_FOUND_POST_EXCEPTION); } int current_person = (int) applyRepository.countApplyWithStackNameUsingFetchJoinByPost(post); Hibernate.initialize(post.getStackNames()); + Hibernate.initialize(post.getCategories()); return PostDetailRes.of(post, current_person); } @@ -189,6 +188,7 @@ public Page getProjects(String sort, Pageable page) throws Applic } else{ //스크랩순 posts = postRepository.findAllByPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(LocalDateTime.now(), RECRUITING, pageable); } + posts.forEach(post -> post.getCategories().size()); return posts.map(post -> GetProjectRes.of(post)); } @@ -205,6 +205,7 @@ public Page getProjectsBySearchWord(String sort, String searchWor } else{ posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, pageable); } + posts.forEach(post -> post.getCategories().size()); return posts.map(post -> GetProjectRes.of(post)); } @@ -229,6 +230,7 @@ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( }else{ posts = postRepository.findAllPostsJoinedWithStackNamesByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsAndStackNamesStackNameTypeContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, stackName.toString(), pageable); } + posts.forEach(post -> post.getCategories().size()); return posts.map(post -> GetProjectRes.of(post)); } else{ Page posts; @@ -237,6 +239,7 @@ public Page getProjectsByMeetingAreaAndStackNameAndSearchWord( }else{ posts = postRepository.findAllByTitleContainsAndPostTypeTrueAndDeletedAtIsNullAndFinishDateAfterAndStatusAndMeetingCityContainsAndMeetingTownContainsOrderByScrapCountDescCreatedAtDesc(searchWord.toLowerCase(), LocalDateTime.now(), RECRUITING, meetingCity,meetingTown, pageable); } + posts.forEach(post -> post.getCategories().size()); return posts.map(post -> GetProjectRes.of(post)); } } From ec91c4802b8d6653de77474caa58d0fc0c571e3d Mon Sep 17 00:00:00 2001 From: yumzen Date: Sun, 24 Mar 2024 20:29:04 +0900 Subject: [PATCH 09/13] =?UTF-8?q?feat:=20dto=20swagger=20schema=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/post/dto/CategoryReq.java | 10 ++ .../server/domain/post/dto/GetContestRes.java | 43 +++++++ .../server/domain/post/dto/GetProjectRes.java | 43 +++++++ .../server/domain/post/dto/PostDeleteRes.java | 9 ++ .../server/domain/post/dto/PostDetailRes.java | 94 +++++++++++++++ .../server/domain/post/dto/PostModifyReq.java | 67 ++++++++++ .../server/domain/post/dto/PostReq.java | 60 +++++++++ .../server/domain/post/dto/PostRes.java | 114 +++++++++++++++++- .../server/domain/post/dto/PostScrapRes.java | 14 +++ .../server/domain/post/dto/ScrapPost.java | 16 +++ .../server/domain/post/dto/StackNameReq.java | 6 + .../server/domain/post/entity/StackName.java | 3 +- 12 files changed, 473 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/CategoryReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/CategoryReq.java index 479657d7..1a64f107 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/CategoryReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/CategoryReq.java @@ -1,6 +1,16 @@ package com.gongjakso.server.domain.post.dto; +import io.swagger.v3.oas.annotations.media.Schema; public record CategoryReq ( + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리", + allowableValues = {"PLAN","DESIGN","FE","BE","ETC","LATER"} + ) String categoryType, + + @Schema( + description = "공고 카테고리(역할)의 인원수를 size로 관리", + defaultValue = "0" + ) Integer size ){} diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/GetContestRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/GetContestRes.java index 4ac0bfc1..31132b7b 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/GetContestRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/GetContestRes.java @@ -3,6 +3,7 @@ import com.gongjakso.server.domain.post.entity.Category; import com.gongjakso.server.domain.post.entity.Post; import com.gongjakso.server.domain.post.enumerate.PostStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; @@ -11,15 +12,57 @@ @Builder public record GetContestRes ( + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) Long postId, + + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "post를 생성한 사용자의 이름" + ) String name, //팀장명 + + @Schema( + description = "post의 상태를 (RECRUITING | CANCEL | CLOSE | ACTIVE | COMPLETE) ENUM으로 관리", + defaultValue = "RECRUITING", + allowableValues = {"RECRUITING", "CANCEL", "CLOSE", "ACTIVE", "COMPLETE"} + ) PostStatus status, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜 관리" + ) LocalDateTime finishDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜를 디데이로 관리" + ) long daysRemaining, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) List categories, + + @Schema( + description = "공고 스크랩 수, 스크랩 수가 높을수록 인기순 우선순위", + defaultValue = "0" + ) long scrapCount ){ public static GetContestRes of(Post post){ return GetContestRes.builder() diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/GetProjectRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/GetProjectRes.java index 8eccc399..43dca8df 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/GetProjectRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/GetProjectRes.java @@ -3,6 +3,7 @@ import com.gongjakso.server.domain.post.entity.Category; import com.gongjakso.server.domain.post.entity.Post; import com.gongjakso.server.domain.post.enumerate.PostStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; @@ -11,15 +12,57 @@ @Builder public record GetProjectRes ( + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) Long postId, + + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "post를 생성한 사용자의 이름" + ) String name, //팀장명 + + @Schema( + description = "post의 상태를 (RECRUITING | CANCEL | CLOSE | ACTIVE | COMPLETE) ENUM으로 관리", + defaultValue = "RECRUITING", + allowableValues = {"RECRUITING", "CANCEL", "CLOSE", "ACTIVE", "COMPLETE"} + ) PostStatus status, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜 관리" + ) LocalDateTime finishDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜를 디데이로 관리" + ) long daysRemaining, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) List categories, + + @Schema( + description = "공고 스크랩 수, 스크랩 수가 높을수록 인기순 우선순위", + defaultValue = "0" + ) long scrapCount ){ public static GetProjectRes of(Post post){ return GetProjectRes.builder() diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostDeleteRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostDeleteRes.java index 18506cde..cefe91d9 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostDeleteRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostDeleteRes.java @@ -2,11 +2,20 @@ import com.gongjakso.server.domain.member.entity.Member; import com.gongjakso.server.domain.post.entity.Post; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder public record PostDeleteRes( + + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) Long postId, + + @Schema( + description = "member를 식별하는 pk값" + ) Long memberId ){ public static PostDeleteRes of(Post post, Member member){ diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java index 09f722e6..a414e19c 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostDetailRes.java @@ -6,6 +6,7 @@ import com.gongjakso.server.domain.post.entity.StackName; import com.gongjakso.server.domain.post.enumerate.MeetingMethod; import com.gongjakso.server.domain.post.enumerate.PostStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; @@ -15,27 +16,120 @@ @Builder @JsonInclude(JsonInclude.Include.NON_NULL) public record PostDetailRes( + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) Long postId, + + @Schema( + description = "member를 식별하는 pk값" + ) Long memberId, + + @Schema( + description = "post를 생성한 사용자의 이름" + ) String memberName, + + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "post의 내용을 관리" + ) String contents, + + @Schema( + description = "공모전 공고에서 공모전의 출처를 관리" + ) String urlLink, + + @Schema( + description = "post의 상태를 (RECRUITING | CANCEL | CLOSE | ACTIVE | COMPLETE) ENUM으로 관리", + defaultValue = "RECRUITING", + allowableValues = {"RECRUITING", "CANCEL", "CLOSE", "ACTIVE", "COMPLETE"} + ) PostStatus status, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜를 디데이로 관리" + ) Long daysRemaining, + + @Schema( + description = "공모전/프로젝트 모집하려는 최대 인원 관리", + defaultValue = "0" + ) Long maxPerson, + + @Schema( + description = "공모전/프로젝트 모집된 현황 인원 관리", + defaultValue = "0" + ) int currentPerson, + + @Schema( + description = "사용 기술스택을 (REACT | TYPESCRIPT | JAVASCRIPT | NEXTJS | NODEJS | JAVA | SPRING | KOTLIN | SWIFT | FLUTTER | FIGMA | ETC)의 ENUM으로 관리하는 테이블" + ) List stackNames, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) List categories, + + @Schema( + description = "회의 방식을 (OFFLINE, ONLINE, BOTH) 로 관리", + allowableValues = {"OFFLINE", "ONLINE", "BOTH"} + ) MeetingMethod meetingMethod, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingCity, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingTown, + + @Schema( + description = "Q&A 방법 관리" + ) boolean questionMethod, + + @Schema( + description = "Q&A Link 관리" + ) String questionLink, + + @Schema( + description = "공고 타입을 0(contest), 1(project)으로 관리" + ) boolean postType, + + @Schema( + description = "공고 생성 시간을 관리" + ) LocalDateTime createdAt, + + @Schema( + description = "공고 스크랩 수, 스크랩 수가 높을수록 인기순 우선순위", + defaultValue = "0" + ) Long scrapCount ) { diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java index 0199a3ec..d4d4a5de 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostModifyReq.java @@ -4,26 +4,93 @@ import com.gongjakso.server.domain.post.entity.StackName; import com.gongjakso.server.domain.post.enumerate.MeetingMethod; import com.gongjakso.server.domain.post.enumerate.PostStatus; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; import java.util.List; public record PostModifyReq ( + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "post의 내용을 관리" + ) String contents, + + @Schema( + description = "공모전 공고에서 공모전의 출처를 관리" + ) String contestLink, + + @Schema( + description = "post의 상태를 (RECRUITING | CANCEL | CLOSE | ACTIVE | COMPLETE) ENUM으로 관리", + defaultValue = "RECRUITING", + allowableValues = {"RECRUITING", "CANCEL", "CLOSE", "ACTIVE", "COMPLETE"} + ) PostStatus status, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜 관리" + ) LocalDateTime finishDate, + + @Schema( + description = "공모전/프로젝트 모집하려는 최대 인원 관리", + defaultValue = "0" + ) Long maxPerson, + + @Schema( + description = "사용 기술스택을 (REACT | TYPESCRIPT | JAVASCRIPT | NEXTJS | NODEJS | JAVA | SPRING | KOTLIN | SWIFT | FLUTTER | FIGMA | ETC)의 ENUM으로 관리하는 테이블" + ) List stackNames, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) List categories, + @Schema( + description = "회의 방식을 (OFFLINE, ONLINE, BOTH) 로 관리", + allowableValues = {"OFFLINE", "ONLINE", "BOTH"} + ) MeetingMethod meetingMethod, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingCity, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingTown, + + @Schema( + description = "Q&A 방법 관리" + ) boolean questionMethod, + + @Schema( + description = "Q&A Link 관리" + ) String questionLink, + + @Schema( + description = "공고 타입을 0(contest), 1(project)으로 관리" + ) boolean postType ){ } diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java index 964ae2ea..a0f53c7e 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostReq.java @@ -4,26 +4,86 @@ import com.gongjakso.server.domain.post.entity.Post; import com.gongjakso.server.domain.post.entity.StackName; import com.gongjakso.server.domain.post.enumerate.MeetingMethod; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; import java.util.List; public record PostReq ( + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "post의 내용을 관리" + ) String contents, + + @Schema( + description = "공모전 공고에서 공모전의 출처를 관리" + ) String contestLink, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜 관리" + ) LocalDateTime finishDate, + @Schema( + description = "공모전/프로젝트 모집하려는 최대 인원 관리", + defaultValue = "0" + ) Long maxPerson, + + @Schema( + description = "사용 기술스택을 (REACT | TYPESCRIPT | JAVASCRIPT | NEXTJS | NODEJS | JAVA | SPRING | KOTLIN | SWIFT | FLUTTER | FIGMA | ETC)의 ENUM으로 관리하는 테이블" + ) List stackNames, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) List categories, + @Schema( + description = "회의 방식을 (OFFLINE, ONLINE, BOTH) 로 관리", + allowableValues = {"OFFLINE", "ONLINE", "BOTH"} + ) MeetingMethod meetingMethod, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingCity, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) String meetingTown, + + @Schema( + description = "Q&A 방법 관리" + ) boolean questionMethod, + + @Schema( + description = "Q&A Link 관리" + ) String questionLink, + + @Schema( + description = "공고 타입을 0(contest), 1(project)으로 관리" + ) boolean postType ){ @Builder diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java index e9404cd5..d1aa75d8 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostRes.java @@ -5,16 +5,122 @@ import com.gongjakso.server.domain.post.entity.StackName; import com.gongjakso.server.domain.post.enumerate.MeetingMethod; import com.gongjakso.server.domain.post.enumerate.PostStatus; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; import java.time.LocalDateTime; import java.util.List; @Builder -public record PostRes(Long postId, Long memberId, String title, String contents, String contestLink, PostStatus status, LocalDateTime startDate, - LocalDateTime endDate, LocalDateTime finishDate, Long maxPerson, List stackNames, - List categories, MeetingMethod meetingMethod, String meetingCity, String meetingTown, - boolean questionMethod, String questionLink, boolean postType, LocalDateTime createdAt, LocalDateTime modifiedAt, LocalDateTime deletedAt){ +public record PostRes( + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) + Long postId, + + @Schema( + description = "member를 식별하는 pk값" + ) + Long memberId, + + @Schema( + description = "post의 제목을 관리" + ) + String title, + + @Schema( + description = "post의 내용을 관리" + ) + String contents, + + @Schema( + description = "공모전 공고에서 공모전의 출처를 관리" + ) + String contestLink, + + @Schema( + description = "post의 상태를 (RECRUITING | CANCEL | CLOSE | ACTIVE | COMPLETE) ENUM으로 관리", + defaultValue = "RECRUITING", + allowableValues = {"RECRUITING", "CANCEL", "CLOSE", "ACTIVE", "COMPLETE"} + ) + PostStatus status, + + @Schema( + description = "공모전/프로젝트 활동 시작 날짜 관리" + ) + LocalDateTime startDate, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) + LocalDateTime endDate, + + @Schema( + description = "공모전/프로젝트 모집 마감 날짜 관리" + ) + LocalDateTime finishDate, + + @Schema( + description = "공모전/프로젝트 모집하려는 최대 인원 관리", + defaultValue = "0" + ) + Long maxPerson, + + @Schema( + description = "사용 기술스택을 (REACT | TYPESCRIPT | JAVASCRIPT | NEXTJS | NODEJS | JAVA | SPRING | KOTLIN | SWIFT | FLUTTER | FIGMA | ETC)의 ENUM으로 관리하는 테이블" + ) + List stackNames, + + @Schema( + description = "공고 카테고리(역할)를 (PLAN | DESIGN | FE | BE | ETC | LATER)의 ENUM으로 관리하는 테이블" + ) + List categories, + + @Schema( + description = "회의 방식을 (OFFLINE, ONLINE, BOTH) 로 관리", + allowableValues = {"OFFLINE", "ONLINE", "BOTH"} + ) + MeetingMethod meetingMethod, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) + String meetingCity, + + @Schema( + description = "회의 장소를 행정구역단위로 관리" + ) + String meetingTown, + + @Schema( + description = "Q&A 방법 관리" + ) + boolean questionMethod, + + @Schema( + description = "Q&A Link 관리" + ) + String questionLink, + + @Schema( + description = "공고 타입을 0(contest), 1(project)으로 관리" + ) + boolean postType, + + @Schema( + description = "공고 생성 날짜 관리" + ) + LocalDateTime createdAt, + + @Schema( + description = "공고 마지막 수정 날짜 관리" + ) + LocalDateTime modifiedAt, + + @Schema( + description = "공고 논리적 삭제 관리" + ) + LocalDateTime deletedAt){ public static PostRes of(Post post){ return PostRes.builder() .postId(post.getPostId()) diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/PostScrapRes.java b/src/main/java/com/gongjakso/server/domain/post/dto/PostScrapRes.java index 0da7c5bc..4058d2a2 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/PostScrapRes.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/PostScrapRes.java @@ -1,12 +1,26 @@ package com.gongjakso.server.domain.post.dto; import com.gongjakso.server.domain.post.entity.PostScrap; +import io.swagger.v3.oas.annotations.media.Schema; import lombok.Builder; @Builder public record PostScrapRes( + + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) Long postId, + + @Schema( + description = "member를 식별하는 pk값" + ) Long memberId, + + @Schema( + description = "사용자가 공고를 스크랩 했는지 boolean값으로 판단", + defaultValue = "0" + ) Boolean ScrapStatus ) { public static PostScrapRes of(PostScrap postScrap){ diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/ScrapPost.java b/src/main/java/com/gongjakso/server/domain/post/dto/ScrapPost.java index 716c410d..7891282c 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/ScrapPost.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/ScrapPost.java @@ -1,13 +1,29 @@ package com.gongjakso.server.domain.post.dto; import com.gongjakso.server.domain.post.entity.Post; +import io.swagger.v3.oas.annotations.media.Schema; import java.time.LocalDateTime; public record ScrapPost( + @Schema( + description = "post가 생성된 순서를 관리하며 숫자가 높을수록 최신 공고임" + ) long postId, + + @Schema( + description = "post의 제목을 관리" + ) String title, + + @Schema( + description = "공모전/프로젝트 활동 마감 날짜 관리" + ) LocalDateTime endDate, + + @Schema( + description = "공고 타입을 0(contest), 1(project)으로 관리" + ) Boolean postType ) { public static ScrapPost of(Post post){ diff --git a/src/main/java/com/gongjakso/server/domain/post/dto/StackNameReq.java b/src/main/java/com/gongjakso/server/domain/post/dto/StackNameReq.java index 8f05020c..847a50d0 100644 --- a/src/main/java/com/gongjakso/server/domain/post/dto/StackNameReq.java +++ b/src/main/java/com/gongjakso/server/domain/post/dto/StackNameReq.java @@ -1,5 +1,11 @@ package com.gongjakso.server.domain.post.dto; +import io.swagger.v3.oas.annotations.media.Schema; + public record StackNameReq ( + @Schema( + description = "사용 기술스택을 (REACT | TYPESCRIPT | JAVASCRIPT | NEXTJS | NODEJS | JAVA | SPRING | KOTLIN | SWIFT | FLUTTER | FIGMA | ETC)의 ENUM으로 관리", + allowableValues = {"REACT","TYPESCRIPT","JAVASCRIPT","NEXTJS","NODEJS","JAVA","SPRING","KOTLIN","SWIFT","FLUTTER","FIGMA","ETC"} + ) String stackNameType ){} diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java b/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java index 8351c20d..906c38d6 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/StackName.java @@ -1,7 +1,6 @@ package com.gongjakso.server.domain.post.entity; import com.fasterxml.jackson.annotation.JsonIgnore; -import com.gongjakso.server.global.common.BaseTimeEntity; import jakarta.persistence.*; import lombok.AccessLevel; import lombok.Builder; @@ -12,7 +11,7 @@ @Entity @Table(name = "stack_name") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class StackName extends BaseTimeEntity { +public class StackName { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) From 35fca4f489f4a9fae0fbd1f08015353370ee6430 Mon Sep 17 00:00:00 2001 From: yumzen Date: Tue, 26 Mar 2024 12:45:13 +0900 Subject: [PATCH 10/13] =?UTF-8?q?fixed:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20basetimeentity=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gongjakso/server/domain/post/entity/Category.java | 3 +-- .../com/gongjakso/server/domain/post/entity/PostScrap.java | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/Category.java b/src/main/java/com/gongjakso/server/domain/post/entity/Category.java index 66d1fa4b..229a2536 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/Category.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/Category.java @@ -2,7 +2,6 @@ import com.fasterxml.jackson.annotation.JsonIgnore; import com.gongjakso.server.domain.post.enumerate.CategoryType; -import com.gongjakso.server.global.common.BaseTimeEntity; import jakarta.persistence.*; import lombok.*; @@ -11,7 +10,7 @@ @Entity @Table(name = "category") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Category extends BaseTimeEntity { +public class Category { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/gongjakso/server/domain/post/entity/PostScrap.java b/src/main/java/com/gongjakso/server/domain/post/entity/PostScrap.java index 556f0a98..0797d3e7 100644 --- a/src/main/java/com/gongjakso/server/domain/post/entity/PostScrap.java +++ b/src/main/java/com/gongjakso/server/domain/post/entity/PostScrap.java @@ -1,7 +1,6 @@ package com.gongjakso.server.domain.post.entity; import com.gongjakso.server.domain.member.entity.Member; -import com.gongjakso.server.global.common.BaseTimeEntity; import jakarta.persistence.*; import lombok.*; @@ -9,7 +8,7 @@ @Getter @Setter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class PostScrap extends BaseTimeEntity{ +public class PostScrap{ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private long postScrapId; From 62d0b6b7708898a5728280fdbcab2012ca76bc5a Mon Sep 17 00:00:00 2001 From: Jieun Yeom Date: Sat, 13 Apr 2024 19:17:12 +0900 Subject: [PATCH 11/13] fixed: findByPostId --- .../gongjakso/server/domain/post/repository/PostRepository.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java index 39d3f482..71fb0009 100644 --- a/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java +++ b/src/main/java/com/gongjakso/server/domain/post/repository/PostRepository.java @@ -13,6 +13,7 @@ import java.util.Optional; public interface PostRepository extends JpaRepository { + Post findByPostId(Long postId); Post findWithStackNameAndCategoryUsingFetchJoinByPostId(Long postId); Optional findByPostIdAndDeletedAtIsNull(Long postId); From a5406fe0ca2788893a911cc52f843751526a0701 Mon Sep 17 00:00:00 2001 From: Jieun Yeom Date: Sat, 13 Apr 2024 19:27:01 +0900 Subject: [PATCH 12/13] =?UTF-8?q?fix:=20ApplyService=20=EC=B6=A9=EB=8F=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/apply/service/ApplyService.java | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java index f2f056bb..6ca0d51b 100644 --- a/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java +++ b/src/main/java/com/gongjakso/server/domain/apply/service/ApplyService.java @@ -25,8 +25,8 @@ import java.time.LocalDateTime; import java.util.ArrayList; -import java.util.List; import java.util.Optional; +import java.util.List; import java.util.stream.Collectors; import static com.gongjakso.server.domain.post.enumerate.PostStatus.RECRUITING; @@ -58,13 +58,13 @@ public void save(Member member, Long post_id, ApplyReq req) { } - public ApplyRes findApply(Member member, Long post_id) { + public ApplyRes findApply(Member member,Long post_id) { //Get Post Post post = postRepository.findById(post_id).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION)); if (post == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION); } - if (post.getMember() != member) { + if(post.getMember()!=member){ throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); } @@ -76,15 +76,15 @@ public ApplyRes findApply(Member member, Long post_id) { } public CategoryRes findPostCategory(Long post_id) { - Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(post_id); + Post post = postRepository.findByPostId(post_id); //Change List Type List categoryList = changeCategoryType(post); List stackNameList; - if (post.isPostType()) { + if(post.isPostType()){ stackNameList = changeStackNameType(post); - } else { - stackNameList = null; + }else { + stackNameList= null; } return CategoryRes.of(categoryList, stackNameList); @@ -103,11 +103,11 @@ public ApplicationRes findApplication(Member member, Long apply_id, Long post_id //Change List Type List categoryList = changeCategoryType(post); List stackNameList; - if (post.isPostType()) { + if(post.isPostType()){ stackNameList = changeStackNameType(post); System.out.println("change stack name"); - } else { - stackNameList = null; + }else { + stackNameList= null; } return ApplicationRes.of(apply, categoryList, stackNameList); @@ -115,7 +115,7 @@ public ApplicationRes findApplication(Member member, Long apply_id, Long post_id } - public List changeCategoryType(Post post) { + public List changeCategoryType(Post post){ List categoryList = categoryRepository.findCategoryByPost(post); if (categoryList == null) { throw new ApplicationException(ErrorCode.NOT_FOUND_CATEGORY_EXCEPTION); @@ -129,7 +129,7 @@ public List changeCategoryType(Post post) { return stringTypelist; } - public List changeStackNameType(Post post) { + public List changeStackNameType(Post post){ List stackNameList = stackNameRepository.findStackNameByPost(post); List stringTypelist = new ArrayList<>(); for (StackName stackName : stackNameList) { @@ -139,7 +139,7 @@ public List changeStackNameType(Post post) { return stringTypelist; } - public ApplyPageRes applyListPage(Member member, long post_id, int page, int size) { + public ApplyPageRes applyListPage(Member member,long post_id, int page, int size) { Post post = postRepository.findById(post_id).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION)); if (post.getMember() != member) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); @@ -180,7 +180,7 @@ private String decisionState(Apply apply) { return "미열람"; } - public void updateState(Member member, Long apply_id, ApplyType applyType) { + public void updateState(Member member,Long apply_id, ApplyType applyType) { Apply apply = applyRepository.findById(apply_id).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_APPLY_EXCEPTION)); //Check ApplyType if (apply.getApplyType().equals(ApplyType.NONE) || apply.getApplyType().equals(ApplyType.OPEN_APPLY)) { @@ -190,7 +190,7 @@ public void updateState(Member member, Long apply_id, ApplyType applyType) { apply.setApplyType(applyType); if (applyType.equals(ApplyType.PASS)) { Post post = apply.getPost(); - if (post.getMember() != member) { + if(post.getMember()!=member){ throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); } Category category = categoryRepository.findCategoryByPostAndCategoryType(post, CategoryType.valueOf(apply.getRecruit_part())); @@ -204,7 +204,7 @@ public void updateState(Member member, Long apply_id, ApplyType applyType) { } - public void updatePostState(Member member, Long post_id, PostStatus postStatus) { + public void updatePostState(Member member,Long post_id, PostStatus postStatus) { Post post = postRepository.findById(post_id).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION)); if (post.getMember() != member) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); @@ -217,7 +217,7 @@ public void updatePostState(Member member, Long post_id, PostStatus postStatus) post.setStatus(postStatus); } - public void updatePostPeriod(Member member, Long post_id, PeriodReq req) { + public void updatePostPeriod(Member member,Long post_id, PeriodReq req) { Post post = postRepository.findById(post_id).orElseThrow(() -> new ApplicationException(ErrorCode.NOT_FOUND_POST_EXCEPTION)); if (post.getMember() != member) { throw new ApplicationException(ErrorCode.UNAUTHORIZED_EXCEPTION); @@ -236,25 +236,22 @@ public List getMyApplyList(Member member) { // Business Logic List applyList = applyRepository.findAllByMemberAndDeletedAtIsNull(member); - List postIdList = applyList.stream() - .map(apply -> apply.getPost().getPostId()) - .toList(); - List postList = postRepository.findAllByPostIdInAndStatusAndDeletedAtIsNull(postIdList, RECRUITING); // Response - return postList.stream() - .map(post -> { + return applyList.stream() + .filter(apply -> apply.getPost().getStatus() == PostStatus.RECRUITING) + .map(apply -> { + Post post = apply.getPost(); List categoryList = post.getCategories().stream() .map(category -> category.getCategoryType().toString()) .toList(); - return MyPageRes.of(post, member, categoryList); + return MyPageRes.of(post, apply, categoryList); }) .collect(Collectors.toList()); } - public Long getApplicantApplyId(Long memberId, Long postId) { Post post = postRepository.findWithStackNameAndCategoryUsingFetchJoinByPostId(postId); From f6216d6d8fc3504b23fd4b10295a9e1df771e7b4 Mon Sep 17 00:00:00 2001 From: Jieun Yeom Date: Sat, 13 Apr 2024 19:30:03 +0900 Subject: [PATCH 13/13] =?UTF-8?q?fix:=20ApplyRepository=20=EC=B6=A9?= =?UTF-8?q?=EB=8F=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/domain/apply/repository/ApplyRepository.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java b/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java index 938169fd..90939f7c 100644 --- a/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java +++ b/src/main/java/com/gongjakso/server/domain/apply/repository/ApplyRepository.java @@ -12,8 +12,11 @@ public interface ApplyRepository extends JpaRepository { long countApplyWithStackNameUsingFetchJoinByPost(Post post); + long countApplyByPost(Post post); boolean existsApplyByMemberAndPost(Member member,Post post); Page findAllByPost(Post post, Pageable pageable); Page findApplyByApplyType(ApplyType applyType, Pageable pageable); List findAllByMemberAndDeletedAtIsNull(Member member); -} \ No newline at end of file + List findAllByPost(Post post); + Long findApplyIdByMemberAndPost(Member member,Post post); +}