From a8ccd5dc79e36b0fafb765abbd7509a63c9860c8 Mon Sep 17 00:00:00 2001 From: seongjae6751 Date: Thu, 3 Oct 2024 16:04:41 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=EB=AA=A8=EB=93=A0=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=ED=91=9C=20=ED=94=84=EB=A0=88=EC=9E=84=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/TimetableApiV2.java | 15 ++++++++++++ .../controller/TimetableControllerV2.java | 9 ++++++++ .../TimetableFrameRepositoryV2.java | 3 +++ .../service/TimetableServiceV2.java | 9 ++++++++ .../koin/acceptance/TimetableV2ApiTest.java | 23 +++++++++++++++++++ 5 files changed, 59 insertions(+) diff --git a/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableApiV2.java b/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableApiV2.java index ea0f7a352..47b577bdb 100644 --- a/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableApiV2.java +++ b/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableApiV2.java @@ -98,6 +98,21 @@ ResponseEntity deleteTimetablesFrame( @Auth(permit = {STUDENT}) Integer userId ); + @ApiResponses( + value = { + @ApiResponse(responseCode = "200"), + @ApiResponse(responseCode = "401", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "403", content = @Content(schema = @Schema(hidden = true))), + @ApiResponse(responseCode = "404", content = @Content(schema = @Schema(hidden = true))) + } + ) + @Operation(summary = "시간표 프레임 모두 삭제") + @DeleteMapping("/v2/all/timetables/frame") + public ResponseEntity deleteAllTimetablesFrame( + @RequestParam(name = "semester") String semester, + @Auth(permit = {STUDENT}) Integer userId + ); + @ApiResponses( value = { @ApiResponse(responseCode = "200"), diff --git a/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableControllerV2.java b/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableControllerV2.java index 8d35b1536..ea0becbdd 100644 --- a/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableControllerV2.java +++ b/src/main/java/in/koreatech/koin/domain/timetableV2/controller/TimetableControllerV2.java @@ -70,6 +70,15 @@ public ResponseEntity deleteTimetablesFrame( return ResponseEntity.noContent().build(); } + @DeleteMapping("/v2/all/timetables/frame") + public ResponseEntity deleteAllTimetablesFrame( + @RequestParam(name = "semester") String semester, + @Auth(permit = {STUDENT}) Integer userId + ) { + timetableServiceV2.deleteAllTimetablesFrame(userId, semester); + return ResponseEntity.noContent().build(); + } + @PostMapping("/v2/timetables/lecture") public ResponseEntity createTimetableLecture( @Valid @RequestBody TimetableLectureCreateRequest request, diff --git a/src/main/java/in/koreatech/koin/domain/timetableV2/repository/TimetableFrameRepositoryV2.java b/src/main/java/in/koreatech/koin/domain/timetableV2/repository/TimetableFrameRepositoryV2.java index 46d1e44a1..5dbc6ceb1 100644 --- a/src/main/java/in/koreatech/koin/domain/timetableV2/repository/TimetableFrameRepositoryV2.java +++ b/src/main/java/in/koreatech/koin/domain/timetableV2/repository/TimetableFrameRepositoryV2.java @@ -9,6 +9,7 @@ import org.springframework.data.repository.query.Param; import in.koreatech.koin.domain.timetable.exception.TimetableNotFoundException; +import in.koreatech.koin.domain.timetable.model.Semester; import in.koreatech.koin.domain.timetableV2.exception.TimetableFrameNotFoundException; import in.koreatech.koin.domain.timetableV2.model.TimetableFrame; import in.koreatech.koin.domain.user.model.User; @@ -68,4 +69,6 @@ SELECT COUNT(t) FROM TimetableFrame t void deleteById(Integer id); void deleteAllByUser(User user); + + void deleteAllByUserAndSemester(User user, Semester semester); } diff --git a/src/main/java/in/koreatech/koin/domain/timetableV2/service/TimetableServiceV2.java b/src/main/java/in/koreatech/koin/domain/timetableV2/service/TimetableServiceV2.java index 9752c9570..eafd00c75 100644 --- a/src/main/java/in/koreatech/koin/domain/timetableV2/service/TimetableServiceV2.java +++ b/src/main/java/in/koreatech/koin/domain/timetableV2/service/TimetableServiceV2.java @@ -6,6 +6,7 @@ import java.util.List; import java.util.Objects; +import in.koreatech.koin.domain.timetable.exception.SemesterNotFoundException; import in.koreatech.koin.global.exception.KoinIllegalArgumentException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -190,4 +191,12 @@ private void cancelMainTimetable(Integer userId, Integer semesterId) { semesterId); mainTimetableFrame.cancelMain(); } + + @Transactional + public void deleteAllTimetablesFrame(Integer userId, String semester) { + User user = userRepository.findById(userId).get(); + Semester userSemester = semesterRepositoryV2.findBySemester(semester) + .orElseThrow(() -> new SemesterNotFoundException("해당하는 시간표 프레임이 없습니다")); + timetableFrameRepositoryV2.deleteAllByUserAndSemester(user, userSemester); + } } diff --git a/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java b/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java index c10fed6f6..804851faa 100644 --- a/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java +++ b/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java @@ -230,6 +230,29 @@ void setup() { .andExpect(status().isForbidden()); } + @Test + void 모든_시간표_프레임을_삭제한다() throws Exception { + User user = userFixture.준호_학생().getUser(); + String token = userFixture.getToken(user); + Semester semester = semesterFixture.semester("20192"); + + TimetableFrame frame1 = timetableV2Fixture.시간표1(user, semester); + TimetableFrame frame2 = timetableV2Fixture.시간표1(user, semester); + TimetableFrame frame3 = timetableV2Fixture.시간표1(user, semester); + + mockMvc.perform( + delete("/v2/timetables/all/frame") + .header("Authorization", "Bearer " + token) + .param("semester", semester.getSemester()) + .contentType(MediaType.APPLICATION_JSON) + ) + .andExpect(status().isNoContent()); + + assertThat(timetableFrameRepositoryV2.findById(frame1.getId())).isNotPresent(); + assertThat(timetableFrameRepositoryV2.findById(frame2.getId())).isNotPresent(); + assertThat(timetableFrameRepositoryV2.findById(frame3.getId())).isNotPresent(); + } + @Test void 시간표를_생성한다_TimetableLecture() throws Exception { User user = userFixture.준호_학생().getUser(); From 28012f2f6c38138bf80aa91063a5608bbe42453e Mon Sep 17 00:00:00 2001 From: seongjae6751 Date: Thu, 3 Oct 2024 16:14:01 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=ED=85=8C=EC=8A=A4=ED=8A=B8=EC=83=81?= =?UTF-8?q?=20=EC=98=A4=ED=83=80=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java b/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java index 804851faa..71351835d 100644 --- a/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java +++ b/src/test/java/in/koreatech/koin/acceptance/TimetableV2ApiTest.java @@ -241,7 +241,7 @@ void setup() { TimetableFrame frame3 = timetableV2Fixture.시간표1(user, semester); mockMvc.perform( - delete("/v2/timetables/all/frame") + delete("/v2/all/timetables/frame") .header("Authorization", "Bearer " + token) .param("semester", semester.getSemester()) .contentType(MediaType.APPLICATION_JSON)