From 87f035be4ea6ab05f07262b4e5e6dd41ae9e9b79 Mon Sep 17 00:00:00 2001 From: msk226 Date: Sat, 3 Jan 2026 13:22:18 +0900 Subject: [PATCH 1/2] =?UTF-8?q?[Feature]=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=ED=98=B8=EC=B6=9C=20=EC=8B=9C,=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=8B=9D?= =?UTF-8?q?=EB=B3=84=EC=9E=90=20=EC=9D=91=EB=8B=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/presentation/command/PostCommandController.java | 8 +++++--- .../review/application/command/ManageReviewService.java | 7 ++++--- .../presentation/command/ReviewCommandController.java | 8 +++++--- .../presentation/command/dto/CreateReviewResponse.java | 8 ++++++++ .../application/command/ManageScheduleService.java | 6 ++++-- .../presentation/command/ScheduleCommandController.java | 8 +++++--- .../presentation/command/dto/CreateScheduleResponse.java | 8 ++++++++ .../study/application/command/CreateStudyService.java | 3 ++- .../presentation/command/StudyCommandController.java | 9 ++++++--- .../command/dto/response/CreateStudyResponse.java | 8 ++++++++ .../spot/todo/application/command/ManageTodoService.java | 6 ++++-- .../todo/presentation/command/TodoCommandController.java | 8 +++++--- .../presentation/command/dto/CreateTodoResponse.java | 8 ++++++++ 13 files changed, 72 insertions(+), 23 deletions(-) create mode 100644 modules/study/src/main/java/kr/spot/review/presentation/command/dto/CreateReviewResponse.java create mode 100644 modules/study/src/main/java/kr/spot/schedule/presentation/command/dto/CreateScheduleResponse.java create mode 100644 modules/study/src/main/java/kr/spot/study/presentation/command/dto/response/CreateStudyResponse.java create mode 100644 modules/study/src/main/java/kr/spot/todo/presentation/command/dto/CreateTodoResponse.java diff --git a/modules/study/src/main/java/kr/spot/post/presentation/command/PostCommandController.java b/modules/study/src/main/java/kr/spot/post/presentation/command/PostCommandController.java index 610210c..9517d87 100644 --- a/modules/study/src/main/java/kr/spot/post/presentation/command/PostCommandController.java +++ b/modules/study/src/main/java/kr/spot/post/presentation/command/PostCommandController.java @@ -11,6 +11,7 @@ import kr.spot.code.status.SuccessStatus; import kr.spot.post.application.command.LikePostService; import kr.spot.post.application.command.ManagePostService; +import kr.spot.post.presentation.command.dto.CreatePostResponse; import kr.spot.post.presentation.command.dto.ManagePostRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -38,12 +39,13 @@ public class PostCommandController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "`STUDY404`: 스터디를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) }) @PostMapping - public ResponseEntity> createPost( + public ResponseEntity> createPost( @Parameter(description = "스터디 ID", required = true) @PathVariable Long studyId, @CurrentMember @Parameter(hidden = true) Long writerId, @RequestBody ManagePostRequest request) { - managePostService.createPost(studyId, writerId, request); - return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._CREATED)); + long postId = managePostService.createPost(studyId, writerId, request); + return ResponseEntity.ok( + ApiResponse.onSuccess(SuccessStatus._CREATED, CreatePostResponse.from(postId))); } @Operation(summary = "스터디 게시글 수정", description = "스터디의 게시글을 수정합니다. 작성자만 수정할 수 있습니다.") diff --git a/modules/study/src/main/java/kr/spot/review/application/command/ManageReviewService.java b/modules/study/src/main/java/kr/spot/review/application/command/ManageReviewService.java index d02761e..6d312d3 100644 --- a/modules/study/src/main/java/kr/spot/review/application/command/ManageReviewService.java +++ b/modules/study/src/main/java/kr/spot/review/application/command/ManageReviewService.java @@ -29,7 +29,7 @@ public class ManageReviewService { private final ReviewRepository reviewRepository; private final StudyAccessValidator studyAccessValidator; - public void createReview(long studyId, long memberId, CreateReviewRequest request, + public long createReview(long studyId, long memberId, CreateReviewRequest request, MultipartFile imageFile) { studyAccessValidator.validateStudyMember(studyId, memberId); @@ -38,9 +38,10 @@ public void createReview(long studyId, long memberId, CreateReviewRequest reques Content content = Content.of(request.activity(), request.learned(), request.encouragement(), imageUrl); - Review review = Review.of(idGenerator.nextId(), studyId, writerInfo, content, - request.isPrivate()); + long reviewId = idGenerator.nextId(); + Review review = Review.of(reviewId, studyId, writerInfo, content, request.isPrivate()); reviewRepository.save(review); + return reviewId; } public void deleteReview(long studyId, long reviewId, long memberId) { diff --git a/modules/study/src/main/java/kr/spot/review/presentation/command/ReviewCommandController.java b/modules/study/src/main/java/kr/spot/review/presentation/command/ReviewCommandController.java index b314b71..47e8cdd 100644 --- a/modules/study/src/main/java/kr/spot/review/presentation/command/ReviewCommandController.java +++ b/modules/study/src/main/java/kr/spot/review/presentation/command/ReviewCommandController.java @@ -10,6 +10,7 @@ import kr.spot.review.application.command.ManageReviewService; import kr.spot.review.domain.enums.Reaction; import kr.spot.review.presentation.command.dto.CreateReviewRequest; +import kr.spot.review.presentation.command.dto.CreateReviewResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -32,14 +33,15 @@ public class ReviewCommandController { @Operation(summary = "스터디 회고록 작성", description = "특정 스터디에 대한 회고록을 작성합니다.") @PostMapping - public ResponseEntity> createReview( + public ResponseEntity> createReview( @PathVariable Long studyId, @CurrentMember @Parameter(hidden = true) Long memberId, @RequestPart CreateReviewRequest request, @RequestPart(required = false) MultipartFile imageFile ) { - manageReviewService.createReview(studyId, memberId, request, imageFile); - return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._CREATED)); + long reviewId = manageReviewService.createReview(studyId, memberId, request, imageFile); + return ResponseEntity.ok( + ApiResponse.onSuccess(SuccessStatus._CREATED, CreateReviewResponse.from(reviewId))); } @Operation(summary = "스터디 회고록 삭제", description = "특정 스터디에 대한 회고록을 삭제합니다.") diff --git a/modules/study/src/main/java/kr/spot/review/presentation/command/dto/CreateReviewResponse.java b/modules/study/src/main/java/kr/spot/review/presentation/command/dto/CreateReviewResponse.java new file mode 100644 index 0000000..5e3020d --- /dev/null +++ b/modules/study/src/main/java/kr/spot/review/presentation/command/dto/CreateReviewResponse.java @@ -0,0 +1,8 @@ +package kr.spot.review.presentation.command.dto; + +public record CreateReviewResponse(Long reviewId) { + + public static CreateReviewResponse from(long reviewId) { + return new CreateReviewResponse(reviewId); + } +} diff --git a/modules/study/src/main/java/kr/spot/schedule/application/command/ManageScheduleService.java b/modules/study/src/main/java/kr/spot/schedule/application/command/ManageScheduleService.java index e75dfa3..fc15951 100644 --- a/modules/study/src/main/java/kr/spot/schedule/application/command/ManageScheduleService.java +++ b/modules/study/src/main/java/kr/spot/schedule/application/command/ManageScheduleService.java @@ -16,12 +16,14 @@ public class ManageScheduleService { private final IdGenerator idGenerator; private final ScheduleRepository scheduleRepository; - public void createSchedule(CreateScheduleRequest request, long studyId) { - Schedule schedule = Schedule.of(idGenerator.nextId(), studyId, request.title(), + public long createSchedule(CreateScheduleRequest request, long studyId) { + long scheduleId = idGenerator.nextId(); + Schedule schedule = Schedule.of(scheduleId, studyId, request.title(), request.locationInfo(), request.startAt(), request.endAt()); scheduleRepository.save(schedule); + return scheduleId; } public void deleteSchedule(long studyId, long scheduleId) { diff --git a/modules/study/src/main/java/kr/spot/schedule/presentation/command/ScheduleCommandController.java b/modules/study/src/main/java/kr/spot/schedule/presentation/command/ScheduleCommandController.java index d3d613a..96793bf 100644 --- a/modules/study/src/main/java/kr/spot/schedule/presentation/command/ScheduleCommandController.java +++ b/modules/study/src/main/java/kr/spot/schedule/presentation/command/ScheduleCommandController.java @@ -11,6 +11,7 @@ import kr.spot.code.status.SuccessStatus; import kr.spot.schedule.application.command.ManageScheduleService; import kr.spot.schedule.presentation.command.dto.CreateScheduleRequest; +import kr.spot.schedule.presentation.command.dto.CreateScheduleResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -35,11 +36,12 @@ public class ScheduleCommandController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "`STUDY404`: 스터디를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) }) @PostMapping - public ResponseEntity> createSchedule( + public ResponseEntity> createSchedule( @Parameter(description = "스터디 ID", required = true) @PathVariable Long studyId, @RequestBody CreateScheduleRequest request) { - manageScheduleService.createSchedule(request, studyId); - return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._CREATED)); + long scheduleId = manageScheduleService.createSchedule(request, studyId); + return ResponseEntity.ok( + ApiResponse.onSuccess(SuccessStatus._CREATED, CreateScheduleResponse.from(scheduleId))); } @Operation(summary = "스터디 일정 삭제", description = "스터디의 일정을 삭제합니다.") diff --git a/modules/study/src/main/java/kr/spot/schedule/presentation/command/dto/CreateScheduleResponse.java b/modules/study/src/main/java/kr/spot/schedule/presentation/command/dto/CreateScheduleResponse.java new file mode 100644 index 0000000..4ed403c --- /dev/null +++ b/modules/study/src/main/java/kr/spot/schedule/presentation/command/dto/CreateScheduleResponse.java @@ -0,0 +1,8 @@ +package kr.spot.schedule.presentation.command.dto; + +public record CreateScheduleResponse(Long scheduleId) { + + public static CreateScheduleResponse from(long scheduleId) { + return new CreateScheduleResponse(scheduleId); + } +} diff --git a/modules/study/src/main/java/kr/spot/study/application/command/CreateStudyService.java b/modules/study/src/main/java/kr/spot/study/application/command/CreateStudyService.java index 03970ad..8358e43 100644 --- a/modules/study/src/main/java/kr/spot/study/application/command/CreateStudyService.java +++ b/modules/study/src/main/java/kr/spot/study/application/command/CreateStudyService.java @@ -37,7 +37,7 @@ public class CreateStudyService { private final StudyStatsRepository studyStatsRepository; private final StudyMemberRepository studyMemberRepository; - public void createStudy(CreateStudyRequest request, Long leaderId, MultipartFile imageFile) { + public long createStudy(CreateStudyRequest request, long leaderId, MultipartFile imageFile) { long studyId = idGenerator.nextId(); Study study = Study.of(studyId, leaderId, request.name(), request.maxMembers(), Fee.of(request.hasFee(), request.amount()), null, request.description(), request.isOnline()); @@ -53,6 +53,7 @@ public void createStudy(CreateStudyRequest request, Long leaderId, MultipartFile saveAllStudyRegions(request, studyId); eventPublisher.publishEvent(StudyCreatedEvent.of(studyId, imageFile)); + return studyId; } private void saveAllStudyCategories(CreateStudyRequest request, long studyId) { diff --git a/modules/study/src/main/java/kr/spot/study/presentation/command/StudyCommandController.java b/modules/study/src/main/java/kr/spot/study/presentation/command/StudyCommandController.java index b4b808e..d745ac4 100644 --- a/modules/study/src/main/java/kr/spot/study/presentation/command/StudyCommandController.java +++ b/modules/study/src/main/java/kr/spot/study/presentation/command/StudyCommandController.java @@ -12,6 +12,7 @@ import kr.spot.study.application.command.CreateStudyService; import kr.spot.study.application.command.StudyLikeService; import kr.spot.study.presentation.command.dto.request.CreateStudyRequest; +import kr.spot.study.presentation.command.dto.response.CreateStudyResponse; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; @@ -47,11 +48,13 @@ public class StudyCommandController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "401", description = "인증되지 않은 사용자입니다.", content = @Content(schema = @Schema(implementation = kr.spot.ApiResponse.class))) }) @PostMapping - public ResponseEntity> createStudy(@RequestPart CreateStudyRequest request, + public ResponseEntity> createStudy( + @RequestPart CreateStudyRequest request, @CurrentMember @Parameter(hidden = true) Long memberId, @RequestPart(required = false) MultipartFile imageFile) { - createStudyService.createStudy(request, memberId, imageFile); - return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._CREATED)); + long studyId = createStudyService.createStudy(request, memberId, imageFile); + return ResponseEntity.ok( + ApiResponse.onSuccess(SuccessStatus._CREATED, CreateStudyResponse.from(studyId))); } @Operation(summary = "스터디 좋아요", description = "스터디에 좋아요를 누릅니다.") diff --git a/modules/study/src/main/java/kr/spot/study/presentation/command/dto/response/CreateStudyResponse.java b/modules/study/src/main/java/kr/spot/study/presentation/command/dto/response/CreateStudyResponse.java new file mode 100644 index 0000000..83315e0 --- /dev/null +++ b/modules/study/src/main/java/kr/spot/study/presentation/command/dto/response/CreateStudyResponse.java @@ -0,0 +1,8 @@ +package kr.spot.study.presentation.command.dto.response; + +public record CreateStudyResponse(Long studyId) { + + public static CreateStudyResponse from(long studyId) { + return new CreateStudyResponse(studyId); + } +} diff --git a/modules/study/src/main/java/kr/spot/todo/application/command/ManageTodoService.java b/modules/study/src/main/java/kr/spot/todo/application/command/ManageTodoService.java index a8631b3..6df3288 100644 --- a/modules/study/src/main/java/kr/spot/todo/application/command/ManageTodoService.java +++ b/modules/study/src/main/java/kr/spot/todo/application/command/ManageTodoService.java @@ -17,15 +17,17 @@ public class ManageTodoService { private final IdGenerator idGenerator; private final TodoRepository todoRepository; - public void createTodo(long studyId, long memberId, CreateTodoRequest request) { + public long createTodo(long studyId, long memberId, CreateTodoRequest request) { + long todoId = idGenerator.nextId(); Todo todo = Todo.of( - idGenerator.nextId(), + todoId, studyId, memberId, request.dueDate(), request.content() ); todoRepository.save(todo); + return todoId; } public void updateTodo(long studyId, long todoId, long memberId, UpdateTodoRequest request) { diff --git a/modules/study/src/main/java/kr/spot/todo/presentation/command/TodoCommandController.java b/modules/study/src/main/java/kr/spot/todo/presentation/command/TodoCommandController.java index 4f7ab5a..2689ff2 100644 --- a/modules/study/src/main/java/kr/spot/todo/presentation/command/TodoCommandController.java +++ b/modules/study/src/main/java/kr/spot/todo/presentation/command/TodoCommandController.java @@ -11,6 +11,7 @@ import kr.spot.code.status.SuccessStatus; import kr.spot.todo.application.command.ManageTodoService; import kr.spot.todo.presentation.command.dto.CreateTodoRequest; +import kr.spot.todo.presentation.command.dto.CreateTodoResponse; import kr.spot.todo.presentation.command.dto.UpdateTodoRequest; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; @@ -37,12 +38,13 @@ public class TodoCommandController { @io.swagger.v3.oas.annotations.responses.ApiResponse(responseCode = "404", description = "`STUDY404`: 스터디를 찾을 수 없습니다.", content = @Content(schema = @Schema(implementation = ApiResponse.class))) }) @PostMapping - public ResponseEntity> createTodo( + public ResponseEntity> createTodo( @Parameter(description = "스터디 ID", required = true) @PathVariable Long studyId, @CurrentMember @Parameter(hidden = true) Long memberId, @RequestBody CreateTodoRequest request) { - manageTodoService.createTodo(studyId, memberId, request); - return ResponseEntity.ok(ApiResponse.onSuccess(SuccessStatus._CREATED)); + long todoId = manageTodoService.createTodo(studyId, memberId, request); + return ResponseEntity.ok( + ApiResponse.onSuccess(SuccessStatus._CREATED, CreateTodoResponse.from(todoId))); } @Operation(summary = "투두 수정", description = "투두 내용과 마감일을 수정합니다.") diff --git a/modules/study/src/main/java/kr/spot/todo/presentation/command/dto/CreateTodoResponse.java b/modules/study/src/main/java/kr/spot/todo/presentation/command/dto/CreateTodoResponse.java new file mode 100644 index 0000000..e8e1895 --- /dev/null +++ b/modules/study/src/main/java/kr/spot/todo/presentation/command/dto/CreateTodoResponse.java @@ -0,0 +1,8 @@ +package kr.spot.todo.presentation.command.dto; + +public record CreateTodoResponse(Long todoId) { + + public static CreateTodoResponse from(long todoId) { + return new CreateTodoResponse(todoId); + } +} From b27aa278557a58ba5b3d58cfa7bd513c350af733 Mon Sep 17 00:00:00 2001 From: msk226 Date: Sat, 3 Jan 2026 13:22:27 +0900 Subject: [PATCH 2/2] =?UTF-8?q?[Feature]=20=EC=97=94=ED=8B=B0=ED=8B=B0=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=20API=20=ED=98=B8=EC=B6=9C=20=EC=8B=9C,=20?= =?UTF-8?q?=ED=95=B4=EB=8B=B9=20=EC=97=94=ED=8B=B0=ED=8B=B0=20=EC=8B=9D?= =?UTF-8?q?=EB=B3=84=EC=9E=90=20=EC=9D=91=EB=8B=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spot/post/application/command/ManagePostService.java | 3 ++- .../post/presentation/command/dto/CreatePostResponse.java | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 modules/study/src/main/java/kr/spot/post/presentation/command/dto/CreatePostResponse.java diff --git a/modules/study/src/main/java/kr/spot/post/application/command/ManagePostService.java b/modules/study/src/main/java/kr/spot/post/application/command/ManagePostService.java index c17f212..9b8797e 100644 --- a/modules/study/src/main/java/kr/spot/post/application/command/ManagePostService.java +++ b/modules/study/src/main/java/kr/spot/post/application/command/ManagePostService.java @@ -25,11 +25,12 @@ public class ManagePostService { private final PostStatsRepository postStatsRepository; private final StudyAccessValidator studyAccessValidator; - public void createPost(long studyId, long writerId, ManagePostRequest request) { + public long createPost(long studyId, long writerId, ManagePostRequest request) { studyAccessValidator.validateStudyMember(studyId, writerId); WriterInfo writerInfo = getWriterInfo(writerId); Post post = createAndSavePost(request, studyId, writerInfo); initializeAndSavePostStats(post); + return post.getId(); } public void updatePost(long studyId, long postId, ManagePostRequest request, long writerId) { diff --git a/modules/study/src/main/java/kr/spot/post/presentation/command/dto/CreatePostResponse.java b/modules/study/src/main/java/kr/spot/post/presentation/command/dto/CreatePostResponse.java new file mode 100644 index 0000000..a0ded69 --- /dev/null +++ b/modules/study/src/main/java/kr/spot/post/presentation/command/dto/CreatePostResponse.java @@ -0,0 +1,8 @@ +package kr.spot.post.presentation.command.dto; + +public record CreatePostResponse(Long postId) { + + public static CreatePostResponse from(long postId) { + return new CreatePostResponse(postId); + } +}