From b088968553d63055c35e4e3b9fd1e621f42f84a8 Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 28 Mar 2025 15:07:21 +0900 Subject: [PATCH 01/16] =?UTF-8?q?refactor:date->LocalDateTime=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/activity/ActivityServiceImpl.java | 2 +- .../application/archive/ArchiveServiceImpl.java | 2 +- .../semtlewebserverspring/config/SecurityConfig.java | 2 +- .../semtlewebserverspring/domain/activity/Activity.java | 8 ++++---- .../dto/activity/ActivityRequestDto.java | 4 +++- .../dto/activity/ActivityResponseDto.java | 3 ++- .../vo/activity/ActivityRequestVo.java | 5 +++-- .../vo/activity/ActivityResponseVo.java | 4 +++- 8 files changed, 18 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index b402e5a..28dd534 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -36,10 +36,10 @@ public void createActivityBoard(ActivityRequestDto requestDto) throws IOExceptio Activity activity = Activity.builder() .title(requestDto.getTitle()) .content(requestDto.getContent()) + .createdAt(requestDto.getCreatedAt()) .writer(requestDto.getWriter()) .images(requestDto.getImages()) .uuid(requestDto.getUuid()) - .createdAt(new Date()) .type(requestDto.getType()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 838fee5..8f6fa17 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -22,7 +22,7 @@ @Service @AllArgsConstructor -public class ArchiveServiceImpl implements ArchiveService{ +public class ArchiveServiceImpl implements ArchiveService{ private final ArchiveRepository archiveRepository; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java index 400494c..0d016c3 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java @@ -32,7 +32,7 @@ public CorsConfigurationSource corsConfigurationSource() { var cors = new org.springframework.web.cors.CorsConfiguration(); cors.setAllowedOriginPatterns( List.of("http://localhost:3000", "https://archisemtle.com", - "https://archisemtle.site")); + "https://archisemtle.site", "http://localhost:8080/")); cors.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); cors.setAllowedHeaders(List.of("*")); cors.setAllowCredentials(true); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java index d0f99d4..d1fe5a2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.dto.activity.ActivityRequestDto; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -27,10 +28,9 @@ public class Activity { private String content; @Column(nullable = false, unique = false) private String writer; - @Column(nullable = true, unique = false) - @Temporal(TemporalType.DATE) - private Date createdAt; - @Column(nullable = true, unique = false, columnDefinition = "uuid") + @Column(nullable = false, unique = false) + private LocalDateTime createdAt; + @Column(nullable = false, unique = false, columnDefinition = "uuid") private UUID uuid; @ElementCollection @CollectionTable(name = "activity_image", joinColumns = @JoinColumn(name = "activity_id")) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java index b129c93..0467771 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityRequestDto.java @@ -1,5 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto.activity; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -16,7 +18,7 @@ public class ActivityRequestDto { private String content; private String writer; private UUID uuid; - private Date createdAt; + private LocalDateTime createdAt; private String type; private List images; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java index 419dd80..b2da687 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/activity/ActivityResponseDto.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.activity.Activity; import com.archisemtle.semtlewebserverspring.vo.activity.ActivityResponseVo; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -16,7 +17,7 @@ public class ActivityResponseDto { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java index 5837ae2..8dafd25 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityRequestVo.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.vo.activity; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityRequestDto; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -14,7 +16,6 @@ public class ActivityRequestVo { private String title; private String content; private String writer; - private Date createdAt; private UUID uuid; private List images; private String type; @@ -25,7 +26,7 @@ public static ActivityRequestDto voToDto(ActivityRequestVo requestVo){ .content(requestVo.getContent()) .writer(requestVo.getWriter()) .images(requestVo.getImages()) - .createdAt(requestVo.getCreatedAt()) + .createdAt(LocalDateTime.now()) .uuid(requestVo.getUuid()) .type(requestVo.getType()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java index 0414091..d15bea8 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/activity/ActivityResponseVo.java @@ -1,5 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.activity; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import lombok.Builder; @@ -14,7 +16,7 @@ public class ActivityResponseVo { private String title; private String content; private String writer; - private Date createdAt; + private LocalDateTime createdAt; private List images; private String type; From b4b6f9f240ebedc99c838b2f85858c2015464edf Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 28 Mar 2025 19:22:04 +0900 Subject: [PATCH 02/16] =?UTF-8?q?refactor:Date->LocalDateTime=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../archive/ArchiveServiceImpl.java | 13 +++++---- .../domain/archive/Archive.java | 28 +++++++------------ .../dto/archive/ArchiveRequestDto.java | 3 +- .../dto/archive/ArchiveResponseDto.java | 4 +-- .../archive/ArchiveController.java | 1 + .../vo/archive/ArchiveRequestVo.java | 4 +-- .../vo/archive/ArchiveResponseVo.java | 4 +-- 7 files changed, 27 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 838fee5..4a00834 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -9,23 +9,27 @@ import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; import com.archisemtle.semtlewebserverspring.infrastructure.archive.ArchiveRepository; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; import java.util.UUID; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort.Direction; import org.springframework.stereotype.Service; -import com.archisemtle.semtlewebserverspring.domain.archive.Archive; @Service @AllArgsConstructor +@Slf4j public class ArchiveServiceImpl implements ArchiveService{ private final ArchiveRepository archiveRepository; + private static final Logger logger = LoggerFactory.getLogger(ArchiveServiceImpl.class); //게시판 생성 @Override @@ -34,13 +38,12 @@ public void createArchiveBoard(ArchiveRequestDto requestDto) { .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(new Date()) + .createdAt(requestDto.getCreatedAt()) .uuid(requestDto.getUuid()) .imageUrl(requestDto.getImageUrl()) .fileUrl(requestDto.getFileUrl()) .build(); archiveRepository.save(archive); - } //게시판 읽기 @@ -65,7 +68,7 @@ public void updateArchiveBoard(Long id, ArchiveRequestDto requestDto) { .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(prevArchive.getCreatedAt()) + .createdAt(requestDto.getCreatedAt()) .uuid(prevArchive.getUuid()) .fileUrl(requestDto.getFileUrl()) .imageUrl(requestDto.getImageUrl()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java index afbfe37..4a41119 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java @@ -1,23 +1,25 @@ package com.archisemtle.semtlewebserverspring.domain.archive; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; -import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveResponseDto; + import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import java.util.UUID; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @Getter @Entity(name = "archive") +@AllArgsConstructor @NoArgsConstructor +@Builder public class Archive { @Id @@ -27,31 +29,21 @@ public class Archive { @Column(unique = false, nullable = false) private String title; + @Column(unique = false, nullable = false) private String writer; + @Column(unique = false, nullable = false) private String content; - private Date createdAt; + @Column(unique = false, nullable = false) + private LocalDateTime createdAt; @Column(unique = false, nullable = false) private UUID uuid; @Column(unique = false, nullable = true) private List imageUrl; + @Column(unique = false, nullable = true) private List fileUrl; - @Builder - public Archive(Long id, String title, String writer, String content, Date createdAt, UUID uuid, - List imageUrl, List fileUrl) - { - this.id = id; - this.title = title; - this.writer = writer; - this.content = content; - this.createdAt = createdAt; - this.uuid = uuid; - this.imageUrl = imageUrl; - this.fileUrl = fileUrl; - } - public static ArchiveResponseVo entityToVo(Archive archive){ return ArchiveResponseVo.builder() .writer(archive.getWriter()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java index ccdbd63..9c4231e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveRequestDto.java @@ -1,5 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.archive; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -16,7 +17,7 @@ public class ArchiveRequestDto { private String content; private String title; private UUID uuid; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java index 65e8b4a..4adf4a8 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/archive/ArchiveResponseDto.java @@ -2,7 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.archive.Archive; import com.archisemtle.semtlewebserverspring.vo.archive.ArchiveResponseVo; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -16,7 +16,7 @@ public class ArchiveResponseDto { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java index ce05073..ee23e2e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java @@ -45,6 +45,7 @@ public CommonResponse createArchive(@RequestBody ArchiveRequestVo reques @GetMapping("/{id}") public CommonResponse readArchive(@PathVariable Long id){ ArchiveResponseDto responseDto = archiveService.readArchiveBoard(id); + return CommonResponse.success("족보 게시판 흭득 성공", ArchiveResponseDto.dtoToVo(responseDto)); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java index 757db58..2f0f5b5 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveRequestVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.archive; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveRequestDto; +import java.time.LocalDateTime; import java.util.Date; import java.util.List; import java.util.UUID; @@ -14,7 +15,6 @@ public class ArchiveRequestVo { private String content; private String title; private UUID uuid; - private Date createdAt; private List imageUrl; private List fileUrl; @@ -23,7 +23,7 @@ public static ArchiveRequestDto voToDto(ArchiveRequestVo requestVo) { .content(requestVo.getContent()) .writer(requestVo.getWriter()) .title(requestVo.getTitle()) - .createdAt(requestVo.getCreatedAt()) + .createdAt(LocalDateTime.now()) .uuid(requestVo.getUuid()) .imageUrl(requestVo.getImageUrl()) .fileUrl(requestVo.getFileUrl()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java index 507b93d..ec1412d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/archive/ArchiveResponseVo.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.vo.archive; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import lombok.Builder; import lombok.Getter; @@ -13,7 +13,7 @@ public class ArchiveResponseVo { private String writer; private String content; private String title; - private Date createdAt; + private LocalDateTime createdAt; private List imageUrl; private List fileUrl; From fb7d6f01eee2c90463fa8ff6df2f8ac7fbdd51e1 Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 28 Mar 2025 19:24:43 +0900 Subject: [PATCH 03/16] =?UTF-8?q?refactor:Date=20->=20LocalDateTime=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 --- .../application/archive/ArchiveServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 4a00834..fbcc30c 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -68,7 +68,7 @@ public void updateArchiveBoard(Long id, ArchiveRequestDto requestDto) { .title(requestDto.getTitle()) .content(requestDto.getContent()) .writer(requestDto.getWriter()) - .createdAt(requestDto.getCreatedAt()) + .createdAt(prevArchive.getCreatedAt()) .uuid(prevArchive.getUuid()) .fileUrl(requestDto.getFileUrl()) .imageUrl(requestDto.getImageUrl()) From 6715920c9d37005284a22448af53cdd6a852b47f Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 28 Mar 2025 20:02:34 +0900 Subject: [PATCH 04/16] =?UTF-8?q?refactor:Activity=20List=ED=83=80?= =?UTF-8?q?=EC=9E=85=20=ED=98=B8=EC=B6=9C=20=EC=9D=BC=EB=B6=80=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/activity/ActivityServiceImpl.java | 4 ++-- .../presentation/activity/ActivityController.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index b402e5a..5dccc21 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -88,8 +88,8 @@ public ActivityListResponseDto readActivityListBoard(ActivityListRequestDto requ Pageable pageable = PageRequest.of(requestDto.getPage()-1, requestDto.getSize(), Sort.by(Direction.ASC, "createdAt")); - - activityPage = activityRepository.findByTypeContainingIgnoreCase(requestDto.getType(), pageable); + activityPage = requestDto.getType().isEmpty() ? activityRepository.findAll(pageable) : + activityRepository.findByTypeContainingIgnoreCase(requestDto.getType(), pageable); int total_posts = (int)activityPage.getTotalElements(); int total_pages = (int) Math.ceil((double) total_posts / requestDto.getSize()); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java index d29c19a..0828de0 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java @@ -82,7 +82,7 @@ public CommonResponse deleteActivity(@PathVariable Long id) { public CommonResponse getActivityList( @RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "size", defaultValue = "15") int size, - @RequestParam(name = "type", defaultValue = "기타") String type){ + @RequestParam(name = "type", defaultValue = "") String type){ ActivityListRequestVo requestVo = ActivityListRequestVo.builder() .page(page) .size(size) From 7f74cba87cee097d5181633a631db839387ec529 Mon Sep 17 00:00:00 2001 From: hhjkhhbgkugjnbj Date: Wed, 2 Apr 2025 03:29:02 +0900 Subject: [PATCH 05/16] =?UTF-8?q?Refector=20:=20=EA=B3=B5=EA=B3=A0=20?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD,=20=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EA=B0=9C=EC=9D=B8=EC=A0=95=EB=B3=B4=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=B0=8F=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=20=EA=B3=B5=EA=B3=A0=20=EA=B4=80=EB=A0=A8=20?= =?UTF-8?q?API=20Refectoring?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +- build.gradle | 5 +- .../application/ApplyProjectService.java | 2 +- .../application/ApplyProjectServiceImpl.java | 123 ++++++++++-------- .../ProjectApplicationService.java | 8 +- .../ProjectApplicationServiceImpl.java | 107 +++++++-------- .../application/member/MemberServiceImpl.java | 19 ++- .../common/BaseResponseStatus.java | 5 + .../{Applicants.java => Applicant.java} | 33 ++--- .../domain/Application.java | 35 +++-- .../semtlewebserverspring/domain/Member.java | 4 +- .../domain/ProjectJoinAnswer.java | 38 ++++++ .../{ShowMember.java => ProjectJoinFile.java} | 27 ++-- .../domain/ProjectJoinUrl.java | 32 +++++ .../dto/ApplyProjectResponseDto.java | 13 +- .../dto/ChangeApplyStatusResponseDto.java | 13 +- .../dto/ProjectApplicantsResponseDto.java | 16 ++- .../ShowApplyingProjectInfoResponseDto.java | 26 ++-- .../ShowProjectApplicantInfoResponseDto.java | 30 ++--- .../dto/member/MemberReadResponseDto.java | 4 +- .../dto/member/MemberUpdateRequestDto.java | 7 +- .../infrastructure/ApplicantsRepository.java | 12 +- .../infrastructure/ApplicationRepository.java | 8 +- .../ProjectJoinAnswerRepository.java | 10 ++ .../ProjectJoinFileRepository.java | 10 ++ .../ProjectJoinUrlRepository.java | 10 ++ .../presentation/ApplyingController.java | 26 ++-- .../presentation/MemberController.java | 26 +++- .../ProjectApplicaionController.java | 83 +++++++----- .../vo/ApplyProjectResponseVo.java | 11 +- .../vo/ChangeApplyStatusResponseVo.java | 9 +- .../vo/ShowApplyingProjectListResponseVo.java | 17 +-- .../ShowProjectApplicantInfoResponseVo.java | 27 +--- .../ShowProjectApplicantsListResponseVo.java | 7 +- .../vo/member/MemberReadResponseVo.java | 4 +- 35 files changed, 465 insertions(+), 346 deletions(-) rename src/main/java/com/archisemtle/semtlewebserverspring/domain/{Applicants.java => Applicant.java} (54%) create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java rename src/main/java/com/archisemtle/semtlewebserverspring/domain/{ShowMember.java => ProjectJoinFile.java} (50%) create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java diff --git a/.gitignore b/.gitignore index b9b1a83..80524f4 100644 --- a/.gitignore +++ b/.gitignore @@ -20,6 +20,8 @@ bin/ ### IntelliJ IDEA ### application.properties +application.yml +.env .idea *.iws *.iml @@ -36,4 +38,4 @@ out/ /.nb-gradle/ ### VS Code ### -.vscode/ \ No newline at end of file +.vscode/ diff --git a/build.gradle b/build.gradle index 767144d..aa7bdce 100644 --- a/build.gradle +++ b/build.gradle @@ -53,6 +53,9 @@ dependencies { annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta" annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' + implementation 'org.postgresql:postgresql' + + } tasks.named('test') { @@ -65,4 +68,4 @@ jar { clean { delete file('src/main/generated') -} \ No newline at end of file +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java index 97a3aa7..ed0b330 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java @@ -4,5 +4,5 @@ import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; public interface ApplyProjectService { - ApplyProjectResponseDto applyProject(Integer boardId, Integer applicantId, ApplyProjectRequestDto applyProjectRequestDto) throws Exception; + ApplyProjectResponseDto applyProject(Long boardId, Long applicantId, ApplyProjectRequestDto applyProjectRequestDto) throws Exception; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java index ff67c34..d7738ad 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java @@ -1,29 +1,28 @@ package com.archisemtle.semtlewebserverspring.application; -import static com.archisemtle.semtlewebserverspring.common.BaseResponseStatus.NO_DATA; - import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; -import com.archisemtle.semtlewebserverspring.domain.Applicants; +import com.archisemtle.semtlewebserverspring.domain.Applicant; import com.archisemtle.semtlewebserverspring.domain.Application; import com.archisemtle.semtlewebserverspring.domain.Member; import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinAnswer; +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile; +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl; import com.archisemtle.semtlewebserverspring.domain.ProjectTypeCategory; import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto; -import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto.FileDto; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository; import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ProjectBoardRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinAnswerRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinFileRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinUrlRepository; import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository; -import java.sql.Timestamp; import java.time.LocalDate; import java.time.LocalDateTime; -import java.time.ZoneId; -import java.time.chrono.ChronoLocalDateTime; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; @@ -42,84 +41,98 @@ public class ApplyProjectServiceImpl implements ApplyProjectService { private final MemberRepository memberRepository; private final ProjectBoardRepository projectBoardRepository; private final RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository; + private final ProjectJoinAnswerRepository projectJoinAnswerRepository; + private final ProjectJoinFileRepository projectJoinFileRepository; + private final ProjectJoinUrlRepository projectJoinUrlRepository; @Override @Transactional - public ApplyProjectResponseDto applyProject(Integer boardId,Integer applicantId, ApplyProjectRequestDto applyProjectRequestDto) - throws Exception { - ProjectBoard projectBoard = projectBoardRepository.findById(Long.valueOf(boardId)) - .orElseThrow(() -> new BaseException(NO_DATA)); //todo 나중에 BaseResponseStatue 수정 필요 + public ApplyProjectResponseDto applyProject(Long postId, Long applicantId, ApplyProjectRequestDto applyProjectRequestDto) { + + if(postId == null || applicantId == null || applyProjectRequestDto.getAnswers() == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } - LocalDateTime now = LocalDateTime.now(); + ProjectBoard projectBoard = projectBoardRepository.findById(postId) + .orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND)); - LocalDate endDateTime = projectBoard.getProjectRecruitingEndTime(); + if(LocalDate.now().isBefore(projectBoard.getProjectRecruitingEndTime().plusDays(1))) { - if(now.isBefore(ChronoLocalDateTime.from(endDateTime))) { - Member member = memberRepository.findById(applicantId) + Member member = memberRepository.findById(Math.toIntExact(applicantId)) .orElseThrow(() -> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); - Date applyDate = Date.from( - LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant()); + List existingApplications = applicationRepository.findByMemberIdAndPostId(member.getMemberId(), postId); - String updatedAt = LocalDateTime.now() - .atZone(ZoneId.of("UTC")) - .format(java.time.format.DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss'Z'")); + if (!existingApplications.isEmpty()) { + throw new BaseException(BaseResponseStatus.DUPLICATE_APPLICATION); + } - Applicants applicants = Applicants.builder() + Applicant applicant = Applicant.builder() .name(member.getUsername()) - .applyDate(applyDate) - .status("대기") // 기본값 + .applyDate(LocalDate.now()) + .status("대기") .email(member.getEmail()) .phone(member.getPhone()) - .resumeUrl(applyProjectRequestDto.getFiles().stream() - .filter(file -> file.getFileName().equals("resume.pdf")) - .map(FileDto::getFileUrl) - .findFirst() - .orElse(null)) - .portfolioUrl(applyProjectRequestDto.getUrls().stream() - .findFirst() - .orElse(null)) - .customAnswer("답변 내용") - .updatedAt(updatedAt) - .boardId(boardId) + .updatedAt(LocalDateTime.now()) + .postId(postId) .build(); - applicantsRepository.save(applicants); + applicantsRepository.save(applicant); - ProjectTypeCategory projectTypeName = projectBoard.getProjectTypeCategory(); // project_type_category_name 가져오기 - - List relationFieldProjectPostMiddles = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId(Long.valueOf(boardId)); + ProjectTypeCategory projectTypeName = projectBoard.getProjectTypeCategory(); + List relationFieldProjectPostMiddles = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId(postId); List relationFieldNames = relationFieldProjectPostMiddles.stream() - .map(relationField -> relationField.getRelationFieldCategory().getName()) // 이름 가져오기 - .collect(Collectors.toList()); - - String questionAnswers = applyProjectRequestDto.getAnswers().stream() - .map(ApplyProjectRequestDto.AnswerDto::getAnswer) // answer만 추출 - .collect(Collectors.joining("*|*")); // 구분자를 사용하여 하나의 문자열로 변환 + .map(relationField -> relationField.getRelationFieldCategory().getName()) + .toList(); Application application = Application.builder() - .applicantId(applicants.getApplicantId()) + .applicantId(applicant.getApplicantId()) + .memberId(member.getMemberId()) .projectTitle(projectBoard.getTitle()) - .boardId(boardId) - .applyDate(applyDate) - .status("대기") // 수정됨. + .postId(postId) + .applyDate(LocalDate.now()) + .status("대기") .projectType(projectTypeName.getName()) .relateField(relationFieldNames.toString()) - .questionAnswer(questionAnswers) .build(); applicationRepository.save(application); - // 응답 DTO 생성 - ApplyProjectResponseDto successResponseDto = ApplyProjectResponseDto.entityToDto(application); + List projectJoinUrls = applyProjectRequestDto.getUrls().stream() + .map(url -> ProjectJoinUrl.builder() + .url(url) + .applicationId(application.getApplicationId()) + .build()) + .collect(Collectors.toList()); + + projectJoinUrlRepository.saveAll(projectJoinUrls); + + List projectJoinFiles = applyProjectRequestDto.getFiles().stream() + .map(fileDto -> ProjectJoinFile.builder() + .file(fileDto.getFileUrl()) + .applicationId(application.getApplicationId()) + .build()) + .collect(Collectors.toList()); + + projectJoinFileRepository.saveAll(projectJoinFiles); + + List projectJoinAnswers = applyProjectRequestDto.getAnswers().stream() + .map(answerDto -> ProjectJoinAnswer.builder() + .answerText(answerDto.getAnswer()) + .questionId((long) answerDto.getQuestionId()) + .applicationId(application.getApplicationId()) + .build()) + .collect(Collectors.toList()); + + projectJoinAnswerRepository.saveAll(projectJoinAnswers); + + ApplyProjectResponseDto successResponseDto = ApplyProjectResponseDto.entityToDto(application); return successResponseDto; }else{ - ApplyProjectResponseDto failResponseDto = ApplyProjectResponseDto.entityToDto(null); - - return failResponseDto; + throw new BaseException(BaseResponseStatus.RECRUITING_ALREADY_ENDED); } } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java index 6765b28..930e230 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java @@ -8,8 +8,8 @@ import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; public interface ProjectApplicationService { - ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int limit) throws Exception; - ShowProjectApplicantInfoResponseDto getApplicantInfo(Integer boardId,Integer applicantId) throws Exception; - ChangeApplyStatusResponseDto changeApplyStatus(Integer boardId,Integer applicantId, String status) throws Exception; - ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(Integer applicantId,int page, int limit) throws Exception; + ProjectApplicantsResponseDto getApplicants(Long boardId, int page, int limit) throws Exception; + ShowProjectApplicantInfoResponseDto getApplicantInfo(Long boardId,Long applicantId) throws Exception; + ChangeApplyStatusResponseDto changeApplyStatus(Long boardId,Long applicantId, String status) throws Exception; + ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int memberId,int page, int limit) throws Exception; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java index 150f8fd..bb498aa 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java @@ -2,19 +2,15 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; -import com.archisemtle.semtlewebserverspring.domain.Member; -import com.archisemtle.semtlewebserverspring.domain.Applicants; +import com.archisemtle.semtlewebserverspring.domain.Applicant; import com.archisemtle.semtlewebserverspring.domain.Application; -import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository; -import java.sql.Timestamp; import java.time.LocalDateTime; -import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; @@ -33,29 +29,23 @@ public class ProjectApplicationServiceImpl implements ProjectApplicationService private final ApplicationRepository applicationRepository; @Override - public ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int limit) - throws Exception { - - // 게시글 ID로 지원자 목록 조회 (페이징 처리) - Pageable pageable = PageRequest.of(page - 1, limit); // Pageable로 선언 - Page applicantsPage = applicantsRepository.findAllWithApplication( - boardId, + public ProjectApplicantsResponseDto getApplicants(Long postId, int page, int limit) { + if(postId == null || page == 0 || limit == 0) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Pageable pageable = PageRequest.of(page - 1, limit); + Page applicantsPage = applicantsRepository.findAllWithApplication( + postId, pageable ); - // 결과가 비어있거나 지원자 목록 조회에 실패한 경우 처리 - if (applicantsPage.isEmpty()) { - throw new BaseException(BaseResponseStatus.APPLICATION_NOT_FOUND); + if (applicantsPage == null || applicantsPage.isEmpty()) { + throw new BaseException(BaseResponseStatus.NO_APPLICANTS); } - // 지원자 정보를 DTO로 변환 - List applicants = applicantsPage.getContent(); - - // DTO 생성 ProjectApplicantsResponseDto projectApplicantsResponseDto = ProjectApplicantsResponseDto.entityToDto( - applicants, - page, - (int) applicantsPage.getTotalElements() + applicantsPage, + page ); return projectApplicantsResponseDto; @@ -63,66 +53,63 @@ public ProjectApplicantsResponseDto getApplicants(Integer boardId, int page, int @Override - public ShowProjectApplicantInfoResponseDto getApplicantInfo(Integer boardId, Integer applicantId) throws Exception { - Applicants applicants = applicantsRepository.findByBoardIdAndApplicantId(boardId, applicantId).orElseThrow(() -> new BaseException( + public ShowProjectApplicantInfoResponseDto getApplicantInfo(Long postId, Long applicantId) { + if(postId == null || applicantId == 0) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Applicant applicant = applicantsRepository.findByPostIdAndApplicantId(postId, applicantId).orElseThrow(() -> new BaseException( BaseResponseStatus.NO_APPLICANT_FOUND)); - ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = ShowProjectApplicantInfoResponseDto.entityToDto( - applicants); + applicant); return showProjectApplicantInfoResponseDto; } @Override @Transactional - public ChangeApplyStatusResponseDto changeApplyStatus(Integer boardId, Integer applicantId, - String status) throws Exception { - // 신청자 정보 조회 - Applicants applicants = applicantsRepository.findByBoardIdAndApplicantId(boardId, applicantId).orElseThrow(() -> new BaseException( + public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, Long applicantId, String status) { + + if(postId == null || applicantId == null || status == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + + Applicant applicant = applicantsRepository.findByPostIdAndApplicantId(postId, applicantId).orElseThrow(() -> new BaseException( BaseResponseStatus.NO_APPLICANT_FOUND)); - Applicants updatedApplicants = Applicants.builder() - .applicantId(applicants.getApplicantId()) - .name(applicants.getName()) - .applyDate(applicants.getApplyDate()) + Applicant updatedApplicant = Applicant.builder() + .applicantId(applicant.getApplicantId()) + .name(applicant.getName()) + .applyDate(applicant.getApplyDate()) .status(status) - .email(applicants.getEmail()) - .phone(applicants.getPhone()) - .resumeUrl(applicants.getResumeUrl()) - .portfolioUrl(applicants.getPortfolioUrl()) - .customAnswer(applicants.getCustomAnswer()) - .additionalFile(applicants.getAdditionalFile()) - .updatedAt(String.valueOf(LocalDateTime.now())) - .boardId(applicants.getBoardId()) + .email(applicant.getEmail()) + .phone(applicant.getPhone()) + .updatedAt(LocalDateTime.now()) + .postId(applicant.getPostId()) .build(); - applicantsRepository.save(updatedApplicants); + applicantsRepository.save(updatedApplicant); - ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto(updatedApplicants); + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto( + updatedApplicant); return changeApplyStatusResponseDto; } @Override - public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(Integer applicantId, int page, int limit) - throws Exception { - - // 게시글 ID로 지원자 목록 조회 (페이징 처리) - Pageable pageable = PageRequest.of(page - 1, limit); // Pageable로 선언 - Page applicationsPage = applicationRepository.findByApplicantId(applicantId, pageable); + public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int memberId, int page, int limit) { - // 결과가 비어있거나 신청서 조회에 실패한 경우 처리 - if (applicationsPage.isEmpty()) { - System.out.println("신청한 공고가 없거나 조회에 실패했습니다."); - return null; + if(memberId == 0 || page == 0 || limit == 0) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); } - // 지원자 정보를 DTO로 변환 - List applications = applicationsPage.getContent(); + Pageable pageable = PageRequest.of(page - 1, limit); + Page applicationsPage = applicationRepository.findByMemberId(memberId, pageable); + + if (applicationsPage == null || applicationsPage.isEmpty()) { + throw new BaseException(BaseResponseStatus.NO_APPLICATIONS); + } - // DTO 생성 ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = ShowApplyingProjectInfoResponseDto.entityToDto( - applications, - page, - (int) applicationsPage.getTotalElements() + applicationsPage, + page ); return showApplyingProjectInfoResponseDto; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java index f71c859..84b3d4e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; +import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.config.jwt.JwtToken; import com.archisemtle.semtlewebserverspring.config.jwt.JwtTokenProvider; import com.archisemtle.semtlewebserverspring.domain.Member; @@ -18,6 +19,7 @@ import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; +import java.time.LocalDate; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -89,7 +91,7 @@ public ExcelAddMemberResponseDto excelAddMember(MultipartFile file) throws IOExc .password(passwordEncoder.encode("#semtle308")) .studentId(studentId) .username(username) - .birth(parseDate("2025-01-01")) + .birth(LocalDate.parse("2025-01-01")) .phone(phone) .role(role) .manageApprovalStatus(false) @@ -129,6 +131,11 @@ private Date parseDate(String dateStr) { // Member 조회 메서드 @Override public MemberReadResponseDto show(UUID uuid) { + + if(uuid == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid).orElseThrow(()-> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); @@ -149,6 +156,13 @@ public MemberReadResponseDto show(UUID uuid) { @Override @Transactional public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { + + if(uuid == null || memberUpdateRequestDto.getUsername() == null || memberUpdateRequestDto.getBirth() == null + || memberUpdateRequestDto.getPhone() == null || memberUpdateRequestDto.getImageUrl() + == null) { + throw new BaseException(BaseResponseStatus.WRONG_PARAM); + } + Member member = memberRepository.findByUuid(uuid).orElseThrow(()-> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); @@ -157,10 +171,11 @@ public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { .uuid(member.getUuid()) .email(member.getEmail()) .password(member.getPassword()) - .studentId(member.getStudentId() != null ? memberUpdateRequestDto.getStudentId() : member.getStudentId()) + .studentId(member.getStudentId()) .username(memberUpdateRequestDto.getUsername() != null ? memberUpdateRequestDto.getUsername() : member.getUsername()) // 업데이트 값 적용 .birth(memberUpdateRequestDto.getBirth() != null ? memberUpdateRequestDto.getBirth() : member.getBirth()) .phone(memberUpdateRequestDto.getPhone() != null ? memberUpdateRequestDto.getPhone() : member.getPhone()) + .profileImageUrl(memberUpdateRequestDto.getImageUrl() != null ? memberUpdateRequestDto.getImageUrl() : member.getProfileImageUrl()) .role(member.getRole()) .manageApprovalStatus(member.isManageApprovalStatus()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java index e062055..7903a77 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java @@ -95,6 +95,11 @@ public enum BaseResponseStatus { INVALID_APPLICATION_STATUS(HttpStatus.BAD_REQUEST, false, 5002, "유효하지 않은 신청 상태입니다."), APPLICATION_ALREADY_PROCESSED(HttpStatus.CONFLICT, false, 5003, "이미 처리된 신청입니다."), APPLICATION_NOT_FOUND(HttpStatus.NOT_FOUND, false, 5004, "신청 정보를 찾을 수 없습니다."), + NO_BOARD_FOUND(HttpStatus.NOT_FOUND, false, 5005, "공고를 찾을 수 없습니다."), + RECRUITING_ALREADY_ENDED(HttpStatus.BAD_REQUEST, false, 5006, "프로젝트 모집이 마감되었습니다."), + NO_APPLICANTS(HttpStatus.BAD_REQUEST, false, 5007, "신청자가 존재하지 않습니다."), + NO_APPLICATIONS(HttpStatus.BAD_REQUEST, false, 5007, "신청서가 존재하지 않습니다."), + DUPLICATE_APPLICATION(HttpStatus.BAD_REQUEST, false, 5008, "이미 신청한 공고입니다."), /** * 6000 : Cart & WishProductList Service Error diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java similarity index 54% rename from src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java rename to src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java index 2ada142..3fc064e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicants.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java @@ -5,7 +5,8 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.Date; +import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -14,54 +15,40 @@ @Getter @Entity(name = "applicants") @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Applicants { +public class Applicant { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer applicantId; + private Long applicantId; @Column(nullable = false) private String name; @Column(nullable = false) - private Date applyDate; + private LocalDate applyDate; @Column(nullable = false) private String status; - @Column(nullable = false, unique = true) + @Column(nullable = false) private String email; private String phone; - private String resumeUrl; - - private String portfolioUrl; - - private String customAnswer; - - private String additionalFile; - - private String updatedAt; + private LocalDateTime updatedAt; @Column(nullable = false) - private Integer boardId; // 게시판 ID + private Long postId; @Builder - public Applicants(Integer applicantId,String name, Date applyDate, String status, String email, String phone, - String resumeUrl, String portfolioUrl, String customAnswer, - String additionalFile, String updatedAt , Integer boardId) { + public Applicant(Long applicantId, String name, LocalDate applyDate, String status, String email, String phone, LocalDateTime updatedAt , Long postId) { this.applicantId = applicantId; this.name = name; this.applyDate = applyDate; this.status = status; this.email = email; this.phone = phone; - this.resumeUrl = resumeUrl; - this.portfolioUrl = portfolioUrl; - this.customAnswer = customAnswer; - this.additionalFile = additionalFile; this.updatedAt = updatedAt; - this.boardId = boardId; + this.postId = postId; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java index c0f022c..fcea2ca 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java @@ -2,18 +2,19 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import java.time.LocalDateTime; +import java.time.LocalDate; -import java.util.Date; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; @Getter @Entity(name = "applications") @@ -21,43 +22,41 @@ public class Application { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private Integer applicationId; + private Long applicationId; @Column(name = "applicant_id", nullable = false) - private Integer applicantId; // 지원자 ID + private Long applicantId; - @ManyToOne // ManyToOne 관계 설정 - @JoinColumn(name = "applicant_id", referencedColumnName = "applicantId", insertable = false, updatable = false) // 외래 키 설정 - private Applicants applicant; // 지원자와의 관계 + @Column(name = "member_id", nullable = false) + private int memberId; @Column(nullable = false) - private String projectTitle; // 프로젝트 제목 + private String projectTitle; @Column(nullable = false) - private Integer boardId; // 게시판 ID + private Long postId; @Column(nullable = false) - private Date applyDate; // 지원 날짜 + private LocalDate applyDate; @Column(nullable = false) - private String status; // 지원 상태 + private String status; - private String projectType; // 프로젝트 유형 + private String projectType; - private String relateField; // 관련 분야 + private String relateField; - private String questionAnswer; @Builder - public Application(Integer applicantId ,String projectTitle, Integer boardId, Date applyDate, String status, - String projectType, String relateField, String questionAnswer) { + public Application(Long applicantId, int memberId ,String projectTitle, Long postId, LocalDate applyDate, String status, + String projectType, String relateField) { this.applicantId = applicantId; + this.memberId = memberId; this.projectTitle = projectTitle; - this.boardId = boardId; + this.postId = postId; this.applyDate = applyDate; this.status = status; this.projectType = projectType; this.relateField = relateField; - this.questionAnswer = questionAnswer; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java index a917619..9a69ace 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Member.java @@ -5,8 +5,8 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import java.time.LocalDate; import java.util.Collection; -import java.util.Date; import java.util.List; import java.util.UUID; import lombok.AccessLevel; @@ -41,7 +41,7 @@ public class Member implements UserDetails { private String username; // @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date birth; + private LocalDate birth; private String phone; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java new file mode 100644 index 0000000..feff742 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java @@ -0,0 +1,38 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectJoinAnswer { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int projectJoinAnswerId; + + @Column(nullable = false) + private String answerText; + + @Column(nullable = false) + private Long questionId; + + @Column(nullable = false) + private Long applicationId; + + @Builder + public ProjectJoinAnswer(String answerText, Long questionId, Long applicationId) { + this.answerText = answerText; + this.questionId = questionId; + this.applicationId = applicationId; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java similarity index 50% rename from src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java rename to src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java index b08c20e..e678543 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ShowMember.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java @@ -5,8 +5,6 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; -import java.util.Date; -import java.util.UUID; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -15,27 +13,20 @@ @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ShowMember { +public class ProjectJoinFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int memberId; + private int projectJoinFileId; - @Column(nullable = false, unique = true) - private UUID uuid = UUID.randomUUID(); + @Column(nullable = false) + private String file; - private String name; - - // @DateTimeFormat(pattern = "yyyy-MM-dd") - private Date birth; - - private String phone; - - //private String imageUrl; + @Column(nullable = false) + private Long applicationId; @Builder - public ShowMember(String name, Date birth, String phone) { - this.name = name; - this.birth = birth; - this.phone = phone; + public ProjectJoinFile(String file, Long applicationId) { + this.file = file; + this.applicationId = applicationId; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java new file mode 100644 index 0000000..51cf9b6 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java @@ -0,0 +1,32 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ProjectJoinUrl { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private int projectJoinUrlId; + + @Column(nullable = false) + private String url; + + @Column(nullable = false) + private Long applicationId; + + @Builder + public ProjectJoinUrl(String url, Long applicationId) { + this.url = url; + this.applicationId = applicationId; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java index 76cd51d..3d3b6da 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java @@ -1,10 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; import com.archisemtle.semtlewebserverspring.domain.Application; -import com.archisemtle.semtlewebserverspring.domain.ShowMember; import java.time.LocalDateTime; -import java.util.Date; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -14,21 +11,21 @@ @Builder public class ApplyProjectResponseDto { private String message; - private Integer appliedId; - private String appliedAt; + private Long applicationId; + private LocalDateTime appliedAt; public static ApplyProjectResponseDto entityToDto(Application application) { if(application == null) { return ApplyProjectResponseDto.builder() .message("모집기간이 마감되었습니다.") - .appliedId(null) + .applicationId(null) .appliedAt(null) .build(); }else { return ApplyProjectResponseDto.builder() .message("프로젝트 신청이 성공적으로 접수되었습니다.") - .appliedId(application.getApplicationId()) - .appliedAt(LocalDateTime.now().toString()) + .applicationId(application.getApplicationId()) + .appliedAt(LocalDateTime.now()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java index 24fcebf..730db91 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java @@ -1,8 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; +import com.archisemtle.semtlewebserverspring.domain.Applicant; import java.time.LocalDateTime; -import java.util.Date; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -11,15 +10,13 @@ @Setter @Builder public class ChangeApplyStatusResponseDto { - private String message; private String updatedStatus; - private String updatedAt; + private LocalDateTime updatedAt; - public static ChangeApplyStatusResponseDto entityToDto(Applicants applicants) { + public static ChangeApplyStatusResponseDto entityToDto(Applicant applicant) { return ChangeApplyStatusResponseDto.builder() - .message("신청자의 상태가 성공적으로 변경되었습니다.") - .updatedStatus(applicants.getStatus()) - .updatedAt(String.valueOf(LocalDateTime.now())) + .updatedStatus(applicant.getStatus()) + .updatedAt(LocalDateTime.now()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java index a465c95..e5a9c1e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java @@ -1,13 +1,14 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.domain.Applicant; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.springframework.data.domain.Page; @Getter @Setter @@ -22,13 +23,13 @@ public class ProjectApplicantsResponseDto { @Getter @NoArgsConstructor public static class ApplicantInfo { - private Integer applicantId; + private Long applicantId; private String name; - private Date applyDate; + private LocalDate applyDate; private String status; @Builder - public ApplicantInfo(Integer applicantId, String name, Date applyDate, String status) { + public ApplicantInfo(Long applicantId, String name, LocalDate applyDate, String status) { this.applicantId = applicantId; this.name = name; this.applyDate = applyDate; @@ -36,7 +37,10 @@ public ApplicantInfo(Integer applicantId, String name, Date applyDate, String st } } - public static ProjectApplicantsResponseDto entityToDto(List applicants, int currentPage, int totalElements) { + public static ProjectApplicantsResponseDto entityToDto(Page applicantsPage, int currentPage) { + List applicants = applicantsPage.getContent(); + int totalElements = (int) applicantsPage.getTotalElements(); + List applicantInfoList = applicants.stream() .map(applicant -> ApplicantInfo.builder() .applicantId(applicant.getApplicantId()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java index a508a27..83dd718 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java @@ -1,15 +1,14 @@ package com.archisemtle.semtlewebserverspring.dto; import com.archisemtle.semtlewebserverspring.domain.Application; -import java.lang.reflect.Array; -import java.time.LocalDateTime; -import java.util.Date; +import java.time.LocalDate; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import org.springframework.data.domain.Page; @Getter @Setter @@ -24,26 +23,26 @@ public class ShowApplyingProjectInfoResponseDto { @Getter @NoArgsConstructor public static class ApplicationInfo { - private Integer applicationId; + private Long applicationId; private String projectTitle; - private Integer boardId; - private Date applyDate; + private Long postId; + private LocalDate applyDate; private String status; private String projectType; private String relateField; @Builder public ApplicationInfo( - Integer applicationId, + Long applicationId, String projectTitle, - Integer boardId, - Date applyDate, + Long postId, + LocalDate applyDate, String status, String projectType, String relateField) { this.applicationId = applicationId; this.projectTitle = projectTitle; - this.boardId = boardId; + this.postId = postId; this.applyDate = applyDate; this.status = status; this.projectType = projectType; @@ -52,12 +51,15 @@ public ApplicationInfo( } - public static ShowApplyingProjectInfoResponseDto entityToDto(List applications, int currentPage, int totalElements) { + public static ShowApplyingProjectInfoResponseDto entityToDto(Page applicationsPage, int currentPage) { + List applications = applicationsPage.getContent(); + int totalElements = (int) applicationsPage.getTotalElements(); + List applicationInfoList = applications.stream() .map(application -> ApplicationInfo.builder() .applicationId(application.getApplicationId()) .projectTitle(application.getProjectTitle()) - .boardId(application.getBoardId()) + .postId(application.getPostId()) .applyDate(application.getApplyDate()) .status(application.getStatus()) .projectType(application.getProjectType()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java index 2d0b457..3acb29d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicants; -import java.util.Date; +import com.archisemtle.semtlewebserverspring.domain.Applicant; +import java.time.LocalDate; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -10,29 +10,21 @@ @Setter @Builder public class ShowProjectApplicantInfoResponseDto { - private Integer applicantId; + private Long applicantId; private String name; - private Date applyDate; + private LocalDate applyDate; private String status; private String email; private String phone; - private String resumeUrl; - private String portfolioUrl; - private String customAnswer; - private String additionalFile; - public static ShowProjectApplicantInfoResponseDto entityToDto(Applicants applicants) { + public static ShowProjectApplicantInfoResponseDto entityToDto(Applicant applicant) { return ShowProjectApplicantInfoResponseDto.builder() - .applicantId(applicants.getApplicantId()) - .name(applicants.getName()) - .applyDate(applicants.getApplyDate()) - .status(applicants.getStatus()) - .email(applicants.getEmail()) - .phone(applicants.getPhone()) - .resumeUrl(applicants.getResumeUrl()) - .portfolioUrl(applicants.getPortfolioUrl()) - .customAnswer(applicants.getCustomAnswer()) - .additionalFile(applicants.getAdditionalFile()) + .applicantId(applicant.getApplicantId()) + .name(applicant.getName()) + .applyDate(applicant.getApplyDate()) + .status(applicant.getStatus()) + .email(applicant.getEmail()) + .phone(applicant.getPhone()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java index 6a56164..af09d78 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.member; -import java.util.Date; +import java.time.LocalDate; import java.util.UUID; import lombok.Builder; import lombok.Data; @@ -13,7 +13,7 @@ public class MemberReadResponseDto { private String password; private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; private String role; private boolean manageApprovalStatus; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java index ed5a505..e0e7237 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java @@ -1,15 +1,14 @@ package com.archisemtle.semtlewebserverspring.dto.member; -import java.util.Date; +import java.time.LocalDate; import lombok.Data; @Data public class MemberUpdateRequestDto { - private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; - //private String imageUrl; + private String imageUrl; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java index 4819e1c..c96154b 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.infrastructure; -import com.archisemtle.semtlewebserverspring.domain.Applicants; +import com.archisemtle.semtlewebserverspring.domain.Applicant; import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; @@ -10,12 +10,12 @@ import org.springframework.stereotype.Repository; @Repository -public interface ApplicantsRepository extends JpaRepository { +public interface ApplicantsRepository extends JpaRepository { @Query(value = "SELECT pa.* FROM applicants pa " + - "JOIN applications app ON pa.applicant_id = app.applicant_id " + // 조인 조건 수정 - "WHERE app.board_id = :boardId", nativeQuery = true) // nativeQuery를 사용하여 SQL 쿼리 - Page findAllWithApplication(@Param("boardId") Integer boardId, Pageable pageable); + "JOIN applications app ON pa.applicant_id = app.applicant_id " + + "WHERE app.post_id = :postId", nativeQuery = true) + Page findAllWithApplication(@Param("postId") Long postId, Pageable pageable); - Optional findByBoardIdAndApplicantId(Integer boardId, Integer applicantId); + Optional findByPostIdAndApplicantId(Long postId, Long applicantId); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java index 33ac0cf..040b7e9 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java @@ -1,13 +1,17 @@ package com.archisemtle.semtlewebserverspring.infrastructure; import com.archisemtle.semtlewebserverspring.domain.Application; +import java.util.List; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository -public interface ApplicationRepository extends JpaRepository { +public interface ApplicationRepository extends JpaRepository { - Page findByApplicantId(Integer applicantId, Pageable pageable); + Page findByApplicantId(Long applicantId, Pageable pageable); + Page findByMemberId(int memberId, Pageable pageable); + + List findByMemberIdAndPostId(int memberId, Long postId); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java new file mode 100644 index 0000000..f92180c --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinAnswer; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJoinAnswerRepository extends JpaRepository { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java new file mode 100644 index 0000000..ff56c45 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinFileRepository.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJoinFileRepository extends JpaRepository { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java new file mode 100644 index 0000000..1fc0e56 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinUrlRepository.java @@ -0,0 +1,10 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ProjectJoinUrlRepository extends JpaRepository { + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java index b264caf..e4b516e 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.presentation; import com.archisemtle.semtlewebserverspring.application.ApplyProjectService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; @@ -21,20 +23,22 @@ public class ApplyingController { private final ApplyProjectService applyProjectService; + // 공고 신청 - @PostMapping("/{post_id}/apply/{id}") + @PostMapping("/{post_id}/apply/{applicant_id}") public CommonResponse ApplyProject( - @PathVariable("post_id") Integer boardId, - @PathVariable("id") Integer applicantId, + @PathVariable("post_id") Long postId, + @PathVariable("applicant_id") Long applicantId, @RequestBody ApplyProjectRequestDto applyProjectRequestDto - ) throws Exception { - ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(boardId, applicantId, applyProjectRequestDto); - ApplyProjectResponseVo applyProjectResponseVo = ApplyProjectResponseVo.dtoToVo(applyProjectResponseDto); - - if(applyProjectResponseVo.getAppliedAt() != null) { - return CommonResponse.success("applied successfully", applyProjectResponseVo); - }else{ - return CommonResponse.fail(null,"apply failed"); + ){ + try { + ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(postId, applicantId, applyProjectRequestDto); + ApplyProjectResponseVo applyProjectResponseVo = ApplyProjectResponseVo.dtoToVo(applyProjectResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), applyProjectResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); } } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java index 0d508e6..d3b1973 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java @@ -83,19 +83,31 @@ public CommonResponse excelAddMember( // 출력 - 이름, 생년월일, 전화번호, 학번, 프로필 사진 @GetMapping("/{uuid}") public CommonResponse showMember(@PathVariable UUID uuid) { - MemberReadResponseDto showMemberDto = memberService.show(uuid); - MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); - return CommonResponse.success("해당하는 멤버의 정보를 조회하는데 성공하였습니다.", responseVo); + try{ + MemberReadResponseDto showMemberDto = memberService.show(uuid); + MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); + return CommonResponse.success("해당하는 멤버의 정보를 조회하는데 성공하였습니다.", responseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } // 개인 정보 수정 - // uuid, 이름, 생년월일, 전화번호, 학번, 프로필 사진 + // 이름, 생년월일, 전화번호, 프로필 사진 @PatchMapping("/{uuid}") - public CommonResponse updateMember(@PathVariable UUID uuid, + public CommonResponse updateMember(@PathVariable UUID uuid, @RequestBody MemberUpdateRequestDto memberUpdateRequestDto) { - memberService.update(uuid, memberUpdateRequestDto); + try { + memberService.update(uuid, memberUpdateRequestDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), BaseResponseStatus.SUCCESS.getCode()); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } - return CommonResponse.success("회원 정보 수정에 성공하였습니다."); } @GetMapping diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java index ca40e2c..83355cd 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java @@ -1,12 +1,16 @@ package com.archisemtle.semtlewebserverspring.presentation; import com.archisemtle.semtlewebserverspring.application.ProjectApplicationService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; +import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; +import com.archisemtle.semtlewebserverspring.vo.ApplyProjectResponseVo; import com.archisemtle.semtlewebserverspring.vo.ChangeApplyStatusResponseVo; import com.archisemtle.semtlewebserverspring.vo.ShowApplyingProjectListResponseVo; import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantInfoResponseVo; @@ -33,51 +37,66 @@ public class ProjectApplicaionController { // 본인이 게시한 프로젝트(공고) 신청자 목록 조회 API @GetMapping("/{post_id}/applicants") public CommonResponse ShowProjectApplicantsList( - @PathVariable("post_id") Integer postId, + @PathVariable("post_id") Long postId, @RequestParam(value = "page", defaultValue = "1") int page, - @RequestParam(value = "limit", defaultValue = "10") int limit) throws Exception { - - ProjectApplicantsResponseDto projectApplicantsResponseDto = projectApplicationService.getApplicants(postId, page, limit); - ShowProjectApplicantsListResponseVo showProjectApplicantsResponseVo = ShowProjectApplicantsListResponseVo.dtoToVo(projectApplicantsResponseDto); - - return CommonResponse.success("applicants Showed successfully", showProjectApplicantsResponseVo); + @RequestParam(value = "limit", defaultValue = "10") int limit){ + try { + ProjectApplicantsResponseDto projectApplicantsResponseDto = projectApplicationService.getApplicants(postId, page, limit); + ShowProjectApplicantsListResponseVo showProjectApplicantsResponseVo = ShowProjectApplicantsListResponseVo.dtoToVo(projectApplicantsResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showProjectApplicantsResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } // 본인이 게시한 프로젝트(공고) 신청자 정보(내용) 조회 API - @GetMapping("/{post_id}/applicants/{id}") - public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Integer boardId, @PathVariable("id") Integer applicantId) - throws Exception { - - ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(boardId, applicantId); - - ShowProjectApplicantInfoResponseVo showProjectApplicantInfoResponseVo = ShowProjectApplicantInfoResponseVo.dtoToVo(showProjectApplicantInfoResponseDto); - return CommonResponse.success("applicants Info Showed successfully", showProjectApplicantInfoResponseVo); + @GetMapping("/{post_id}/applicants/{applicant_id}") + public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Long postId, @PathVariable("applicant_id") Long applicantId) { + try { + ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(postId, applicantId); + ShowProjectApplicantInfoResponseVo showProjectApplicantInfoResponseVo = ShowProjectApplicantInfoResponseVo.dtoToVo(showProjectApplicantInfoResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showProjectApplicantInfoResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } // 본인이 게시한 프로젝트(공고) 신청자 승인 상태 변경 API - @PatchMapping("/{post_id}/applicants/{id}") + @PatchMapping("/{post_id}/applicants/{applicant_id}") public CommonResponse ChangeApplyStatus( - @PathVariable("post_id") Integer boardId, - @PathVariable("id") Integer applicantId, + @PathVariable("post_id") Long postId, + @PathVariable("applicant_id") Long applicantId, @RequestBody ChangeApplyStatusRequestDto changeApplyStatusRequestDto - ) throws Exception { - - ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(boardId,applicantId,changeApplyStatusRequestDto.getStatus()); - - ChangeApplyStatusResponseVo changeApplyStatusResponseVo = ChangeApplyStatusResponseVo.dtoToVo(changeApplyStatusResponseDto); - return CommonResponse.success("applicant Status changed successfully", changeApplyStatusResponseVo); + ) { + try { + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(postId,applicantId,changeApplyStatusRequestDto.getStatus()); + ChangeApplyStatusResponseVo changeApplyStatusResponseVo = ChangeApplyStatusResponseVo.dtoToVo(changeApplyStatusResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), changeApplyStatusResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } // 본인이 신청한 프로젝트 목록 조회 (승인결과포함) API - @GetMapping("/applications/{id}") + @GetMapping("/applications/{member_id}") public CommonResponse ShowApplyingProjectList( - @PathVariable("id") Integer applicantId, + @PathVariable("member_id") int memberId, @RequestParam(value = "page", defaultValue = "1") int page, - @RequestParam(value = "limit", defaultValue = "10") int limit) throws Exception { - - ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(applicantId, page, limit); - - ShowApplyingProjectListResponseVo showApplyingProjectListResponseVo = ShowApplyingProjectListResponseVo.dtoToVo(showApplyingProjectInfoResponseDto); - return CommonResponse.success("Applying applications Showed successfully", showApplyingProjectListResponseVo); + @RequestParam(value = "limit", defaultValue = "10") int limit) { + try { + ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(memberId, page, limit); + ShowApplyingProjectListResponseVo showApplyingProjectListResponseVo = ShowApplyingProjectListResponseVo.dtoToVo(showApplyingProjectInfoResponseDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showApplyingProjectListResponseVo); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java index 3472bcf..2c986c5 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,13 +10,13 @@ @NoArgsConstructor public class ApplyProjectResponseVo { private String message; - private Integer appliedId; - private String appliedAt; + private Long applicationId; + private LocalDateTime appliedAt; @Builder - public ApplyProjectResponseVo(String message, Integer appliedId, String appliedAt) { + public ApplyProjectResponseVo(String message, Long applicationId, LocalDateTime appliedAt) { this.message = message; - this.appliedId = appliedId; + this.applicationId = applicationId; this.appliedAt = appliedAt; } @@ -23,7 +24,7 @@ public static ApplyProjectResponseVo dtoToVo( ApplyProjectResponseDto applyProjectResponseDto) { return ApplyProjectResponseVo.builder() .message(applyProjectResponseDto.getMessage()) - .appliedId(applyProjectResponseDto.getAppliedId()) + .applicationId(applyProjectResponseDto.getApplicationId()) .appliedAt(applyProjectResponseDto.getAppliedAt()) .build(); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java index ab91713..7cb3127 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ChangeApplyStatusResponseVo.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; +import java.time.LocalDate; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -8,13 +10,11 @@ @Getter @NoArgsConstructor public class ChangeApplyStatusResponseVo { - String message; String updatedStatus; - String updatedAt; + LocalDateTime updatedAt; @Builder - public ChangeApplyStatusResponseVo(String message, String updatedStatus, String updatedAt) { - this.message = message; + public ChangeApplyStatusResponseVo(String updatedStatus, LocalDateTime updatedAt) { this.updatedStatus = updatedStatus; this.updatedAt = updatedAt; } @@ -22,7 +22,6 @@ public ChangeApplyStatusResponseVo(String message, String updatedStatus, String public static ChangeApplyStatusResponseVo dtoToVo( ChangeApplyStatusResponseDto changeApplyStatusResponseDto) { return ChangeApplyStatusResponseVo.builder() - .message(changeApplyStatusResponseDto.getMessage()) .updatedStatus(changeApplyStatusResponseDto.getUpdatedStatus()) .updatedAt(changeApplyStatusResponseDto.getUpdatedAt()) .build(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java index cefe7b8..1762232 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.Date; import java.util.List; @@ -21,26 +22,26 @@ public class ShowApplyingProjectListResponseVo { @Getter @NoArgsConstructor public static class ApplicationInfo { - private Integer applicationId; + private Long applicationId; private String projectTitle; - private Integer boardId; - private Date applyDate; + private Long postId; + private LocalDate applyDate; private String status; private String projectType; private String relateField; @Builder public ApplicationInfo( - Integer applicationId, + Long applicationId, String projectTitle, - Integer boardId, - Date applyDate, + Long postId, + LocalDate applyDate, String status, String projectType, String relateField) { this.applicationId = applicationId; this.projectTitle = projectTitle; - this.boardId = boardId; + this.postId = postId; this.applyDate = applyDate; this.status = status; this.projectType = projectType; @@ -64,7 +65,7 @@ public static ShowApplyingProjectListResponseVo dtoToVo( .map(dtoApplication -> ShowApplyingProjectListResponseVo.ApplicationInfo.builder() .applicationId(dtoApplication.getApplicationId()) .projectTitle(dtoApplication.getProjectTitle()) - .boardId(dtoApplication.getBoardId()) + .postId(dtoApplication.getPostId()) .applyDate(dtoApplication.getApplyDate()) .status(dtoApplication.getStatus()) .projectType(dtoApplication.getProjectType()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java index f53cbfe..f4e3322 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; +import java.time.LocalDate; import java.util.Date; import lombok.Builder; import lombok.Getter; @@ -9,39 +10,27 @@ @Getter @NoArgsConstructor public class ShowProjectApplicantInfoResponseVo { - private Integer applicantId; + private Long applicantId; private String name; - private Date applyDate; + private LocalDate applyDate; private String status; private String email; private String phone; - private String resumeUrl; - private String portfolioUrl; - private String customAnswer; - private String additionalFile; @Builder public ShowProjectApplicantInfoResponseVo( - Integer applicantId, + Long applicantId, String name, - Date applyDate, + LocalDate applyDate, String status, String email, - String phone, - String resumeUrl, - String portfolioUrl, - String customAnswer, - String additionalFile){ + String phone){ this.applicantId = applicantId; this.name = name; this.applyDate = applyDate; this.status = status; this.email = email; this.phone = phone; - this.resumeUrl = resumeUrl; - this.portfolioUrl = portfolioUrl; - this.customAnswer = customAnswer; - this.additionalFile = additionalFile; } public static ShowProjectApplicantInfoResponseVo dtoToVo( @@ -53,10 +42,6 @@ public static ShowProjectApplicantInfoResponseVo dtoToVo( .status(showProjectApplicantInfoResponseDto.getStatus()) .email(showProjectApplicantInfoResponseDto.getEmail()) .phone(showProjectApplicantInfoResponseDto.getPhone()) - .resumeUrl(showProjectApplicantInfoResponseDto.getResumeUrl()) - .portfolioUrl(showProjectApplicantInfoResponseDto.getPortfolioUrl()) - .customAnswer(showProjectApplicantInfoResponseDto.getCustomAnswer()) - .additionalFile(showProjectApplicantInfoResponseDto.getAdditionalFile()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java index ba0e0ab..21b0382 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; +import java.time.LocalDate; import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -20,13 +21,13 @@ public class ShowProjectApplicantsListResponseVo { @Getter @NoArgsConstructor public static class ApplicantInfo { - private Integer applicantId; + private Long applicantId; private String name; - private Date applyDate; + private LocalDate applyDate; private String status; @Builder - public ApplicantInfo(Integer applicantId, String name, Date applyDate, String status) { + public ApplicantInfo(Long applicantId, String name, LocalDate applyDate, String status) { this.applicantId = applicantId; this.name = name; this.applyDate = applyDate; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java index a3883c3..d06ce15 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo.member; import com.archisemtle.semtlewebserverspring.dto.member.MemberReadResponseDto; -import java.util.Date; +import java.time.LocalDate; import java.util.UUID; import lombok.Builder; import lombok.Getter; @@ -14,7 +14,7 @@ public class MemberReadResponseVo { private String password; private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; private String role; private boolean manageApprovalStatus; From 077a720f152ae1d1a46dc4ad35e81578a9abf6e5 Mon Sep 17 00:00:00 2001 From: hhjkhhbgkugjnbj Date: Fri, 4 Apr 2025 01:52:51 +0900 Subject: [PATCH 06/16] =?UTF-8?q?Refector=20:=20=EC=98=A4=EB=A5=98=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ApplyProjectServiceImpl.java | 1 - .../ProjectApplicationServiceImpl.java | 23 +++++++++++++++++++ .../common/BaseResponseStatus.java | 1 + .../domain/Application.java | 3 ++- .../dto/member/MemberReadResponseDto.java | 1 + .../infrastructure/ApplicationRepository.java | 3 +++ .../presentation/MemberController.java | 2 +- .../vo/member/MemberReadResponseVo.java | 2 ++ 8 files changed, 33 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java index d7738ad..938810d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java @@ -55,7 +55,6 @@ public ApplyProjectResponseDto applyProject(Long postId, Long applicantId, Apply ProjectBoard projectBoard = projectBoardRepository.findById(postId) .orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND)); - if(LocalDate.now().isBefore(projectBoard.getProjectRecruitingEndTime().plusDays(1))) { Member member = memberRepository.findById(Math.toIntExact(applicantId)) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java index bb498aa..46431b0 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java @@ -75,6 +75,11 @@ public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, Long applican Applicant applicant = applicantsRepository.findByPostIdAndApplicantId(postId, applicantId).orElseThrow(() -> new BaseException( BaseResponseStatus.NO_APPLICANT_FOUND)); + // 이미 변경된(동일한) 상태 + if(applicant.getStatus().equals(status)) { + throw new BaseException(BaseResponseStatus.PROCESSED_APPLICATION); + } + Applicant updatedApplicant = Applicant.builder() .applicantId(applicant.getApplicantId()) .name(applicant.getName()) @@ -88,6 +93,24 @@ public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, Long applican applicantsRepository.save(updatedApplicant); + + Application application = applicationRepository.findByApplicantId(applicant.getApplicantId()).orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_APPLICATIONS)); + + Application updatedApplication = Application.builder() + .applicationId(application.getApplicationId()) + .applicantId(application.getApplicantId()) + .memberId(application.getMemberId()) + .projectTitle(application.getProjectTitle()) + .postId(application.getPostId()) + .applyDate(application.getApplyDate()) + .status(status) + .projectType(application.getProjectType()) + .relateField(application.getRelateField()) + .build(); + + applicationRepository.save(updatedApplication); + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto( updatedApplicant); return changeApplyStatusResponseDto; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java index 7903a77..a09a13d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java @@ -100,6 +100,7 @@ public enum BaseResponseStatus { NO_APPLICANTS(HttpStatus.BAD_REQUEST, false, 5007, "신청자가 존재하지 않습니다."), NO_APPLICATIONS(HttpStatus.BAD_REQUEST, false, 5007, "신청서가 존재하지 않습니다."), DUPLICATE_APPLICATION(HttpStatus.BAD_REQUEST, false, 5008, "이미 신청한 공고입니다."), + PROCESSED_APPLICATION(HttpStatus.BAD_REQUEST, false, 5009, "이미 변경된 상태입니다."), /** * 6000 : Cart & WishProductList Service Error diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java index fcea2ca..975f285 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java @@ -48,8 +48,9 @@ public class Application { @Builder - public Application(Long applicantId, int memberId ,String projectTitle, Long postId, LocalDate applyDate, String status, + public Application(Long applicationId, Long applicantId, int memberId ,String projectTitle, Long postId, LocalDate applyDate, String status, String projectType, String relateField) { + this.applicationId = applicationId; this.applicantId = applicantId; this.memberId = memberId; this.projectTitle = projectTitle; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java index af09d78..08f1296 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberReadResponseDto.java @@ -15,6 +15,7 @@ public class MemberReadResponseDto { private String username; private LocalDate birth; private String phone; + private String profileImageUrl; private String role; private boolean manageApprovalStatus; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java index 040b7e9..c39eb91 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java @@ -2,6 +2,7 @@ import com.archisemtle.semtlewebserverspring.domain.Application; import java.util.List; +import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; @@ -14,4 +15,6 @@ public interface ApplicationRepository extends JpaRepository Page findByMemberId(int memberId, Pageable pageable); List findByMemberIdAndPostId(int memberId, Long postId); + + Optional findByApplicantId(Long applicantId); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java index d3b1973..a943ad2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java @@ -86,7 +86,7 @@ public CommonResponse showMember(@PathVariable UUID uuid) try{ MemberReadResponseDto showMemberDto = memberService.show(uuid); MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); - return CommonResponse.success("해당하는 멤버의 정보를 조회하는데 성공하였습니다.", responseVo); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), responseVo); } catch (BaseException e) { return CommonResponse.fail(e.getErrorCode(), e.getMessage()); } catch (Exception e) { diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java index d06ce15..7381063 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/member/MemberReadResponseVo.java @@ -17,6 +17,7 @@ public class MemberReadResponseVo { private LocalDate birth; private String phone; private String role; + private String profileImageUrl; private boolean manageApprovalStatus; public static MemberReadResponseVo dtoToVo( @@ -30,6 +31,7 @@ public static MemberReadResponseVo dtoToVo( .birth(memberReadResponseDto.getBirth()) .phone(memberReadResponseDto.getPhone()) .role(memberReadResponseDto.getRole()) + .profileImageUrl(memberReadResponseDto.getProfileImageUrl()) .manageApprovalStatus(memberReadResponseDto.isManageApprovalStatus()) .build(); } From 79af3face631797210861ab59f0d66a9e5c02a31 Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 4 Apr 2025 17:03:39 +0900 Subject: [PATCH 07/16] =?UTF-8?q?refactor:=20=EA=B2=8C=EC=8B=9C=EB=AC=BC?= =?UTF-8?q?=20=EB=82=B4=EC=9A=A9=20=EC=A0=9C=ED=95=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- .../SemtleWebServerSpringApplication.java | 1 + .../activity/ActivityServiceImpl.java | 1 - .../application/archive/ArchiveService.java | 1 - .../archive/ArchiveServiceImpl.java | 3 +-- .../common/ExceptHandler.java | 18 ++++++++++++++++++ .../config/SecurityConfig.java | 2 +- .../domain/activity/Activity.java | 1 + .../domain/archive/Archive.java | 3 +++ .../archive/ArchiveController.java | 1 + 10 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java diff --git a/build.gradle b/build.gradle index 767144d..74d2e3f 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-security' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.0.2' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.3.0' testImplementation 'org.springframework.security:spring-security-test' diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java b/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java index 15a2ba3..08db5b9 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/SemtleWebServerSpringApplication.java @@ -10,4 +10,5 @@ public static void main(String[] args) { SpringApplication.run(SemtleWebServerSpringApplication.class, args); } + } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index 31565a3..8446a09 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -72,7 +72,6 @@ public void updateActivityBoard(Long id, ActivityRequestDto requestDto){ .images(requestDto.getImages()) .type(requestDto.getType()) .build(); - activityRepository.save(changedActivity); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java index 868458c..6656fd3 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveService.java @@ -11,7 +11,6 @@ public interface ArchiveService { - public void createArchiveBoard(ArchiveRequestDto requestDto); public ArchiveResponseDto readArchiveBoard(Long id); public void updateArchiveBoard(Long id, ArchiveRequestDto requestDto); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java index 6925b7c..3964f1d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/archive/ArchiveServiceImpl.java @@ -27,8 +27,6 @@ @Slf4j public class ArchiveServiceImpl implements ArchiveService{ - - private final ArchiveRepository archiveRepository; private static final Logger logger = LoggerFactory.getLogger(ArchiveServiceImpl.class); @@ -44,6 +42,7 @@ public void createArchiveBoard(ArchiveRequestDto requestDto) { .imageUrl(requestDto.getImageUrl()) .fileUrl(requestDto.getFileUrl()) .build(); + archiveRepository.save(archive); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java new file mode 100644 index 0000000..c5ddd2a --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java @@ -0,0 +1,18 @@ +package com.archisemtle.semtlewebserverspring.common; + +import io.swagger.v3.oas.annotations.Hidden; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +@Hidden +@RestControllerAdvice +public class ExceptHandler { + + + @ExceptionHandler(BaseException.class) + protected CommonResponse handlerCustomException(BaseException e){ + return CommonResponse.fail(e.getErrorCode()); + } + + +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java index 0d016c3..d210007 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/config/SecurityConfig.java @@ -32,7 +32,7 @@ public CorsConfigurationSource corsConfigurationSource() { var cors = new org.springframework.web.cors.CorsConfiguration(); cors.setAllowedOriginPatterns( List.of("http://localhost:3000", "https://archisemtle.com", - "https://archisemtle.site", "http://localhost:8080/")); + "https://archisemtle.site", "http://localhost:8080")); cors.setAllowedMethods(List.of("GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS")); cors.setAllowedHeaders(List.of("*")); cors.setAllowCredentials(true); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java index d1fe5a2..f45bb87 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/activity/Activity.java @@ -24,6 +24,7 @@ public class Activity { @Column(nullable = false, unique = false) private String title; + @Lob @Column(nullable = false, unique = false) private String content; @Column(nullable = false, unique = false) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java index 4a41119..aef7132 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/archive/Archive.java @@ -7,6 +7,7 @@ import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.Lob; import java.time.LocalDateTime; import java.util.List; import java.util.UUID; @@ -31,6 +32,8 @@ public class Archive { private String title; @Column(unique = false, nullable = false) private String writer; + + @Lob @Column(unique = false, nullable = false) private String content; @Column(unique = false, nullable = false) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java index ee23e2e..52a4aad 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java @@ -38,6 +38,7 @@ public class ArchiveController { @PostMapping public CommonResponse createArchive(@RequestBody ArchiveRequestVo requestVo) throws IOException{ archiveService.createArchiveBoard(ArchiveRequestVo.voToDto(requestVo)); + return CommonResponse.success("Secret Note 게시물이 성공적으로 등록되었습니다."); } From 6667d8f62775977588b8beda701c6cd9b2e5623c Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 4 Apr 2025 17:06:11 +0900 Subject: [PATCH 08/16] =?UTF-8?q?refactor:=20=EB=B3=80=EA=B2=BD=EC=82=AC?= =?UTF-8?q?=ED=95=AD=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/ExceptHandler.java | 18 ------------------ 1 file changed, 18 deletions(-) delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java deleted file mode 100644 index c5ddd2a..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/ExceptHandler.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.archisemtle.semtlewebserverspring.common; - -import io.swagger.v3.oas.annotations.Hidden; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@Hidden -@RestControllerAdvice -public class ExceptHandler { - - - @ExceptionHandler(BaseException.class) - protected CommonResponse handlerCustomException(BaseException e){ - return CommonResponse.fail(e.getErrorCode()); - } - - -} From a612c16812e70b574683e2e2b3afab49c17047a4 Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 4 Apr 2025 19:05:48 +0900 Subject: [PATCH 09/16] =?UTF-8?q?refactor:=20=ED=8E=98=EC=9D=B4=EC=A7=80?= =?UTF-8?q?=20=EC=A0=84=EC=B2=B4=20=EB=B6=88=EB=9F=AC=EC=98=A4=EA=B8=B0=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 --- .../application/activity/ActivityServiceImpl.java | 2 +- .../presentation/activity/ActivityController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java index 31565a3..1a3b03c 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/activity/ActivityServiceImpl.java @@ -88,7 +88,7 @@ public ActivityListResponseDto readActivityListBoard(ActivityListRequestDto requ Pageable pageable = PageRequest.of(requestDto.getPage()-1, requestDto.getSize(), Sort.by(Direction.ASC, "createdAt")); - activityPage = requestDto.getType().isEmpty() ? activityRepository.findAll(pageable) : + activityPage = requestDto.getType().equals("all") ? activityRepository.findAll(pageable) : activityRepository.findByTypeContainingIgnoreCase(requestDto.getType(), pageable); int total_posts = (int)activityPage.getTotalElements(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java index 0828de0..7598b4a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java @@ -82,7 +82,7 @@ public CommonResponse deleteActivity(@PathVariable Long id) { public CommonResponse getActivityList( @RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "size", defaultValue = "15") int size, - @RequestParam(name = "type", defaultValue = "") String type){ + @RequestParam(name = "type", defaultValue = "all") String type){ ActivityListRequestVo requestVo = ActivityListRequestVo.builder() .page(page) .size(size) From 3597193ca1b8f88b2bcf4ee643db1821f1ce2eb5 Mon Sep 17 00:00:00 2001 From: Bagsangbin Date: Fri, 4 Apr 2025 20:22:46 +0900 Subject: [PATCH 10/16] =?UTF-8?q?feature:BaseException=EC=98=88=EC=99=B8?= =?UTF-8?q?=EB=A5=BC=20=EC=B2=98=EB=A6=AC=ED=95=98=EB=8A=94=20=EA=B8=80?= =?UTF-8?q?=EB=A1=9C=EB=B2=8C=20=EC=98=88=EC=99=B8=EC=B2=98=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/GlobalExceptionContreoller.java | 19 +++++++++++++++++++ .../activity/ActivityController.java | 8 ++++++-- .../archive/ArchiveController.java | 3 +++ 3 files changed, 28 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java new file mode 100644 index 0000000..b7657cc --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/GlobalExceptionContreoller.java @@ -0,0 +1,19 @@ +package com.archisemtle.semtlewebserverspring.common; + +import io.jsonwebtoken.io.IOException; +import io.swagger.v3.oas.annotations.Hidden; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + + +//Swagger는 api문서는 다 들고오려는 특성이 있는데 예외 처리 컨트롤러를 가져오는 과정에서는 에럭 발생 +// 이에 Hidden 어노테이션으로 swagger가 탐지하는 영역에서 벗어나게 설정 + +@Hidden +@RestControllerAdvice +public class GlobalExceptionContreoller { + @ExceptionHandler(BaseException.class) + public CommonResponse BaseExceptionHandler(BaseException e){ + return CommonResponse.fail(e.getErrorCode(), e.getErrorCode().getMessage()); + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java index 0828de0..fbfff92 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/activity/ActivityController.java @@ -3,6 +3,7 @@ import com.archisemtle.semtlewebserverspring.application.activity.ActivityService; import com.archisemtle.semtlewebserverspring.application.activity.ActivityServiceImpl; import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityListRequestDto; import com.archisemtle.semtlewebserverspring.dto.activity.ActivityListResponseDto; @@ -48,9 +49,8 @@ public class ActivityController { //게시물 생성 @PostMapping - public CommonResponse createActivity(@RequestBody ActivityRequestVo requestVo) + public CommonResponse createActivity(@Valid @RequestBody ActivityRequestVo requestVo) throws IOException { - activityService.createActivityBoard(ActivityRequestVo.voToDto(requestVo)); return CommonResponse.success("게시글 작성 성공"); } @@ -83,6 +83,9 @@ public CommonResponse getActivityList( @RequestParam(name = "page", defaultValue = "1") int page, @RequestParam(name = "size", defaultValue = "15") int size, @RequestParam(name = "type", defaultValue = "") String type){ + + if(page < 1 || size < 1 || type.isEmpty()) throw new BaseException(BaseResponseStatus.WRONG_PARAM); + ActivityListRequestVo requestVo = ActivityListRequestVo.builder() .page(page) .size(size) @@ -96,6 +99,7 @@ public CommonResponse getActivityList( @GetMapping("/recent") public CommonResponse getCurActivityList( @RequestParam(name = "limit", defaultValue = "3") int limit){ + if(limit < 1) throw new BaseException(BaseResponseStatus.WRONG_PARAM); ActivityListResponseDto responseDto = activityService.readRecentActivityListBoard(limit); return CommonResponse.success("최근 활동 게시물 목록 읽어오기 성공", ActivityListResponseDto.dtoToVo(responseDto)); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java index ee23e2e..568e07a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/archive/ArchiveController.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.presentation.archive; import com.archisemtle.semtlewebserverspring.application.archive.ArchiveService; +import com.archisemtle.semtlewebserverspring.common.BaseException; +import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveListRequestDto; import com.archisemtle.semtlewebserverspring.dto.archive.ArchiveListResponseDto; @@ -72,6 +74,7 @@ public CommonResponse getArchiveList( @RequestParam(name = "size", defaultValue = "15") int size, @RequestParam(name = "search_keyword", defaultValue = "") String search_keyword ){ + if(page < 1 || size < 1) throw new BaseException(BaseResponseStatus.WRONG_PARAM); ArchiveListRequestVo requestVo = new ArchiveListRequestVo(page, size, search_keyword); ArchiveListRequestDto requestDto = ArchiveListRequestVo.voToDto(requestVo); ArchiveListResponseDto responseDto = archiveService.getArchiveList(requestDto); From a381d6b630443b6215a2e7799788b2bbc435bef8 Mon Sep 17 00:00:00 2001 From: hhjkhhbgkugjnbj Date: Tue, 8 Apr 2025 21:49:45 +0900 Subject: [PATCH 11/16] =?UTF-8?q?Refector:=20member=5Fid=20->=20uuid=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=98=A4=EB=A5=98=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ApplyProjectService.java | 2 +- .../application/ApplyProjectServiceImpl.java | 98 +++++--------- .../ProjectApplicationService.java | 9 +- .../ProjectApplicationServiceImpl.java | 125 ++++++++++-------- .../common/BaseResponseStatus.java | 7 +- .../domain/Applicant.java | 55 -------- .../domain/Application.java | 63 --------- .../semtlewebserverspring/domain/Apply.java | 57 ++++++++ .../domain/ProjectJoinAnswer.java | 38 ------ .../domain/ProjectJoinFile.java | 16 ++- .../domain/ProjectJoinUrl.java | 16 ++- .../dto/ApplyProjectRequestDto.java | 22 +-- .../dto/ApplyProjectResponseDto.java | 24 +--- .../dto/ChangeApplyStatusResponseDto.java | 8 +- .../dto/ProjectApplicantsResponseDto.java | 40 +++--- .../ShowApplyingProjectInfoResponseDto.java | 72 +++++----- .../ShowProjectApplicantInfoResponseDto.java | 24 ++-- .../infrastructure/ApplicantsRepository.java | 21 --- .../infrastructure/ApplicationRepository.java | 20 --- .../infrastructure/ApplyRepository.java | 16 +++ .../ProjectJoinAnswerRepository.java | 10 -- .../presentation/ApplyingController.java | 13 +- ...java => ProjectApplicationController.java} | 25 ++-- .../vo/ApplyProjectResponseVo.java | 11 +- .../vo/ShowApplyingProjectListResponseVo.java | 53 ++++---- .../ShowProjectApplicantInfoResponseVo.java | 23 ++-- .../ShowProjectApplicantsListResponseVo.java | 37 +++--- 27 files changed, 371 insertions(+), 534 deletions(-) delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java create mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java delete mode 100644 src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java rename src/main/java/com/archisemtle/semtlewebserverspring/presentation/{ProjectApplicaionController.java => ProjectApplicationController.java} (88%) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java index ed0b330..ca65cb1 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectService.java @@ -4,5 +4,5 @@ import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; public interface ApplyProjectService { - ApplyProjectResponseDto applyProject(Long boardId, Long applicantId, ApplyProjectRequestDto applyProjectRequestDto) throws Exception; + ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) throws Exception; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java index 938810d..a61fcae 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ApplyProjectServiceImpl.java @@ -2,31 +2,27 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; -import com.archisemtle.semtlewebserverspring.domain.Applicant; -import com.archisemtle.semtlewebserverspring.domain.Application; +import com.archisemtle.semtlewebserverspring.domain.Apply; import com.archisemtle.semtlewebserverspring.domain.Member; import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; -import com.archisemtle.semtlewebserverspring.domain.ProjectJoinAnswer; import com.archisemtle.semtlewebserverspring.domain.ProjectJoinFile; import com.archisemtle.semtlewebserverspring.domain.ProjectJoinUrl; -import com.archisemtle.semtlewebserverspring.domain.ProjectTypeCategory; -import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectRequestDto; import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; -import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository; -import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ApplyRepository; import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ProjectBoardRepository; -import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinAnswerRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinFileRepository; import com.archisemtle.semtlewebserverspring.infrastructure.ProjectJoinUrlRepository; -import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -36,100 +32,74 @@ @Transactional(readOnly = true) public class ApplyProjectServiceImpl implements ApplyProjectService { - private final ApplicantsRepository applicantsRepository; - private final ApplicationRepository applicationRepository; private final MemberRepository memberRepository; + private final ApplyRepository applyRepository; private final ProjectBoardRepository projectBoardRepository; - private final RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository; - private final ProjectJoinAnswerRepository projectJoinAnswerRepository; private final ProjectJoinFileRepository projectJoinFileRepository; private final ProjectJoinUrlRepository projectJoinUrlRepository; @Override @Transactional - public ApplyProjectResponseDto applyProject(Long postId, Long applicantId, ApplyProjectRequestDto applyProjectRequestDto) { + public ApplyProjectResponseDto applyProject(ApplyProjectRequestDto applyProjectRequestDto) { - if(postId == null || applicantId == null || applyProjectRequestDto.getAnswers() == null) { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + UUID uuid = UUID.fromString(authentication.getName()); + + if(applyProjectRequestDto == null) { throw new BaseException(BaseResponseStatus.WRONG_PARAM); } - ProjectBoard projectBoard = projectBoardRepository.findById(postId) + ProjectBoard projectBoard = projectBoardRepository.findById(applyProjectRequestDto.getPostId()) .orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND)); - if(LocalDate.now().isBefore(projectBoard.getProjectRecruitingEndTime().plusDays(1))) { - Member member = memberRepository.findById(Math.toIntExact(applicantId)) + if(LocalDate.now().isBefore(projectBoard.getProjectRecruitingEndTime().plusDays(1))) { + Member member = memberRepository.findByUuid(uuid) .orElseThrow(() -> new BaseException( BaseResponseStatus.NO_EXIST_MEMBERS)); - List existingApplications = applicationRepository.findByMemberIdAndPostId(member.getMemberId(), postId); - - if (!existingApplications.isEmpty()) { - throw new BaseException(BaseResponseStatus.DUPLICATE_APPLICATION); + if(projectBoard.getWriterUuid().equals(member.getUuid().toString())) { + throw new BaseException(BaseResponseStatus.SAME_WRITER); } - Applicant applicant = Applicant.builder() - .name(member.getUsername()) - .applyDate(LocalDate.now()) - .status("대기") - .email(member.getEmail()) - .phone(member.getPhone()) - .updatedAt(LocalDateTime.now()) - .postId(postId) - .build(); - - applicantsRepository.save(applicant); - ProjectTypeCategory projectTypeName = projectBoard.getProjectTypeCategory(); - List relationFieldProjectPostMiddles = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId(postId); + Apply existingApply = applyRepository.findByMemberAndProjectBoardId(member, applyProjectRequestDto.getPostId()); - List relationFieldNames = relationFieldProjectPostMiddles.stream() - .map(relationField -> relationField.getRelationFieldCategory().getName()) - .toList(); + if (existingApply != null) { + throw new BaseException(BaseResponseStatus.DUPLICATE_APPLY); + } - Application application = Application.builder() - .applicantId(applicant.getApplicantId()) - .memberId(member.getMemberId()) - .projectTitle(projectBoard.getTitle()) - .postId(postId) - .applyDate(LocalDate.now()) + Apply apply = Apply.builder() + .member(member) + .projectBoard(projectBoard) + .applyDate(LocalDateTime.now()) .status("대기") - .projectType(projectTypeName.getName()) - .relateField(relationFieldNames.toString()) + .updatedAt(LocalDateTime.now()) + .answer(applyProjectRequestDto.getAnswer()) .build(); - applicationRepository.save(application); - + applyRepository.save(apply); List projectJoinUrls = applyProjectRequestDto.getUrls().stream() .map(url -> ProjectJoinUrl.builder() .url(url) - .applicationId(application.getApplicationId()) + .apply(apply) .build()) .collect(Collectors.toList()); projectJoinUrlRepository.saveAll(projectJoinUrls); - List projectJoinFiles = applyProjectRequestDto.getFiles().stream() - .map(fileDto -> ProjectJoinFile.builder() - .file(fileDto.getFileUrl()) - .applicationId(application.getApplicationId()) + List projectJoinFiles = applyProjectRequestDto.getFileUrls().stream() + .map(fileUrl -> ProjectJoinFile.builder() + .file(fileUrl) + .apply(apply) .build()) .collect(Collectors.toList()); projectJoinFileRepository.saveAll(projectJoinFiles); - List projectJoinAnswers = applyProjectRequestDto.getAnswers().stream() - .map(answerDto -> ProjectJoinAnswer.builder() - .answerText(answerDto.getAnswer()) - .questionId((long) answerDto.getQuestionId()) - .applicationId(application.getApplicationId()) - .build()) - .collect(Collectors.toList()); - - projectJoinAnswerRepository.saveAll(projectJoinAnswers); - ApplyProjectResponseDto successResponseDto = ApplyProjectResponseDto.entityToDto(application); - return successResponseDto; + ApplyProjectResponseDto applyProjectResponseDto = ApplyProjectResponseDto.entityToDto(apply); + return applyProjectResponseDto; }else{ throw new BaseException(BaseResponseStatus.RECRUITING_ALREADY_ENDED); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java index 930e230..e52f044 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationService.java @@ -1,15 +1,14 @@ package com.archisemtle.semtlewebserverspring.application; - -import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; +import java.util.UUID; public interface ProjectApplicationService { ProjectApplicantsResponseDto getApplicants(Long boardId, int page, int limit) throws Exception; - ShowProjectApplicantInfoResponseDto getApplicantInfo(Long boardId,Long applicantId) throws Exception; - ChangeApplyStatusResponseDto changeApplyStatus(Long boardId,Long applicantId, String status) throws Exception; - ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int memberId,int page, int limit) throws Exception; + ShowProjectApplicantInfoResponseDto getApplicantInfo(Long boardId,UUID uuid) throws Exception; + ChangeApplyStatusResponseDto changeApplyStatus(Long boardId,UUID uuid, String status) throws Exception; + ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int page, int limit) throws Exception; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java index 46431b0..1364531 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectApplicationServiceImpl.java @@ -2,20 +2,26 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; -import com.archisemtle.semtlewebserverspring.domain.Applicant; -import com.archisemtle.semtlewebserverspring.domain.Application; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import com.archisemtle.semtlewebserverspring.domain.Member; +import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; -import com.archisemtle.semtlewebserverspring.infrastructure.ApplicantsRepository; -import com.archisemtle.semtlewebserverspring.infrastructure.ApplicationRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ApplyRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.ProjectBoardRepository; +import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository; import java.time.LocalDateTime; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -25,26 +31,32 @@ @Transactional(readOnly = true) public class ProjectApplicationServiceImpl implements ProjectApplicationService { - private final ApplicantsRepository applicantsRepository; - private final ApplicationRepository applicationRepository; + private final ApplyRepository applyRepository; + private final MemberRepository memberRepository; + private final ProjectBoardRepository projectBoardRepository; + private final RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository; @Override public ProjectApplicantsResponseDto getApplicants(Long postId, int page, int limit) { if(postId == null || page == 0 || limit == 0) { throw new BaseException(BaseResponseStatus.WRONG_PARAM); } + + ProjectBoard projectBoard = projectBoardRepository.findById(postId) + .orElseThrow(() -> new BaseException(BaseResponseStatus.NO_BOARD_FOUND)); + Pageable pageable = PageRequest.of(page - 1, limit); - Page applicantsPage = applicantsRepository.findAllWithApplication( - postId, + Page applyPage = applyRepository.findByProjectBoard( + projectBoard, pageable ); - if (applicantsPage == null || applicantsPage.isEmpty()) { + if (applyPage == null) { throw new BaseException(BaseResponseStatus.NO_APPLICANTS); } ProjectApplicantsResponseDto projectApplicantsResponseDto = ProjectApplicantsResponseDto.entityToDto( - applicantsPage, + applyPage, page ); @@ -53,86 +65,91 @@ public ProjectApplicantsResponseDto getApplicants(Long postId, int page, int lim @Override - public ShowProjectApplicantInfoResponseDto getApplicantInfo(Long postId, Long applicantId) { - if(postId == null || applicantId == 0) { + public ShowProjectApplicantInfoResponseDto getApplicantInfo(Long postId, UUID uuid) { + if(postId == null || uuid == null) { throw new BaseException(BaseResponseStatus.WRONG_PARAM); } - Applicant applicant = applicantsRepository.findByPostIdAndApplicantId(postId, applicantId).orElseThrow(() -> new BaseException( - BaseResponseStatus.NO_APPLICANT_FOUND)); + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); + + Apply apply = applyRepository.findByMemberAndProjectBoardId(member, postId); + if(apply == null) { + throw new BaseException(BaseResponseStatus.NO_APPLICANTS); + } + ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = ShowProjectApplicantInfoResponseDto.entityToDto( - applicant); + apply); return showProjectApplicantInfoResponseDto; } @Override @Transactional - public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, Long applicantId, String status) { + public ChangeApplyStatusResponseDto changeApplyStatus(Long postId, UUID uuid, String status) { - if(postId == null || applicantId == null || status == null) { + if(postId == null || uuid == null || status == null) { throw new BaseException(BaseResponseStatus.WRONG_PARAM); } + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); - Applicant applicant = applicantsRepository.findByPostIdAndApplicantId(postId, applicantId).orElseThrow(() -> new BaseException( - BaseResponseStatus.NO_APPLICANT_FOUND)); + Apply apply = applyRepository.findByMemberAndProjectBoardId(member, postId); - // 이미 변경된(동일한) 상태 - if(applicant.getStatus().equals(status)) { - throw new BaseException(BaseResponseStatus.PROCESSED_APPLICATION); + if (apply == null) { + throw new BaseException(BaseResponseStatus.NO_APPLICATIONS); } - Applicant updatedApplicant = Applicant.builder() - .applicantId(applicant.getApplicantId()) - .name(applicant.getName()) - .applyDate(applicant.getApplyDate()) - .status(status) - .email(applicant.getEmail()) - .phone(applicant.getPhone()) - .updatedAt(LocalDateTime.now()) - .postId(applicant.getPostId()) - .build(); - - applicantsRepository.save(updatedApplicant); - + if(!(status.equals("승인") || status.equals("대기") || status.equals("반려"))) { + throw new BaseException(BaseResponseStatus.FALSE_STATUS); + } - Application application = applicationRepository.findByApplicantId(applicant.getApplicantId()).orElseThrow(() -> new BaseException( - BaseResponseStatus.NO_APPLICATIONS)); + if(apply.getStatus().equals(status)) { + throw new BaseException(BaseResponseStatus.PROCESSED_APPLY); + } - Application updatedApplication = Application.builder() - .applicationId(application.getApplicationId()) - .applicantId(application.getApplicantId()) - .memberId(application.getMemberId()) - .projectTitle(application.getProjectTitle()) - .postId(application.getPostId()) - .applyDate(application.getApplyDate()) + Apply updatedApply = Apply.builder() + .applyId(apply.getApplyId()) + .member(apply.getMember()) + .projectBoard(apply.getProjectBoard()) + .applyDate(apply.getApplyDate()) .status(status) - .projectType(application.getProjectType()) - .relateField(application.getRelateField()) + .updatedAt(LocalDateTime.now()) + .answer(apply.getAnswer()) .build(); - applicationRepository.save(updatedApplication); + applyRepository.save(updatedApply); ChangeApplyStatusResponseDto changeApplyStatusResponseDto = ChangeApplyStatusResponseDto.entityToDto( - updatedApplicant); + updatedApply); return changeApplyStatusResponseDto; } @Override - public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int memberId, int page, int limit) { + public ShowApplyingProjectInfoResponseDto getApplyingProjectInfo(int page, int limit) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + UUID uuid = UUID.fromString(authentication.getName()); - if(memberId == 0 || page == 0 || limit == 0) { + if(page == 0 || limit == 0) { throw new BaseException(BaseResponseStatus.WRONG_PARAM); } + Member member = memberRepository.findByUuid(uuid) + .orElseThrow(() -> new BaseException( + BaseResponseStatus.NO_EXIST_MEMBERS)); + Pageable pageable = PageRequest.of(page - 1, limit); - Page applicationsPage = applicationRepository.findByMemberId(memberId, pageable); + Page applyPage = applyRepository.findByMember(member, pageable); - if (applicationsPage == null || applicationsPage.isEmpty()) { + if (applyPage == null || applyPage.isEmpty()) { throw new BaseException(BaseResponseStatus.NO_APPLICATIONS); } ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = ShowApplyingProjectInfoResponseDto.entityToDto( - applicationsPage, - page + applyPage, + page, + relationFieldProjectPostMiddleRepository ); return showApplyingProjectInfoResponseDto; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java index a09a13d..4afb789 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/common/BaseResponseStatus.java @@ -91,7 +91,6 @@ public enum BaseResponseStatus { /** * 5000 : Applicant & Application Service Error */ - NO_APPLICANT_FOUND(HttpStatus.NOT_FOUND, false, 5001, "신청자를 찾을 수 없습니다."), INVALID_APPLICATION_STATUS(HttpStatus.BAD_REQUEST, false, 5002, "유효하지 않은 신청 상태입니다."), APPLICATION_ALREADY_PROCESSED(HttpStatus.CONFLICT, false, 5003, "이미 처리된 신청입니다."), APPLICATION_NOT_FOUND(HttpStatus.NOT_FOUND, false, 5004, "신청 정보를 찾을 수 없습니다."), @@ -99,8 +98,10 @@ public enum BaseResponseStatus { RECRUITING_ALREADY_ENDED(HttpStatus.BAD_REQUEST, false, 5006, "프로젝트 모집이 마감되었습니다."), NO_APPLICANTS(HttpStatus.BAD_REQUEST, false, 5007, "신청자가 존재하지 않습니다."), NO_APPLICATIONS(HttpStatus.BAD_REQUEST, false, 5007, "신청서가 존재하지 않습니다."), - DUPLICATE_APPLICATION(HttpStatus.BAD_REQUEST, false, 5008, "이미 신청한 공고입니다."), - PROCESSED_APPLICATION(HttpStatus.BAD_REQUEST, false, 5009, "이미 변경된 상태입니다."), + DUPLICATE_APPLY(HttpStatus.BAD_REQUEST, false, 5008, "이미 신청한 공고입니다."), + PROCESSED_APPLY(HttpStatus.BAD_REQUEST, false, 5009, "이미 변경된 상태입니다."), + FALSE_STATUS(HttpStatus.BAD_REQUEST, false, 5010, "존재하지 않는 상태입니다."), + SAME_WRITER(HttpStatus.BAD_REQUEST, false, 5011, "작성자는 공고 신청이 불가합니다."), /** * 6000 : Cart & WishProductList Service Error diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java deleted file mode 100644 index 3fc064e..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Applicant.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import java.time.LocalDate; -import java.time.LocalDateTime; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity(name = "applicants") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Applicant { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long applicantId; - - @Column(nullable = false) - private String name; - - @Column(nullable = false) - private LocalDate applyDate; - - @Column(nullable = false) - private String status; - - @Column(nullable = false) - private String email; - - private String phone; - - private LocalDateTime updatedAt; - - @Column(nullable = false) - private Long postId; - - @Builder - public Applicant(Long applicantId, String name, LocalDate applyDate, String status, String email, String phone, LocalDateTime updatedAt , Long postId) { - this.applicantId = applicantId; - this.name = name; - this.applyDate = applyDate; - this.status = status; - this.email = email; - this.phone = phone; - this.updatedAt = updatedAt; - this.postId = postId; - } - -} - diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java deleted file mode 100644 index 975f285..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Application.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.JoinColumn; -import jakarta.persistence.ManyToOne; -import java.time.LocalDate; - -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import org.hibernate.annotations.Comment; - -@Getter -@Entity(name = "applications") -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class Application { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long applicationId; - - @Column(name = "applicant_id", nullable = false) - private Long applicantId; - - @Column(name = "member_id", nullable = false) - private int memberId; - - @Column(nullable = false) - private String projectTitle; - - @Column(nullable = false) - private Long postId; - - @Column(nullable = false) - private LocalDate applyDate; - - @Column(nullable = false) - private String status; - - private String projectType; - - private String relateField; - - - @Builder - public Application(Long applicationId, Long applicantId, int memberId ,String projectTitle, Long postId, LocalDate applyDate, String status, - String projectType, String relateField) { - this.applicationId = applicationId; - this.applicantId = applicantId; - this.memberId = memberId; - this.projectTitle = projectTitle; - this.postId = postId; - this.applyDate = applyDate; - this.status = status; - this.projectType = projectType; - this.relateField = relateField; - } -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java new file mode 100644 index 0000000..a6dcce6 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/Apply.java @@ -0,0 +1,57 @@ +package com.archisemtle.semtlewebserverspring.domain; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.GenerationType; +import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.Lob; +import jakarta.persistence.ManyToOne; +import java.time.LocalDateTime; +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@Entity(name = "apply") +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Apply { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long applyId; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + private Member member; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "project_board_id", nullable = false) + private ProjectBoard projectBoard; + + @Column(nullable = false) + private LocalDateTime applyDate; + + @Column(nullable = false) + private String status; + + @Column(nullable = false) + private LocalDateTime updatedAt; + + @Lob + @Column(nullable = false) + private String answer; + + @Builder + public Apply(Long applyId, Member member, ProjectBoard projectBoard, LocalDateTime applyDate, String status, LocalDateTime updatedAt, String answer) { + this.applyId = applyId; + this.member = member; + this.projectBoard = projectBoard; + this.applyDate = applyDate; + this.status = status; + this.updatedAt = updatedAt; + this.answer = answer; + } +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java deleted file mode 100644 index feff742..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinAnswer.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.archisemtle.semtlewebserverspring.domain; - -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Entity -@NoArgsConstructor(access = AccessLevel.PROTECTED) -public class ProjectJoinAnswer { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private int projectJoinAnswerId; - - @Column(nullable = false) - private String answerText; - - @Column(nullable = false) - private Long questionId; - - @Column(nullable = false) - private Long applicationId; - - @Builder - public ProjectJoinAnswer(String answerText, Long questionId, Long applicationId) { - this.answerText = answerText; - this.questionId = questionId; - this.applicationId = applicationId; - } -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java index e678543..4bc19a1 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinFile.java @@ -2,13 +2,17 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; @Getter @Entity @@ -16,17 +20,19 @@ public class ProjectJoinFile { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int projectJoinFileId; + private Long projectJoinFileId; @Column(nullable = false) private String file; - @Column(nullable = false) - private Long applicationId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "apply_id", nullable = false) + @Comment("신청 ID") + private Apply apply; @Builder - public ProjectJoinFile(String file, Long applicationId) { + public ProjectJoinFile(String file, Apply apply) { this.file = file; - this.applicationId = applicationId; + this.apply = apply; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java index 51cf9b6..8324637 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/domain/ProjectJoinUrl.java @@ -2,13 +2,17 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; +import jakarta.persistence.JoinColumn; +import jakarta.persistence.ManyToOne; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; @Getter @Entity @@ -16,17 +20,19 @@ public class ProjectJoinUrl { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - private int projectJoinUrlId; + private Long projectJoinUrlId; @Column(nullable = false) private String url; - @Column(nullable = false) - private Long applicationId; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "apply_id", nullable = false) + @Comment("신청 ID") + private Apply apply; @Builder - public ProjectJoinUrl(String url, Long applicationId) { + public ProjectJoinUrl(String url, Apply apply) { this.url = url; - this.applicationId = applicationId; + this.apply = apply; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java index b336fef..a7cb19f 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectRequestDto.java @@ -1,6 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; import java.util.List; +import java.util.UUID; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -9,23 +10,8 @@ @Setter @Builder public class ApplyProjectRequestDto { - private List answers; + private Long postId; + private String answer; private List urls; - private List files; - - @Getter - @Setter - @Builder - public static class AnswerDto { - private Integer questionId; - private String answer; - } - - @Getter - @Setter - @Builder - public static class FileDto { - private String fileName; - private String fileUrl; - } + private List fileUrls; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java index 3d3b6da..db95136 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ApplyProjectResponseDto.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Application; +import com.archisemtle.semtlewebserverspring.domain.Apply; import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; @@ -10,23 +10,13 @@ @Setter @Builder public class ApplyProjectResponseDto { - private String message; - private Long applicationId; + private Long applyId; private LocalDateTime appliedAt; - public static ApplyProjectResponseDto entityToDto(Application application) { - if(application == null) { - return ApplyProjectResponseDto.builder() - .message("모집기간이 마감되었습니다.") - .applicationId(null) - .appliedAt(null) - .build(); - }else { - return ApplyProjectResponseDto.builder() - .message("프로젝트 신청이 성공적으로 접수되었습니다.") - .applicationId(application.getApplicationId()) - .appliedAt(LocalDateTime.now()) - .build(); - } + public static ApplyProjectResponseDto entityToDto(Apply apply) { + return ApplyProjectResponseDto.builder() + .applyId(apply.getApplyId()) + .appliedAt(LocalDateTime.now()) + .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java index 730db91..3a03789 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ChangeApplyStatusResponseDto.java @@ -1,6 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicant; +import com.archisemtle.semtlewebserverspring.domain.Apply; import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; @@ -13,10 +13,10 @@ public class ChangeApplyStatusResponseDto { private String updatedStatus; private LocalDateTime updatedAt; - public static ChangeApplyStatusResponseDto entityToDto(Applicant applicant) { + public static ChangeApplyStatusResponseDto entityToDto(Apply apply) { return ChangeApplyStatusResponseDto.builder() - .updatedStatus(applicant.getStatus()) - .updatedAt(LocalDateTime.now()) + .updatedStatus(apply.getStatus()) + .updatedAt(apply.getUpdatedAt()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java index e5a9c1e..03987fc 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ProjectApplicantsResponseDto.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicant; -import java.time.LocalDate; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -18,45 +18,45 @@ public class ProjectApplicantsResponseDto { private int totalElements; private int totalPages; private int currentPage; - private List applicants; + private List applys; @Getter @NoArgsConstructor - public static class ApplicantInfo { - private Long applicantId; - private String name; - private LocalDate applyDate; + public static class ApplyInfo { + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; @Builder - public ApplicantInfo(Long applicantId, String name, LocalDate applyDate, String status) { - this.applicantId = applicantId; - this.name = name; + public ApplyInfo(Long applyId, String username, LocalDateTime applyDate, String status) { + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; } } - public static ProjectApplicantsResponseDto entityToDto(Page applicantsPage, int currentPage) { - List applicants = applicantsPage.getContent(); + public static ProjectApplicantsResponseDto entityToDto(Page applicantsPage, int currentPage) { + List applys = applicantsPage.getContent(); int totalElements = (int) applicantsPage.getTotalElements(); - List applicantInfoList = applicants.stream() - .map(applicant -> ApplicantInfo.builder() - .applicantId(applicant.getApplicantId()) - .name(applicant.getName()) - .applyDate(applicant.getApplyDate()) - .status(applicant.getStatus()) + List applyInfoList = applys.stream() + .map(apply -> ApplyInfo.builder() + .applyId(apply.getApplyId()) + .username(apply.getMember().getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) .build()) .collect(Collectors.toList()); - int totalPages = (int) Math.ceil((double) totalElements / applicants.size()); + int totalPages = (int) Math.ceil((double) totalElements / applys.size()); return ProjectApplicantsResponseDto.builder() .totalElements(totalElements) .totalPages(totalPages) .currentPage(currentPage) - .applicants(applicantInfoList) + .applys(applyInfoList) .build(); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java index 83dd718..ea29b4a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowApplyingProjectInfoResponseDto.java @@ -1,7 +1,9 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Application; -import java.time.LocalDate; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import com.archisemtle.semtlewebserverspring.domain.RelationFieldProjectPostMiddle; +import com.archisemtle.semtlewebserverspring.infrastructure.RelationFieldProjectPostMiddleRepository; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -18,62 +20,72 @@ public class ShowApplyingProjectInfoResponseDto { private int totalElements; private int totalPages; private int currentPage; - private List applications; + private List applys; @Getter @NoArgsConstructor - public static class ApplicationInfo { - private Long applicationId; - private String projectTitle; + public static class ApplyInfo { + private Long applyId; private Long postId; - private LocalDate applyDate; + private String projectTitle; + private LocalDateTime applyDate; private String status; private String projectType; private String relateField; @Builder - public ApplicationInfo( - Long applicationId, - String projectTitle, + public ApplyInfo( + Long applyId, Long postId, - LocalDate applyDate, + String projectTitle, String status, String projectType, - String relateField) { - this.applicationId = applicationId; - this.projectTitle = projectTitle; + String relateField, + LocalDateTime applyDate) { + this.applyId = applyId; this.postId = postId; - this.applyDate = applyDate; + this.projectTitle = projectTitle; this.status = status; this.projectType = projectType; this.relateField = relateField; + this.applyDate = applyDate; } } - public static ShowApplyingProjectInfoResponseDto entityToDto(Page applicationsPage, int currentPage) { - List applications = applicationsPage.getContent(); - int totalElements = (int) applicationsPage.getTotalElements(); + public static ShowApplyingProjectInfoResponseDto entityToDto(Page applyPage, int currentPage, RelationFieldProjectPostMiddleRepository relationFieldProjectPostMiddleRepository) { + + List applys = applyPage.getContent(); + int totalElements = (int) applyPage.getTotalElements(); + + List applyInfoList = applys.stream() + .map(apply -> { + List relatedFields = relationFieldProjectPostMiddleRepository + .findAllByProjectBoardId(apply.getProjectBoard().getId()); + + String relatedFieldsStr = relatedFields.stream() + .map(field -> field.getRelationFieldCategory().getName()) + .collect(Collectors.joining(", ")); - List applicationInfoList = applications.stream() - .map(application -> ApplicationInfo.builder() - .applicationId(application.getApplicationId()) - .projectTitle(application.getProjectTitle()) - .postId(application.getPostId()) - .applyDate(application.getApplyDate()) - .status(application.getStatus()) - .projectType(application.getProjectType()) - .relateField(application.getRelateField()) - .build()) + return ApplyInfo.builder() + .applyId(apply.getApplyId()) + .postId(apply.getProjectBoard().getId()) + .projectTitle(apply.getProjectBoard().getTitle()) + .status(apply.getStatus()) + .projectType(apply.getProjectBoard().getProjectTypeCategory().getName()) + .relateField(relatedFieldsStr) + .applyDate(apply.getApplyDate()) + .build(); + }) .collect(Collectors.toList()); - int totalPages = (int) Math.ceil((double) totalElements / applications.size()); + int totalPages = (int) Math.ceil((double) totalElements / applys.size()); return ShowApplyingProjectInfoResponseDto.builder() .totalElements(totalElements) .totalPages(totalPages) .currentPage(currentPage) - .applications(applicationInfoList) + .applys(applyInfoList) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java index 3acb29d..3713086 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/ShowProjectApplicantInfoResponseDto.java @@ -1,7 +1,7 @@ package com.archisemtle.semtlewebserverspring.dto; -import com.archisemtle.semtlewebserverspring.domain.Applicant; -import java.time.LocalDate; +import com.archisemtle.semtlewebserverspring.domain.Apply; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.Setter; @@ -10,21 +10,21 @@ @Setter @Builder public class ShowProjectApplicantInfoResponseDto { - private Long applicantId; - private String name; - private LocalDate applyDate; + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; private String email; private String phone; - public static ShowProjectApplicantInfoResponseDto entityToDto(Applicant applicant) { + public static ShowProjectApplicantInfoResponseDto entityToDto(Apply apply) { return ShowProjectApplicantInfoResponseDto.builder() - .applicantId(applicant.getApplicantId()) - .name(applicant.getName()) - .applyDate(applicant.getApplyDate()) - .status(applicant.getStatus()) - .email(applicant.getEmail()) - .phone(applicant.getPhone()) + .applyId(apply.getApplyId()) + .username(apply.getMember().getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) + .email(apply.getMember().getEmail()) + .phone(apply.getMember().getPhone()) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java deleted file mode 100644 index c96154b..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicantsRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.archisemtle.semtlewebserverspring.infrastructure; - -import com.archisemtle.semtlewebserverspring.domain.Applicant; -import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.data.jpa.repository.Query; -import org.springframework.data.repository.query.Param; -import org.springframework.stereotype.Repository; - -@Repository -public interface ApplicantsRepository extends JpaRepository { - @Query(value = "SELECT pa.* FROM applicants pa " + - "JOIN applications app ON pa.applicant_id = app.applicant_id " + - "WHERE app.post_id = :postId", nativeQuery = true) - Page findAllWithApplication(@Param("postId") Long postId, Pageable pageable); - - Optional findByPostIdAndApplicantId(Long postId, Long applicantId); -} - diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java deleted file mode 100644 index c39eb91..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplicationRepository.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.archisemtle.semtlewebserverspring.infrastructure; - -import com.archisemtle.semtlewebserverspring.domain.Application; -import java.util.List; -import java.util.Optional; -import org.springframework.data.domain.Page; -import org.springframework.data.domain.Pageable; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ApplicationRepository extends JpaRepository { - - Page findByApplicantId(Long applicantId, Pageable pageable); - Page findByMemberId(int memberId, Pageable pageable); - - List findByMemberIdAndPostId(int memberId, Long postId); - - Optional findByApplicantId(Long applicantId); -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java new file mode 100644 index 0000000..03f5340 --- /dev/null +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ApplyRepository.java @@ -0,0 +1,16 @@ +package com.archisemtle.semtlewebserverspring.infrastructure; + +import com.archisemtle.semtlewebserverspring.domain.Apply; +import com.archisemtle.semtlewebserverspring.domain.Member; +import com.archisemtle.semtlewebserverspring.domain.ProjectBoard; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface ApplyRepository extends JpaRepository { + Apply findByMemberAndProjectBoardId(Member member, Long postId); + Page findByProjectBoard(ProjectBoard projectBoard, Pageable pageable); + Page findByMember(Member member, Pageable pageable); +} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java deleted file mode 100644 index f92180c..0000000 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectJoinAnswerRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.archisemtle.semtlewebserverspring.infrastructure; - -import com.archisemtle.semtlewebserverspring.domain.ProjectJoinAnswer; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ProjectJoinAnswerRepository extends JpaRepository { - -} diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java index e4b516e..e6a137a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ApplyingController.java @@ -9,8 +9,6 @@ import com.archisemtle.semtlewebserverspring.vo.ApplyProjectResponseVo; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.CrossOrigin; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -24,15 +22,10 @@ public class ApplyingController { private final ApplyProjectService applyProjectService; - // 공고 신청 - @PostMapping("/{post_id}/apply/{applicant_id}") - public CommonResponse ApplyProject( - @PathVariable("post_id") Long postId, - @PathVariable("applicant_id") Long applicantId, - @RequestBody ApplyProjectRequestDto applyProjectRequestDto - ){ + @PostMapping("/apply") + public CommonResponse ApplyProject(@RequestBody ApplyProjectRequestDto applyProjectRequestDto){ try { - ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(postId, applicantId, applyProjectRequestDto); + ApplyProjectResponseDto applyProjectResponseDto = applyProjectService.applyProject(applyProjectRequestDto); ApplyProjectResponseVo applyProjectResponseVo = ApplyProjectResponseVo.dtoToVo(applyProjectResponseDto); return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), applyProjectResponseVo); } catch (BaseException e) { diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java similarity index 88% rename from src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java rename to src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java index 83355cd..ddc6d31 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicaionController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/ProjectApplicationController.java @@ -4,20 +4,18 @@ import com.archisemtle.semtlewebserverspring.common.BaseException; import com.archisemtle.semtlewebserverspring.common.BaseResponseStatus; import com.archisemtle.semtlewebserverspring.common.CommonResponse; -import com.archisemtle.semtlewebserverspring.dto.ApplyProjectResponseDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusRequestDto; import com.archisemtle.semtlewebserverspring.dto.ChangeApplyStatusResponseDto; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; -import com.archisemtle.semtlewebserverspring.vo.ApplyProjectResponseVo; import com.archisemtle.semtlewebserverspring.vo.ChangeApplyStatusResponseVo; import com.archisemtle.semtlewebserverspring.vo.ShowApplyingProjectListResponseVo; import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantInfoResponseVo; import com.archisemtle.semtlewebserverspring.vo.ShowProjectApplicantsListResponseVo; +import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -29,8 +27,8 @@ @Slf4j @RequiredArgsConstructor @RestController -@RequestMapping("/api/v1/own/projects") -public class ProjectApplicaionController { +@RequestMapping("/api/v1/projects") +public class ProjectApplicationController { private final ProjectApplicationService projectApplicationService; @@ -52,10 +50,10 @@ public CommonResponse ShowProjectApplicants } // 본인이 게시한 프로젝트(공고) 신청자 정보(내용) 조회 API - @GetMapping("/{post_id}/applicants/{applicant_id}") - public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Long postId, @PathVariable("applicant_id") Long applicantId) { + @GetMapping("/{post_id}/applicants/{uuid}") + public CommonResponse ShowProjectApplicantsInfo(@PathVariable("post_id") Long postId, @PathVariable("uuid") UUID uuid) { try { - ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(postId, applicantId); + ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto = projectApplicationService.getApplicantInfo(postId, uuid); ShowProjectApplicantInfoResponseVo showProjectApplicantInfoResponseVo = ShowProjectApplicantInfoResponseVo.dtoToVo(showProjectApplicantInfoResponseDto); return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showProjectApplicantInfoResponseVo); } catch (BaseException e) { @@ -66,14 +64,14 @@ public CommonResponse ShowProjectApplicantsI } // 본인이 게시한 프로젝트(공고) 신청자 승인 상태 변경 API - @PatchMapping("/{post_id}/applicants/{applicant_id}") + @PatchMapping("/{post_id}/applicants/{uuid}") public CommonResponse ChangeApplyStatus( @PathVariable("post_id") Long postId, - @PathVariable("applicant_id") Long applicantId, + @PathVariable("uuid") UUID uuid, @RequestBody ChangeApplyStatusRequestDto changeApplyStatusRequestDto ) { try { - ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(postId,applicantId,changeApplyStatusRequestDto.getStatus()); + ChangeApplyStatusResponseDto changeApplyStatusResponseDto = projectApplicationService.changeApplyStatus(postId,uuid,changeApplyStatusRequestDto.getStatus()); ChangeApplyStatusResponseVo changeApplyStatusResponseVo = ChangeApplyStatusResponseVo.dtoToVo(changeApplyStatusResponseDto); return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), changeApplyStatusResponseVo); } catch (BaseException e) { @@ -84,13 +82,12 @@ public CommonResponse ChangeApplyStatus( } // 본인이 신청한 프로젝트 목록 조회 (승인결과포함) API - @GetMapping("/applications/{member_id}") + @GetMapping("/applications") public CommonResponse ShowApplyingProjectList( - @PathVariable("member_id") int memberId, @RequestParam(value = "page", defaultValue = "1") int page, @RequestParam(value = "limit", defaultValue = "10") int limit) { try { - ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(memberId, page, limit); + ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto = projectApplicationService.getApplyingProjectInfo(page, limit); ShowApplyingProjectListResponseVo showApplyingProjectListResponseVo = ShowApplyingProjectListResponseVo.dtoToVo(showApplyingProjectInfoResponseDto); return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), showApplyingProjectListResponseVo); } catch (BaseException e) { diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java index 2c986c5..1c320c7 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ApplyProjectResponseVo.java @@ -9,22 +9,19 @@ @Getter @NoArgsConstructor public class ApplyProjectResponseVo { - private String message; - private Long applicationId; + private Long applyId; private LocalDateTime appliedAt; @Builder - public ApplyProjectResponseVo(String message, Long applicationId, LocalDateTime appliedAt) { - this.message = message; - this.applicationId = applicationId; + public ApplyProjectResponseVo(Long applyId, LocalDateTime appliedAt) { + this.applyId = applyId; this.appliedAt = appliedAt; } public static ApplyProjectResponseVo dtoToVo( ApplyProjectResponseDto applyProjectResponseDto) { return ApplyProjectResponseVo.builder() - .message(applyProjectResponseDto.getMessage()) - .applicationId(applyProjectResponseDto.getApplicationId()) + .applyId(applyProjectResponseDto.getApplyId()) .appliedAt(applyProjectResponseDto.getAppliedAt()) .build(); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java index 1762232..f063973 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowApplyingProjectListResponseVo.java @@ -1,9 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ShowApplyingProjectInfoResponseDto; -import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.Date; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -17,59 +15,60 @@ public class ShowApplyingProjectListResponseVo { private int totalElements; private int totalPages; private int currentPage; - private List applications; + private List apply; @Getter @NoArgsConstructor - public static class ApplicationInfo { - private Long applicationId; - private String projectTitle; + public static class ApplyInfo { + private Long applyId; private Long postId; - private LocalDate applyDate; + private String projectTitle; + private LocalDateTime applyDate; private String status; private String projectType; private String relateField; @Builder - public ApplicationInfo( - Long applicationId, - String projectTitle, + public ApplyInfo( + Long applyId, Long postId, - LocalDate applyDate, + String projectTitle, String status, String projectType, - String relateField) { - this.applicationId = applicationId; - this.projectTitle = projectTitle; + String relateField, + LocalDateTime applyDate) { + this.applyId = applyId; this.postId = postId; - this.applyDate = applyDate; + this.projectTitle = projectTitle; this.status = status; this.projectType = projectType; this.relateField = relateField; + this.applyDate = applyDate; } } + @Builder public ShowApplyingProjectListResponseVo(int totalElements, int totalPages, int currentPage, - List applications) { + List apply) { this.totalElements = totalElements; this.totalPages = totalPages; this.currentPage = currentPage; - this.applications = applications; + this.apply = apply; } public static ShowApplyingProjectListResponseVo dtoToVo( ShowApplyingProjectInfoResponseDto showApplyingProjectInfoResponseDto) { - List applicationInfoList = showApplyingProjectInfoResponseDto.getApplications().stream() - .map(dtoApplication -> ShowApplyingProjectListResponseVo.ApplicationInfo.builder() - .applicationId(dtoApplication.getApplicationId()) - .projectTitle(dtoApplication.getProjectTitle()) - .postId(dtoApplication.getPostId()) - .applyDate(dtoApplication.getApplyDate()) - .status(dtoApplication.getStatus()) - .projectType(dtoApplication.getProjectType()) - .relateField(dtoApplication.getRelateField()) + List applyInfoList = showApplyingProjectInfoResponseDto.getApplys().stream() + .map(apply -> ShowApplyingProjectListResponseVo.ApplyInfo.builder() + .applyId(apply.getApplyId()) + .postId(apply.getPostId()) + .projectTitle(apply.getProjectTitle()) + .status(apply.getStatus()) + .projectType(apply.getProjectType()) + .relateField(apply.getRelateField()) + .applyDate(apply.getApplyDate()) .build()) .collect(Collectors.toList()); @@ -77,7 +76,7 @@ public static ShowApplyingProjectListResponseVo dtoToVo( .totalElements(showApplyingProjectInfoResponseDto.getTotalElements()) .totalPages(showApplyingProjectInfoResponseDto.getTotalPages()) .currentPage(showApplyingProjectInfoResponseDto.getCurrentPage()) - .applications(applicationInfoList) + .apply(applyInfoList) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java index f4e3322..12f4e35 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantInfoResponseVo.java @@ -1,8 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ShowProjectApplicantInfoResponseDto; -import java.time.LocalDate; -import java.util.Date; +import java.time.LocalDateTime; import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,23 +9,23 @@ @Getter @NoArgsConstructor public class ShowProjectApplicantInfoResponseVo { - private Long applicantId; - private String name; - private LocalDate applyDate; + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; private String email; private String phone; @Builder public ShowProjectApplicantInfoResponseVo( - Long applicantId, - String name, - LocalDate applyDate, + Long applyId, + String username, + LocalDateTime applyDate, String status, String email, String phone){ - this.applicantId = applicantId; - this.name = name; + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; this.email = email; @@ -36,8 +35,8 @@ public ShowProjectApplicantInfoResponseVo( public static ShowProjectApplicantInfoResponseVo dtoToVo( ShowProjectApplicantInfoResponseDto showProjectApplicantInfoResponseDto) { return ShowProjectApplicantInfoResponseVo.builder() - .applicantId(showProjectApplicantInfoResponseDto.getApplicantId()) - .name(showProjectApplicantInfoResponseDto.getName()) + .applyId(showProjectApplicantInfoResponseDto.getApplyId()) + .username(showProjectApplicantInfoResponseDto.getUsername()) .applyDate(showProjectApplicantInfoResponseDto.getApplyDate()) .status(showProjectApplicantInfoResponseDto.getStatus()) .email(showProjectApplicantInfoResponseDto.getEmail()) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java index 21b0382..db5be96 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/ShowProjectApplicantsListResponseVo.java @@ -1,8 +1,7 @@ package com.archisemtle.semtlewebserverspring.vo; import com.archisemtle.semtlewebserverspring.dto.ProjectApplicantsResponseDto; -import java.time.LocalDate; -import java.util.Date; +import java.time.LocalDateTime; import java.util.List; import java.util.stream.Collectors; import lombok.Builder; @@ -16,20 +15,20 @@ public class ShowProjectApplicantsListResponseVo { private int totalElements; private int totalPages; private int currentPage; - private List applicants; + private List applys; @Getter @NoArgsConstructor - public static class ApplicantInfo { - private Long applicantId; - private String name; - private LocalDate applyDate; + public static class ApplyInfo { + private Long applyId; + private String username; + private LocalDateTime applyDate; private String status; @Builder - public ApplicantInfo(Long applicantId, String name, LocalDate applyDate, String status) { - this.applicantId = applicantId; - this.name = name; + public ApplyInfo(Long applyId, String username, LocalDateTime applyDate, String status) { + this.applyId = applyId; + this.username = username; this.applyDate = applyDate; this.status = status; } @@ -37,22 +36,22 @@ public ApplicantInfo(Long applicantId, String name, LocalDate applyDate, String @Builder public ShowProjectApplicantsListResponseVo(int totalElements, int totalPages, int currentPage, - List applicants) { + List applys) { this.totalElements = totalElements; this.totalPages = totalPages; this.currentPage = currentPage; - this.applicants = applicants; + this.applys = applys; } public static ShowProjectApplicantsListResponseVo dtoToVo( ProjectApplicantsResponseDto projectApplicantsResponseDto) { - List applicantInfoList = projectApplicantsResponseDto.getApplicants().stream() - .map(dtoApplicant -> ApplicantInfo.builder() - .applicantId(dtoApplicant.getApplicantId()) - .name(dtoApplicant.getName()) - .applyDate(dtoApplicant.getApplyDate()) - .status(dtoApplicant.getStatus()) + List applyInfoList = projectApplicantsResponseDto.getApplys().stream() + .map(apply -> ApplyInfo.builder() + .applyId(apply.getApplyId()) + .username(apply.getUsername()) + .applyDate(apply.getApplyDate()) + .status(apply.getStatus()) .build()) .collect(Collectors.toList()); @@ -60,7 +59,7 @@ public static ShowProjectApplicantsListResponseVo dtoToVo( .totalElements(projectApplicantsResponseDto.getTotalElements()) .totalPages(projectApplicantsResponseDto.getTotalPages()) .currentPage(projectApplicantsResponseDto.getCurrentPage()) - .applicants(applicantInfoList) + .applys(applyInfoList) .build(); } } From e655894e4555c0237f60db0eb94fe50f94fe6e31 Mon Sep 17 00:00:00 2001 From: Leeforgiveness Date: Wed, 9 Apr 2025 23:47:16 +0900 Subject: [PATCH 12/16] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?=EC=95=88=EB=90=98=EB=8A=94=20=EB=AC=B8=EC=A0=9C=20=EC=88=98?= =?UTF-8?q?=EC=A0=95(#126)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ProjectBoardServiceImpl.java | 7 +++++++ .../infrastructure/ProjectBoardImageRepository.java | 1 + 2 files changed, 8 insertions(+) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java index 595049e..7fb8f8b 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java @@ -247,6 +247,13 @@ public void deleteProjectBoard(UUID uuid, Long id) { throw new BaseException(FAIL_TO_DELETE); } + List projectBoardImages = projectBoardImageRepository.findAllByProjectBoardId( + id); + + if(!projectBoardImages.isEmpty()) { + projectBoardImageRepository.deleteAllByProjectBoardId(id); + } + List relationFieldProjectPostMiddleList = relationFieldProjectPostMiddleRepository.findAllByProjectBoardId( id); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java index 936e6e4..6bdfcbe 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/infrastructure/ProjectBoardImageRepository.java @@ -7,4 +7,5 @@ public interface ProjectBoardImageRepository extends JpaRepository { List findAllByProjectBoardId(Long id); + void deleteAllByProjectBoardId(Long id); } From 4163c4487d046ba7549ab97c27262d4bc4480c9b Mon Sep 17 00:00:00 2001 From: Leeforgiveness Date: Thu, 10 Apr 2025 00:24:52 +0900 Subject: [PATCH 13/16] =?UTF-8?q?feat:=20=ED=94=84=EB=A1=9C=EC=A0=9D?= =?UTF-8?q?=ED=8A=B8=20=EA=B2=8C=EC=8B=9C=EB=AC=BC=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=EB=B3=80=EA=B2=BD=20=EB=A1=9C=EC=A7=81=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80(#127)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/ProjectBoardServiceImpl.java | 19 +++++++++++++++++-- .../dto/UpdateProjectBoardRequestDto.java | 1 + .../vo/UpdateProjectBoardRequestVo.java | 2 ++ 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java index 7fb8f8b..8d48072 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/ProjectBoardServiceImpl.java @@ -250,7 +250,7 @@ public void deleteProjectBoard(UUID uuid, Long id) { List projectBoardImages = projectBoardImageRepository.findAllByProjectBoardId( id); - if(!projectBoardImages.isEmpty()) { + if (!projectBoardImages.isEmpty()) { projectBoardImageRepository.deleteAllByProjectBoardId(id); } @@ -280,7 +280,7 @@ public void updateProjectBoard(UUID uuid, Long id, .id(id) .title(updateProjectBoardRequestDto.getTitle()) .content(updateProjectBoardRequestDto.getContent()) - .writerUuid(origin.getWriterUuid()) //TODO: 나중에 실제 값으로 변경해야함 + .writerUuid(origin.getWriterUuid()) .writerName(origin.getWriterName()) .contact(updateProjectBoardRequestDto.getContact()) .projectTypeCategory(updateProjectBoardRequestDto.getProjectTypeCategory()) @@ -292,6 +292,21 @@ public void updateProjectBoard(UUID uuid, Long id, projectBoardRepository.save(projectBoard); + List projectBoardImages = projectBoardImageRepository.findAllByProjectBoardId( + id); + + if (!projectBoardImages.isEmpty()) { + projectBoardImageRepository.deleteAllByProjectBoardId(id); + } + List projectBoardImageList = updateProjectBoardRequestDto.getProjectBoardImages() + .stream().map( + image -> ProjectBoardImage.builder() + .projectBoard(projectBoard) + .projectBoardImageUrl(image) + .build()) + .collect(Collectors.toList()); + projectBoardImageRepository.saveAll(projectBoardImageList); + relationFieldProjectPostMiddleRepository.deleteAllByProjectBoardId(id); List relationFieldProjectPostMiddles = updateProjectBoardRequestDto.getRelationFieldCategories() diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java index 70f7de2..e5ae41b 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/UpdateProjectBoardRequestDto.java @@ -21,4 +21,5 @@ public class UpdateProjectBoardRequestDto { private LocalDate projectStartTime; private LocalDate projectEndTime; private LocalDate projectRecruitingEndTime; + private List projectBoardImages; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java b/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java index 98ee4b0..759da3c 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/vo/UpdateProjectBoardRequestVo.java @@ -18,6 +18,7 @@ public class UpdateProjectBoardRequestVo { private LocalDate projectStartTime; private LocalDate projectEndTime; private LocalDate projectRecruitingEndTime; + private List projectBoardImages; public static UpdateProjectBoardRequestDto voToDto( UpdateProjectBoardRequestVo updateProjectBoardRequestVo) { @@ -30,6 +31,7 @@ public static UpdateProjectBoardRequestDto voToDto( .projectStartTime(updateProjectBoardRequestVo.getProjectStartTime()) .projectEndTime(updateProjectBoardRequestVo.getProjectEndTime()) .projectRecruitingEndTime(updateProjectBoardRequestVo.getProjectRecruitingEndTime()) + .projectBoardImages(updateProjectBoardRequestVo.getProjectBoardImages()) .build(); } } From bdb5b9ff1bf72656a20ee81bc3f558a0ef7dd71b Mon Sep 17 00:00:00 2001 From: e-wha Date: Thu, 10 Apr 2025 00:49:43 +0900 Subject: [PATCH 14/16] =?UTF-8?q?refactor:=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=9E=AC=EC=84=A4=EC=A0=95=20API=20=EB=B0=8F=20?= =?UTF-8?q?=ED=98=B8=EC=9B=90=EA=B0=80=EC=9E=85=20API=20=EC=88=98=EC=A0=95?= =?UTF-8?q?,=20=EC=97=AD=ED=95=A0=20=EB=B3=80=EA=B2=BD=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=B6=94=EA=B0=80,=20Swagger=20=EB=AC=B8=EC=84=9C?= =?UTF-8?q?=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/EmailService.java | 2 +- .../application/member/EmailServiceImpl.java | 23 ++++++++--- .../application/member/MemberServiceImpl.java | 4 +- .../member/PasswordResetServiceImpl.java | 7 ++-- .../dto/member/MemberDeactiveRequestDto.java | 1 + .../member/MemberRegistrationRequestDto.java | 19 +++++---- .../dto/member/MemberUpdateRequestDto.java | 3 +- .../presentation/AuthController.java | 14 ++++++- .../presentation/MemberController.java | 41 +++++++++++++++---- 9 files changed, 83 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java index 7edcd77..cd77d1a 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java @@ -1,5 +1,5 @@ package com.archisemtle.semtlewebserverspring.application.member; public interface EmailService { - void sendPasswordResetEmail(String to, String resetLink); + void sendPasswordResetEmail(String to, String resetToken); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java index 4023051..ff3e788 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java @@ -14,14 +14,14 @@ public class EmailServiceImpl implements EmailService{ private final JavaMailSender mailSender; @Override - public void sendPasswordResetEmail(String to, String resetLink) { + public void sendPasswordResetEmail(String to, String resetToken) { try { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setTo(to); helper.setSubject("비밀번호 재설정 안내"); - helper.setText(buildEmailContent(resetLink), true); + helper.setText(buildEmailContent(resetToken), true); mailSender.send(message); } catch (MessagingException e) { @@ -29,10 +29,21 @@ public void sendPasswordResetEmail(String to, String resetLink) { } } - private String buildEmailContent(String resetLink) { + private String buildEmailContent(String resetToken) { return "

비밀번호 재설정 안내

" + - "

아래 버튼을 클릭하여 비밀번호를 재설정하세요.

" + - "

비밀번호 재설정

" + - "

이 링크는 15분 후 만료됩니다.

"; + "

아래 코드를 기입하여 비밀번호를 재설정하세요.

" + + "
" + + resetToken + + "
" + + "

이 코드는 15분 후 만료됩니다.

"; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java index f71c859..bc693e2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java @@ -159,7 +159,8 @@ public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { .password(member.getPassword()) .studentId(member.getStudentId() != null ? memberUpdateRequestDto.getStudentId() : member.getStudentId()) .username(memberUpdateRequestDto.getUsername() != null ? memberUpdateRequestDto.getUsername() : member.getUsername()) // 업데이트 값 적용 - .birth(memberUpdateRequestDto.getBirth() != null ? memberUpdateRequestDto.getBirth() : member.getBirth()) + .birth(memberUpdateRequestDto.getBirth() != null ? parseDate( + String.valueOf(memberUpdateRequestDto.getBirth())) : member.getBirth()) .phone(memberUpdateRequestDto.getPhone() != null ? memberUpdateRequestDto.getPhone() : member.getPhone()) .role(member.getRole()) .manageApprovalStatus(member.isManageApprovalStatus()) @@ -175,6 +176,7 @@ public void deactivateMember(UUID uuid, MemberDeactiveRequestDto memberDeactiveR .orElseThrow(() -> new RuntimeException("해당 UUID의 회원을 찾을 수 없습니다.")); member.setManageApprovalStatus(memberDeactiveRequestDto.isManageApprovalStatus()); + member.setRole(memberDeactiveRequestDto.getRole()); memberRepository.save(member); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java index 6569c59..09c535b 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java @@ -27,14 +27,13 @@ public MemberPasswordResetEmailResponseDto sendPasswordResetEmail(String email) Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new RuntimeException("해당 이메일의 회원이 없습니다.")); - String resetToken = UUID.randomUUID().toString(); + String resetToken = UUID.randomUUID().toString().substring(0, 6); Instant expirationTime = Instant.now().plusSeconds(900); tokenStore.put(resetToken, email); tokenExpirationStore.put(resetToken, expirationTime); - String resetLink = "https://example.com/password-reset?token=" + resetToken; - emailService.sendPasswordResetEmail(member.getEmail(), resetLink); + emailService.sendPasswordResetEmail(member.getEmail(), resetToken); return new MemberPasswordResetEmailResponseDto(expirationTime.toString()); } @@ -66,6 +65,6 @@ public void resetPassword(String token, String currentPassword, String newPasswo @Override public String generateResetToken() { - return UUID.randomUUID().toString(); + return UUID.randomUUID().toString().substring(0, 6); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java index 2764395..cc70b3c 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java @@ -7,5 +7,6 @@ @NoArgsConstructor public class MemberDeactiveRequestDto { private boolean manageApprovalStatus; + private String role; private String reason; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java index 28d3ce4..5e9ccea 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java @@ -1,6 +1,8 @@ package com.archisemtle.semtlewebserverspring.dto.member; import com.archisemtle.semtlewebserverspring.domain.Member; +import java.time.LocalDate; +import java.util.Date; import java.util.UUID; import lombok.Getter; import lombok.NoArgsConstructor; @@ -13,20 +15,21 @@ public class MemberRegistrationRequestDto { private String email; private String password; - private String role; - private String name; - private String profileUrl; - private boolean manageApprovalStatus; + private String username; + private String studentId; + private String phone; + private LocalDate birth; public Member toEntity(PasswordEncoder passwordEncoder) { return Member.builder() .uuid(UUID.randomUUID()) .email(email) .password(passwordEncoder.encode(password)) - .role(role) - .username(name) - .profileImageUrl(profileUrl) - .manageApprovalStatus(manageApprovalStatus) + .studentId(studentId) + .username(username) + .phone(phone) + .role("USER") + .manageApprovalStatus(true) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java index ed5a505..2679eea 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberUpdateRequestDto.java @@ -1,5 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.member; +import java.time.LocalDate; import java.util.Date; import lombok.Data; @@ -8,7 +9,7 @@ public class MemberUpdateRequestDto { private String studentId; private String username; - private Date birth; + private LocalDate birth; private String phone; //private String imageUrl; diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java index d4b1637..21428d1 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java @@ -14,6 +14,8 @@ import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository; import com.archisemtle.semtlewebserverspring.vo.member.LoginResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberPasswordResetResponseVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; @@ -28,6 +30,7 @@ @RequiredArgsConstructor @RestController @RequestMapping("/api/v1/auth") +@Tag(name = "auth-controller", description = "보안") public class AuthController { private final MemberService memberService; @@ -36,14 +39,19 @@ public class AuthController { // 로그인 @PostMapping("/signin") - public CommonResponse Login(@RequestBody LoginRequestDto loginRequestDto) { + @Operation(summary = "로그인", description = "이메일과 비밀번호로 로그인합니다.") + public CommonResponse Login( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "로그인 정보") + @RequestBody LoginRequestDto loginRequestDto) { LoginResponseVo loginResponseVo = LoginResponseVo.dtoToVo( memberService.login(loginRequestDto)); return CommonResponse.success("로그인에 성공하였습니다.", loginResponseVo); } @PostMapping("/password/reset/email") + @Operation(summary = "비밀번호 재설정 이메일 전송", description = "이메일을 기준으로 비밀번호 재설정 이메일을 전송합니다.") public CommonResponse requestPasswordReset( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "이메일") @RequestBody MemberPasswordResetEmailRequestDto memberPasswordResetEmailRequestDto ) { MemberPasswordResetEmailResponseDto memberPasswordResetEmailResponseDto = passwordResetService.sendPasswordResetEmail( @@ -55,7 +63,9 @@ public CommonResponse requestPasswordReset( } @PostMapping("/password/reset") + @Operation(summary = "비밀번호 재설정", description = "이메일을 기준으로 비밀번호 재설정 이메일을 전송합니다.") public CommonResponse confirmPasswordReset( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "비밀번호 재설정 정보") @RequestBody MemberPasswordResetRequestDto memberPasswordResetRequestDto ) { passwordResetService.resetPassword(memberPasswordResetRequestDto.getToken(), @@ -66,7 +76,9 @@ public CommonResponse confirmPasswordReset( } @PutMapping("/password/manager") + @Operation(summary = "관리자 2차 인증", description = "비밀번호를 기준으로 2차인증을 진행합니다.") public CommonResponse verifyAdmin( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "2차 인증 정보") @RequestBody verifyAdminRequestDto verifyAdminRequestDto) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java index 0d508e6..0c7a56f 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java @@ -25,6 +25,10 @@ import com.archisemtle.semtlewebserverspring.vo.member.MemberListResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberPasswordResetResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberReadResponseVo; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.Parameters; +import io.swagger.v3.oas.annotations.tags.Tag; import java.io.IOException; import java.time.ZonedDateTime; import java.util.List; @@ -39,6 +43,7 @@ @RequiredArgsConstructor @RestController @RequestMapping("/api/v1/members") +@Tag(name = "member-controller", description = "회원관리시스템") public class MemberController { private final MemberService memberService; @@ -48,16 +53,20 @@ public class MemberController { // 회원 입력 @PostMapping + @Operation(summary = "회원 등록", description = "회원 정보를 등록합니다.") public CommonResponse save( + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "회원 등록 정보") @RequestBody MemberRegistrationRequestDto memberRegistrationRequestDto) { memberService.save(memberRegistrationRequestDto); return CommonResponse.success("Member Showed successfully"); } @PostMapping(value = "/signup", consumes = "multipart/form-data") + @Operation(summary = "회원 등록 (엑셀 삽입)", description = "엑셀에 등록된 회원 정보를 통해 회원을 등록합니다.") public CommonResponse excelAddMember( @RequestPart("file") @io.swagger.v3.oas.annotations.Parameter( + description = "회원 정보가 삽입된 엑셀 파일", required = true ) MultipartFile file) { @@ -78,20 +87,24 @@ public CommonResponse excelAddMember( } } - // 개인 정보 조회 - // 입력 - uuid - // 출력 - 이름, 생년월일, 전화번호, 학번, 프로필 사진 @GetMapping("/{uuid}") - public CommonResponse showMember(@PathVariable UUID uuid) { + @Operation(summary = "개인 정보 조회", description = "uuid를 기준으로 해당하는 회원의 정보를 조회합니다.") + public CommonResponse showMember( + @Parameter(description = "회원의 고유 번호") + @PathVariable UUID uuid) { MemberReadResponseDto showMemberDto = memberService.show(uuid); MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); - return CommonResponse.success("해당하는 멤버의 정보를 조회하는데 성공하였습니다.", responseVo); + return CommonResponse.success("해당하는 회원의 정보를 조회하는데 성공하였습니다.", responseVo); } - // 개인 정보 수정 - // uuid, 이름, 생년월일, 전화번호, 학번, 프로필 사진 + @PatchMapping("/{uuid}") - public CommonResponse updateMember(@PathVariable UUID uuid, + @Operation(summary = "개인 정보 수정", description = "uuid를 기준으로 해당하는 회원의 정보를 수정합니다.") + public CommonResponse updateMember( + @Parameter(description = "회원의 고유 번호") + @PathVariable UUID uuid, + + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "회원 수정 정보") @RequestBody MemberUpdateRequestDto memberUpdateRequestDto) { memberService.update(uuid, memberUpdateRequestDto); @@ -99,6 +112,12 @@ public CommonResponse updateMember(@PathVariable UUID uuid, } @GetMapping + @Operation(summary = "회원 목록 조회", description = "페이지 번호, 사이즈, 검색어를 기준으로 회원 목록을 조회합니다.") + @Parameters({ + @Parameter(name = "page", description = "페이지 번호, 기본 값: 0"), + @Parameter(name = "size", description = "페이지 당 컨텐츠 개수, 기본 값: 10"), + @Parameter(name = "search_name", description = "검색할 회원의 이름, 기본 값: null (선택)") + }) public CommonResponse getMemberList( @RequestParam(name = "page", defaultValue = "0") int page, @RequestParam(name = "size", defaultValue = "10") int size, @@ -130,8 +149,12 @@ public CommonResponse getMemberList( } @PatchMapping("/{uuid}/deactivate") + @Operation(summary = "회원 활동 가능 여부 및 역할 변경", description = "uuid를 기준으로 회원의 활동 가능 여부 및 역할을 변경합니다.") public CommonResponse deactivateMember( + @Parameter(description = "회원의 고유 번호") @PathVariable UUID uuid, + + @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "변경 정보") @RequestBody MemberDeactiveRequestDto memberDeactiveRequestDto ) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -143,7 +166,7 @@ public CommonResponse deactivateMember( } memberService.deactivateMember(uuid, memberDeactiveRequestDto); - return CommonResponse.success("회원의 활동 가능 여부가 변경되었습니다.", + return CommonResponse.success("회원의 활동 가능 여부 및 역할이 변경되었습니다.", "deactivate-at : " + ZonedDateTime.now()); } From e82773d39a75f4acfb7490959906765156641cc1 Mon Sep 17 00:00:00 2001 From: hhjkhhbgkugjnbj Date: Fri, 11 Apr 2025 18:27:07 +0900 Subject: [PATCH 15/16] =?UTF-8?q?Refector:=20=EA=B0=9C=EC=9D=B8=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/MemberServiceImpl.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java index 84b3d4e..9dcf44d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java @@ -148,6 +148,7 @@ public MemberReadResponseDto show(UUID uuid) { .birth(member.getBirth()) .phone(member.getPhone()) .role(member.getRole()) + .profileImageUrl(member.getProfileImageUrl()) .manageApprovalStatus(member.isManageApprovalStatus()) .build(); } From adf96a8a6b65851b5fd8082e61c49a3567b19fcd Mon Sep 17 00:00:00 2001 From: e_wha <55922263+e-wha@users.noreply.github.com> Date: Mon, 14 Apr 2025 21:12:27 +0900 Subject: [PATCH 16/16] =?UTF-8?q?Revert=20"Refactor/#125=20=EB=B9=84?= =?UTF-8?q?=EB=B0=80=EB=B2=88=ED=98=B8=20=EC=9E=AC=EC=84=A4=EC=A0=95=20?= =?UTF-8?q?=EB=B0=8F=20=ED=9A=8C=EC=9B=90=EA=B0=80=EC=9E=85=20API=20?= =?UTF-8?q?=EC=88=98=EC=A0=95,=20=EC=97=AD=ED=95=A0=20=EB=B3=80=EA=B2=BD?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80,=20Swagger=20?= =?UTF-8?q?=EB=AC=B8=EC=84=9C=20=EC=84=A4=EB=AA=85=20=EC=B6=94=EA=B0=80"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/member/EmailService.java | 2 +- .../application/member/EmailServiceImpl.java | 23 ++------ .../application/member/MemberServiceImpl.java | 4 +- .../member/PasswordResetServiceImpl.java | 7 ++- .../dto/member/MemberDeactiveRequestDto.java | 1 - .../member/MemberRegistrationRequestDto.java | 19 +++---- .../presentation/AuthController.java | 14 +---- .../presentation/MemberController.java | 57 +++++++------------ 8 files changed, 41 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java index cd77d1a..7edcd77 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailService.java @@ -1,5 +1,5 @@ package com.archisemtle.semtlewebserverspring.application.member; public interface EmailService { - void sendPasswordResetEmail(String to, String resetToken); + void sendPasswordResetEmail(String to, String resetLink); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java index ff3e788..4023051 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/EmailServiceImpl.java @@ -14,14 +14,14 @@ public class EmailServiceImpl implements EmailService{ private final JavaMailSender mailSender; @Override - public void sendPasswordResetEmail(String to, String resetToken) { + public void sendPasswordResetEmail(String to, String resetLink) { try { MimeMessage message = mailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setTo(to); helper.setSubject("비밀번호 재설정 안내"); - helper.setText(buildEmailContent(resetToken), true); + helper.setText(buildEmailContent(resetLink), true); mailSender.send(message); } catch (MessagingException e) { @@ -29,21 +29,10 @@ public void sendPasswordResetEmail(String to, String resetToken) { } } - private String buildEmailContent(String resetToken) { + private String buildEmailContent(String resetLink) { return "

비밀번호 재설정 안내

" + - "

아래 코드를 기입하여 비밀번호를 재설정하세요.

" + - "
" + - resetToken + - "
" + - "

이 코드는 15분 후 만료됩니다.

"; + "

아래 버튼을 클릭하여 비밀번호를 재설정하세요.

" + + "

비밀번호 재설정

" + + "

이 링크는 15분 후 만료됩니다.

"; } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java index 5332cf0..9dcf44d 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/MemberServiceImpl.java @@ -174,8 +174,7 @@ public void update(UUID uuid , MemberUpdateRequestDto memberUpdateRequestDto) { .password(member.getPassword()) .studentId(member.getStudentId()) .username(memberUpdateRequestDto.getUsername() != null ? memberUpdateRequestDto.getUsername() : member.getUsername()) // 업데이트 값 적용 - .birth(memberUpdateRequestDto.getBirth() != null ? parseDate( - String.valueOf(memberUpdateRequestDto.getBirth())) : member.getBirth()) + .birth(memberUpdateRequestDto.getBirth() != null ? memberUpdateRequestDto.getBirth() : member.getBirth()) .phone(memberUpdateRequestDto.getPhone() != null ? memberUpdateRequestDto.getPhone() : member.getPhone()) .profileImageUrl(memberUpdateRequestDto.getImageUrl() != null ? memberUpdateRequestDto.getImageUrl() : member.getProfileImageUrl()) .role(member.getRole()) @@ -192,7 +191,6 @@ public void deactivateMember(UUID uuid, MemberDeactiveRequestDto memberDeactiveR .orElseThrow(() -> new RuntimeException("해당 UUID의 회원을 찾을 수 없습니다.")); member.setManageApprovalStatus(memberDeactiveRequestDto.isManageApprovalStatus()); - member.setRole(memberDeactiveRequestDto.getRole()); memberRepository.save(member); } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java index 09c535b..6569c59 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/application/member/PasswordResetServiceImpl.java @@ -27,13 +27,14 @@ public MemberPasswordResetEmailResponseDto sendPasswordResetEmail(String email) Member member = memberRepository.findByEmail(email) .orElseThrow(() -> new RuntimeException("해당 이메일의 회원이 없습니다.")); - String resetToken = UUID.randomUUID().toString().substring(0, 6); + String resetToken = UUID.randomUUID().toString(); Instant expirationTime = Instant.now().plusSeconds(900); tokenStore.put(resetToken, email); tokenExpirationStore.put(resetToken, expirationTime); - emailService.sendPasswordResetEmail(member.getEmail(), resetToken); + String resetLink = "https://example.com/password-reset?token=" + resetToken; + emailService.sendPasswordResetEmail(member.getEmail(), resetLink); return new MemberPasswordResetEmailResponseDto(expirationTime.toString()); } @@ -65,6 +66,6 @@ public void resetPassword(String token, String currentPassword, String newPasswo @Override public String generateResetToken() { - return UUID.randomUUID().toString().substring(0, 6); + return UUID.randomUUID().toString(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java index cc70b3c..2764395 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberDeactiveRequestDto.java @@ -7,6 +7,5 @@ @NoArgsConstructor public class MemberDeactiveRequestDto { private boolean manageApprovalStatus; - private String role; private String reason; } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java index 5e9ccea..28d3ce4 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/dto/member/MemberRegistrationRequestDto.java @@ -1,8 +1,6 @@ package com.archisemtle.semtlewebserverspring.dto.member; import com.archisemtle.semtlewebserverspring.domain.Member; -import java.time.LocalDate; -import java.util.Date; import java.util.UUID; import lombok.Getter; import lombok.NoArgsConstructor; @@ -15,21 +13,20 @@ public class MemberRegistrationRequestDto { private String email; private String password; - private String username; - private String studentId; - private String phone; - private LocalDate birth; + private String role; + private String name; + private String profileUrl; + private boolean manageApprovalStatus; public Member toEntity(PasswordEncoder passwordEncoder) { return Member.builder() .uuid(UUID.randomUUID()) .email(email) .password(passwordEncoder.encode(password)) - .studentId(studentId) - .username(username) - .phone(phone) - .role("USER") - .manageApprovalStatus(true) + .role(role) + .username(name) + .profileImageUrl(profileUrl) + .manageApprovalStatus(manageApprovalStatus) .build(); } } diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java index 21428d1..d4b1637 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/AuthController.java @@ -14,8 +14,6 @@ import com.archisemtle.semtlewebserverspring.infrastructure.MemberRepository; import com.archisemtle.semtlewebserverspring.vo.member.LoginResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberPasswordResetResponseVo; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; import java.util.UUID; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; @@ -30,7 +28,6 @@ @RequiredArgsConstructor @RestController @RequestMapping("/api/v1/auth") -@Tag(name = "auth-controller", description = "보안") public class AuthController { private final MemberService memberService; @@ -39,19 +36,14 @@ public class AuthController { // 로그인 @PostMapping("/signin") - @Operation(summary = "로그인", description = "이메일과 비밀번호로 로그인합니다.") - public CommonResponse Login( - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "로그인 정보") - @RequestBody LoginRequestDto loginRequestDto) { + public CommonResponse Login(@RequestBody LoginRequestDto loginRequestDto) { LoginResponseVo loginResponseVo = LoginResponseVo.dtoToVo( memberService.login(loginRequestDto)); return CommonResponse.success("로그인에 성공하였습니다.", loginResponseVo); } @PostMapping("/password/reset/email") - @Operation(summary = "비밀번호 재설정 이메일 전송", description = "이메일을 기준으로 비밀번호 재설정 이메일을 전송합니다.") public CommonResponse requestPasswordReset( - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "이메일") @RequestBody MemberPasswordResetEmailRequestDto memberPasswordResetEmailRequestDto ) { MemberPasswordResetEmailResponseDto memberPasswordResetEmailResponseDto = passwordResetService.sendPasswordResetEmail( @@ -63,9 +55,7 @@ public CommonResponse requestPasswordReset( } @PostMapping("/password/reset") - @Operation(summary = "비밀번호 재설정", description = "이메일을 기준으로 비밀번호 재설정 이메일을 전송합니다.") public CommonResponse confirmPasswordReset( - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "비밀번호 재설정 정보") @RequestBody MemberPasswordResetRequestDto memberPasswordResetRequestDto ) { passwordResetService.resetPassword(memberPasswordResetRequestDto.getToken(), @@ -76,9 +66,7 @@ public CommonResponse confirmPasswordReset( } @PutMapping("/password/manager") - @Operation(summary = "관리자 2차 인증", description = "비밀번호를 기준으로 2차인증을 진행합니다.") public CommonResponse verifyAdmin( - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "2차 인증 정보") @RequestBody verifyAdminRequestDto verifyAdminRequestDto) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); diff --git a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java index 7bf450f..a943ad2 100644 --- a/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java +++ b/src/main/java/com/archisemtle/semtlewebserverspring/presentation/MemberController.java @@ -25,10 +25,6 @@ import com.archisemtle.semtlewebserverspring.vo.member.MemberListResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberPasswordResetResponseVo; import com.archisemtle.semtlewebserverspring.vo.member.MemberReadResponseVo; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; import java.io.IOException; import java.time.ZonedDateTime; import java.util.List; @@ -43,7 +39,6 @@ @RequiredArgsConstructor @RestController @RequestMapping("/api/v1/members") -@Tag(name = "member-controller", description = "회원관리시스템") public class MemberController { private final MemberService memberService; @@ -53,20 +48,16 @@ public class MemberController { // 회원 입력 @PostMapping - @Operation(summary = "회원 등록", description = "회원 정보를 등록합니다.") public CommonResponse save( - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "회원 등록 정보") @RequestBody MemberRegistrationRequestDto memberRegistrationRequestDto) { memberService.save(memberRegistrationRequestDto); return CommonResponse.success("Member Showed successfully"); } @PostMapping(value = "/signup", consumes = "multipart/form-data") - @Operation(summary = "회원 등록 (엑셀 삽입)", description = "엑셀에 등록된 회원 정보를 통해 회원을 등록합니다.") public CommonResponse excelAddMember( @RequestPart("file") @io.swagger.v3.oas.annotations.Parameter( - description = "회원 정보가 삽입된 엑셀 파일", required = true ) MultipartFile file) { @@ -87,24 +78,10 @@ public CommonResponse excelAddMember( } } + // 개인 정보 조회 + // 입력 - uuid + // 출력 - 이름, 생년월일, 전화번호, 학번, 프로필 사진 @GetMapping("/{uuid}") - @Operation(summary = "개인 정보 조회", description = "uuid를 기준으로 해당하는 회원의 정보를 조회합니다.") - public CommonResponse showMember( - @Parameter(description = "회원의 고유 번호") - @PathVariable UUID uuid) { - MemberReadResponseDto showMemberDto = memberService.show(uuid); - MemberReadResponseVo responseVo = MemberReadResponseVo.dtoToVo(showMemberDto); - return CommonResponse.success("해당하는 회원의 정보를 조회하는데 성공하였습니다.", responseVo); - } - - - @PatchMapping("/{uuid}") - @Operation(summary = "개인 정보 수정", description = "uuid를 기준으로 해당하는 회원의 정보를 수정합니다.") - public CommonResponse updateMember( - @Parameter(description = "회원의 고유 번호") - @PathVariable UUID uuid, - - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "회원 수정 정보") public CommonResponse showMember(@PathVariable UUID uuid) { try{ MemberReadResponseDto showMemberDto = memberService.show(uuid); @@ -117,13 +94,23 @@ public CommonResponse showMember(@PathVariable UUID uuid) } } + // 개인 정보 수정 + // 이름, 생년월일, 전화번호, 프로필 사진 + @PatchMapping("/{uuid}") + public CommonResponse updateMember(@PathVariable UUID uuid, + @RequestBody MemberUpdateRequestDto memberUpdateRequestDto) { + try { + memberService.update(uuid, memberUpdateRequestDto); + return CommonResponse.success(BaseResponseStatus.SUCCESS.getMessage(), BaseResponseStatus.SUCCESS.getCode()); + } catch (BaseException e) { + return CommonResponse.fail(e.getErrorCode(), e.getMessage()); + } catch (Exception e) { + return CommonResponse.fail(BaseResponseStatus.INTERNAL_SERVER_ERROR, BaseResponseStatus.INTERNAL_SERVER_ERROR.getMessage()); + } + + } + @GetMapping - @Operation(summary = "회원 목록 조회", description = "페이지 번호, 사이즈, 검색어를 기준으로 회원 목록을 조회합니다.") - @Parameters({ - @Parameter(name = "page", description = "페이지 번호, 기본 값: 0"), - @Parameter(name = "size", description = "페이지 당 컨텐츠 개수, 기본 값: 10"), - @Parameter(name = "search_name", description = "검색할 회원의 이름, 기본 값: null (선택)") - }) public CommonResponse getMemberList( @RequestParam(name = "page", defaultValue = "0") int page, @RequestParam(name = "size", defaultValue = "10") int size, @@ -155,12 +142,8 @@ public CommonResponse getMemberList( } @PatchMapping("/{uuid}/deactivate") - @Operation(summary = "회원 활동 가능 여부 및 역할 변경", description = "uuid를 기준으로 회원의 활동 가능 여부 및 역할을 변경합니다.") public CommonResponse deactivateMember( - @Parameter(description = "회원의 고유 번호") @PathVariable UUID uuid, - - @io.swagger.v3.oas.annotations.parameters.RequestBody(description = "변경 정보") @RequestBody MemberDeactiveRequestDto memberDeactiveRequestDto ) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); @@ -172,7 +155,7 @@ public CommonResponse deactivateMember( } memberService.deactivateMember(uuid, memberDeactiveRequestDto); - return CommonResponse.success("회원의 활동 가능 여부 및 역할이 변경되었습니다.", + return CommonResponse.success("회원의 활동 가능 여부가 변경되었습니다.", "deactivate-at : " + ZonedDateTime.now()); }