From fee193db72a9e575deabd6af008e715e1754eac7 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 10:56:13 +0900 Subject: [PATCH 1/8] =?UTF-8?q?Refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmc/suppin/SuppinApplicationTests.java | 35 +++++++++---------- 1 file changed, 17 insertions(+), 18 deletions(-) diff --git a/src/test/java/com/cmc/suppin/SuppinApplicationTests.java b/src/test/java/com/cmc/suppin/SuppinApplicationTests.java index add6347..f5a8930 100644 --- a/src/test/java/com/cmc/suppin/SuppinApplicationTests.java +++ b/src/test/java/com/cmc/suppin/SuppinApplicationTests.java @@ -1,29 +1,28 @@ package com.cmc.suppin; -import com.cmc.suppin.global.enums.UserStatus; -import com.cmc.suppin.member.domain.repository.MemberRepository; import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import static org.assertj.core.api.AssertionsForClassTypes.assertThat; - @SpringBootTest class SuppinApplicationTests { - @Autowired - private MemberRepository memberRepository; - @Test - public void testExistsByUserIdAndStatusNot() { - // Given - String userId = "testUser"; - UserStatus status = UserStatus.DELETED; - - // When - boolean exists = memberRepository.existsByUserIdAndStatusNot(userId, status); - - // Then - assertThat(exists).isFalse(); + void contextLoads() { } + +// @Autowired +// private MemberRepository memberRepository; +// +// @Test +// public void testExistsByUserIdAndStatusNot() { +// // Given +// String userId = "testUser"; +// UserStatus status = UserStatus.DELETED; +// +// // When +// boolean exists = memberRepository.existsByUserIdAndStatusNot(userId, status); +// +// // Then +// assertThat(exists).isFalse(); +// } } From 8da888b7fcea56b9eab41a7ad470195449f684e8 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 14:25:20 +0900 Subject: [PATCH 2/8] =?UTF-8?q?Refactor:=20=EC=9D=B4=EB=A9=94=EC=9D=BC=20?= =?UTF-8?q?=EC=9D=B8=EC=A6=9D=20=EC=8B=9C=20=EC=97=90=EB=9F=AC=EC=BC=80?= =?UTF-8?q?=EC=9D=B4=EC=8A=A4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../suppin/member/service/MemberService.java | 69 +++++++++++-------- 1 file changed, 39 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/cmc/suppin/member/service/MemberService.java b/src/main/java/com/cmc/suppin/member/service/MemberService.java index d886758..6940584 100644 --- a/src/main/java/com/cmc/suppin/member/service/MemberService.java +++ b/src/main/java/com/cmc/suppin/member/service/MemberService.java @@ -41,16 +41,6 @@ public class MemberService { private final EmailVerificationTokenRepository emailVerificationTokenRepository; private final MailConfig mailConfig; - public boolean requestEmailVerification(String email) { - String code = generateVerificationCode(); - saveVerificationToken(email, code); - return mailConfig.sendMail(email, code); - } - - public boolean verifyEmailCode(String email, String code) { - return verifyToken(email, code); - } - /** * 회원가입 */ @@ -140,6 +130,45 @@ public void logout(Long accountId) { } } + /** + * 이메일 인증번호 요청 + */ + public boolean requestEmailVerification(String email) { + String code = generateVerificationCode(); + saveVerificationToken(email, code); + return mailConfig.sendMail(email, code); + } + + public boolean verifyEmailCode(String email, String code) { + boolean isValid = verifyToken(email, code); + if (!isValid) { + throw new IllegalArgumentException("이메일 인증에 실패하였습니다."); + } + return isValid; + } + + private boolean verifyToken(String email, String token) { + Optional verificationTokenOpt = emailVerificationTokenRepository.findByEmailAndToken(email, token); + if (verificationTokenOpt.isPresent()) { + EmailVerificationToken verificationToken = verificationTokenOpt.get(); + boolean isNotExpired = !verificationToken.isExpired(); + return isNotExpired; + } + return false; + } + + private void saveVerificationToken(String email, String code) { + EmailVerificationToken verificationToken = EmailVerificationToken.builder() + .email(email) + .token(code) + .expiryDate(LocalDateTime.now().plusMinutes(5)) + .build(); + + emailVerificationTokenRepository.deleteByEmail(email); + emailVerificationTokenRepository.save(verificationToken); + } + + private Member getMember(Long memberId) { return memberRepository.findByIdAndStatusNot(memberId, UserStatus.DELETED) .orElseThrow(() -> new MemberException(MemberErrorCode.MEMBER_NOT_FOUND)); @@ -168,26 +197,6 @@ private String generateVerificationCode() { return String.valueOf(code); } - private void saveVerificationToken(String email, String code) { - EmailVerificationToken verificationToken = EmailVerificationToken.builder() - .email(email) - .token(code) - .expiryDate(LocalDateTime.now().plusMinutes(5)) - .build(); - - emailVerificationTokenRepository.deleteByEmail(email); - emailVerificationTokenRepository.save(verificationToken); - } - - private boolean verifyToken(String email, String token) { - Optional verificationTokenOpt = emailVerificationTokenRepository.findByEmailAndToken(email, token); - if (verificationTokenOpt.isPresent()) { - EmailVerificationToken verificationToken = verificationTokenOpt.get(); - return !verificationToken.isExpired(); - } - return false; - } - /** * 검증 메서드 */ From b6939c8c13ca27c2f987031257ae125d2f13d0f3 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 18:50:24 +0900 Subject: [PATCH 3/8] =?UTF-8?q?Refactor:=20=EB=8C=93=EA=B8=80=20=EC=88=98?= =?UTF-8?q?=EC=A7=91=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=83=9D=EC=84=B1=20?= =?UTF-8?q?API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/events/controller/EventApi.java | 4 ++- .../controller/dto/EventRequestDTO.java | 15 ++++++++++ .../events/converter/EventConverter.java | 18 +++++++----- .../cmc/suppin/event/events/domain/Event.java | 7 +++-- .../event/events/service/EventService.java | 21 ++++++++++++++ .../cmc/suppin/SuppinApplicationTests.java | 28 ------------------- 6 files changed, 54 insertions(+), 39 deletions(-) delete mode 100644 src/test/java/com/cmc/suppin/SuppinApplicationTests.java diff --git a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java index eaf3042..db72fd0 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java @@ -29,7 +29,9 @@ public class EventApi { private final EventService eventService; @PostMapping("/new") - @Operation(summary = "댓글 이벤트 생성 API", description = "request : eventType, title, url, startDate, endDate") + @Operation(summary = "댓글 이벤트 생성 API", + description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + + "title, description, url, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") public ResponseEntity> createEvent(@RequestBody @Valid EventRequestDTO.CommentEventCreateDTO request, @CurrentAccount Account account) { eventService.createEvent(request, account.userId()); return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java index 31e2407..74e78bc 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java @@ -1,6 +1,8 @@ package com.cmc.suppin.event.events.controller.dto; import com.cmc.suppin.global.enums.EventType; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -13,11 +15,24 @@ public class EventRequestDTO { @AllArgsConstructor @Builder public static class CommentEventCreateDTO { + @NotNull private EventType type; + + @NotEmpty private String title; + + @NotEmpty + private String description; + + @NotEmpty private String url; + + @NotEmpty private String startDate; + + @NotEmpty private String endDate; + private String announcementDate; } } diff --git a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java index d21beab..8a1f8ca 100644 --- a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java +++ b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java @@ -5,30 +5,34 @@ import com.cmc.suppin.event.events.domain.Event; import com.cmc.suppin.member.domain.Member; -import java.time.LocalDateTime; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; public class EventConverter { public static Event toCommentEventEntity(EventRequestDTO.CommentEventCreateDTO request, Member member) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return Event.builder() .type(request.getType()) .title(request.getTitle()) .url(request.getUrl()) - .startDate(LocalDateTime.parse(request.getStartDate())) - .endDate(LocalDateTime.parse(request.getEndDate())) - .announcementDate(LocalDateTime.parse(request.getAnnouncementDate())) + .startDate(LocalDate.parse(request.getStartDate(), formatter).atStartOfDay()) + .endDate(LocalDate.parse(request.getEndDate(), formatter).atStartOfDay()) + .announcementDate(LocalDate.parse(request.getAnnouncementDate(), formatter).atStartOfDay()) + .description(request.getDescription()) .member(member) .build(); } public static EventResponseDTO.CommentEventDetailDTO toEventDetailDTO(Event event) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return EventResponseDTO.CommentEventDetailDTO.builder() .type(event.getType()) .title(event.getTitle()) .url(event.getUrl()) - .startDate(event.getStartDate().toString()) - .endDate(event.getEndDate().toString()) - .announcementDate(event.getAnnouncementDate().toString()) + .startDate(event.getStartDate().format(formatter)) + .endDate(event.getEndDate().format(formatter)) + .announcementDate(event.getAnnouncementDate().format(formatter)) .build(); } } diff --git a/src/main/java/com/cmc/suppin/event/events/domain/Event.java b/src/main/java/com/cmc/suppin/event/events/domain/Event.java index 868400d..1b95edf 100644 --- a/src/main/java/com/cmc/suppin/event/events/domain/Event.java +++ b/src/main/java/com/cmc/suppin/event/events/domain/Event.java @@ -39,7 +39,7 @@ public class Event extends BaseDateTimeEntity { @Column(columnDefinition = "VARCHAR(100)", nullable = false) private String title; - @Column(columnDefinition = "TEXT") + @Column(columnDefinition = "TEXT", nullable = false) private String description; @Enumerated(EnumType.STRING) @@ -66,6 +66,7 @@ public void setMember(Member member) { member.getEventList().add(this); } - // Getters and Setters - + public void setStatus(EventStatus status) { + this.status = status; + } } diff --git a/src/main/java/com/cmc/suppin/event/events/service/EventService.java b/src/main/java/com/cmc/suppin/event/events/service/EventService.java index 00869ac..97f6ab2 100644 --- a/src/main/java/com/cmc/suppin/event/events/service/EventService.java +++ b/src/main/java/com/cmc/suppin/event/events/service/EventService.java @@ -4,12 +4,17 @@ import com.cmc.suppin.event.events.converter.EventConverter; import com.cmc.suppin.event.events.domain.Event; import com.cmc.suppin.event.events.domain.repository.EventRepository; +import com.cmc.suppin.global.enums.EventStatus; import com.cmc.suppin.global.enums.UserStatus; import com.cmc.suppin.member.domain.Member; import com.cmc.suppin.member.domain.repository.MemberRepository; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.List; + @Service @RequiredArgsConstructor public class EventService { @@ -17,12 +22,28 @@ public class EventService { private final EventRepository eventRepository; private final MemberRepository memberRepository; + // 이벤트 상태 업데이트 메서드 + @Transactional + public void updateEventStatus() { + LocalDateTime now = LocalDateTime.now(); + List events = eventRepository.findAll(); + + for (Event event : events) { + if (event.getEndDate().isBefore(now) && event.getStatus() != EventStatus.DONE) { + event.setStatus(EventStatus.DONE); + } else if (event.getEndDate().isAfter(now) && event.getStatus() != EventStatus.PROCESSING) { + event.setStatus(EventStatus.PROCESSING); + } + } + } + public void createEvent(EventRequestDTO.CommentEventCreateDTO request, String userId) { Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) .orElseThrow(() -> new IllegalArgumentException("Member not found")); Event event = EventConverter.toCommentEventEntity(request, member); event.setMember(member); + event.setStatus(EventStatus.PROCESSING); eventRepository.save(event); } } diff --git a/src/test/java/com/cmc/suppin/SuppinApplicationTests.java b/src/test/java/com/cmc/suppin/SuppinApplicationTests.java deleted file mode 100644 index f5a8930..0000000 --- a/src/test/java/com/cmc/suppin/SuppinApplicationTests.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.cmc.suppin; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -class SuppinApplicationTests { - - @Test - void contextLoads() { - } - -// @Autowired -// private MemberRepository memberRepository; -// -// @Test -// public void testExistsByUserIdAndStatusNot() { -// // Given -// String userId = "testUser"; -// UserStatus status = UserStatus.DELETED; -// -// // When -// boolean exists = memberRepository.existsByUserIdAndStatusNot(userId, status); -// -// // Then -// assertThat(exists).isFalse(); -// } -} From 9cbd9d29d490e7e23ac9015f1444bf3170003533 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 18:52:27 +0900 Subject: [PATCH 4/8] =?UTF-8?q?Feat:=20Crontab=EC=9D=84=20=ED=99=9C?= =?UTF-8?q?=EC=9A=A9=ED=95=9C=20EventStatus=20=EC=9E=90=EB=8F=99=EB=B3=80?= =?UTF-8?q?=ED=99=98=20=EC=8A=A4=EC=BC=80=EC=A5=B4=EB=9F=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/events/service/ScheduledTasks.java | 17 +++++++++++++++++ .../suppin/global/config/SchedulingConfig.java | 9 +++++++++ src/main/resources/application.yml | 4 ++++ 3 files changed, 30 insertions(+) create mode 100644 src/main/java/com/cmc/suppin/event/events/service/ScheduledTasks.java create mode 100644 src/main/java/com/cmc/suppin/global/config/SchedulingConfig.java diff --git a/src/main/java/com/cmc/suppin/event/events/service/ScheduledTasks.java b/src/main/java/com/cmc/suppin/event/events/service/ScheduledTasks.java new file mode 100644 index 0000000..f7f5ca2 --- /dev/null +++ b/src/main/java/com/cmc/suppin/event/events/service/ScheduledTasks.java @@ -0,0 +1,17 @@ +package com.cmc.suppin.event.events.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class ScheduledTasks { + + private final EventService eventService; + + @Scheduled(cron = "0 0 0 * * *") // 매일 자정에 실행 + public void updateEventStatuses() { + eventService.updateEventStatus(); + } +} diff --git a/src/main/java/com/cmc/suppin/global/config/SchedulingConfig.java b/src/main/java/com/cmc/suppin/global/config/SchedulingConfig.java new file mode 100644 index 0000000..9343206 --- /dev/null +++ b/src/main/java/com/cmc/suppin/global/config/SchedulingConfig.java @@ -0,0 +1,9 @@ +package com.cmc.suppin.global.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; + +@Configuration +@EnableScheduling +public class SchedulingConfig { +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b593742..86f9082 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -16,6 +16,10 @@ spring: dialect: org.hibernate.dialect.MySQL8Dialect show_sql: true format_sql: true + task: + scheduling: + pool: + size: 10 mail: host: smtp.gmail.com From b4af1b944b1fa7abbe57e9e0bfb599748a93078f Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 19:38:32 +0900 Subject: [PATCH 5/8] =?UTF-8?q?Feat:=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/events/controller/EventApi.java | 21 ++++++++++++------- .../controller/dto/EventRequestDTO.java | 2 ++ .../controller/dto/EventResponseDTO.java | 19 ++++++++++++++++- .../events/converter/EventConverter.java | 16 ++++++++++++++ .../event/events/service/EventService.java | 14 ++++++++++++- 5 files changed, 63 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java index db72fd0..9e37765 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java @@ -1,6 +1,7 @@ package com.cmc.suppin.event.events.controller; import com.cmc.suppin.event.events.controller.dto.EventRequestDTO; +import com.cmc.suppin.event.events.controller.dto.EventResponseDTO; import com.cmc.suppin.event.events.service.EventService; import com.cmc.suppin.global.response.ApiResponse; import com.cmc.suppin.global.response.ResponseCode; @@ -13,27 +14,33 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; + +import java.util.List; @RestController @Slf4j @RequiredArgsConstructor @Validated @Tag(name = "Event", description = "Event 관련 API") -@RequestMapping("/api/v1/event") +@RequestMapping("/api/v1/events") public class EventApi { private final EventService eventService; - @PostMapping("/new") + @GetMapping("/all") + @Operation(summary = "전체 이벤트 조회 API", description = "로그인한 사용자의 모든 이벤트와 설문 및 댓글 수를 조회합니다., JWT 토큰만 주시면 됩니다.") + public ResponseEntity>> getAllEventsWithCounts(@CurrentAccount Account account) { + List events = eventService.getAllEvents(account.userId()); + return ResponseEntity.ok(ApiResponse.of(events)); + } + + @PostMapping("/new/comment/crawling") @Operation(summary = "댓글 이벤트 생성 API", description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + "title, description, url, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") public ResponseEntity> createEvent(@RequestBody @Valid EventRequestDTO.CommentEventCreateDTO request, @CurrentAccount Account account) { - eventService.createEvent(request, account.userId()); + eventService.createCommentEvent(request, account.userId()); return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); } } diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java index 74e78bc..b94f7f2 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java @@ -33,6 +33,8 @@ public static class CommentEventCreateDTO { @NotEmpty private String endDate; + @NotEmpty private String announcementDate; } + } diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java index 089e6b8..7fa0fdb 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java @@ -1,5 +1,6 @@ package com.cmc.suppin.event.events.controller.dto; +import com.cmc.suppin.global.enums.EventStatus; import com.cmc.suppin.global.enums.EventType; import lombok.AllArgsConstructor; import lombok.Builder; @@ -12,8 +13,24 @@ public class EventResponseDTO { @Getter @NoArgsConstructor @AllArgsConstructor - public static class CommentEventDetailDTO { + public static class EventInfoDTO { + private EventType type; + private String title; + private String url; + private String startDate; + private String endDate; + private String announcementDate; + private Integer surveyCount; + private Integer commentCount; + private EventStatus status; + } + + @Builder + @Getter + @NoArgsConstructor + @AllArgsConstructor + public static class CommentEventDetailDTO { private EventType type; private String title; private String url; diff --git a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java index 8a1f8ca..465dfbd 100644 --- a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java +++ b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java @@ -35,4 +35,20 @@ public static EventResponseDTO.CommentEventDetailDTO toEventDetailDTO(Event even .announcementDate(event.getAnnouncementDate().format(formatter)) .build(); } + + public static EventResponseDTO.EventInfoDTO toEventInfoDTO(Event event) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + + return EventResponseDTO.EventInfoDTO.builder() + .type(event.getType()) + .title(event.getTitle()) + .url(event.getUrl()) + .startDate(event.getStartDate().format(formatter)) + .endDate(event.getEndDate().format(formatter)) + .announcementDate(event.getAnnouncementDate().format(formatter)) + .surveyCount(event.getSurveyList().size()) + .commentCount(event.getCommentList().size()) + .status(event.getStatus()) + .build(); + } } diff --git a/src/main/java/com/cmc/suppin/event/events/service/EventService.java b/src/main/java/com/cmc/suppin/event/events/service/EventService.java index 97f6ab2..aaa6902 100644 --- a/src/main/java/com/cmc/suppin/event/events/service/EventService.java +++ b/src/main/java/com/cmc/suppin/event/events/service/EventService.java @@ -1,6 +1,7 @@ package com.cmc.suppin.event.events.service; import com.cmc.suppin.event.events.controller.dto.EventRequestDTO; +import com.cmc.suppin.event.events.controller.dto.EventResponseDTO; import com.cmc.suppin.event.events.converter.EventConverter; import com.cmc.suppin.event.events.domain.Event; import com.cmc.suppin.event.events.domain.repository.EventRepository; @@ -14,6 +15,7 @@ import java.time.LocalDateTime; import java.util.List; +import java.util.stream.Collectors; @Service @RequiredArgsConstructor @@ -37,7 +39,7 @@ public void updateEventStatus() { } } - public void createEvent(EventRequestDTO.CommentEventCreateDTO request, String userId) { + public void createCommentEvent(EventRequestDTO.CommentEventCreateDTO request, String userId) { Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) .orElseThrow(() -> new IllegalArgumentException("Member not found")); @@ -46,4 +48,14 @@ public void createEvent(EventRequestDTO.CommentEventCreateDTO request, String us event.setStatus(EventStatus.PROCESSING); eventRepository.save(event); } + + public List getAllEvents(String userId) { + Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); + + List events = eventRepository.findByMemberId(member.getId()); + return events.stream() + .map(EventConverter::toEventInfoDTO) + .collect(Collectors.toList()); + } } From e34ae0af7ceb0b85cfcf3183092b61c21f1b6611 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 19:50:43 +0900 Subject: [PATCH 6/8] =?UTF-8?q?Feat:=20=EC=84=A4=EB=AC=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EB=93=B1=EB=A1=9D=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/events/controller/EventApi.java | 11 ++++++++- .../controller/dto/EventRequestDTO.java | 23 +++++++++++++++++++ .../events/converter/EventConverter.java | 15 ++++++++++++ .../event/events/service/EventService.java | 20 ++++++++++++---- 4 files changed, 63 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java index 9e37765..da6c4b0 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java @@ -39,8 +39,17 @@ public ResponseEntity>> getAllEv @Operation(summary = "댓글 이벤트 생성 API", description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + "title, description, url, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") - public ResponseEntity> createEvent(@RequestBody @Valid EventRequestDTO.CommentEventCreateDTO request, @CurrentAccount Account account) { + public ResponseEntity> createCommentEvent(@RequestBody @Valid EventRequestDTO.CommentEventCreateDTO request, @CurrentAccount Account account) { eventService.createCommentEvent(request, account.userId()); return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); } + + @PostMapping("/new/survey") + @Operation(summary = "설문조사 이벤트 생성 API", + description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + + "title, description, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") + public ResponseEntity> createSurveyEvent(@RequestBody @Valid EventRequestDTO.SurveyEventCreateDTO request, @CurrentAccount Account account) { + eventService.createSurveyEvent(request, account.userId()); + return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); + } } diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java index b94f7f2..e013b78 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java @@ -37,4 +37,27 @@ public static class CommentEventCreateDTO { private String announcementDate; } + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class SurveyEventCreateDTO { + @NotNull + private EventType type; + + @NotEmpty + private String title; + + @NotEmpty + private String description; + + @NotEmpty + private String startDate; + + @NotEmpty + private String endDate; + + @NotEmpty + private String announcementDate; + } } diff --git a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java index 465dfbd..90fb633 100644 --- a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java +++ b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java @@ -15,11 +15,24 @@ public static Event toCommentEventEntity(EventRequestDTO.CommentEventCreateDTO r return Event.builder() .type(request.getType()) .title(request.getTitle()) + .description(request.getDescription()) .url(request.getUrl()) .startDate(LocalDate.parse(request.getStartDate(), formatter).atStartOfDay()) .endDate(LocalDate.parse(request.getEndDate(), formatter).atStartOfDay()) .announcementDate(LocalDate.parse(request.getAnnouncementDate(), formatter).atStartOfDay()) + .member(member) + .build(); + } + + public static Event toSurveyEventEntity(EventRequestDTO.SurveyEventCreateDTO request, Member member) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + return Event.builder() + .type(request.getType()) + .title(request.getTitle()) .description(request.getDescription()) + .startDate(LocalDate.parse(request.getStartDate(), formatter).atStartOfDay()) + .endDate(LocalDate.parse(request.getEndDate(), formatter).atStartOfDay()) + .announcementDate(LocalDate.parse(request.getAnnouncementDate(), formatter).atStartOfDay()) .member(member) .build(); } @@ -51,4 +64,6 @@ public static EventResponseDTO.EventInfoDTO toEventInfoDTO(Event event) { .status(event.getStatus()) .build(); } + + } diff --git a/src/main/java/com/cmc/suppin/event/events/service/EventService.java b/src/main/java/com/cmc/suppin/event/events/service/EventService.java index aaa6902..7cb99bf 100644 --- a/src/main/java/com/cmc/suppin/event/events/service/EventService.java +++ b/src/main/java/com/cmc/suppin/event/events/service/EventService.java @@ -39,6 +39,16 @@ public void updateEventStatus() { } } + public List getAllEvents(String userId) { + Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); + + List events = eventRepository.findByMemberId(member.getId()); + return events.stream() + .map(EventConverter::toEventInfoDTO) + .collect(Collectors.toList()); + } + public void createCommentEvent(EventRequestDTO.CommentEventCreateDTO request, String userId) { Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) .orElseThrow(() -> new IllegalArgumentException("Member not found")); @@ -49,13 +59,13 @@ public void createCommentEvent(EventRequestDTO.CommentEventCreateDTO request, St eventRepository.save(event); } - public List getAllEvents(String userId) { + public void createSurveyEvent(EventRequestDTO.SurveyEventCreateDTO request, String userId) { Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) .orElseThrow(() -> new IllegalArgumentException("Member not found")); - List events = eventRepository.findByMemberId(member.getId()); - return events.stream() - .map(EventConverter::toEventInfoDTO) - .collect(Collectors.toList()); + Event event = EventConverter.toSurveyEventEntity(request, member); + event.setMember(member); + event.setStatus(EventStatus.PROCESSING); + eventRepository.save(event); } } From dc8d973884a7cdb3d93fb3ac1419a1a261dc03c2 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 20:22:23 +0900 Subject: [PATCH 7/8] =?UTF-8?q?Feat:=20=EC=84=A4=EB=AC=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/events/controller/EventApi.java | 11 ++++++-- .../controller/dto/EventRequestDTO.java | 26 +++++++++++-------- .../events/converter/EventConverter.java | 20 +++++++++++++- .../cmc/suppin/event/events/domain/Event.java | 4 +++ .../domain/repository/EventRepository.java | 4 +++ .../event/events/service/EventService.java | 12 +++++++++ 6 files changed, 63 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java index da6c4b0..011b18c 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java @@ -37,7 +37,7 @@ public ResponseEntity>> getAllEv @PostMapping("/new/comment/crawling") @Operation(summary = "댓글 이벤트 생성 API", - description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + + description = "Request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + "title, description, url, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") public ResponseEntity> createCommentEvent(@RequestBody @Valid EventRequestDTO.CommentEventCreateDTO request, @CurrentAccount Account account) { eventService.createCommentEvent(request, account.userId()); @@ -46,10 +46,17 @@ public ResponseEntity> createCommentEvent(@RequestBody @Valid @PostMapping("/new/survey") @Operation(summary = "설문조사 이벤트 생성 API", - description = "request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + + description = "Request : type(ENUM 타입으로, 'COMMENT와 SURVEY' 둘 중 하나를 입력해주시면 됩니다), " + "title, description, startDate(yyyy-MM-dd), endDate(yyyy-MM-dd), announcementDate(yyyy-MM-dd)") public ResponseEntity> createSurveyEvent(@RequestBody @Valid EventRequestDTO.SurveyEventCreateDTO request, @CurrentAccount Account account) { eventService.createSurveyEvent(request, account.userId()); return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); } + + @PutMapping("/{eventId}/update") + @Operation(summary = "이벤트 수정 API", description = "PathVariable: eventId, Request : title, description, url, startDate, endDate, announcementDate") + public ResponseEntity> updateEvent(@PathVariable Long eventId, @RequestBody @Valid EventRequestDTO.EventUpdateDTO request, @CurrentAccount Account account) { + eventService.updateEvent(eventId, request, account.userId()); + return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); + } } diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java index e013b78..7a221b6 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventRequestDTO.java @@ -17,22 +17,16 @@ public class EventRequestDTO { public static class CommentEventCreateDTO { @NotNull private EventType type; - @NotEmpty private String title; - @NotEmpty private String description; - @NotEmpty private String url; - @NotEmpty private String startDate; - @NotEmpty private String endDate; - @NotEmpty private String announcementDate; } @@ -44,20 +38,30 @@ public static class CommentEventCreateDTO { public static class SurveyEventCreateDTO { @NotNull private EventType type; - @NotEmpty private String title; - @NotEmpty private String description; - @NotEmpty private String startDate; - @NotEmpty private String endDate; - @NotEmpty private String announcementDate; } + + @Getter + @NoArgsConstructor + @AllArgsConstructor + @Builder + public static class EventUpdateDTO { + @NotNull + private EventType type; + private String title; + private String description; + private String url; + private String startDate; + private String endDate; + private String announcementDate; + } } diff --git a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java index 90fb633..4d27c34 100644 --- a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java +++ b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java @@ -3,6 +3,7 @@ import com.cmc.suppin.event.events.controller.dto.EventRequestDTO; import com.cmc.suppin.event.events.controller.dto.EventResponseDTO; import com.cmc.suppin.event.events.domain.Event; +import com.cmc.suppin.global.enums.EventType; import com.cmc.suppin.member.domain.Member; import java.time.LocalDate; @@ -51,7 +52,6 @@ public static EventResponseDTO.CommentEventDetailDTO toEventDetailDTO(Event even public static EventResponseDTO.EventInfoDTO toEventInfoDTO(Event event) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); - return EventResponseDTO.EventInfoDTO.builder() .type(event.getType()) .title(event.getTitle()) @@ -65,5 +65,23 @@ public static EventResponseDTO.EventInfoDTO toEventInfoDTO(Event event) { .build(); } + public static Event toUpdatedEventEntity(EventRequestDTO.EventUpdateDTO request, Member member) { + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); + Event.EventBuilder eventBuilder = Event.builder() + .title(request.getTitle()) + .description(request.getDescription()) + .startDate(LocalDate.parse(request.getStartDate(), formatter).atStartOfDay()) + .endDate(LocalDate.parse(request.getEndDate(), formatter).atStartOfDay()) + .announcementDate(LocalDate.parse(request.getAnnouncementDate(), formatter).atStartOfDay()) + .member(member); + + // Only set URL if the event type is COMMENT + if (request.getType() == EventType.COMMENT) { + eventBuilder.url(request.getUrl()); + } + + return eventBuilder.build(); + } + } diff --git a/src/main/java/com/cmc/suppin/event/events/domain/Event.java b/src/main/java/com/cmc/suppin/event/events/domain/Event.java index 1b95edf..3a53fc9 100644 --- a/src/main/java/com/cmc/suppin/event/events/domain/Event.java +++ b/src/main/java/com/cmc/suppin/event/events/domain/Event.java @@ -69,4 +69,8 @@ public void setMember(Member member) { public void setStatus(EventStatus status) { this.status = status; } + + public void setId(Long id) { + this.id = id; + } } diff --git a/src/main/java/com/cmc/suppin/event/events/domain/repository/EventRepository.java b/src/main/java/com/cmc/suppin/event/events/domain/repository/EventRepository.java index e431734..872950a 100644 --- a/src/main/java/com/cmc/suppin/event/events/domain/repository/EventRepository.java +++ b/src/main/java/com/cmc/suppin/event/events/domain/repository/EventRepository.java @@ -4,7 +4,11 @@ import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; +import java.util.Optional; public interface EventRepository extends JpaRepository { List findByMemberId(Long memberId); + + Optional findByIdAndMemberId(Long id, Long memberId); + } diff --git a/src/main/java/com/cmc/suppin/event/events/service/EventService.java b/src/main/java/com/cmc/suppin/event/events/service/EventService.java index 7cb99bf..8f25fb7 100644 --- a/src/main/java/com/cmc/suppin/event/events/service/EventService.java +++ b/src/main/java/com/cmc/suppin/event/events/service/EventService.java @@ -68,4 +68,16 @@ public void createSurveyEvent(EventRequestDTO.SurveyEventCreateDTO request, Stri event.setStatus(EventStatus.PROCESSING); eventRepository.save(event); } + + public void updateEvent(Long eventId, EventRequestDTO.EventUpdateDTO request, String userId) { + Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); + + Event event = eventRepository.findByIdAndMemberId(eventId, member.getId()) + .orElseThrow(() -> new IllegalArgumentException("Event not found")); + + Event updatedEvent = EventConverter.toUpdatedEventEntity(request, member); + updatedEvent.setId(event.getId()); // 유지하려는 ID 설정 + eventRepository.save(updatedEvent); + } } From 0a15b8865396d693db6b643287caca58f67da183 Mon Sep 17 00:00:00 2001 From: yxhwxn Date: Tue, 6 Aug 2024 20:27:36 +0900 Subject: [PATCH 8/8] =?UTF-8?q?Feat:=20=EC=84=A4=EB=AC=B8=20=EA=B8=B0?= =?UTF-8?q?=EB=B0=98=20=EC=9D=B4=EB=B2=A4=ED=8A=B8=20=EC=82=AD=EC=A0=9C=20?= =?UTF-8?q?API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cmc/suppin/event/events/controller/EventApi.java | 7 +++++++ .../event/events/controller/dto/EventResponseDTO.java | 1 + .../suppin/event/events/converter/EventConverter.java | 1 + .../cmc/suppin/event/events/service/EventService.java | 10 ++++++++++ 4 files changed, 19 insertions(+) diff --git a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java index 011b18c..d8f88fa 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/EventApi.java @@ -59,4 +59,11 @@ public ResponseEntity> updateEvent(@PathVariable Long eventId, eventService.updateEvent(eventId, request, account.userId()); return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); } + + @DeleteMapping("/{eventId}") + @Operation(summary = "이벤트 삭제 API", description = "PathVariable: eventId, JWT 토큰만 주시면 됩니다.") + public ResponseEntity> deleteEvent(@PathVariable Long eventId, @CurrentAccount Account account) { + eventService.deleteEvent(eventId, account.userId()); + return ResponseEntity.ok(ApiResponse.of(ResponseCode.SUCCESS)); + } } diff --git a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java index 7fa0fdb..3645962 100644 --- a/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java +++ b/src/main/java/com/cmc/suppin/event/events/controller/dto/EventResponseDTO.java @@ -14,6 +14,7 @@ public class EventResponseDTO { @NoArgsConstructor @AllArgsConstructor public static class EventInfoDTO { + private Long eventId; private EventType type; private String title; private String url; diff --git a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java index 4d27c34..9b828a1 100644 --- a/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java +++ b/src/main/java/com/cmc/suppin/event/events/converter/EventConverter.java @@ -53,6 +53,7 @@ public static EventResponseDTO.CommentEventDetailDTO toEventDetailDTO(Event even public static EventResponseDTO.EventInfoDTO toEventInfoDTO(Event event) { DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); return EventResponseDTO.EventInfoDTO.builder() + .eventId(event.getId()) .type(event.getType()) .title(event.getTitle()) .url(event.getUrl()) diff --git a/src/main/java/com/cmc/suppin/event/events/service/EventService.java b/src/main/java/com/cmc/suppin/event/events/service/EventService.java index 8f25fb7..d4ba61a 100644 --- a/src/main/java/com/cmc/suppin/event/events/service/EventService.java +++ b/src/main/java/com/cmc/suppin/event/events/service/EventService.java @@ -80,4 +80,14 @@ public void updateEvent(Long eventId, EventRequestDTO.EventUpdateDTO request, St updatedEvent.setId(event.getId()); // 유지하려는 ID 설정 eventRepository.save(updatedEvent); } + + public void deleteEvent(Long eventId, String userId) { + Member member = memberRepository.findByUserIdAndStatusNot(userId, UserStatus.DELETED) + .orElseThrow(() -> new IllegalArgumentException("Member not found")); + + Event event = eventRepository.findByIdAndMemberId(eventId, member.getId()) + .orElseThrow(() -> new IllegalArgumentException("Event not found")); + + eventRepository.delete(event); + } }