From 22dd9b159d33790d44aa5a960494c46936f3d9b8 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 16 Jan 2025 19:15:45 +0900 Subject: [PATCH 01/22] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../curriculum/domain/Curriculum.java | 7 ++- .../curriculum/dto/CurriculumDTO.java | 11 ++++ .../com/gdgoc/study_group/day/domain/Day.java | 10 ++- .../com/gdgoc/study_group/day/dto/DayDTO.java | 15 +++++ .../study/api/StudyController.java | 28 +++++++++ .../study/application/StudyService.java | 61 +++++++++++++++++++ .../study_group/study/domain/Status.java | 7 --- .../gdgoc/study_group/study/domain/Study.java | 9 ++- .../study/dto/StudyCreateRequest.java | 21 +++++++ 9 files changed, 154 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java create mode 100644 src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java create mode 100644 src/main/java/com/gdgoc/study_group/study/api/StudyController.java create mode 100644 src/main/java/com/gdgoc/study_group/study/application/StudyService.java delete mode 100644 src/main/java/com/gdgoc/study_group/study/domain/Status.java create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java diff --git a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java index 5fc3795..da5cb7c 100644 --- a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java +++ b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java @@ -7,12 +7,13 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Entity +@Builder @Getter -@Setter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor public class Curriculum { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java b/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java new file mode 100644 index 0000000..a31b923 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java @@ -0,0 +1,11 @@ +package com.gdgoc.study_group.curriculum.dto; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class CurriculumDTO { + private Integer week; + private String subject; +} diff --git a/src/main/java/com/gdgoc/study_group/day/domain/Day.java b/src/main/java/com/gdgoc/study_group/day/domain/Day.java index 4c299b7..2935c34 100644 --- a/src/main/java/com/gdgoc/study_group/day/domain/Day.java +++ b/src/main/java/com/gdgoc/study_group/day/domain/Day.java @@ -1,5 +1,6 @@ package com.gdgoc.study_group.day.domain; +import com.fasterxml.jackson.annotation.JsonFormat; import com.gdgoc.study_group.study.domain.Study; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -8,12 +9,13 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import java.time.LocalTime; -import lombok.Getter; -import lombok.Setter; +import lombok.*; @Entity +@Builder @Getter -@Setter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor public class Day { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -24,5 +26,7 @@ public class Day { private Study study; private String day; + + @JsonFormat(pattern = "kk:mm") private LocalTime startTime; } diff --git a/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java new file mode 100644 index 0000000..e2ffdc6 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java @@ -0,0 +1,15 @@ +package com.gdgoc.study_group.day.dto; + +import com.fasterxml.jackson.annotation.JsonFormat; +import java.time.LocalTime; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class DayDTO { + private String day; + + @JsonFormat(pattern = "hh:mm") // "startTime": "14:00" 형식으로 입력 + private LocalTime startTime; +} diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java new file mode 100644 index 0000000..73a9cf0 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -0,0 +1,28 @@ +package com.gdgoc.study_group.study.api; + +import com.gdgoc.study_group.study.application.StudyService; +import com.gdgoc.study_group.study.domain.Study; +import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import org.springframework.http.ResponseEntity; +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; + +@RestController +@RequestMapping("/studies") +public class StudyController { + + public final StudyService studyService; + + public StudyController(StudyService studyService) { + this.studyService = studyService; + } + + @PostMapping() + public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { + Study newStudy = studyService.createStudy(request); + + return ResponseEntity.ok(newStudy); + } +} diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java new file mode 100644 index 0000000..e2a9c49 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -0,0 +1,61 @@ +package com.gdgoc.study_group.study.application; + +import com.gdgoc.study_group.curriculum.domain.Curriculum; +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.domain.Day; +import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.study.dao.StudyRepository; +import com.gdgoc.study_group.study.domain.Study; +import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import java.util.ArrayList; +import org.springframework.stereotype.Service; + +@Service +public class StudyService { + + public final StudyRepository studyRepository; + + public StudyService(StudyRepository studyRepository) { + this.studyRepository = studyRepository; + } + + public Study createStudy(StudyCreateRequest request) { + Study study = + Study.builder() + .name(request.getName()) + .description(request.getDescription()) + .requirement(request.getRequirements()) + .question(request.getQuestion()) + .maxParticipants(request.getMaxParticipants()) + .studyStatus(request.getStudyStatus()) + .curriculums(new ArrayList<>()) // 빈 리스트로 초기화 + .days(new ArrayList<>()) // 빈 리스트로 초기화 + .isApplicationClosed(false) // 스터디 생성할 때 false로 설정 + .build(); + + if (request.getCurriculums() != null) { + for (CurriculumDTO curriculumDTO : request.getCurriculums()) { + Curriculum curriculum = + Curriculum.builder() + .study(study) + .week(curriculumDTO.getWeek()) + .subject(curriculumDTO.getSubject()) + .build(); + study.getCurriculums().add(curriculum); + } + } + + if (request.getDays() != null) { + for (DayDTO dayDTO : request.getDays()) { + Day day = + Day.builder() + .study(study) + .day(dayDTO.getDay()) + .startTime(dayDTO.getStartTime()) + .build(); + } + } + + return studyRepository.save(study); + } +} diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Status.java b/src/main/java/com/gdgoc/study_group/study/domain/Status.java deleted file mode 100644 index 37dc8a6..0000000 --- a/src/main/java/com/gdgoc/study_group/study/domain/Status.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.gdgoc.study_group.study.domain; - -public enum Status { - OFFLINE, - ONLINE, - FINISHED -} diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Study.java b/src/main/java/com/gdgoc/study_group/study/domain/Study.java index 5ed44a7..2a8b315 100644 --- a/src/main/java/com/gdgoc/study_group/study/domain/Study.java +++ b/src/main/java/com/gdgoc/study_group/study/domain/Study.java @@ -8,8 +8,13 @@ import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; +import lombok.*; @Entity +@Builder +@Getter +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@NoArgsConstructor public class Study { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -21,10 +26,10 @@ public class Study { @OneToMany(mappedBy = "study") private List rounds = new ArrayList<>(); - @OneToMany(mappedBy = "study") + @OneToMany(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true) private List curriculums = new ArrayList<>(); - @OneToMany(mappedBy = "study") + @OneToMany(mappedBy = "study", cascade = CascadeType.ALL, orphanRemoval = true) private List days = new ArrayList<>(); @OneToMany(mappedBy = "study") diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java new file mode 100644 index 0000000..8369056 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java @@ -0,0 +1,21 @@ +package com.gdgoc.study_group.study.dto; + +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.study.domain.StudyStatus; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class StudyCreateRequest { + private String name; + private String description; + private String requirements; + private String question; + private Integer maxParticipants; + private StudyStatus studyStatus; + private List curriculums; + private List days; +} From 90ad73f57f0f49da5c2a3ff2f1be6250a3772f2b Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 16 Jan 2025 20:04:15 +0900 Subject: [PATCH 02/22] =?UTF-8?q?feat:=20StudyCreateResponse=20DTO=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gdgoc/study_group/day/domain/Day.java | 2 +- .../com/gdgoc/study_group/day/dto/DayDTO.java | 2 +- .../study/api/StudyController.java | 6 +-- .../study/application/StudyService.java | 39 ++++++++++++++++++- .../study/dto/StudyCreateResponse.java | 21 ++++++++++ src/main/resources/application.yml | 2 +- 6 files changed, 64 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java diff --git a/src/main/java/com/gdgoc/study_group/day/domain/Day.java b/src/main/java/com/gdgoc/study_group/day/domain/Day.java index 2935c34..e1133b2 100644 --- a/src/main/java/com/gdgoc/study_group/day/domain/Day.java +++ b/src/main/java/com/gdgoc/study_group/day/domain/Day.java @@ -27,6 +27,6 @@ public class Day { private String day; - @JsonFormat(pattern = "kk:mm") + @JsonFormat(pattern = "HH:mm") private LocalTime startTime; } diff --git a/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java index e2ffdc6..eb7b4ec 100644 --- a/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java +++ b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java @@ -10,6 +10,6 @@ public class DayDTO { private String day; - @JsonFormat(pattern = "hh:mm") // "startTime": "14:00" 형식으로 입력 + @JsonFormat(pattern = "HH:mm") // "startTime": "14:00" 형식으로 입력 private LocalTime startTime; } diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 73a9cf0..f5587b0 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -1,8 +1,8 @@ package com.gdgoc.study_group.study.api; import com.gdgoc.study_group.study.application.StudyService; -import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import com.gdgoc.study_group.study.dto.StudyCreateResponse; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -20,8 +20,8 @@ public StudyController(StudyService studyService) { } @PostMapping() - public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { - Study newStudy = studyService.createStudy(request); + public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { + StudyCreateResponse newStudy = studyService.createStudy(request); return ResponseEntity.ok(newStudy); } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index e2a9c49..fd73f52 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -7,6 +7,7 @@ import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import com.gdgoc.study_group.study.dto.StudyCreateResponse; import java.util.ArrayList; import org.springframework.stereotype.Service; @@ -19,7 +20,9 @@ public StudyService(StudyRepository studyRepository) { this.studyRepository = studyRepository; } - public Study createStudy(StudyCreateRequest request) { + public StudyCreateResponse createStudy(StudyCreateRequest request) { + + // 스터디 생성 Study study = Study.builder() .name(request.getName()) @@ -53,9 +56,41 @@ public Study createStudy(StudyCreateRequest request) { .day(dayDTO.getDay()) .startTime(dayDTO.getStartTime()) .build(); + study.getDays().add(day); } } - return studyRepository.save(study); + studyRepository.save(study); + + // response DTO 생성 + StudyCreateResponse response = + StudyCreateResponse.builder() + .id(study.getId()) + .name(study.getName()) + .description(study.getDescription()) + .requirement(study.getRequirement()) + .maxParticipants(study.getMaxParticipants()) + .studyStatus(study.getStudyStatus()) + .curriculums(new ArrayList<>()) + .days(new ArrayList<>()) + .build(); + + // response에 curriculum DTO 추가 + for (Curriculum curriculum : study.getCurriculums()) { + CurriculumDTO curriculumDTO = + CurriculumDTO.builder() + .week(curriculum.getWeek()) + .subject(curriculum.getSubject()) + .build(); + response.getCurriculums().add(curriculumDTO); + } + + // response에 day DTO 추가 + for (Day day : study.getDays()) { + DayDTO dayDTO = DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); + response.getDays().add(dayDTO); + } + + return response; } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java new file mode 100644 index 0000000..dad0470 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java @@ -0,0 +1,21 @@ +package com.gdgoc.study_group.study.dto; + +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.study.domain.StudyStatus; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class StudyCreateResponse { + private Long id; + private String name; + private String description; + private String requirement; + private Integer maxParticipants; + private StudyStatus studyStatus; + private List curriculums; + private List days; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index f8dc6af..b58f271 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ spring: jpa: hibernate: - ddl-auto: update + ddl-auto: create properties: hibernate: format_sql: true From 2ea082680c722627e65187e3863874633e05aacb Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 16 Jan 2025 20:47:23 +0900 Subject: [PATCH 03/22] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=A0=84=EC=B2=B4=20=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/api/StudyController.java | 16 +++++-- .../study/application/StudyService.java | 43 ++++++++----------- .../study/dto/StudyCreateResponse.java | 12 +----- .../study/dto/StudyListResponse.java | 14 ++++++ src/main/resources/application.yml | 2 +- 5 files changed, 45 insertions(+), 42 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index f5587b0..12220ae 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -3,11 +3,10 @@ import com.gdgoc.study_group.study.application.StudyService; import com.gdgoc.study_group.study.dto.StudyCreateRequest; import com.gdgoc.study_group.study.dto.StudyCreateResponse; +import com.gdgoc.study_group.study.dto.StudyListResponse; +import java.util.List; import org.springframework.http.ResponseEntity; -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.*; @RestController @RequestMapping("/studies") @@ -25,4 +24,13 @@ public ResponseEntity createStudy(@RequestBody StudyCreateR return ResponseEntity.ok(newStudy); } + + @GetMapping() + public ResponseEntity> getStudyList() { + List studyList = studyService.getStudyList(); + + return ResponseEntity.ok(studyList); + } + + } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index fd73f52..57ae73d 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -8,7 +8,9 @@ import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.StudyCreateRequest; import com.gdgoc.study_group.study.dto.StudyCreateResponse; +import com.gdgoc.study_group.study.dto.StudyListResponse; import java.util.ArrayList; +import java.util.List; import org.springframework.stereotype.Service; @Service @@ -62,35 +64,24 @@ public StudyCreateResponse createStudy(StudyCreateRequest request) { studyRepository.save(study); - // response DTO 생성 - StudyCreateResponse response = - StudyCreateResponse.builder() - .id(study.getId()) - .name(study.getName()) - .description(study.getDescription()) - .requirement(study.getRequirement()) - .maxParticipants(study.getMaxParticipants()) - .studyStatus(study.getStudyStatus()) - .curriculums(new ArrayList<>()) - .days(new ArrayList<>()) - .build(); + return StudyCreateResponse.builder().message("Study Created").id(study.getId()).build(); + } - // response에 curriculum DTO 추가 - for (Curriculum curriculum : study.getCurriculums()) { - CurriculumDTO curriculumDTO = - CurriculumDTO.builder() - .week(curriculum.getWeek()) - .subject(curriculum.getSubject()) - .build(); - response.getCurriculums().add(curriculumDTO); - } + public List getStudyList() { + List studyList = studyRepository.findAll(); + List studyListResponses = new ArrayList<>(); - // response에 day DTO 추가 - for (Day day : study.getDays()) { - DayDTO dayDTO = DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); - response.getDays().add(dayDTO); + for (Study study : studyList) { + StudyListResponse studyResponse = + StudyListResponse.builder() + .id(study.getId()) + .name(study.getName()) + .description(study.getDescription()) + .status(study.getStudyStatus()) + .build(); + studyListResponses.add(studyResponse); } - return response; + return studyListResponses; } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java index dad0470..a594f7b 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java @@ -1,21 +1,11 @@ package com.gdgoc.study_group.study.dto; -import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; -import com.gdgoc.study_group.day.dto.DayDTO; -import com.gdgoc.study_group.study.domain.StudyStatus; -import java.util.List; import lombok.Builder; import lombok.Getter; @Getter @Builder public class StudyCreateResponse { + private String message; private Long id; - private String name; - private String description; - private String requirement; - private Integer maxParticipants; - private StudyStatus studyStatus; - private List curriculums; - private List days; } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java new file mode 100644 index 0000000..7e10f67 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java @@ -0,0 +1,14 @@ +package com.gdgoc.study_group.study.dto; + +import com.gdgoc.study_group.study.domain.StudyStatus; +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class StudyListResponse { + private Long id; + private String name; + private String description; + private StudyStatus status; +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index b58f271..f8dc6af 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,7 +11,7 @@ spring: jpa: hibernate: - ddl-auto: create + ddl-auto: update properties: hibernate: format_sql: true From 3310c20c3d65b3fc191d50ac74885c81affbee10 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 16 Jan 2025 21:12:04 +0900 Subject: [PATCH 04/22] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/api/StudyController.java | 10 +++ .../study/application/StudyService.java | 76 +++++++++++++++---- .../study/dto/StudyDetailResponse.java | 21 +++++ 3 files changed, 92 insertions(+), 15 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 12220ae..4d06aa6 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -3,6 +3,7 @@ import com.gdgoc.study_group.study.application.StudyService; import com.gdgoc.study_group.study.dto.StudyCreateRequest; import com.gdgoc.study_group.study.dto.StudyCreateResponse; +import com.gdgoc.study_group.study.dto.StudyDetailResponse; import com.gdgoc.study_group.study.dto.StudyListResponse; import java.util.List; import org.springframework.http.ResponseEntity; @@ -32,5 +33,14 @@ public ResponseEntity> getStudyList() { return ResponseEntity.ok(studyList); } + @GetMapping("/{studyId}") + public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { + StudyDetailResponse studyDetail = studyService.getStudyDetail(studyId); + if (studyDetail == null) { + return ResponseEntity.notFound().build(); + } + + return ResponseEntity.ok(studyDetail); + } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index 57ae73d..c2620ae 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -8,9 +8,11 @@ import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.StudyCreateRequest; import com.gdgoc.study_group.study.dto.StudyCreateResponse; +import com.gdgoc.study_group.study.dto.StudyDetailResponse; import com.gdgoc.study_group.study.dto.StudyListResponse; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import org.springframework.stereotype.Service; @Service @@ -22,24 +24,24 @@ public StudyService(StudyRepository studyRepository) { this.studyRepository = studyRepository; } - public StudyCreateResponse createStudy(StudyCreateRequest request) { + public StudyCreateResponse createStudy(StudyCreateRequest createRequest) { // 스터디 생성 Study study = Study.builder() - .name(request.getName()) - .description(request.getDescription()) - .requirement(request.getRequirements()) - .question(request.getQuestion()) - .maxParticipants(request.getMaxParticipants()) - .studyStatus(request.getStudyStatus()) + .name(createRequest.getName()) + .description(createRequest.getDescription()) + .requirement(createRequest.getRequirements()) + .question(createRequest.getQuestion()) + .maxParticipants(createRequest.getMaxParticipants()) + .studyStatus(createRequest.getStudyStatus()) .curriculums(new ArrayList<>()) // 빈 리스트로 초기화 .days(new ArrayList<>()) // 빈 리스트로 초기화 .isApplicationClosed(false) // 스터디 생성할 때 false로 설정 .build(); - if (request.getCurriculums() != null) { - for (CurriculumDTO curriculumDTO : request.getCurriculums()) { + if (createRequest.getCurriculums() != null) { + for (CurriculumDTO curriculumDTO : createRequest.getCurriculums()) { Curriculum curriculum = Curriculum.builder() .study(study) @@ -50,8 +52,8 @@ public StudyCreateResponse createStudy(StudyCreateRequest request) { } } - if (request.getDays() != null) { - for (DayDTO dayDTO : request.getDays()) { + if (createRequest.getDays() != null) { + for (DayDTO dayDTO : createRequest.getDays()) { Day day = Day.builder() .study(study) @@ -67,21 +69,65 @@ public StudyCreateResponse createStudy(StudyCreateRequest request) { return StudyCreateResponse.builder().message("Study Created").id(study.getId()).build(); } + // 스터디 전체 목록 조회 public List getStudyList() { List studyList = studyRepository.findAll(); - List studyListResponses = new ArrayList<>(); + List listResponse = new ArrayList<>(); for (Study study : studyList) { - StudyListResponse studyResponse = + StudyListResponse studyListResponse = StudyListResponse.builder() .id(study.getId()) .name(study.getName()) .description(study.getDescription()) .status(study.getStudyStatus()) .build(); - studyListResponses.add(studyResponse); + listResponse.add(studyListResponse); } - return studyListResponses; + return listResponse; + } + + // 스터디 상세 정보 조회 + public StudyDetailResponse getStudyDetail(Long studyId) { + Optional study = studyRepository.findById(studyId); + + if (study.isPresent()) { // 해당 아이디를 가진 스터디가 존재할 때 + StudyDetailResponse detailResponse = + StudyDetailResponse.builder() + .id(studyId) + .name(study.get().getName()) + .description(study.get().getDescription()) + .requirement(study.get().getRequirement()) + .question(study.get().getQuestion()) + .curriculums(new ArrayList<>()) + .days(new ArrayList<>()) + .maxParticipants(study.get().getMaxParticipants()) + .isApplicationClosed(study.get().getIsApplicationClosed()) + .build(); + + // curriculum이 있다면 curriculumDTO로 변환해 response에 추가 + if (study.get().getCurriculums() != null) { + for (Curriculum curriculum : study.get().getCurriculums()) { + CurriculumDTO curriculumDTO = + CurriculumDTO.builder() + .week(curriculum.getWeek()) + .subject(curriculum.getSubject()) + .build(); + detailResponse.getCurriculums().add(curriculumDTO); + } + } + + // day가 있다면 dayDTO로 변환해 responsedp cnrk + if (study.get().getDays() != null) { + for (Day day : study.get().getDays()) { + DayDTO dayDTO = DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); + detailResponse.getDays().add(dayDTO); + } + } + + return detailResponse; + } + return null; } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java new file mode 100644 index 0000000..2557d3b --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java @@ -0,0 +1,21 @@ +package com.gdgoc.study_group.study.dto; + +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.dto.DayDTO; +import java.util.List; +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class StudyDetailResponse { + private Long id; + private String name; + private String requirement; + private String description; + private String question; + private List curriculums; + private List days; + private Integer maxParticipants; + private boolean isApplicationClosed; +} From b7009460b0d8f1a5f7ce0718927b73646962668e Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 16 Jan 2025 21:49:00 +0900 Subject: [PATCH 05/22] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/api/StudyController.java | 36 ++++++++++---- .../study/application/StudyService.java | 47 +++++++++++++++---- .../study/dto/MessageResponse.java | 10 ++++ 3 files changed, 74 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 4d06aa6..7669f6c 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -1,11 +1,10 @@ package com.gdgoc.study_group.study.api; import com.gdgoc.study_group.study.application.StudyService; -import com.gdgoc.study_group.study.dto.StudyCreateRequest; -import com.gdgoc.study_group.study.dto.StudyCreateResponse; -import com.gdgoc.study_group.study.dto.StudyDetailResponse; -import com.gdgoc.study_group.study.dto.StudyListResponse; +import com.gdgoc.study_group.study.dao.StudyRepository; +import com.gdgoc.study_group.study.dto.*; import java.util.List; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -14,33 +13,50 @@ public class StudyController { public final StudyService studyService; + private final StudyRepository studyRepository; - public StudyController(StudyService studyService) { + public StudyController(StudyService studyService, StudyRepository studyRepository) { this.studyService = studyService; + this.studyRepository = studyRepository; } @PostMapping() public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { StudyCreateResponse newStudy = studyService.createStudy(request); - return ResponseEntity.ok(newStudy); + return ResponseEntity.status(HttpStatus.CREATED).body(newStudy); } @GetMapping() public ResponseEntity> getStudyList() { List studyList = studyService.getStudyList(); - return ResponseEntity.ok(studyList); + return ResponseEntity.status(HttpStatus.OK).body(studyList); } @GetMapping("/{studyId}") - public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { + public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { StudyDetailResponse studyDetail = studyService.getStudyDetail(studyId); if (studyDetail == null) { - return ResponseEntity.notFound().build(); + MessageResponse messageResponse = MessageResponse.builder().message("해당하는 스터디가 없습니다.").build(); + + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(messageResponse); + } + + return ResponseEntity.status(HttpStatus.OK).body(studyDetail); + } + + @DeleteMapping("/{studyId}") + public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { + + MessageResponse messageResponse = studyService.deleteStudy(studyId); + + if (messageResponse == null) { + messageResponse = MessageResponse.builder().message("스터디가 삭제되었습니다.").build(); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body(messageResponse); } - return ResponseEntity.ok(studyDetail); + return ResponseEntity.status(HttpStatus.OK).body(messageResponse); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index c2620ae..ed11ec0 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -6,15 +6,13 @@ import com.gdgoc.study_group.day.dto.DayDTO; import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; -import com.gdgoc.study_group.study.dto.StudyCreateRequest; -import com.gdgoc.study_group.study.dto.StudyCreateResponse; -import com.gdgoc.study_group.study.dto.StudyDetailResponse; -import com.gdgoc.study_group.study.dto.StudyListResponse; +import com.gdgoc.study_group.study.dto.*; import java.util.ArrayList; import java.util.List; import java.util.Optional; import org.springframework.stereotype.Service; +/** 예외처리 + 권한 확인 아직 안 함.... 빨리 하겠슴다 */ @Service public class StudyService { @@ -24,9 +22,14 @@ public StudyService(StudyRepository studyRepository) { this.studyRepository = studyRepository; } + /** + * 스터디를 생성합니다. + * + * @param createRequest 스터디 생성 DTO + * @return ResponseDTO 반환 + */ public StudyCreateResponse createStudy(StudyCreateRequest createRequest) { - // 스터디 생성 Study study = Study.builder() .name(createRequest.getName()) @@ -66,10 +69,14 @@ public StudyCreateResponse createStudy(StudyCreateRequest createRequest) { studyRepository.save(study); - return StudyCreateResponse.builder().message("Study Created").id(study.getId()).build(); + return StudyCreateResponse.builder().message("스터디가 생성되었습니다").id(study.getId()).build(); } - // 스터디 전체 목록 조회 + /** + * 스터디 전체 목록을 조회합니다. + * + * @return 스터디 전체 목록 리스트 + */ public List getStudyList() { List studyList = studyRepository.findAll(); List listResponse = new ArrayList<>(); @@ -88,7 +95,12 @@ public List getStudyList() { return listResponse; } - // 스터디 상세 정보 조회 + /** + * 스터디 상세 정보를 조회합니다. + * + * @param studyId 조회할 스터디 아이디 + * @return 스터디 정보 반환 + */ public StudyDetailResponse getStudyDetail(Long studyId) { Optional study = studyRepository.findById(studyId); @@ -118,7 +130,7 @@ public StudyDetailResponse getStudyDetail(Long studyId) { } } - // day가 있다면 dayDTO로 변환해 responsedp cnrk + // day가 있다면 dayDTO로 변환해 response에 추가 if (study.get().getDays() != null) { for (Day day : study.get().getDays()) { DayDTO dayDTO = DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); @@ -130,4 +142,21 @@ public StudyDetailResponse getStudyDetail(Long studyId) { } return null; } + + /** + * 스터디장 권한 확인 필요 스터디를 삭제합니다 + * + * @param studyId 삭제할 스터디의 아이디 + * @return 삭제 완료 메시지를 담은 MessageResponse DTO + */ + public MessageResponse deleteStudy(Long studyId) { + Optional study = studyRepository.findById(studyId); + + if (study.isEmpty()) { + return null; + } + + studyRepository.deleteById(studyId); + return MessageResponse.builder().message("스터디가 삭제되었습니다.").build(); + } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java new file mode 100644 index 0000000..fcf398d --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java @@ -0,0 +1,10 @@ +package com.gdgoc.study_group.study.dto; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class MessageResponse { + private String message; +} From e99cab5be51899c536529069158c950278057e79 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 17 Jan 2025 16:51:08 +0900 Subject: [PATCH 06/22] =?UTF-8?q?refactor:=20delete,=20detail=20response?= =?UTF-8?q?=20dto=EC=88=98=EC=A0=95=20=EB=B0=8F=20cascade=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit curriculum, day cascade 설정 추가 delete, detail response dto 수정 --- .../study/api/StudyController.java | 20 ++--- .../study/application/StudyService.java | 82 ++++++++++++------- .../gdgoc/study_group/study/domain/Study.java | 2 +- 3 files changed, 61 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 7669f6c..e9f7a15 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -13,16 +13,14 @@ public class StudyController { public final StudyService studyService; - private final StudyRepository studyRepository; public StudyController(StudyService studyService, StudyRepository studyRepository) { this.studyService = studyService; - this.studyRepository = studyRepository; } @PostMapping() public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { - StudyCreateResponse newStudy = studyService.createStudy(request); + StudyCreateResponse newStudy = studyService.createStudy(1L, request); // 임시 유저 return ResponseEntity.status(HttpStatus.CREATED).body(newStudy); } @@ -39,9 +37,8 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { StudyDetailResponse studyDetail = studyService.getStudyDetail(studyId); if (studyDetail == null) { - MessageResponse messageResponse = MessageResponse.builder().message("해당하는 스터디가 없습니다.").build(); - - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(messageResponse); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); } return ResponseEntity.status(HttpStatus.OK).body(studyDetail); @@ -50,13 +47,14 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { @DeleteMapping("/{studyId}") public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { - MessageResponse messageResponse = studyService.deleteStudy(studyId); + boolean isStudyExist = studyService.deleteStudy(studyId); - if (messageResponse == null) { - messageResponse = MessageResponse.builder().message("스터디가 삭제되었습니다.").build(); - return ResponseEntity.status(HttpStatus.NOT_FOUND).body(messageResponse); + if (isStudyExist) { + return ResponseEntity.status(HttpStatus.NO_CONTENT) + .body(MessageResponse.builder().message("스터디가 삭제되었습니다.").build()); } - return ResponseEntity.status(HttpStatus.OK).body(messageResponse); + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index ed11ec0..4dd56ac 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -4,9 +4,12 @@ import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; import com.gdgoc.study_group.day.domain.Day; import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.member.dao.MemberRepository; import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.*; +import com.gdgoc.study_group.studyMember.domain.StudyMember; +import com.gdgoc.study_group.studyMember.domain.StudyMemberStatus; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -18,17 +21,47 @@ public class StudyService { public final StudyRepository studyRepository; - public StudyService(StudyRepository studyRepository) { + public StudyService(StudyRepository studyRepository, MemberRepository memberRepository) { this.studyRepository = studyRepository; } + private Curriculum createCurriculum(CurriculumDTO curriculumDTO, Study study) { + return Curriculum.builder() + .study(study) + .week(curriculumDTO.getWeek()) + .subject(curriculumDTO.getSubject()) + .build(); + } + + private CurriculumDTO curriculumEntityToDTO(Curriculum curriculum) { + return CurriculumDTO.builder() + .week(curriculum.getWeek()) + .subject(curriculum.getSubject()) + .build(); + } + + private DayDTO dayEntityToDTO(Day day) { + return DayDTO.builder() + .day(day.getDay()) + .startTime(day.getStartTime()) + .build(); + } + + private Day createDay(DayDTO dayDTO, Study study) { + return Day.builder() + .study(study) + .day(dayDTO.getDay()) + .startTime(dayDTO.getStartTime()) + .build(); + } + /** * 스터디를 생성합니다. * * @param createRequest 스터디 생성 DTO * @return ResponseDTO 반환 */ - public StudyCreateResponse createStudy(StudyCreateRequest createRequest) { + public StudyCreateResponse createStudy(Long userId, StudyCreateRequest createRequest) { Study study = Study.builder() @@ -39,31 +72,25 @@ public StudyCreateResponse createStudy(StudyCreateRequest createRequest) { .maxParticipants(createRequest.getMaxParticipants()) .studyStatus(createRequest.getStudyStatus()) .curriculums(new ArrayList<>()) // 빈 리스트로 초기화 - .days(new ArrayList<>()) // 빈 리스트로 초기화 + .days(new ArrayList<>()) + .studyMembers(new ArrayList<>()) .isApplicationClosed(false) // 스터디 생성할 때 false로 설정 .build(); + // 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 + // 하려고 하는데 아직 구현중 + + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 if (createRequest.getCurriculums() != null) { for (CurriculumDTO curriculumDTO : createRequest.getCurriculums()) { - Curriculum curriculum = - Curriculum.builder() - .study(study) - .week(curriculumDTO.getWeek()) - .subject(curriculumDTO.getSubject()) - .build(); - study.getCurriculums().add(curriculum); + study.getCurriculums().add(createCurriculum(curriculumDTO, study)); } } + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 if (createRequest.getDays() != null) { for (DayDTO dayDTO : createRequest.getDays()) { - Day day = - Day.builder() - .study(study) - .day(dayDTO.getDay()) - .startTime(dayDTO.getStartTime()) - .build(); - study.getDays().add(day); + study.getDays().add(createDay(dayDTO, study)); } } @@ -121,20 +148,14 @@ public StudyDetailResponse getStudyDetail(Long studyId) { // curriculum이 있다면 curriculumDTO로 변환해 response에 추가 if (study.get().getCurriculums() != null) { for (Curriculum curriculum : study.get().getCurriculums()) { - CurriculumDTO curriculumDTO = - CurriculumDTO.builder() - .week(curriculum.getWeek()) - .subject(curriculum.getSubject()) - .build(); - detailResponse.getCurriculums().add(curriculumDTO); + detailResponse.getCurriculums().add(curriculumEntityToDTO(curriculum)); } } // day가 있다면 dayDTO로 변환해 response에 추가 if (study.get().getDays() != null) { for (Day day : study.get().getDays()) { - DayDTO dayDTO = DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); - detailResponse.getDays().add(dayDTO); + detailResponse.getDays().add(dayEntityToDTO(day)); } } @@ -147,16 +168,15 @@ public StudyDetailResponse getStudyDetail(Long studyId) { * 스터디장 권한 확인 필요 스터디를 삭제합니다 * * @param studyId 삭제할 스터디의 아이디 - * @return 삭제 완료 메시지를 담은 MessageResponse DTO + * @return 해당하는 스터디의 존재 여부 */ - public MessageResponse deleteStudy(Long studyId) { + public boolean deleteStudy(Long studyId) { Optional study = studyRepository.findById(studyId); - if (study.isEmpty()) { - return null; + if (study.isPresent()) { + studyRepository.deleteById(studyId); } - studyRepository.deleteById(studyId); - return MessageResponse.builder().message("스터디가 삭제되었습니다.").build(); + return study.isPresent(); } } diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Study.java b/src/main/java/com/gdgoc/study_group/study/domain/Study.java index 2a8b315..69b7540 100644 --- a/src/main/java/com/gdgoc/study_group/study/domain/Study.java +++ b/src/main/java/com/gdgoc/study_group/study/domain/Study.java @@ -20,7 +20,7 @@ public class Study { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @OneToMany(mappedBy = "study") + @OneToMany(mappedBy = "study", cascade = CascadeType.PERSIST) private List studyMembers = new ArrayList<>(); @OneToMany(mappedBy = "study") From 52858dc9a77977e9b006931d254bc76d217ef037 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 17 Jan 2025 17:38:41 +0900 Subject: [PATCH 07/22] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 스터디 수정 기능을 service와 controller에 추가 --- .../study/api/StudyController.java | 18 +++- .../study/application/StudyService.java | 91 +++++++++++++------ 2 files changed, 76 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index e9f7a15..7509c3d 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -38,12 +38,24 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { if (studyDetail == null) { return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); + .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); } return ResponseEntity.status(HttpStatus.OK).body(studyDetail); } + @PatchMapping("/{studyId}") + public ResponseEntity updateStudy( + @PathVariable("studyId") Long studyId, @RequestBody StudyCreateRequest updateRequest) { + Long updatedStudyId = studyService.updateStudy(studyId, updateRequest); + if (updatedStudyId == null) { + return ResponseEntity.status(HttpStatus.NOT_FOUND) + .body(MessageResponse.builder().message("해당하는 스터디가 없습니다").build()); + } + return ResponseEntity.status(HttpStatus.OK) + .body(StudyCreateResponse.builder().message("스터디가 수정되었습니다.").id(updatedStudyId).build()); + } + @DeleteMapping("/{studyId}") public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { @@ -51,10 +63,10 @@ public ResponseEntity deleteStudy(@PathVariable("studyId") Long if (isStudyExist) { return ResponseEntity.status(HttpStatus.NO_CONTENT) - .body(MessageResponse.builder().message("스터디가 삭제되었습니다.").build()); + .body(MessageResponse.builder().message("스터디가 삭제되었습니다.").build()); } return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); + .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index 4dd56ac..4f0ea02 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -8,8 +8,6 @@ import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.*; -import com.gdgoc.study_group.studyMember.domain.StudyMember; -import com.gdgoc.study_group.studyMember.domain.StudyMemberStatus; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -27,32 +25,25 @@ public StudyService(StudyRepository studyRepository, MemberRepository memberRepo private Curriculum createCurriculum(CurriculumDTO curriculumDTO, Study study) { return Curriculum.builder() - .study(study) - .week(curriculumDTO.getWeek()) - .subject(curriculumDTO.getSubject()) - .build(); + .study(study) + .week(curriculumDTO.getWeek()) + .subject(curriculumDTO.getSubject()) + .build(); } private CurriculumDTO curriculumEntityToDTO(Curriculum curriculum) { return CurriculumDTO.builder() - .week(curriculum.getWeek()) - .subject(curriculum.getSubject()) - .build(); + .week(curriculum.getWeek()) + .subject(curriculum.getSubject()) + .build(); } private DayDTO dayEntityToDTO(Day day) { - return DayDTO.builder() - .day(day.getDay()) - .startTime(day.getStartTime()) - .build(); + return DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); } private Day createDay(DayDTO dayDTO, Study study) { - return Day.builder() - .study(study) - .day(dayDTO.getDay()) - .startTime(dayDTO.getStartTime()) - .build(); + return Day.builder().study(study).day(dayDTO.getDay()).startTime(dayDTO.getStartTime()).build(); } /** @@ -129,32 +120,34 @@ public List getStudyList() { * @return 스터디 정보 반환 */ public StudyDetailResponse getStudyDetail(Long studyId) { - Optional study = studyRepository.findById(studyId); + Optional existingStudy = studyRepository.findById(studyId); + + if (existingStudy.isPresent()) { // 해당 아이디를 가진 스터디가 존재할 때 + Study study = existingStudy.get(); - if (study.isPresent()) { // 해당 아이디를 가진 스터디가 존재할 때 StudyDetailResponse detailResponse = StudyDetailResponse.builder() .id(studyId) - .name(study.get().getName()) - .description(study.get().getDescription()) - .requirement(study.get().getRequirement()) - .question(study.get().getQuestion()) + .name(study.getName()) + .description(study.getDescription()) + .requirement(study.getRequirement()) + .question(study.getQuestion()) .curriculums(new ArrayList<>()) .days(new ArrayList<>()) - .maxParticipants(study.get().getMaxParticipants()) - .isApplicationClosed(study.get().getIsApplicationClosed()) + .maxParticipants(study.getMaxParticipants()) + .isApplicationClosed(study.getIsApplicationClosed()) .build(); // curriculum이 있다면 curriculumDTO로 변환해 response에 추가 - if (study.get().getCurriculums() != null) { - for (Curriculum curriculum : study.get().getCurriculums()) { + if (study.getCurriculums() != null) { + for (Curriculum curriculum : study.getCurriculums()) { detailResponse.getCurriculums().add(curriculumEntityToDTO(curriculum)); } } // day가 있다면 dayDTO로 변환해 response에 추가 - if (study.get().getDays() != null) { - for (Day day : study.get().getDays()) { + if (study.getDays() != null) { + for (Day day : study.getDays()) { detailResponse.getDays().add(dayEntityToDTO(day)); } } @@ -164,6 +157,44 @@ public StudyDetailResponse getStudyDetail(Long studyId) { return null; } + public Long updateStudy(Long studyId, StudyCreateRequest updateRequest) { + Optional study = studyRepository.findById(studyId); + + if (study.isEmpty()) {} + + Study existingStudy = studyRepository.findById(studyId).get(); + Study updatedStudy = + Study.builder() + .id(existingStudy.getId()) + .name(existingStudy.getName()) + .description(existingStudy.getDescription()) + .requirement(existingStudy.getRequirement()) + .question(existingStudy.getQuestion()) + .curriculums(new ArrayList<>()) + .days(new ArrayList<>()) + .maxParticipants(existingStudy.getMaxParticipants()) + .isApplicationClosed(existingStudy.getIsApplicationClosed()) + .build(); + + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 + if (updateRequest.getCurriculums() != null) { + for (CurriculumDTO curriculumDTO : updateRequest.getCurriculums()) { + updatedStudy.getCurriculums().add(createCurriculum(curriculumDTO, updatedStudy)); + } + } + + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 + if (updatedStudy.getDays() != null) { + for (DayDTO dayDTO : updateRequest.getDays()) { + updatedStudy.getDays().add(createDay(dayDTO, updatedStudy)); + } + } + + studyRepository.save(updatedStudy); + + return updatedStudy.getId(); + } + /** * 스터디장 권한 확인 필요 스터디를 삭제합니다 * From 33b6e770c1ea59338d61fd1f6e65704d2855c49b Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 17 Jan 2025 17:52:24 +0900 Subject: [PATCH 08/22] =?UTF-8?q?refactor:=20response=EC=97=90=20=EB=A9=94?= =?UTF-8?q?=EC=8B=9C=EC=A7=80=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit StudyCreateResponse에서 message를 제거하고 id만 반환하도록 함 MessageResponse DTO 제거 --- .../study/api/StudyController.java | 24 +++++++++---------- .../study/application/StudyService.java | 4 ++-- .../study/dto/MessageResponse.java | 10 -------- .../study/dto/StudyCreateResponse.java | 1 - 4 files changed, 14 insertions(+), 25 deletions(-) delete mode 100644 src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 7509c3d..3845e8f 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -20,9 +20,10 @@ public StudyController(StudyService studyService, StudyRepository studyRepositor @PostMapping() public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { - StudyCreateResponse newStudy = studyService.createStudy(1L, request); // 임시 유저 + Long createdStudyId = studyService.createStudy(1L, request); // 임시 유저 - return ResponseEntity.status(HttpStatus.CREATED).body(newStudy); + return ResponseEntity.status(HttpStatus.CREATED) + .body(StudyCreateResponse.builder().id(createdStudyId).build()); } @GetMapping() @@ -37,8 +38,7 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { StudyDetailResponse studyDetail = studyService.getStudyDetail(studyId); if (studyDetail == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("해당하는 스터디가 없습니다."); } return ResponseEntity.status(HttpStatus.OK).body(studyDetail); @@ -47,26 +47,26 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { @PatchMapping("/{studyId}") public ResponseEntity updateStudy( @PathVariable("studyId") Long studyId, @RequestBody StudyCreateRequest updateRequest) { + Long updatedStudyId = studyService.updateStudy(studyId, updateRequest); + if (updatedStudyId == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(MessageResponse.builder().message("해당하는 스터디가 없습니다").build()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); } + return ResponseEntity.status(HttpStatus.OK) - .body(StudyCreateResponse.builder().message("스터디가 수정되었습니다.").id(updatedStudyId).build()); + .body(StudyCreateResponse.builder().id(updatedStudyId).build()); } @DeleteMapping("/{studyId}") - public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { + public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { boolean isStudyExist = studyService.deleteStudy(studyId); if (isStudyExist) { - return ResponseEntity.status(HttpStatus.NO_CONTENT) - .body(MessageResponse.builder().message("스터디가 삭제되었습니다.").build()); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body("스터디가 삭제되었습니다."); } - return ResponseEntity.status(HttpStatus.NOT_FOUND) - .body(MessageResponse.builder().message("해당하는 스터디가 없습니다.").build()); + return ResponseEntity.status(HttpStatus.NOT_FOUND).body("해당하는 스터디가 없습니다."); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java index 4f0ea02..43e1b44 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudyService.java @@ -52,7 +52,7 @@ private Day createDay(DayDTO dayDTO, Study study) { * @param createRequest 스터디 생성 DTO * @return ResponseDTO 반환 */ - public StudyCreateResponse createStudy(Long userId, StudyCreateRequest createRequest) { + public Long createStudy(Long userId, StudyCreateRequest createRequest) { Study study = Study.builder() @@ -87,7 +87,7 @@ public StudyCreateResponse createStudy(Long userId, StudyCreateRequest createReq studyRepository.save(study); - return StudyCreateResponse.builder().message("스터디가 생성되었습니다").id(study.getId()).build(); + return study.getId(); } /** diff --git a/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java deleted file mode 100644 index fcf398d..0000000 --- a/src/main/java/com/gdgoc/study_group/study/dto/MessageResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gdgoc.study_group.study.dto; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class MessageResponse { - private String message; -} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java index a594f7b..48a8a24 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java @@ -6,6 +6,5 @@ @Getter @Builder public class StudyCreateResponse { - private String message; private Long id; } From baf1a6eacd6197765584247869f57344c96230c9 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Tue, 21 Jan 2025 16:51:27 +0900 Subject: [PATCH 09/22] =?UTF-8?q?refactor:=20dto=EB=A5=BC=20record?= =?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 dto를 class에서 record로 변경함 --- .../exception/CustomException.java | 4 +++ .../study_group/exception/ErrorCode.java | 4 +++ .../study_group/exception/ErrorResponse.java | 4 +++ .../exception/GlobalExceptionHandler.java | 4 +++ .../study/application/AdminStudyService.java | 4 +++ ...yService.java => StudentStudyService.java} | 26 +++++++++--------- .../study/dto/StudyCreateRequest.java | 27 +++++++++---------- .../study/dto/StudyCreateResponse.java | 11 +++----- .../study/dto/StudyDetailResponse.java | 21 --------------- .../study/dto/StudyListResponse.java | 16 +++++------ .../study_group/study/dto/StudyResponse.java | 18 +++++++++++++ 11 files changed, 74 insertions(+), 65 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/exception/CustomException.java create mode 100644 src/main/java/com/gdgoc/study_group/exception/ErrorCode.java create mode 100644 src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java create mode 100644 src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java rename src/main/java/com/gdgoc/study_group/study/application/{StudyService.java => StudentStudyService.java} (89%) delete mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java create mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java diff --git a/src/main/java/com/gdgoc/study_group/exception/CustomException.java b/src/main/java/com/gdgoc/study_group/exception/CustomException.java new file mode 100644 index 0000000..5fde0b9 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/exception/CustomException.java @@ -0,0 +1,4 @@ +package com.gdgoc.study_group.exception; + +public class CustomException { +} diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java new file mode 100644 index 0000000..e104698 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java @@ -0,0 +1,4 @@ +package com.gdgoc.study_group.exception; + +public class ErrorCode { +} diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java new file mode 100644 index 0000000..b6b3ccf --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java @@ -0,0 +1,4 @@ +package com.gdgoc.study_group.exception; + +public class ErrorResponse { +} diff --git a/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..69a3ea1 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java @@ -0,0 +1,4 @@ +package com.gdgoc.study_group.exception; + +public class GlobalExceptionHandler { +} diff --git a/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java new file mode 100644 index 0000000..80ffb7a --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java @@ -0,0 +1,4 @@ +package com.gdgoc.study_group.study.application; + +public class AdminStudyService { +} diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java similarity index 89% rename from src/main/java/com/gdgoc/study_group/study/application/StudyService.java rename to src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java index 43e1b44..a47bc44 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java @@ -56,12 +56,12 @@ public Long createStudy(Long userId, StudyCreateRequest createRequest) { Study study = Study.builder() - .name(createRequest.getName()) - .description(createRequest.getDescription()) - .requirement(createRequest.getRequirements()) - .question(createRequest.getQuestion()) - .maxParticipants(createRequest.getMaxParticipants()) - .studyStatus(createRequest.getStudyStatus()) + .name(createRequest.name()) + .description(createRequest.description()) + .requirement(createRequest.requirements()) + .question(createRequest.question()) + .maxParticipants(createRequest.maxParticipants()) + .studyStatus(createRequest.studyStatus()) .curriculums(new ArrayList<>()) // 빈 리스트로 초기화 .days(new ArrayList<>()) .studyMembers(new ArrayList<>()) @@ -72,15 +72,15 @@ public Long createStudy(Long userId, StudyCreateRequest createRequest) { // 하려고 하는데 아직 구현중 // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 - if (createRequest.getCurriculums() != null) { - for (CurriculumDTO curriculumDTO : createRequest.getCurriculums()) { + if (createRequest.curriculums() != null) { + for (CurriculumDTO curriculumDTO : createRequest.curriculums()) { study.getCurriculums().add(createCurriculum(curriculumDTO, study)); } } // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 - if (createRequest.getDays() != null) { - for (DayDTO dayDTO : createRequest.getDays()) { + if (createRequest.days() != null) { + for (DayDTO dayDTO : createRequest.days()) { study.getDays().add(createDay(dayDTO, study)); } } @@ -177,15 +177,15 @@ public Long updateStudy(Long studyId, StudyCreateRequest updateRequest) { .build(); // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 - if (updateRequest.getCurriculums() != null) { - for (CurriculumDTO curriculumDTO : updateRequest.getCurriculums()) { + if (updateRequest.curriculums() != null) { + for (CurriculumDTO curriculumDTO : updateRequest.curriculums()) { updatedStudy.getCurriculums().add(createCurriculum(curriculumDTO, updatedStudy)); } } // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 if (updatedStudy.getDays() != null) { - for (DayDTO dayDTO : updateRequest.getDays()) { + for (DayDTO dayDTO : updateRequest.days()) { updatedStudy.getDays().add(createDay(dayDTO, updatedStudy)); } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java index 8369056..dbd4f1d 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java @@ -4,18 +4,17 @@ import com.gdgoc.study_group.day.dto.DayDTO; import com.gdgoc.study_group.study.domain.StudyStatus; import java.util.List; -import lombok.Builder; -import lombok.Getter; -@Getter -@Builder -public class StudyCreateRequest { - private String name; - private String description; - private String requirements; - private String question; - private Integer maxParticipants; - private StudyStatus studyStatus; - private List curriculums; - private List days; -} +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; + +public record StudyCreateRequest ( + @NotBlank(message = "스터디 이름을 입력해 주세요.") @Schema(description = "스터디 이름") String name, + @NotBlank(message = "스터디 소개를 입력해 주세요.") @Schema(description = "스터디 소개") String description, + @Schema(description = "스터디 자원 자격") String requirements, + @Schema(description = "스터디 지원 질문") String question, + @Schema(description = "스터디 최대 인원")Integer maxParticipants, + @NotNull(message = "모임 방식을 선택해 주세요.") @Schema(description = "모임 방식(온/오프라인)") StudyStatus studyStatus, + List curriculums, + List days) {} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java index 48a8a24..a664e46 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java @@ -1,10 +1,7 @@ package com.gdgoc.study_group.study.dto; -import lombok.Builder; -import lombok.Getter; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; -@Getter -@Builder -public class StudyCreateResponse { - private Long id; -} +public record StudyCreateResponse( + @NotNull(message = "id는 null이 될 수 없습니다.") @Schema(description = "생성된 스터디의 id") Long id) {} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java deleted file mode 100644 index 2557d3b..0000000 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyDetailResponse.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.gdgoc.study_group.study.dto; - -import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; -import com.gdgoc.study_group.day.dto.DayDTO; -import java.util.List; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -public class StudyDetailResponse { - private Long id; - private String name; - private String requirement; - private String description; - private String question; - private List curriculums; - private List days; - private Integer maxParticipants; - private boolean isApplicationClosed; -} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java index 7e10f67..85e7347 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java @@ -1,14 +1,10 @@ package com.gdgoc.study_group.study.dto; import com.gdgoc.study_group.study.domain.StudyStatus; -import lombok.Builder; -import lombok.Getter; +import io.swagger.v3.oas.annotations.media.Schema; -@Builder -@Getter -public class StudyListResponse { - private Long id; - private String name; - private String description; - private StudyStatus status; -} +public record StudyListResponse ( + Long id, + @Schema(description = "스터디 이름") String name, + @Schema(description = "스터디 설명") String description, + @Schema(description = "모임 방식(온/오프라인)") StudyStatus status) {} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java new file mode 100644 index 0000000..245b1b2 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java @@ -0,0 +1,18 @@ +package com.gdgoc.study_group.study.dto; + +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.dto.DayDTO; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.util.List; + +public record StudyResponse( + Long id, + @Schema(description = "스터디 이름") String name, + @Schema(description = "스터디 설명") String description, + @Schema(description = "스터디 지원 조건") String requirement, + @Schema(description = "스터디 지원 질문") String question, + @Schema(description = "스터디 커리큘럼") List curriculums, + @Schema(description = "스터디 요일 및 시간") List days, + @Schema(description = "스터디 최대 인원") Integer maxParticipants, + @Schema(description = "스터디 모집 마감 여부") boolean isApplicationClosed) {} From e45b8ad795055b8ce08001e6664c9397bd54c271 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Tue, 21 Jan 2025 16:53:32 +0900 Subject: [PATCH 10/22] =?UTF-8?q?feat:=20exception=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exception/CustomException.java | 17 +++++++++++++- .../study_group/exception/ErrorCode.java | 12 +++++++++- .../study_group/exception/ErrorResponse.java | 14 ++++++++++- .../exception/GlobalExceptionHandler.java | 23 ++++++++++++++++++- 4 files changed, 62 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/exception/CustomException.java b/src/main/java/com/gdgoc/study_group/exception/CustomException.java index 5fde0b9..96d0b25 100644 --- a/src/main/java/com/gdgoc/study_group/exception/CustomException.java +++ b/src/main/java/com/gdgoc/study_group/exception/CustomException.java @@ -1,4 +1,19 @@ package com.gdgoc.study_group.exception; -public class CustomException { +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private final ErrorCode errorCode; + + public CustomException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } + + public CustomException(ErrorCode errorCode, String errorMessage) { + super(errorMessage); + this.errorCode = errorCode; + } } diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java index e104698..ea648c3 100644 --- a/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java @@ -1,4 +1,14 @@ package com.gdgoc.study_group.exception; -public class ErrorCode { +import lombok.AllArgsConstructor; +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +@AllArgsConstructor +public enum ErrorCode { + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "내부 서버 에러가 발생했습니다."), + ; + private final HttpStatus status; + private final String message; } diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java index b6b3ccf..4284329 100644 --- a/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java @@ -1,4 +1,16 @@ package com.gdgoc.study_group.exception; -public class ErrorResponse { +public record ErrorResponse (String errorCodeName, String errorMessage){ + + public static ErrorResponse of(ErrorCode errorCode) { + return new ErrorResponse(errorCode.name(), errorCode.getMessage()); + } + + public static ErrorResponse of(ErrorCode errorCode, String errorMessage) { + return new ErrorResponse(errorCode.name(), errorMessage); + } + + public static ErrorResponse of(String errorCodeName, String errorMessage) { + return new ErrorResponse(errorCodeName, errorMessage); + } } diff --git a/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java index 69a3ea1..3482ced 100644 --- a/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java @@ -1,4 +1,25 @@ package com.gdgoc.study_group.exception; -public class GlobalExceptionHandler { +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler; + +@Slf4j +@RestControllerAdvice +public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { + + @ExceptionHandler(CustomException.class) + public ResponseEntity handleCustomException(CustomException e) { + log.info("CustomException : {}", e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()).body(ErrorResponse.of(e.getErrorCode())); + } + + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e) { + log.error("INTERNAL_SERVER_ERROR : {}", e.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + .body(ErrorResponse.of(ErrorCode.INTERNAL_SERVER_ERROR)); + } } From a412bbf2b878ecd0e18b6267627a1a6cee60b27c Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:08:13 +0900 Subject: [PATCH 11/22] =?UTF-8?q?refactor:=20curriculum=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 - domain에 create 추가 - dto를 record로 변경 --- .../curriculum/domain/Curriculum.java | 15 ++- .../curriculum/dto/CurriculumDTO.java | 17 +-- .../study/application/AdminStudyService.java | 4 - .../study/application/leaderStudyService.java | 118 ++++++++++++++++++ .../study/dto/StudyCreateResponse.java | 7 -- .../study/dto/StudyListResponse.java | 10 -- 6 files changed, 140 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java create mode 100644 src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java delete mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java delete mode 100644 src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java diff --git a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java index da5cb7c..b00dd34 100644 --- a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java +++ b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java @@ -10,10 +10,8 @@ import lombok.*; @Entity -@Builder @Getter -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Curriculum { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -25,4 +23,15 @@ public class Curriculum { private Integer week; private String subject; // 해당 회차의 주제 + + @Builder(access = AccessLevel.PRIVATE) + public Curriculum(Study study, Integer week, String subject) { + this.study = study; + this.week = week; + this.subject = subject; + } + + public static Curriculum create(Study study, Integer week, String subject) { + return Curriculum.builder().study(study).week(week).subject(subject).build(); + } } diff --git a/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java b/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java index a31b923..1f21577 100644 --- a/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java +++ b/src/main/java/com/gdgoc/study_group/curriculum/dto/CurriculumDTO.java @@ -1,11 +1,14 @@ package com.gdgoc.study_group.curriculum.dto; -import lombok.Builder; -import lombok.Getter; +import com.gdgoc.study_group.curriculum.domain.Curriculum; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; -@Getter -@Builder -public class CurriculumDTO { - private Integer week; - private String subject; +public record CurriculumDTO( + @NotBlank(message = "스터디 주차를 입력해 주세요.") @Schema(description = "스터디 주차") Integer week, + @NotBlank(message = "주제를 입력해 주세요.") @Schema(description = "해당 주차의 주제") String subject) { + + public static CurriculumDTO from(Curriculum curriculum) { + return new CurriculumDTO(curriculum.getWeek(), curriculum.getSubject()); + } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java deleted file mode 100644 index 80ffb7a..0000000 --- a/src/main/java/com/gdgoc/study_group/study/application/AdminStudyService.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.gdgoc.study_group.study.application; - -public class AdminStudyService { -} diff --git a/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java new file mode 100644 index 0000000..2149d9d --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java @@ -0,0 +1,118 @@ +package com.gdgoc.study_group.study.application; + +import com.gdgoc.study_group.curriculum.domain.Curriculum; +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; +import com.gdgoc.study_group.day.domain.Day; +import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.exception.CustomException; +import com.gdgoc.study_group.study.dao.StudyRepository; +import com.gdgoc.study_group.study.domain.Study; +import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; + +import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; + +@Service +@Transactional(readOnly = true) +public class AdminStudyService { + + public final StudyRepository studyRepository; + + public AdminStudyService(StudyRepository studyRepository) { + this.studyRepository = studyRepository; + } + + + /** + * 스터디를 생성합니다. + * + * @param request 스터디 생성 DTO + * @return ResponseDTO 반환 + */ + public Long createStudy(StudyCreateRequest request) { + + Study study = Study.create( + request.name(), + request.description(), + request.requirements(), + request.question(), + request.maxParticipants(), + request.studyStatus() + ); + + + // TODO: 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 + + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 + List curriculums = request.curriculums().stream() + .map(curriculumDTO -> Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) + .collect(Collectors.toList()); + + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 + List days = request.days().stream() + .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) + .collect(Collectors.toList()); + + study.addInfo(curriculums, days); + studyRepository.save(study); + + return study.getId(); + } + + + public Long updateStudy(Long studyId, StudyCreateRequest updateRequest) { + Optional study = studyRepository.findById(studyId); + + if (study.isEmpty()) {} + + Study existingStudy = studyRepository.findById(studyId).get(); + Study updatedStudy = + Study.builder() + .id(existingStudy.getId()) + .name(existingStudy.getName()) + .description(existingStudy.getDescription()) + .requirement(existingStudy.getRequirement()) + .question(existingStudy.getQuestion()) + .curriculums(new ArrayList<>()) + .days(new ArrayList<>()) + .maxParticipants(existingStudy.getMaxParticipants()) + .isApplicationClosed(existingStudy.getIsApplicationClosed()) + .build(); + + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 + if (updateRequest.curriculums() != null) { + for (CurriculumDTO curriculumDTO : updateRequest.curriculums()) { + updatedStudy.getCurriculums().add(createCurriculum(curriculumDTO, updatedStudy)); + } + } + + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 + if (updatedStudy.getDays() != null) { + for (DayDTO dayDTO : updateRequest.days()) { + updatedStudy.getDays().add(createDay(dayDTO, updatedStudy)); + } + } + + studyRepository.save(updatedStudy); + + return updatedStudy.getId(); + } + + /** + * 스터디장 권한 확인 필요 스터디를 삭제합니다 + * + * @param studyId 삭제할 스터디의 아이디 + * @return 해당하는 스터디의 존재 여부 + */ + public void deleteStudy(Long studyId) { + Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); + studyRepository.delete(study); + } + +} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java deleted file mode 100644 index a664e46..0000000 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateResponse.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.gdgoc.study_group.study.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import jakarta.validation.constraints.NotNull; - -public record StudyCreateResponse( - @NotNull(message = "id는 null이 될 수 없습니다.") @Schema(description = "생성된 스터디의 id") Long id) {} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java deleted file mode 100644 index 85e7347..0000000 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyListResponse.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gdgoc.study_group.study.dto; - -import com.gdgoc.study_group.study.domain.StudyStatus; -import io.swagger.v3.oas.annotations.media.Schema; - -public record StudyListResponse ( - Long id, - @Schema(description = "스터디 이름") String name, - @Schema(description = "스터디 설명") String description, - @Schema(description = "모임 방식(온/오프라인)") StudyStatus status) {} From 2a4f89f95627f3fd9df16641751b5cf71a0c6380 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:09:30 +0900 Subject: [PATCH 12/22] =?UTF-8?q?feat:=20day=EC=97=90=20create=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 --- .../com/gdgoc/study_group/day/domain/Day.java | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/day/domain/Day.java b/src/main/java/com/gdgoc/study_group/day/domain/Day.java index e1133b2..cb3254c 100644 --- a/src/main/java/com/gdgoc/study_group/day/domain/Day.java +++ b/src/main/java/com/gdgoc/study_group/day/domain/Day.java @@ -12,10 +12,8 @@ import lombok.*; @Entity -@Builder @Getter -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Day { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -29,4 +27,15 @@ public class Day { @JsonFormat(pattern = "HH:mm") private LocalTime startTime; + + @Builder(access = AccessLevel.PRIVATE) + public Day(Study study, String day, LocalTime startTime) { + this.study = study; + this.day = day; + this.startTime = startTime; + } + + public static Day create(Study study, String day, LocalTime startTime) { + return Day.builder().study(study).day(day).startTime(startTime).build(); + } } From d864b11e293374ae4411b1514940452d1630d27d Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:09:47 +0900 Subject: [PATCH 13/22] =?UTF-8?q?refactor:=20record=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gdgoc/study_group/day/dto/DayDTO.java | 20 +++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java index eb7b4ec..5f85a95 100644 --- a/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java +++ b/src/main/java/com/gdgoc/study_group/day/dto/DayDTO.java @@ -1,15 +1,19 @@ package com.gdgoc.study_group.day.dto; import com.fasterxml.jackson.annotation.JsonFormat; +import com.gdgoc.study_group.day.domain.Day; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotBlank; import java.time.LocalTime; -import lombok.Builder; -import lombok.Getter; -@Getter -@Builder -public class DayDTO { - private String day; +public record DayDTO( + @NotBlank(message = "스터디 요일을 입력해 주세요.") @Schema(description = "스터디 요일") String day, + @JsonFormat(pattern = "HH:mm") // "startTime": "14:00" 형식으로 입력 + @NotBlank(message = "스터디 시간을 입력해 주세요") + @Schema(description = "스터디 시간") + LocalTime startTime) { - @JsonFormat(pattern = "HH:mm") // "startTime": "14:00" 형식으로 입력 - private LocalTime startTime; + public static DayDTO from(Day day) { + return new DayDTO(day.getDay(), day.getStartTime()); + } } From eb57a8ffa8364f92872ba7ce08947d76162a203e Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:10:32 +0900 Subject: [PATCH 14/22] =?UTF-8?q?feat:=20custom=20exception=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 --- .../exception/CustomException.java | 18 +++++++-------- .../study_group/exception/ErrorCode.java | 12 ++++++---- .../study_group/exception/ErrorResponse.java | 20 ++++++++-------- .../exception/GlobalExceptionHandler.java | 23 ++++++++++--------- 4 files changed, 39 insertions(+), 34 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/exception/CustomException.java b/src/main/java/com/gdgoc/study_group/exception/CustomException.java index 96d0b25..578cd17 100644 --- a/src/main/java/com/gdgoc/study_group/exception/CustomException.java +++ b/src/main/java/com/gdgoc/study_group/exception/CustomException.java @@ -5,15 +5,15 @@ @Getter public class CustomException extends RuntimeException { - private final ErrorCode errorCode; + private final ErrorCode errorCode; - public CustomException(ErrorCode errorCode) { - super(errorCode.getMessage()); - this.errorCode = errorCode; - } + public CustomException(ErrorCode errorCode) { + super(errorCode.getMessage()); + this.errorCode = errorCode; + } - public CustomException(ErrorCode errorCode, String errorMessage) { - super(errorMessage); - this.errorCode = errorCode; - } + public CustomException(ErrorCode errorCode, String errorMessage) { + super(errorMessage); + this.errorCode = errorCode; + } } diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java index ea648c3..bab6cb5 100644 --- a/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorCode.java @@ -7,8 +7,12 @@ @Getter @AllArgsConstructor public enum ErrorCode { - INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "내부 서버 에러가 발생했습니다."), - ; - private final HttpStatus status; - private final String message; + INTERNAL_SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR, "내부 서버 에러가 발생했습니다."), + + // study + STUDY_NOT_FOUND(HttpStatus.NOT_FOUND, "존재하지 않는 스터디입니다."), + ; + + private final HttpStatus status; + private final String message; } diff --git a/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java index 4284329..f91d2d8 100644 --- a/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java +++ b/src/main/java/com/gdgoc/study_group/exception/ErrorResponse.java @@ -1,16 +1,16 @@ package com.gdgoc.study_group.exception; -public record ErrorResponse (String errorCodeName, String errorMessage){ +public record ErrorResponse(String errorCodeName, String errorMessage) { - public static ErrorResponse of(ErrorCode errorCode) { - return new ErrorResponse(errorCode.name(), errorCode.getMessage()); - } + public static ErrorResponse of(ErrorCode errorCode) { + return new ErrorResponse(errorCode.name(), errorCode.getMessage()); + } - public static ErrorResponse of(ErrorCode errorCode, String errorMessage) { - return new ErrorResponse(errorCode.name(), errorMessage); - } + public static ErrorResponse of(ErrorCode errorCode, String errorMessage) { + return new ErrorResponse(errorCode.name(), errorMessage); + } - public static ErrorResponse of(String errorCodeName, String errorMessage) { - return new ErrorResponse(errorCodeName, errorMessage); - } + public static ErrorResponse of(String errorCodeName, String errorMessage) { + return new ErrorResponse(errorCodeName, errorMessage); + } } diff --git a/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java index 3482ced..8e11887 100644 --- a/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/gdgoc/study_group/exception/GlobalExceptionHandler.java @@ -10,16 +10,17 @@ @RestControllerAdvice public class GlobalExceptionHandler extends ResponseEntityExceptionHandler { - @ExceptionHandler(CustomException.class) - public ResponseEntity handleCustomException(CustomException e) { - log.info("CustomException : {}", e.getMessage()); - return ResponseEntity.status(e.getErrorCode().getStatus()).body(ErrorResponse.of(e.getErrorCode())); - } + @ExceptionHandler(CustomException.class) + public ResponseEntity handleCustomException(CustomException e) { + log.info("CustomException : {}", e.getMessage()); + return ResponseEntity.status(e.getErrorCode().getStatus()) + .body(ErrorResponse.of(e.getErrorCode())); + } - @ExceptionHandler(Exception.class) - public ResponseEntity handleException(Exception e) { - log.error("INTERNAL_SERVER_ERROR : {}", e.getMessage()); - return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) - .body(ErrorResponse.of(ErrorCode.INTERNAL_SERVER_ERROR)); - } + @ExceptionHandler(Exception.class) + public ResponseEntity handleException(Exception e) { + log.error("INTERNAL_SERVER_ERROR : {}", e.getMessage()); + return ResponseEntity.status(ErrorCode.INTERNAL_SERVER_ERROR.getStatus()) + .body(ErrorResponse.of(ErrorCode.INTERNAL_SERVER_ERROR)); + } } From 6633caf94f40502350ac10de9d337862784f47a8 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:11:30 +0900 Subject: [PATCH 15/22] =?UTF-8?q?refactor:=20record=EB=A1=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit StudyDetailResponse와 StudyListResponse 통일 --- .../study/dto/StudyCreateRequest.java | 22 ++++++------ .../study_group/study/dto/StudyResponse.java | 34 +++++++++++++------ 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java index dbd4f1d..597443a 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java @@ -3,18 +3,18 @@ import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; import com.gdgoc.study_group.day.dto.DayDTO; import com.gdgoc.study_group.study.domain.StudyStatus; -import java.util.List; - import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; +import java.util.List; -public record StudyCreateRequest ( - @NotBlank(message = "스터디 이름을 입력해 주세요.") @Schema(description = "스터디 이름") String name, - @NotBlank(message = "스터디 소개를 입력해 주세요.") @Schema(description = "스터디 소개") String description, - @Schema(description = "스터디 자원 자격") String requirements, - @Schema(description = "스터디 지원 질문") String question, - @Schema(description = "스터디 최대 인원")Integer maxParticipants, - @NotNull(message = "모임 방식을 선택해 주세요.") @Schema(description = "모임 방식(온/오프라인)") StudyStatus studyStatus, - List curriculums, - List days) {} +public record StudyCreateRequest( + @NotBlank(message = "스터디 이름을 입력해 주세요.") @Schema(description = "스터디 이름") String name, + @NotBlank(message = "스터디 소개를 입력해 주세요.") @Schema(description = "스터디 소개") String description, + @Schema(description = "스터디 자원 자격") String requirement, + @Schema(description = "스터디 지원 질문") String question, + @Schema(description = "스터디 최대 인원") Integer maxParticipants, + @Schema(description = "스터디 커리큘럼") List curriculums, + @Schema(description = "스터디 요일 및 시간") List days, + @NotNull(message = "모임 방식을 선택해 주세요.") @Schema(description = "모임 방식(온/오프라인)") + StudyStatus studyStatus) {} diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java index 245b1b2..ff19729 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyResponse.java @@ -2,17 +2,31 @@ import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; import com.gdgoc.study_group.day.dto.DayDTO; +import com.gdgoc.study_group.study.domain.Study; import io.swagger.v3.oas.annotations.media.Schema; - import java.util.List; public record StudyResponse( - Long id, - @Schema(description = "스터디 이름") String name, - @Schema(description = "스터디 설명") String description, - @Schema(description = "스터디 지원 조건") String requirement, - @Schema(description = "스터디 지원 질문") String question, - @Schema(description = "스터디 커리큘럼") List curriculums, - @Schema(description = "스터디 요일 및 시간") List days, - @Schema(description = "스터디 최대 인원") Integer maxParticipants, - @Schema(description = "스터디 모집 마감 여부") boolean isApplicationClosed) {} + Long id, + @Schema(description = "스터디 이름") String name, + @Schema(description = "스터디 설명") String description, + @Schema(description = "스터디 지원 조건") String requirement, + @Schema(description = "스터디 지원 질문") String question, + @Schema(description = "스터디 커리큘럼") List curriculums, + @Schema(description = "스터디 요일 및 시간") List days, + @Schema(description = "스터디 최대 인원") Integer maxParticipants, + @Schema(description = "스터디 모집 마감 여부") boolean isApplicationClosed) { + + public static StudyResponse from(Study study) { + return new StudyResponse( + study.getId(), + study.getName(), + study.getDescription(), + study.getRequirement(), + study.getQuestion(), + study.getCurriculums().stream().map(CurriculumDTO::from).toList(), + study.getDays().stream().map(DayDTO::from).toList(), + study.getMaxParticipants(), + study.getIsApplicationClosed()); + } +} From 047112bb01655b5dfdb2bb26a56b95944456c6bc Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:12:31 +0900 Subject: [PATCH 16/22] =?UTF-8?q?feat:=20study=20=EB=8F=84=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=EC=97=90=20create,=20update=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../gdgoc/study_group/study/domain/Study.java | 57 ++++++++++++++++++- 1 file changed, 54 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Study.java b/src/main/java/com/gdgoc/study_group/study/domain/Study.java index 69b7540..1ec1cca 100644 --- a/src/main/java/com/gdgoc/study_group/study/domain/Study.java +++ b/src/main/java/com/gdgoc/study_group/study/domain/Study.java @@ -11,10 +11,8 @@ import lombok.*; @Entity -@Builder @Getter -@AllArgsConstructor(access = AccessLevel.PRIVATE) -@NoArgsConstructor +@NoArgsConstructor(access = AccessLevel.PROTECTED) public class Study { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -44,4 +42,57 @@ public class Study { private String question; // 지원 질문, nullable: 지원 답변 없이 바로 신청 가능 private Integer maxParticipants; // null == 인원 제한 X private Boolean isApplicationClosed = false; // 멤버 지원 종료 여부(기본값은 지원 가능) + + @Builder(access = AccessLevel.PRIVATE) + private Study( + String name, + String description, + String requirement, + String question, + Integer maxParticipants, + StudyStatus studyStatus) { + this.name = name; + this.description = description; + this.requirement = requirement; + this.question = question; + this.maxParticipants = maxParticipants; + this.studyStatus = studyStatus; + } + + public static Study create( + String name, + String description, + String requirement, + String question, + Integer maxParticipants, + StudyStatus status) { + return Study.builder() + .name(name) + .description(description) + .requirement(requirement) + .question(question) + .maxParticipants(maxParticipants) + .studyStatus(status) + .build(); + } + + public void addInfo(List curriculums, List days) { + this.curriculums.addAll(curriculums); + this.days.addAll(days); + } + + public void update( + String name, + String description, + String requirement, + String question, + Integer maxParticipants, + StudyStatus studyStatus) { + this.name = name; + this.description = description; + this.requirement = requirement; + this.question = question; + this.maxParticipants = maxParticipants; + this.studyStatus = studyStatus; + } } From 2ce3d7846695482061378999d1f979488fad95f8 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:14:10 +0900 Subject: [PATCH 17/22] =?UTF-8?q?refactor:=20study=20service=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 - 스터디장 권한이 필요한 함수는 LeaderStudyService로 분리 - dto 변경에 따른 수정 --- .../study/application/LeaderStudyService.java | 76 +++++++ .../application/StudentStudyService.java | 215 ++++-------------- .../study/application/leaderStudyService.java | 118 ---------- 3 files changed, 119 insertions(+), 290 deletions(-) create mode 100644 src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java delete mode 100644 src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java diff --git a/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java new file mode 100644 index 0000000..8e2dfc9 --- /dev/null +++ b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java @@ -0,0 +1,76 @@ +package com.gdgoc.study_group.study.application; + +import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; + +import com.gdgoc.study_group.curriculum.domain.Curriculum; +import com.gdgoc.study_group.day.domain.Day; +import com.gdgoc.study_group.exception.CustomException; +import com.gdgoc.study_group.study.dao.StudyRepository; +import com.gdgoc.study_group.study.domain.Study; +import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class LeaderStudyService { + + // TODO: 스터디장 권한 확인 필요 + + public final StudyRepository studyRepository; + + /** + * 스터디 정보를 수정합니다. + * + * @param studyId 수정할 스터디 ID + * @param request 수정할 스터디의 정보 + */ + @Transactional(readOnly = false) + public void updateStudy(Long studyId, StudyCreateRequest request) { + Study study = + studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); + + study.update( + request.name(), + request.description(), + request.requirement(), + request.question(), + request.maxParticipants(), + request.studyStatus()); + + study.getCurriculums().clear(); + study + .getCurriculums() + .addAll( + request.curriculums().stream() + .map( + curriculumDTO -> + Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) + .toList()); + + study.getDays().clear(); + study + .getDays() + .addAll( + request.days().stream() + .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) + .toList()); + + studyRepository.save(study); + } + + /** + * 스터디장 권한 확인 필요 스터디를 삭제합니다 + * + * @param studyId 삭제할 스터디의 아이디 + * @return 해당하는 스터디의 존재 여부 + */ + @Transactional(readOnly = false) + public void deleteStudy(Long studyId) { + Study study = + studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); + studyRepository.delete(study); + } +} diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java index a47bc44..33c37de 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java @@ -1,90 +1,61 @@ package com.gdgoc.study_group.study.application; +import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; + import com.gdgoc.study_group.curriculum.domain.Curriculum; -import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; import com.gdgoc.study_group.day.domain.Day; -import com.gdgoc.study_group.day.dto.DayDTO; -import com.gdgoc.study_group.member.dao.MemberRepository; +import com.gdgoc.study_group.exception.CustomException; import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.*; -import java.util.ArrayList; import java.util.List; -import java.util.Optional; +import java.util.stream.Collectors; +import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; -/** 예외처리 + 권한 확인 아직 안 함.... 빨리 하겠슴다 */ @Service -public class StudyService { +@RequiredArgsConstructor +@Transactional(readOnly = true) +public class StudentStudyService { public final StudyRepository studyRepository; - public StudyService(StudyRepository studyRepository, MemberRepository memberRepository) { - this.studyRepository = studyRepository; - } - - private Curriculum createCurriculum(CurriculumDTO curriculumDTO, Study study) { - return Curriculum.builder() - .study(study) - .week(curriculumDTO.getWeek()) - .subject(curriculumDTO.getSubject()) - .build(); - } - - private CurriculumDTO curriculumEntityToDTO(Curriculum curriculum) { - return CurriculumDTO.builder() - .week(curriculum.getWeek()) - .subject(curriculum.getSubject()) - .build(); - } - - private DayDTO dayEntityToDTO(Day day) { - return DayDTO.builder().day(day.getDay()).startTime(day.getStartTime()).build(); - } - - private Day createDay(DayDTO dayDTO, Study study) { - return Day.builder().study(study).day(dayDTO.getDay()).startTime(dayDTO.getStartTime()).build(); - } - /** * 스터디를 생성합니다. * - * @param createRequest 스터디 생성 DTO + * @param request 스터디 생성 DTO * @return ResponseDTO 반환 */ - public Long createStudy(Long userId, StudyCreateRequest createRequest) { + @Transactional(readOnly = false) + public Long createStudy(StudyCreateRequest request) { Study study = - Study.builder() - .name(createRequest.name()) - .description(createRequest.description()) - .requirement(createRequest.requirements()) - .question(createRequest.question()) - .maxParticipants(createRequest.maxParticipants()) - .studyStatus(createRequest.studyStatus()) - .curriculums(new ArrayList<>()) // 빈 리스트로 초기화 - .days(new ArrayList<>()) - .studyMembers(new ArrayList<>()) - .isApplicationClosed(false) // 스터디 생성할 때 false로 설정 - .build(); - - // 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 - // 하려고 하는데 아직 구현중 - - // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 - if (createRequest.curriculums() != null) { - for (CurriculumDTO curriculumDTO : createRequest.curriculums()) { - study.getCurriculums().add(createCurriculum(curriculumDTO, study)); - } - } - - // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 - if (createRequest.days() != null) { - for (DayDTO dayDTO : createRequest.days()) { - study.getDays().add(createDay(dayDTO, study)); - } - } - + Study.create( + request.name(), + request.description(), + request.requirement(), + request.question(), + request.maxParticipants(), + request.studyStatus()); + + // TODO: 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 + + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 + List curriculums = + request.curriculums().stream() + .map( + curriculumDTO -> + Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) + .collect(Collectors.toList()); + + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 + List days = + request.days().stream() + .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) + .collect(Collectors.toList()); + + study.addInfo(curriculums, days); studyRepository.save(study); return study.getId(); @@ -95,22 +66,8 @@ public Long createStudy(Long userId, StudyCreateRequest createRequest) { * * @return 스터디 전체 목록 리스트 */ - public List getStudyList() { - List studyList = studyRepository.findAll(); - List listResponse = new ArrayList<>(); - - for (Study study : studyList) { - StudyListResponse studyListResponse = - StudyListResponse.builder() - .id(study.getId()) - .name(study.getName()) - .description(study.getDescription()) - .status(study.getStudyStatus()) - .build(); - listResponse.add(studyListResponse); - } - - return listResponse; + public List getAllStudies() { + return studyRepository.findAll().stream().map(StudyResponse::from).toList(); } /** @@ -119,95 +76,9 @@ public List getStudyList() { * @param studyId 조회할 스터디 아이디 * @return 스터디 정보 반환 */ - public StudyDetailResponse getStudyDetail(Long studyId) { - Optional existingStudy = studyRepository.findById(studyId); - - if (existingStudy.isPresent()) { // 해당 아이디를 가진 스터디가 존재할 때 - Study study = existingStudy.get(); - - StudyDetailResponse detailResponse = - StudyDetailResponse.builder() - .id(studyId) - .name(study.getName()) - .description(study.getDescription()) - .requirement(study.getRequirement()) - .question(study.getQuestion()) - .curriculums(new ArrayList<>()) - .days(new ArrayList<>()) - .maxParticipants(study.getMaxParticipants()) - .isApplicationClosed(study.getIsApplicationClosed()) - .build(); - - // curriculum이 있다면 curriculumDTO로 변환해 response에 추가 - if (study.getCurriculums() != null) { - for (Curriculum curriculum : study.getCurriculums()) { - detailResponse.getCurriculums().add(curriculumEntityToDTO(curriculum)); - } - } - - // day가 있다면 dayDTO로 변환해 response에 추가 - if (study.getDays() != null) { - for (Day day : study.getDays()) { - detailResponse.getDays().add(dayEntityToDTO(day)); - } - } - - return detailResponse; - } - return null; - } - - public Long updateStudy(Long studyId, StudyCreateRequest updateRequest) { - Optional study = studyRepository.findById(studyId); - - if (study.isEmpty()) {} - - Study existingStudy = studyRepository.findById(studyId).get(); - Study updatedStudy = - Study.builder() - .id(existingStudy.getId()) - .name(existingStudy.getName()) - .description(existingStudy.getDescription()) - .requirement(existingStudy.getRequirement()) - .question(existingStudy.getQuestion()) - .curriculums(new ArrayList<>()) - .days(new ArrayList<>()) - .maxParticipants(existingStudy.getMaxParticipants()) - .isApplicationClosed(existingStudy.getIsApplicationClosed()) - .build(); - - // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 - if (updateRequest.curriculums() != null) { - for (CurriculumDTO curriculumDTO : updateRequest.curriculums()) { - updatedStudy.getCurriculums().add(createCurriculum(curriculumDTO, updatedStudy)); - } - } - - // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 - if (updatedStudy.getDays() != null) { - for (DayDTO dayDTO : updateRequest.days()) { - updatedStudy.getDays().add(createDay(dayDTO, updatedStudy)); - } - } - - studyRepository.save(updatedStudy); - - return updatedStudy.getId(); - } - - /** - * 스터디장 권한 확인 필요 스터디를 삭제합니다 - * - * @param studyId 삭제할 스터디의 아이디 - * @return 해당하는 스터디의 존재 여부 - */ - public boolean deleteStudy(Long studyId) { - Optional study = studyRepository.findById(studyId); - - if (study.isPresent()) { - studyRepository.deleteById(studyId); - } - - return study.isPresent(); + public StudyResponse getStudyDetail(Long studyId) { + Study study = + studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); + return StudyResponse.from(study); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java deleted file mode 100644 index 2149d9d..0000000 --- a/src/main/java/com/gdgoc/study_group/study/application/leaderStudyService.java +++ /dev/null @@ -1,118 +0,0 @@ -package com.gdgoc.study_group.study.application; - -import com.gdgoc.study_group.curriculum.domain.Curriculum; -import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; -import com.gdgoc.study_group.day.domain.Day; -import com.gdgoc.study_group.day.dto.DayDTO; -import com.gdgoc.study_group.exception.CustomException; -import com.gdgoc.study_group.study.dao.StudyRepository; -import com.gdgoc.study_group.study.domain.Study; -import com.gdgoc.study_group.study.dto.StudyCreateRequest; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.stream.Collectors; - -import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; - -@Service -@Transactional(readOnly = true) -public class AdminStudyService { - - public final StudyRepository studyRepository; - - public AdminStudyService(StudyRepository studyRepository) { - this.studyRepository = studyRepository; - } - - - /** - * 스터디를 생성합니다. - * - * @param request 스터디 생성 DTO - * @return ResponseDTO 반환 - */ - public Long createStudy(StudyCreateRequest request) { - - Study study = Study.create( - request.name(), - request.description(), - request.requirements(), - request.question(), - request.maxParticipants(), - request.studyStatus() - ); - - - // TODO: 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 - - // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 - List curriculums = request.curriculums().stream() - .map(curriculumDTO -> Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) - .collect(Collectors.toList()); - - // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 - List days = request.days().stream() - .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) - .collect(Collectors.toList()); - - study.addInfo(curriculums, days); - studyRepository.save(study); - - return study.getId(); - } - - - public Long updateStudy(Long studyId, StudyCreateRequest updateRequest) { - Optional study = studyRepository.findById(studyId); - - if (study.isEmpty()) {} - - Study existingStudy = studyRepository.findById(studyId).get(); - Study updatedStudy = - Study.builder() - .id(existingStudy.getId()) - .name(existingStudy.getName()) - .description(existingStudy.getDescription()) - .requirement(existingStudy.getRequirement()) - .question(existingStudy.getQuestion()) - .curriculums(new ArrayList<>()) - .days(new ArrayList<>()) - .maxParticipants(existingStudy.getMaxParticipants()) - .isApplicationClosed(existingStudy.getIsApplicationClosed()) - .build(); - - // 등록된 커리큘럼이 있다면 엔티티로 변환하여 스터디에 추가 - if (updateRequest.curriculums() != null) { - for (CurriculumDTO curriculumDTO : updateRequest.curriculums()) { - updatedStudy.getCurriculums().add(createCurriculum(curriculumDTO, updatedStudy)); - } - } - - // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 스터디에 추가 - if (updatedStudy.getDays() != null) { - for (DayDTO dayDTO : updateRequest.days()) { - updatedStudy.getDays().add(createDay(dayDTO, updatedStudy)); - } - } - - studyRepository.save(updatedStudy); - - return updatedStudy.getId(); - } - - /** - * 스터디장 권한 확인 필요 스터디를 삭제합니다 - * - * @param studyId 삭제할 스터디의 아이디 - * @return 해당하는 스터디의 존재 여부 - */ - public void deleteStudy(Long studyId) { - Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); - studyRepository.delete(study); - } - -} From 889051aecbaa4b1de35f58582081ad16ac80c43c Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 00:15:30 +0900 Subject: [PATCH 18/22] =?UTF-8?q?refactor:=20study=20controller=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 바뀐 response에 따라 수정함 --- .../study/api/StudyController.java | 55 ++++++++----------- 1 file changed, 24 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index 3845e8f..f574730 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -1,72 +1,65 @@ package com.gdgoc.study_group.study.api; -import com.gdgoc.study_group.study.application.StudyService; -import com.gdgoc.study_group.study.dao.StudyRepository; +import com.gdgoc.study_group.study.application.StudentStudyService; +import com.gdgoc.study_group.study.application.LeaderStudyService; import com.gdgoc.study_group.study.dto.*; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; +import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/studies") +@Tag(name = "Study") +@RequiredArgsConstructor public class StudyController { - public final StudyService studyService; - - public StudyController(StudyService studyService, StudyRepository studyRepository) { - this.studyService = studyService; - } + public final StudentStudyService studentStudyService; + public final LeaderStudyService leaderStudyService; + @Operation(summary = "스터디 생성", description = "자율스터디를 생성합니다.") @PostMapping() - public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { - Long createdStudyId = studyService.createStudy(1L, request); // 임시 유저 + public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { + Long studyId = studentStudyService.createStudy(request); - return ResponseEntity.status(HttpStatus.CREATED) - .body(StudyCreateResponse.builder().id(createdStudyId).build()); + return ResponseEntity.ok(studyId); } + @Operation(summary = "전체 스터디 조회", description = "모든 스터디를 조회합니다.") @GetMapping() - public ResponseEntity> getStudyList() { - List studyList = studyService.getStudyList(); + public ResponseEntity> getStudyList() { + List studyList = studentStudyService.getAllStudies(); return ResponseEntity.status(HttpStatus.OK).body(studyList); } + @Operation(summary = "개별 스터디 조회", description = "스터디 하나의 정보를 조회합니다.") @GetMapping("/{studyId}") public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { - StudyDetailResponse studyDetail = studyService.getStudyDetail(studyId); - - if (studyDetail == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("해당하는 스터디가 없습니다."); - } + StudyResponse studyDetail = studentStudyService.getStudyDetail(studyId); return ResponseEntity.status(HttpStatus.OK).body(studyDetail); } + @Operation(summary = "스터디 수정", description = "스터디 정보를 수정합니다. 스터디장만 수정할 수 있습니다.") @PatchMapping("/{studyId}") public ResponseEntity updateStudy( @PathVariable("studyId") Long studyId, @RequestBody StudyCreateRequest updateRequest) { - Long updatedStudyId = studyService.updateStudy(studyId, updateRequest); + leaderStudyService.updateStudy(studyId, updateRequest); - if (updatedStudyId == null) { - return ResponseEntity.status(HttpStatus.NOT_FOUND).build(); - } - - return ResponseEntity.status(HttpStatus.OK) - .body(StudyCreateResponse.builder().id(updatedStudyId).build()); + return ResponseEntity.ok().build(); } + @Operation(summary = "스터디 삭제", description = "스터디를 삭제합니다. 스터디장만 삭제할 수 있습니다.") @DeleteMapping("/{studyId}") public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) { - boolean isStudyExist = studyService.deleteStudy(studyId); - - if (isStudyExist) { - return ResponseEntity.status(HttpStatus.NO_CONTENT).body("스터디가 삭제되었습니다."); - } + leaderStudyService.deleteStudy(studyId); - return ResponseEntity.status(HttpStatus.NOT_FOUND).body("해당하는 스터디가 없습니다."); + return ResponseEntity.status(HttpStatus.NO_CONTENT).body("스터디가 삭제되었습니다."); } } From ee5864bb76b8683a9f0d0a88060f9c3ce4f7de64 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Thu, 23 Jan 2025 22:01:26 +0900 Subject: [PATCH 19/22] =?UTF-8?q?refactor:=20springdoc=20=EB=B2=84?= =?UTF-8?q?=EC=A0=84=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 호환성 문제로 springdoc 버전을 2.5.0에서 2.7.0으로 변경 --- build.gradle | 2 +- .../java/com/gdgoc/study_group/study/api/StudyController.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index e7bccc9..07ed4e5 100644 --- a/build.gradle +++ b/build.gradle @@ -28,7 +28,7 @@ repositories { dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-data-jpa' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.7.0' implementation 'org.postgresql:postgresql' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index f574730..b6bfec3 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -1,7 +1,7 @@ package com.gdgoc.study_group.study.api; -import com.gdgoc.study_group.study.application.StudentStudyService; import com.gdgoc.study_group.study.application.LeaderStudyService; +import com.gdgoc.study_group.study.application.StudentStudyService; import com.gdgoc.study_group.study.dto.*; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; From ff5eb997a80d959a45142834f1ed57e72e71c6a5 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 24 Jan 2025 16:41:47 +0900 Subject: [PATCH 20/22] =?UTF-8?q?refactor:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=83=9D=EC=84=B1=EC=9E=90=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - AllArgsConstructor 추가 - 불필요한 생성자 제거 --- .../gdgoc/study_group/curriculum/domain/Curriculum.java | 9 ++------- src/main/java/com/gdgoc/study_group/day/domain/Day.java | 9 ++------- ...yCreateRequest.java => StudyCreateUpdateRequest.java} | 0 3 files changed, 4 insertions(+), 14 deletions(-) rename src/main/java/com/gdgoc/study_group/study/dto/{StudyCreateRequest.java => StudyCreateUpdateRequest.java} (100%) diff --git a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java index b00dd34..4f2112e 100644 --- a/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java +++ b/src/main/java/com/gdgoc/study_group/curriculum/domain/Curriculum.java @@ -11,7 +11,9 @@ @Entity @Getter +@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Curriculum { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -24,13 +26,6 @@ public class Curriculum { private Integer week; private String subject; // 해당 회차의 주제 - @Builder(access = AccessLevel.PRIVATE) - public Curriculum(Study study, Integer week, String subject) { - this.study = study; - this.week = week; - this.subject = subject; - } - public static Curriculum create(Study study, Integer week, String subject) { return Curriculum.builder().study(study).week(week).subject(subject).build(); } diff --git a/src/main/java/com/gdgoc/study_group/day/domain/Day.java b/src/main/java/com/gdgoc/study_group/day/domain/Day.java index cb3254c..f8b4665 100644 --- a/src/main/java/com/gdgoc/study_group/day/domain/Day.java +++ b/src/main/java/com/gdgoc/study_group/day/domain/Day.java @@ -13,7 +13,9 @@ @Entity @Getter +@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Day { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -28,13 +30,6 @@ public class Day { @JsonFormat(pattern = "HH:mm") private LocalTime startTime; - @Builder(access = AccessLevel.PRIVATE) - public Day(Study study, String day, LocalTime startTime) { - this.study = study; - this.day = day; - this.startTime = startTime; - } - public static Day create(Study study, String day, LocalTime startTime) { return Day.builder().study(study).day(day).startTime(startTime).build(); } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java similarity index 100% rename from src/main/java/com/gdgoc/study_group/study/dto/StudyCreateRequest.java rename to src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java From 31ad47d4e0af09f0081ad01adc87b0713acb7563 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 24 Jan 2025 16:43:17 +0900 Subject: [PATCH 21/22] =?UTF-8?q?refactor:=20create,=20update=20=EB=A9=94?= =?UTF-8?q?=EC=86=8C=EB=93=9C=20=EB=8F=84=EB=A9=94=EC=9D=B8=EC=9C=BC?= =?UTF-8?q?=EB=A1=9C=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit service에서 curriculum과 day를 처리하는 로직을 domain으로 옮김 --- .../study/api/StudyController.java | 10 ++-- .../study/application/LeaderStudyService.java | 38 ++++-------- .../application/StudentStudyService.java | 21 +------ .../gdgoc/study_group/study/domain/Study.java | 60 ++++++++++++------- .../study/dto/StudyCreateUpdateRequest.java | 2 +- 5 files changed, 55 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java index b6bfec3..aae21cb 100644 --- a/src/main/java/com/gdgoc/study_group/study/api/StudyController.java +++ b/src/main/java/com/gdgoc/study_group/study/api/StudyController.java @@ -13,7 +13,7 @@ @RestController @RequestMapping("/studies") -@Tag(name = "Study") +@Tag(name = "Study", description = "스터디 API") @RequiredArgsConstructor public class StudyController { @@ -22,7 +22,7 @@ public class StudyController { @Operation(summary = "스터디 생성", description = "자율스터디를 생성합니다.") @PostMapping() - public ResponseEntity createStudy(@RequestBody StudyCreateRequest request) { + public ResponseEntity createStudy(@RequestBody StudyCreateUpdateRequest request) { Long studyId = studentStudyService.createStudy(request); return ResponseEntity.ok(studyId); @@ -46,8 +46,8 @@ public ResponseEntity getStudyDetail(@PathVariable("studyId") Long studyId) { @Operation(summary = "스터디 수정", description = "스터디 정보를 수정합니다. 스터디장만 수정할 수 있습니다.") @PatchMapping("/{studyId}") - public ResponseEntity updateStudy( - @PathVariable("studyId") Long studyId, @RequestBody StudyCreateRequest updateRequest) { + public ResponseEntity updateStudy( + @PathVariable("studyId") Long studyId, @RequestBody StudyCreateUpdateRequest updateRequest) { leaderStudyService.updateStudy(studyId, updateRequest); @@ -60,6 +60,6 @@ public ResponseEntity deleteStudy(@PathVariable("studyId") Long studyId) leaderStudyService.deleteStudy(studyId); - return ResponseEntity.status(HttpStatus.NO_CONTENT).body("스터디가 삭제되었습니다."); + return ResponseEntity.status(HttpStatus.RESET_CONTENT).body("스터디가 삭제되었습니다."); } } diff --git a/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java index 8e2dfc9..f73c917 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java @@ -2,12 +2,10 @@ import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; -import com.gdgoc.study_group.curriculum.domain.Curriculum; -import com.gdgoc.study_group.day.domain.Day; import com.gdgoc.study_group.exception.CustomException; import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; -import com.gdgoc.study_group.study.dto.StudyCreateRequest; +import com.gdgoc.study_group.study.dto.StudyCreateUpdateRequest; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,35 +26,19 @@ public class LeaderStudyService { * @param request 수정할 스터디의 정보 */ @Transactional(readOnly = false) - public void updateStudy(Long studyId, StudyCreateRequest request) { + public void updateStudy(Long studyId, StudyCreateUpdateRequest request) { Study study = studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); study.update( - request.name(), - request.description(), - request.requirement(), - request.question(), - request.maxParticipants(), - request.studyStatus()); - - study.getCurriculums().clear(); - study - .getCurriculums() - .addAll( - request.curriculums().stream() - .map( - curriculumDTO -> - Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) - .toList()); - - study.getDays().clear(); - study - .getDays() - .addAll( - request.days().stream() - .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) - .toList()); + request.name(), + request.description(), + request.requirement(), + request.question(), + request.maxParticipants(), + request.studyStatus(), + request.curriculums(), + request.days()); studyRepository.save(study); } diff --git a/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java index 33c37de..60fbe16 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/StudentStudyService.java @@ -2,14 +2,11 @@ import static com.gdgoc.study_group.exception.ErrorCode.STUDY_NOT_FOUND; -import com.gdgoc.study_group.curriculum.domain.Curriculum; -import com.gdgoc.study_group.day.domain.Day; import com.gdgoc.study_group.exception.CustomException; import com.gdgoc.study_group.study.dao.StudyRepository; import com.gdgoc.study_group.study.domain.Study; import com.gdgoc.study_group.study.dto.*; import java.util.List; -import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,7 +25,7 @@ public class StudentStudyService { * @return ResponseDTO 반환 */ @Transactional(readOnly = false) - public Long createStudy(StudyCreateRequest request) { + public Long createStudy(StudyCreateUpdateRequest request) { Study study = Study.create( @@ -41,21 +38,7 @@ public Long createStudy(StudyCreateRequest request) { // TODO: 스터디를 생성한 유저를 스터디장으로 설정한 뒤 studyMembers에 추가 - // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 - List curriculums = - request.curriculums().stream() - .map( - curriculumDTO -> - Curriculum.create(study, curriculumDTO.week(), curriculumDTO.subject())) - .collect(Collectors.toList()); - - // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 - List days = - request.days().stream() - .map(dayDTO -> Day.create(study, dayDTO.day(), dayDTO.startTime())) - .collect(Collectors.toList()); - - study.addInfo(curriculums, days); + study.addInfo(request.curriculums(), request.days()); studyRepository.save(study); return study.getId(); diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Study.java b/src/main/java/com/gdgoc/study_group/study/domain/Study.java index 1ec1cca..658e46d 100644 --- a/src/main/java/com/gdgoc/study_group/study/domain/Study.java +++ b/src/main/java/com/gdgoc/study_group/study/domain/Study.java @@ -2,17 +2,24 @@ import com.gdgoc.study_group.answer.domain.Answer; import com.gdgoc.study_group.curriculum.domain.Curriculum; +import com.gdgoc.study_group.curriculum.dto.CurriculumDTO; import com.gdgoc.study_group.day.domain.Day; +import com.gdgoc.study_group.day.dto.DayDTO; import com.gdgoc.study_group.round.domain.Round; +import com.gdgoc.study_group.study.dto.StudyCreateUpdateRequest; import com.gdgoc.study_group.studyMember.domain.StudyMember; import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; + import lombok.*; @Entity @Getter +@Builder @NoArgsConstructor(access = AccessLevel.PROTECTED) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class Study { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -43,22 +50,6 @@ public class Study { private Integer maxParticipants; // null == 인원 제한 X private Boolean isApplicationClosed = false; // 멤버 지원 종료 여부(기본값은 지원 가능) - @Builder(access = AccessLevel.PRIVATE) - private Study( - String name, - String description, - String requirement, - String question, - Integer maxParticipants, - StudyStatus studyStatus) { - this.name = name; - this.description = description; - this.requirement = requirement; - this.question = question; - this.maxParticipants = maxParticipants; - this.studyStatus = studyStatus; - } - public static Study create( String name, String description, @@ -76,23 +67,46 @@ public static Study create( .build(); } - public void addInfo(List curriculums, List days) { + public void addInfo(List curriculumDTOs, List dayDTOs) { + // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 + List curriculums = curriculumDTOs.stream() + .map(curriculumDTO -> Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) + .toList(); + + // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 + List days = dayDTOs.stream() + .map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())) + .toList(); + + this.curriculums.addAll(curriculums); this.days.addAll(days); } public void update( - String name, - String description, - String requirement, - String question, - Integer maxParticipants, - StudyStatus studyStatus) { + String name, + String description, + String requirement, + String question, + Integer maxParticipants, + StudyStatus studyStatus, + List curriculumDTOs, + List dayDTOs) { this.name = name; this.description = description; this.requirement = requirement; this.question = question; this.maxParticipants = maxParticipants; this.studyStatus = studyStatus; + + this.getCurriculums().clear(); + this.getCurriculums().addAll(curriculumDTOs.stream() + .map(curriculumDTO -> Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) + .toList()); + + this.getDays().clear(); + this.getDays().addAll(dayDTOs.stream() + .map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())) + .toList()); } } diff --git a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java index 597443a..5ceb5eb 100644 --- a/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java +++ b/src/main/java/com/gdgoc/study_group/study/dto/StudyCreateUpdateRequest.java @@ -8,7 +8,7 @@ import jakarta.validation.constraints.NotNull; import java.util.List; -public record StudyCreateRequest( +public record StudyCreateUpdateRequest( @NotBlank(message = "스터디 이름을 입력해 주세요.") @Schema(description = "스터디 이름") String name, @NotBlank(message = "스터디 소개를 입력해 주세요.") @Schema(description = "스터디 소개") String description, @Schema(description = "스터디 자원 자격") String requirement, From 872757d40cecb519b72964e99d2ff7399ab7e215 Mon Sep 17 00:00:00 2001 From: ybkang1108 Date: Fri, 24 Jan 2025 17:20:50 +0900 Subject: [PATCH 22/22] =?UTF-8?q?fix:=20=EC=9E=98=EB=AA=BB=EB=90=9C=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../study/application/LeaderStudyService.java | 16 +++--- .../gdgoc/study_group/study/domain/Study.java | 56 ++++++++++--------- 2 files changed, 37 insertions(+), 35 deletions(-) diff --git a/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java index f73c917..2d65edf 100644 --- a/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java +++ b/src/main/java/com/gdgoc/study_group/study/application/LeaderStudyService.java @@ -31,14 +31,14 @@ public void updateStudy(Long studyId, StudyCreateUpdateRequest request) { studyRepository.findById(studyId).orElseThrow(() -> new CustomException(STUDY_NOT_FOUND)); study.update( - request.name(), - request.description(), - request.requirement(), - request.question(), - request.maxParticipants(), - request.studyStatus(), - request.curriculums(), - request.days()); + request.name(), + request.description(), + request.requirement(), + request.question(), + request.maxParticipants(), + request.studyStatus(), + request.curriculums(), + request.days()); studyRepository.save(study); } diff --git a/src/main/java/com/gdgoc/study_group/study/domain/Study.java b/src/main/java/com/gdgoc/study_group/study/domain/Study.java index 658e46d..acb4424 100644 --- a/src/main/java/com/gdgoc/study_group/study/domain/Study.java +++ b/src/main/java/com/gdgoc/study_group/study/domain/Study.java @@ -6,13 +6,10 @@ import com.gdgoc.study_group.day.domain.Day; import com.gdgoc.study_group.day.dto.DayDTO; import com.gdgoc.study_group.round.domain.Round; -import com.gdgoc.study_group.study.dto.StudyCreateUpdateRequest; import com.gdgoc.study_group.studyMember.domain.StudyMember; import jakarta.persistence.*; import java.util.ArrayList; import java.util.List; -import java.util.stream.Collectors; - import lombok.*; @Entity @@ -64,34 +61,33 @@ public static Study create( .question(question) .maxParticipants(maxParticipants) .studyStatus(status) + .isApplicationClosed(false) .build(); } public void addInfo(List curriculumDTOs, List dayDTOs) { // 등록된 커리큘럼이 있다면 엔티티로 변환하여 리스트에 추가 - List curriculums = curriculumDTOs.stream() - .map(curriculumDTO -> Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) - .toList(); + this.curriculums = + curriculumDTOs.stream() + .map( + curriculumDTO -> + Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) + .toList(); // 등록된 스터디 날짜가 있다면 엔티티로 변환하여 리스트에 추가 - List days = dayDTOs.stream() - .map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())) - .toList(); - - - this.curriculums.addAll(curriculums); - this.days.addAll(days); + this.days = + dayDTOs.stream().map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())).toList(); } public void update( - String name, - String description, - String requirement, - String question, - Integer maxParticipants, - StudyStatus studyStatus, - List curriculumDTOs, - List dayDTOs) { + String name, + String description, + String requirement, + String question, + Integer maxParticipants, + StudyStatus studyStatus, + List curriculumDTOs, + List dayDTOs) { this.name = name; this.description = description; this.requirement = requirement; @@ -100,13 +96,19 @@ public void update( this.studyStatus = studyStatus; this.getCurriculums().clear(); - this.getCurriculums().addAll(curriculumDTOs.stream() - .map(curriculumDTO -> Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) - .toList()); + this.getCurriculums() + .addAll( + curriculumDTOs.stream() + .map( + curriculumDTO -> + Curriculum.create(this, curriculumDTO.week(), curriculumDTO.subject())) + .toList()); this.getDays().clear(); - this.getDays().addAll(dayDTOs.stream() - .map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())) - .toList()); + this.getDays() + .addAll( + dayDTOs.stream() + .map(dayDTO -> Day.create(this, dayDTO.day(), dayDTO.startTime())) + .toList()); } }