diff --git a/src/main/java/com/uspray/uspray/InitDb.java b/src/main/java/com/uspray/uspray/InitDb.java index e2522245..eb755ac7 100644 --- a/src/main/java/com/uspray/uspray/InitDb.java +++ b/src/main/java/com/uspray/uspray/InitDb.java @@ -1,16 +1,15 @@ package com.uspray.uspray; -import com.uspray.uspray.global.enums.Authority; -import com.uspray.uspray.global.enums.CategoryType; -import com.uspray.uspray.global.enums.PrayType; import com.uspray.uspray.domain.category.model.Category; import com.uspray.uspray.domain.group.model.Group; import com.uspray.uspray.domain.group.model.GroupMember; import com.uspray.uspray.domain.history.model.History; import com.uspray.uspray.domain.member.model.Member; import com.uspray.uspray.domain.pray.model.Pray; +import com.uspray.uspray.global.enums.Authority; +import com.uspray.uspray.global.enums.CategoryType; +import com.uspray.uspray.global.enums.PrayType; import java.time.LocalDate; -import javax.annotation.PostConstruct; import javax.persistence.EntityManager; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.password.PasswordEncoder; @@ -23,10 +22,10 @@ public class InitDb { private final InitService initService; -// @PostConstruct -// public void init() { -// initService.dbInit(); -// } +// @PostConstruct +// public void init() { +// initService.dbInit(); +// } @Component @Transactional diff --git a/src/main/java/com/uspray/uspray/domain/category/controller/CategoryApi.java b/src/main/java/com/uspray/uspray/domain/category/controller/CategoryApi.java new file mode 100644 index 00000000..2d094af2 --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/category/controller/CategoryApi.java @@ -0,0 +1,77 @@ +package com.uspray.uspray.domain.category.controller; + +import com.uspray.uspray.domain.category.dto.CategoryRequestDto; +import com.uspray.uspray.domain.category.dto.CategoryResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.security.core.userdetails.User; + +@Tag(name = "Category", description = "Category 관련 API") +@SecurityRequirement(name = "JWT Auth") +public interface CategoryApi { + + @Operation(summary = "카테고리 조회") + @ApiResponse( + responseCode = "200", + description = "카테고리 조회", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + ApiResponseDto getCategory( + @Parameter(hidden = true) User user, + @Parameter(description = "카테고리 ID", required = true) Long categoryId + ); + + @Operation(summary = "카테고리 목록 조회") + @ApiResponse( + responseCode = "200", + description = "카테고리 목록 조회", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + ApiResponseDto> getCategoryList( + @Parameter(hidden = true) User user, + @Parameter(description = "카테고리 종류(personal, shared)", required = true, example = "personal") String categoryType + ); + + @Operation(summary = "카테고리 생성") + @ApiResponse( + responseCode = "201", + description = "카테고리 생성", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + ApiResponseDto createCategory( + @Parameter(hidden = true) User user, + CategoryRequestDto categoryRequestDto + ); + + ApiResponseDto deleteCategory( + @Parameter(hidden = true) User user, + @Parameter(description = "카테고리 ID", required = true) Long categoryId + ); + + @Operation(summary = "카테고리 수정") + @ApiResponse( + responseCode = "200", + description = "카테고리 수정", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + ApiResponseDto updatePray( + @Parameter(description = "카테고리 ID", required = true) Long categoryId, + CategoryRequestDto categoryRequestDto, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "카테고리 순서 수정") + @ApiResponse( + responseCode = "200", + description = "카테고리 순서 수정", + content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + ApiResponseDto updatePrayOrder( + @Parameter(description = "카테고리 ID", required = true) Long categoryId, + @Parameter(description = "카테고리 순서", required = true) int index, + @Parameter(hidden = true) User user + ); + +} diff --git a/src/main/java/com/uspray/uspray/domain/category/controller/CategoryController.java b/src/main/java/com/uspray/uspray/domain/category/controller/CategoryController.java index a4eab676..44e22f4c 100644 --- a/src/main/java/com/uspray/uspray/domain/category/controller/CategoryController.java +++ b/src/main/java/com/uspray/uspray/domain/category/controller/CategoryController.java @@ -1,17 +1,10 @@ package com.uspray.uspray.domain.category.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.category.dto.CategoryRequestDto; import com.uspray.uspray.domain.category.dto.CategoryResponseDto; -import com.uspray.uspray.global.exception.SuccessStatus; import com.uspray.uspray.domain.category.service.CategoryService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import com.uspray.uspray.global.exception.SuccessStatus; import java.util.List; import javax.validation.Valid; import lombok.RequiredArgsConstructor; @@ -28,49 +21,31 @@ @RestController @RequestMapping("/category") -@Tag(name = "Category", description = "Category 관련 API") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -public class CategoryController { +public class CategoryController implements CategoryApi { private final CategoryService categoryService; - @Operation(summary = "카테고리 조회") - @ApiResponse( - responseCode = "200", - description = "카테고리 조회", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) + @GetMapping("/{categoryId}") public ApiResponseDto getCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId + @AuthenticationPrincipal User user, @PathVariable("categoryId") Long categoryId ) { return ApiResponseDto.success(SuccessStatus.GET_CATEGORY_SUCCESS, categoryService.getCategory(user.getUsername(), categoryId)); } - @Operation(summary = "카테고리 목록 조회") - @ApiResponse( - responseCode = "200", - description = "카테고리 목록 조회", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) @GetMapping public ApiResponseDto> getCategoryList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "카테고리 종류(personal, shared)", required = true, example = "personal") String categoryType + @AuthenticationPrincipal User user, String categoryType ) { return ApiResponseDto.success(SuccessStatus.GET_CATEGORY_LIST_SUCCESS, categoryService.getCategoryList(user.getUsername(), categoryType)); } - @Operation(summary = "카테고리 생성") - @ApiResponse( - responseCode = "201", - description = "카테고리 생성", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @PostMapping() + @PostMapping public ApiResponseDto createCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody @Valid CategoryRequestDto categoryRequestDto ) { return ApiResponseDto.success(SuccessStatus.CREATE_CATEGORY_SUCCESS, @@ -79,23 +54,18 @@ public ApiResponseDto createCategory( @DeleteMapping("/{categoryId}") public ApiResponseDto deleteCategory( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId + @AuthenticationPrincipal User user, + @PathVariable("categoryId") Long categoryId ) { return ApiResponseDto.success(SuccessStatus.DELETE_CATEGORY_SUCCESS, categoryService.deleteCategory(user.getUsername(), categoryId)); } @PutMapping("/{categoryId}") - @ApiResponse( - responseCode = "200", - description = "카테고리 수정", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @Operation(summary = "카테고리 수정") public ApiResponseDto updatePray( - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId, + @PathVariable("categoryId") Long categoryId, @RequestBody @Valid CategoryRequestDto categoryRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.UPDATE_CATEGORY_SUCCESS, categoryService.updateCategory(user.getUsername(), categoryId, categoryRequestDto)); @@ -103,15 +73,10 @@ public ApiResponseDto updatePray( @PutMapping("/{categoryId}/order/{index}") - @ApiResponse( - responseCode = "200", - description = "카테고리 순서 수정", - content = @Content(schema = @Schema(implementation = CategoryResponseDto.class))) - @Operation(summary = "카테고리 순서 수정") public ApiResponseDto updatePrayOrder( - @Parameter(description = "카테고리 ID", required = true) @PathVariable("categoryId") Long categoryId, - @Parameter(description = "카테고리 순서", required = true) @PathVariable("index") int index, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @PathVariable("categoryId") Long categoryId, + @PathVariable("index") int index, + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.UPDATE_CATEGORY_SUCCESS, categoryService.updateCategoryOrder(user.getUsername(), categoryId, index)); diff --git a/src/main/java/com/uspray/uspray/domain/group/controller/GroupApi.java b/src/main/java/com/uspray/uspray/domain/group/controller/GroupApi.java new file mode 100644 index 00000000..22ccb1eb --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/group/controller/GroupApi.java @@ -0,0 +1,118 @@ +package com.uspray.uspray.domain.group.controller; + +import com.uspray.uspray.domain.group.dto.group.request.GroupMemberRequestDto; +import com.uspray.uspray.domain.group.dto.group.request.GroupRequestDto; +import com.uspray.uspray.domain.group.dto.group.response.GroupListResponseDto; +import com.uspray.uspray.domain.group.dto.group.response.GroupMemberResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import java.util.List; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.security.core.userdetails.User; +import org.springframework.web.bind.annotation.PathVariable; + +public interface GroupApi { + + @Operation(summary = "모임 목록 조회") + @ApiResponse( + responseCode = "200", + description = "사용자가 가입한 목록 조회", + content = @Content(schema = @Schema(implementation = GroupListResponseDto.class)) + ) + ApiResponseDto getGroupList(@Parameter(hidden = true) User user); + + @Operation(summary = "모임 생성") + @ApiResponse( + responseCode = "201", + description = "신규로 모임을 생성합니다", + content = @Content(schema = @Schema(implementation = GroupRequestDto.class)) + ) + ApiResponseDto createGroup( + @Parameter(hidden = true) User user, + GroupRequestDto groupRequestDto + ); + + @Operation(summary = "[모임 리더] 모임 이름을 변경합니다") + @ApiResponse( + responseCode = "200", + description = "모임 이름 변경", + content = @Content(schema = @Schema(implementation = GroupRequestDto.class)) + ) + ApiResponseDto changeGroupName( + @Parameter(hidden = true) User user, + Long groupId, + GroupRequestDto groupRequestDto); + + @Operation(summary = "[모임 리더] 모임 리더를 위임합니다") + @ApiResponse( + responseCode = "200", + description = "모임 리더 위임", + content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) + ) + ApiResponseDto changeGroupLeader( + @Parameter(hidden = true) User user, + Long groupId, + GroupMemberRequestDto groupLeaderRequestDto); + + @Operation(summary = "[모임 리더] 회원 내보내기") + @ApiResponse( + responseCode = "200", + description = "모임 회원을 내보냅니다", + content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) + ) + ApiResponseDto kickGroupMember( + @Parameter(hidden = true) User user, + Long groupId, + GroupMemberRequestDto groupMemberRequestDto); + + @Operation(summary = "모임 가입하기") + @ApiResponse( + responseCode = "200", + description = "모임에 가입합니다" + ) + ApiResponseDto addGroupMember( + @Parameter(hidden = true) User user, + Long groupId); + + @Operation(summary = "모임 탈퇴하기") + @ApiResponse( + responseCode = "204", + description = "모임을 떠납니다", + content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) + ) + ApiResponseDto leaveGroup( + @Parameter(hidden = true) User user, + Long groupId); + + @Operation(summary = "[모임 리더] 모임 삭제하기") + @ApiResponse( + responseCode = "200", + description = "모임을 삭제합니다. 모임 회원, 모임 기도제목 등 일괄 삭제" + ) + ApiResponseDto deleteGroup( + @Parameter(hidden = true) @AuthenticationPrincipal User user, + @PathVariable Long groupId); + + @Operation(summary = "회원 검색") + @ApiResponse( + responseCode = "200", + description = "모임 내 회원 목록을 조회합니다" + ) + ApiResponseDto> searchGroupMembers( + Long groupId, + @Parameter(hidden = true) User user, + String name); + + @Operation(summary = "그룹 알림 설정") + @ApiResponse( + responseCode = "200", + description = "그룹 알림 설정을 변경합니다" + ) + ApiResponseDto changeGroupNotification( + @Parameter(hidden = true) User user, + Long groupId); +} diff --git a/src/main/java/com/uspray/uspray/domain/group/controller/GroupController.java b/src/main/java/com/uspray/uspray/domain/group/controller/GroupController.java index 3b96ae25..72365279 100644 --- a/src/main/java/com/uspray/uspray/domain/group/controller/GroupController.java +++ b/src/main/java/com/uspray/uspray/domain/group/controller/GroupController.java @@ -1,20 +1,14 @@ package com.uspray.uspray.domain.group.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.group.dto.group.request.GroupMemberRequestDto; import com.uspray.uspray.domain.group.dto.group.request.GroupRequestDto; import com.uspray.uspray.domain.group.dto.group.response.GroupListResponseDto; import com.uspray.uspray.domain.group.dto.group.response.GroupMemberResponseDto; -import com.uspray.uspray.global.exception.SuccessStatus; import com.uspray.uspray.domain.group.service.GroupFacade; import com.uspray.uspray.domain.group.service.GroupService; -import io.swagger.v3.oas.annotations.Operation; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import com.uspray.uspray.global.exception.SuccessStatus; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; import javax.validation.Valid; import lombok.RequiredArgsConstructor; @@ -32,20 +26,12 @@ @RestController @RequestMapping("/group") -@Tag(name = "Group", description = "모임 API") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -public class GroupController { +public class GroupController implements GroupApi { private final GroupService groupService; private final GroupFacade groupFacade; - @Operation(summary = "모임 목록 조회") - @ApiResponse( - responseCode = "200", - description = "사용자가 가입한 목록 조회", - content = @Content(schema = @Schema(implementation = GroupListResponseDto.class)) - ) @GetMapping public ApiResponseDto getGroupList( @Parameter(hidden = true) @AuthenticationPrincipal User user) { @@ -53,30 +39,18 @@ public ApiResponseDto getGroupList( groupService.getGroupList(user.getUsername())); } - @Operation(summary = "모임 생성") - @ApiResponse( - responseCode = "201", - description = "신규로 모임을 생성합니다", - content = @Content(schema = @Schema(implementation = GroupRequestDto.class)) - ) @PostMapping public ApiResponseDto createGroup( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @Valid @RequestBody GroupRequestDto groupRequestDto) { groupFacade.createGroup(user.getUsername(), groupRequestDto); return ApiResponseDto.success(SuccessStatus.CREATE_GROUP_SUCCESS, SuccessStatus.CREATE_GROUP_SUCCESS.getMessage()); } - @Operation(summary = "[모임 리더] 모임 이름을 변경합니다") - @ApiResponse( - responseCode = "200", - description = "모임 이름 변경", - content = @Content(schema = @Schema(implementation = GroupRequestDto.class)) - ) @PutMapping("/{groupId}/change-name") public ApiResponseDto changeGroupName( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId, @Valid @RequestBody GroupRequestDto groupRequestDto) { groupFacade.changeGroupName(user.getUsername(), groupId, groupRequestDto); @@ -84,15 +58,9 @@ public ApiResponseDto changeGroupName( SuccessStatus.CHANGE_GROUP_NAME_SUCCESS.getMessage()); } - @Operation(summary = "[모임 리더] 모임 리더를 위임합니다") - @ApiResponse( - responseCode = "200", - description = "모임 리더 위임", - content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) - ) @PutMapping("/{groupId}/change-leader") public ApiResponseDto changeGroupLeader( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId, @Valid @RequestBody GroupMemberRequestDto groupLeaderRequestDto) { groupFacade.changeGroupLeader(user.getUsername(), groupId, @@ -101,15 +69,9 @@ public ApiResponseDto changeGroupLeader( SuccessStatus.CHANGE_GROUP_LEADER_SUCCESS.getMessage()); } - @Operation(summary = "[모임 리더] 회원 내보내기") - @ApiResponse( - responseCode = "200", - description = "모임 회원을 내보냅니다", - content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) - ) @DeleteMapping("/{groupId}/kick") public ApiResponseDto kickGroupMember( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId, @Valid @RequestBody GroupMemberRequestDto groupMemberRequestDto) { groupFacade.kickGroupMember(user.getUsername(), groupId, @@ -118,40 +80,24 @@ public ApiResponseDto kickGroupMember( SuccessStatus.KICK_GROUP_MEMBER_SUCCESS.getMessage()); } - @Operation(summary = "모임 가입하기") - @ApiResponse( - responseCode = "200", - description = "모임에 가입합니다" - ) @PostMapping("/{groupId}/join") public ApiResponseDto addGroupMember( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId) { groupFacade.addGroupMember(user.getUsername(), groupId); return ApiResponseDto.success(SuccessStatus.ADD_GROUP_MEMBER_SUCCESS, SuccessStatus.ADD_GROUP_MEMBER_SUCCESS.getMessage()); } - @Operation(summary = "모임 탈퇴하기") - @ApiResponse( - responseCode = "204", - description = "모임을 떠납니다", - content = @Content(schema = @Schema(implementation = GroupMemberRequestDto.class)) - ) @DeleteMapping("/{groupId}/leave") public ApiResponseDto leaveGroup( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId) { groupFacade.leaveGroup(user.getUsername(), groupId); return ApiResponseDto.success(SuccessStatus.LEAVE_GROUP_SUCCESS, SuccessStatus.LEAVE_GROUP_SUCCESS.getMessage()); } - @Operation(summary = "[모임 리더] 모임 삭제하기") - @ApiResponse( - responseCode = "200", - description = "모임을 삭제합니다. 모임 회원, 모임 기도제목 등 일괄 삭제" - ) @DeleteMapping("/{groupId}") public ApiResponseDto deleteGroup( @Parameter(hidden = true) @AuthenticationPrincipal User user, @@ -161,28 +107,18 @@ public ApiResponseDto deleteGroup( SuccessStatus.DELETE_GROUP_SUCCESS.getMessage()); } - @Operation(summary = "회원 검색") - @ApiResponse( - responseCode = "200", - description = "모임 내 회원 목록을 조회합니다" - ) @GetMapping("/{groupId}/member/search") public ApiResponseDto> searchGroupMembers( @PathVariable Long groupId, - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestParam(required = false) String name) { return ApiResponseDto.success(SuccessStatus.GET_MEMBER_LIST_SUCCESS, groupService.searchGroupMembers(groupId, name, user.getUsername())); } - @Operation(summary = "그룹 알림 설정") - @ApiResponse( - responseCode = "200", - description = "그룹 알림 설정을 변경합니다" - ) @PutMapping("/{groupId}/notification") public ApiResponseDto changeGroupNotification( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long groupId) { groupFacade.changeGroupNotification(user.getUsername(), groupId); return ApiResponseDto.success(SuccessStatus.CHANGE_GROUP_NOTIFICATION_SUCCESS, diff --git a/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayApi.java b/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayApi.java new file mode 100644 index 00000000..e4bb2ba1 --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayApi.java @@ -0,0 +1,81 @@ +package com.uspray.uspray.domain.group.controller; + +import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayRappingDto; +import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayRequestDto; +import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayResponseDto; +import com.uspray.uspray.domain.group.dto.grouppray.ScrapRequestDto; +import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; +import com.uspray.uspray.domain.pray.dto.pray.request.PrayToGroupPrayDto; +import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.security.core.userdetails.User; + +@Tag(name = "Group pray", description = "모임 기도제목 API") +@SecurityRequirement(name = "JWT Auth") +public interface GroupPrayApi { + + @Operation(summary = "[모임 전용] 기도제목 목록 조회") + @ApiResponse( + responseCode = "200", + description = "기도제목 목록 반환", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto> getPrayList( + @Parameter(hidden = true) User user, + @Parameter(description = "기도제목 종류(personal, shared)", required = true, example = "personal") String prayType, + @Parameter(example = "1") Long groupId + ); + + @Operation(summary = "모임 기도제목으로 불러오기") + @ApiResponse( + responseCode = "200", + description = "모임 기도제목으로 불러오기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto prayToGroupPray( + PrayToGroupPrayDto prayToGroupPrayDto, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "모임 기도제목 생성") + @ApiResponse( + responseCode = "201", + description = "모임 기도제목 생성") + ApiResponseDto createGroupPray(GroupPrayRequestDto groupPrayRequestDto, + @Parameter(hidden = true) User user); + + @Operation(summary = "모임 기도제목 조회") + @ApiResponse( + responseCode = "200", + description = "모임 기도제목 목록 반환", + content = @Content(schema = @Schema(implementation = GroupPrayResponseDto.class))) + ApiResponseDto getGroupPray( + Long groupId, + @Parameter(hidden = true) User user); + + @Operation(summary = "모임 기도제목 삭제") + @ApiResponse( + responseCode = "204", + description = "모임 기도제목 삭제") + ApiResponseDto deleteGroupPray(Long id); + + @Operation(summary = "모임 기도제목 좋아요") + @ApiResponse( + responseCode = "200", + description = "모임 기도제목 좋아요") + ApiResponseDto likeGroupPray(Long id, + @Parameter(hidden = true) User user); + + @Operation(summary = "모임 기도제목 스크랩") + @ApiResponse( + responseCode = "200", + description = "모임 기도제목 스크랩") + ApiResponseDto scarpGroupPray(ScrapRequestDto scrapRequestDto, + @Parameter(hidden = true) User user); +} diff --git a/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayController.java b/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayController.java index 2ff8dcac..5df79e79 100644 --- a/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayController.java +++ b/src/main/java/com/uspray/uspray/domain/group/controller/GroupPrayController.java @@ -1,23 +1,14 @@ package com.uspray.uspray.domain.group.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayRappingDto; import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayRequestDto; -import com.uspray.uspray.domain.group.dto.grouppray.GroupPrayResponseDto; import com.uspray.uspray.domain.group.dto.grouppray.ScrapRequestDto; +import com.uspray.uspray.domain.group.service.GroupPrayFacade; +import com.uspray.uspray.domain.group.service.GroupPrayService; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayToGroupPrayDto; -import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.global.exception.SuccessStatus; -import com.uspray.uspray.domain.group.service.GroupPrayFacade; -import com.uspray.uspray.domain.group.service.GroupPrayService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -32,98 +23,65 @@ @RestController @RequestMapping("/grouppray") -@Tag(name = "Group pray", description = "모임 기도제목 API") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -public class GroupPrayController { +public class GroupPrayController implements GroupPrayApi{ private final GroupPrayService groupPrayService; private final GroupPrayFacade groupPrayFacade; - @Operation(summary = "[모임 전용] 기도제목 목록 조회") - @ApiResponse( - responseCode = "200", - description = "기도제목 목록 반환", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @GetMapping public ApiResponseDto> getPrayList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "기도제목 종류(personal, shared)", required = true, example = "personal") String prayType, - @Parameter(example = "1") Long groupId + @AuthenticationPrincipal User user, + String prayType, + Long groupId ) { return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, groupPrayFacade.getPrayList(user.getUsername(), prayType, groupId)); } - @Operation(summary = "모임 기도제목으로 불러오기") - @ApiResponse( - responseCode = "200", - description = "모임 기도제목으로 불러오기", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @PostMapping("/pray-to-grouppray") public ApiResponseDto prayToGroupPray( @RequestBody PrayToGroupPrayDto prayToGroupPrayDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { groupPrayFacade.prayToGroupPray(prayToGroupPrayDto, user.getUsername()); return ApiResponseDto.success(SuccessStatus.PRAY_TO_GROUP_PRAY_SUCCESS); } - @Operation(summary = "모임 기도제목 생성") @PostMapping - @ApiResponse( - responseCode = "201", - description = "모임 기도제목 생성") public ApiResponseDto createGroupPray(@RequestBody GroupPrayRequestDto groupPrayRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { groupPrayFacade.createGroupPray(groupPrayRequestDto, user.getUsername()); return ApiResponseDto.success(SuccessStatus.CREATE_GROUP_PRAY_SUCCESS, SuccessStatus.CREATE_GROUP_PRAY_SUCCESS.getMessage()); } - @Operation(summary = "모임 기도제목 조회") @GetMapping("/{groupId}") - @ApiResponse( - responseCode = "200", - description = "모임 기도제목 목록 반환", - content = @Content(schema = @Schema(implementation = GroupPrayResponseDto.class))) public ApiResponseDto getGroupPray( @PathVariable(name = "groupId") Long groupId, - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { return ApiResponseDto.success(SuccessStatus.GET_GROUP_PRAY_LIST_SUCCESS, groupPrayFacade.getGroupPray(groupId, user.getUsername())); } - @Operation(summary = "모임 기도제목 삭제") @DeleteMapping("/{groupPrayId}") - @ApiResponse( - responseCode = "204", - description = "모임 기도제목 삭제") public ApiResponseDto deleteGroupPray(@PathVariable(name = "groupPrayId") Long id) { groupPrayService.deleteGroupPray(id); return ApiResponseDto.success(SuccessStatus.DELETE_GROUP_PRAY_SUCCESS, SuccessStatus.DELETE_GROUP_PRAY_SUCCESS.getMessage()); } - @Operation(summary = "모임 기도제목 좋아요") @PostMapping("/{groupPrayId}/like") - @ApiResponse( - responseCode = "200", - description = "모임 기도제목 좋아요") public ApiResponseDto likeGroupPray(@PathVariable(name = "groupPrayId") Long id, - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { groupPrayFacade.heartGroupPray(id, user.getUsername()); return ApiResponseDto.success(SuccessStatus.LIKE_GROUP_PRAY_SUCCESS, SuccessStatus.LIKE_GROUP_PRAY_SUCCESS.getMessage()); } - @Operation(summary = "모임 기도제목 스크랩") @PostMapping("/scrap") - @ApiResponse( - responseCode = "200", - description = "모임 기도제목 스크랩") public ApiResponseDto scarpGroupPray(@RequestBody ScrapRequestDto scrapRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { groupPrayFacade.scrapGroupPray(scrapRequestDto, user.getUsername()); return ApiResponseDto.success(SuccessStatus.SCARP_GROUP_PRAY_SUCCESS, SuccessStatus.SCARP_GROUP_PRAY_SUCCESS.getMessage()); diff --git a/src/main/java/com/uspray/uspray/domain/history/controller/HistoryApi.java b/src/main/java/com/uspray/uspray/domain/history/controller/HistoryApi.java new file mode 100644 index 00000000..68eb3e95 --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/history/controller/HistoryApi.java @@ -0,0 +1,45 @@ +package com.uspray.uspray.domain.history.controller; + +import com.uspray.uspray.domain.history.dto.request.HistoryRequestDto; +import com.uspray.uspray.domain.history.dto.request.HistorySearchRequestDto; +import com.uspray.uspray.domain.history.dto.response.HistoryDetailResponseDto; +import com.uspray.uspray.domain.history.dto.response.HistoryListResponseDto; +import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; +import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.core.userdetails.User; + +@Tag(name = "History", description = "기도제목 기록 API") +@SecurityRequirement(name = "JWT Auth") +public interface HistoryApi { + + ApiResponseDto getHistoryList( + @Parameter(hidden = true) User user, + HistoryRequestDto historyRequestDto); + + ApiResponseDto searchHistoryList( + @Parameter(hidden = true) User user, + HistorySearchRequestDto historySearchRequestDto + ); + + ApiResponseDto getHistoryDetail( + @Parameter(hidden = true) User user, + Long historyId); + + @Operation(summary = "히스토리 다시 기도하기") + @ApiResponse( + responseCode = "200", + description = "기도제목 반환", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto historyToPray( + @Parameter(hidden = true) User user, + Long historyId, + PrayRequestDto prayRequestDto); +} diff --git a/src/main/java/com/uspray/uspray/domain/history/controller/HistoryController.java b/src/main/java/com/uspray/uspray/domain/history/controller/HistoryController.java index 97cc2947..882fa9a7 100644 --- a/src/main/java/com/uspray/uspray/domain/history/controller/HistoryController.java +++ b/src/main/java/com/uspray/uspray/domain/history/controller/HistoryController.java @@ -1,22 +1,16 @@ package com.uspray.uspray.domain.history.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.history.dto.request.HistoryRequestDto; import com.uspray.uspray.domain.history.dto.request.HistorySearchRequestDto; import com.uspray.uspray.domain.history.dto.response.HistoryDetailResponseDto; import com.uspray.uspray.domain.history.dto.response.HistoryListResponseDto; +import com.uspray.uspray.domain.history.service.HistoryFacade; +import com.uspray.uspray.domain.history.service.HistoryService; import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.global.exception.SuccessStatus; -import com.uspray.uspray.domain.history.service.HistoryFacade; -import com.uspray.uspray.domain.history.service.HistoryService; -import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; import javax.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -31,17 +25,15 @@ @RestController @RequestMapping("/history") -@Tag(name = "History", description = "기도제목 기록 API") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -public class HistoryController { +public class HistoryController implements HistoryApi{ private final HistoryService historyService; private final HistoryFacade historyFacade; @GetMapping public ApiResponseDto getHistoryList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @ModelAttribute HistoryRequestDto historyRequestDto) { return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, historyService.getHistoryList(user.getUsername(), historyRequestDto.getType(), @@ -53,7 +45,7 @@ public ApiResponseDto getHistoryList( // 날짜까지 (옵션) @PostMapping("/search") public ApiResponseDto searchHistoryList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody @Valid HistorySearchRequestDto historySearchRequestDto ) { return ApiResponseDto.success(SuccessStatus.GET_HISTORY_LIST_SUCCESS, @@ -62,17 +54,12 @@ public ApiResponseDto searchHistoryList( @GetMapping("/detail/{historyId}") public ApiResponseDto getHistoryDetail( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @PathVariable Long historyId) { return ApiResponseDto.success(SuccessStatus.GET_HISTORY_DETAIL_SUCCESS, historyService.getHistoryDetail(user.getUsername(), historyId)); } - @Operation(summary = "히스토리 다시 기도하기") - @ApiResponse( - responseCode = "200", - description = "기도제목 반환", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @PostMapping("/pray/{historyId}") public ApiResponseDto historyToPray( @Parameter(hidden = true) @AuthenticationPrincipal User user, diff --git a/src/main/java/com/uspray/uspray/domain/member/controller/MemberApi.java b/src/main/java/com/uspray/uspray/domain/member/controller/MemberApi.java new file mode 100644 index 00000000..a4c8a1c5 --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/member/controller/MemberApi.java @@ -0,0 +1,51 @@ +package com.uspray.uspray.domain.member.controller; + +import com.uspray.uspray.domain.member.dto.request.CheckPwDTO; +import com.uspray.uspray.domain.member.dto.request.FcmTokenDto; +import com.uspray.uspray.domain.member.dto.request.NotificationAgreeDto; +import com.uspray.uspray.domain.member.dto.request.OauthNameDto; +import com.uspray.uspray.domain.member.dto.response.NotificationInfoDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.springframework.security.core.userdetails.User; + +@SecurityRequirement(name = "JWT Auth") +@Tag(name = "Member", description = "유저 관련 api") +public interface MemberApi { + + @Operation(summary = "전화번호 변경") + ApiResponseDto changePhone( + @Parameter(hidden = true) User user, + @Schema(example = "01046518879") String changePhone); + + @Operation(summary = "알림 On/Off 조회") + ApiResponseDto getNotificationAgree( + @Parameter(hidden = true) User user); + + @Operation(summary = "알림 On/Off") + ApiResponseDto setNotificationAgree( + @Parameter(hidden = true) User user, + NotificationAgreeDto notificationAgreeDto); + + @Operation(summary = "소셜 로그인 회원가입 이름 설정") + ApiResponseDto setOAuthName(OauthNameDto oauthNameDto); + + @Operation(summary = "비밀번호 확인") + ApiResponseDto checkPw( + @Parameter(hidden = true) User user, + CheckPwDTO checkPwDto); + + @Operation(summary = "비밀번호 변경") + ApiResponseDto changePw(@Parameter(hidden = true) User user, + CheckPwDTO changePwDto); + + @Operation(summary = "FCM 토큰 업데이트") + @SecurityRequirement(name = "JWT Auth") + ApiResponseDto updateFcmToken( + @Parameter(hidden = true) User user, + FcmTokenDto fcmTokenDto); +} diff --git a/src/main/java/com/uspray/uspray/domain/member/controller/MemberController.java b/src/main/java/com/uspray/uspray/domain/member/controller/MemberController.java index 6de2285c..694da697 100644 --- a/src/main/java/com/uspray/uspray/domain/member/controller/MemberController.java +++ b/src/main/java/com/uspray/uspray/domain/member/controller/MemberController.java @@ -1,18 +1,13 @@ package com.uspray.uspray.domain.member.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.member.dto.request.CheckPwDTO; import com.uspray.uspray.domain.member.dto.request.FcmTokenDto; -import com.uspray.uspray.domain.member.dto.request.OauthNameDto; import com.uspray.uspray.domain.member.dto.request.NotificationAgreeDto; +import com.uspray.uspray.domain.member.dto.request.OauthNameDto; import com.uspray.uspray.domain.member.dto.response.NotificationInfoDto; -import com.uspray.uspray.global.exception.SuccessStatus; import com.uspray.uspray.domain.member.service.MemberService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import com.uspray.uspray.global.exception.SuccessStatus; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; @@ -27,57 +22,49 @@ @RestController @RequiredArgsConstructor @RequestMapping("/member") -@SecurityRequirement(name = "JWT Auth") -@Tag(name = "Member", description = "유저 관련 api") -public class MemberController { +public class MemberController implements MemberApi{ private final MemberService memberService; - @Operation(summary = "전화번호 변경") @PostMapping("/{changePhone}") public ApiResponseDto changePhone( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Schema(example = "01046518879") @PathVariable("changePhone") String changePhone) { + @AuthenticationPrincipal User user, + @PathVariable("changePhone") String changePhone) { memberService.changePhone(user.getUsername(), changePhone); return ApiResponseDto.success(SuccessStatus.CHANGE_PHONE_SUCCESS); } - @Operation(summary = "알림 On/Off 조회") @GetMapping("/notification-setting") public ApiResponseDto getNotificationAgree( - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { return ApiResponseDto.success(SuccessStatus.GET_NOTIFICATION_AGREE_SUCCESS, memberService.getNotificationAgree(user.getUsername())); } - @Operation(summary = "알림 On/Off") @PostMapping("/notification-setting") public ApiResponseDto setNotificationAgree( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody NotificationAgreeDto notificationAgreeDto) { memberService.changeNotificationAgree(user.getUsername(), notificationAgreeDto); return ApiResponseDto.success(SuccessStatus.CHANGE_PUSH_AGREE_SUCCESS); } @PutMapping("/oauth") - @Operation(summary = "소셜 로그인 회원가입 이름 설정") public ApiResponseDto setOAuthName(@RequestBody OauthNameDto oauthNameDto) { memberService.changeName(oauthNameDto); return ApiResponseDto.success(SuccessStatus.CHANGE_NAME_SUCCESS); } @PostMapping("/check-pw") - @Operation(summary = "비밀번호 확인") public ApiResponseDto checkPw( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody CheckPwDTO checkPwDto) { return ApiResponseDto.success(SuccessStatus.CHECK_USER_PW_SUCCESS, memberService.checkPw( user.getUsername(), checkPwDto)); } @PostMapping("/change-pw") - @Operation(summary = "비밀번호 변경") - public ApiResponseDto changePw(@Parameter(hidden = true) @AuthenticationPrincipal User user, + public ApiResponseDto changePw(@AuthenticationPrincipal User user, @RequestBody CheckPwDTO changePwDto) { memberService.changePw(user.getUsername(), changePwDto); return ApiResponseDto.success(SuccessStatus.CHANGE_USER_PW_SUCCESS); @@ -85,10 +72,8 @@ public ApiResponseDto changePw(@Parameter(hidden = true) @AuthenticationPrinc @PutMapping("/fcm-token") - @Operation(summary = "FCM 토큰 업데이트") - @SecurityRequirement(name = "JWT Auth") public ApiResponseDto updateFcmToken( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody FcmTokenDto fcmTokenDto) { memberService.updateFcmToken(user.getUsername(), fcmTokenDto); return ApiResponseDto.success(SuccessStatus.UPDATE_FCM_TOKEN_SUCCESS); diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayApi.java b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayApi.java new file mode 100644 index 00000000..2baefa3d --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayApi.java @@ -0,0 +1,99 @@ +package com.uspray.uspray.domain.pray.controller; + +import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; +import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; +import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; +import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.security.core.userdetails.User; + +@Tag(name = "Pray", description = "기도제목 관련 API") +@SecurityRequirement(name = "JWT Auth") +public interface PrayApi { + + @Operation(summary = "기도제목 목록 조회") + @ApiResponse( + responseCode = "200", + description = "기도제목 목록 반환", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto> getPrayList( + @Parameter(hidden = true) User user, + @Parameter(description = "기도제목 종류(personal, shared)", required = true, example = "personal") String prayType + ); + + @Operation(summary = "기도제목 조회") + @ApiResponse( + responseCode = "200", + description = "기도제목 조회", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto getPrayDetail( + @Parameter(hidden = true) User user, + @Parameter(description = "기도제목 ID", required = true) Long prayId + ); + + @Operation(summary = "기도제목 생성") + @ApiResponse( + responseCode = "201", + description = "기도제목 생성", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto createPray( + PrayRequestDto prayRequestDto, + @Parameter(hidden = true) User user + ); + + @ApiResponse(responseCode = "204", description = "기도제목 삭제") + @Operation(summary = "기도제목 삭제") + ApiResponseDto deletePray( + @Parameter(description = "기도제목 ID", required = true) Long prayId, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "기도제목 수정") + @ApiResponse( + responseCode = "200", + description = "기도제목 수정", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto updatePray( + @Parameter(description = "기도제목 ID", required = true) Long prayId, + PrayUpdateRequestDto prayUpdateRequestDto, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "오늘 기도하기") + @ApiResponse( + responseCode = "200", + description = "오늘 기도하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto> todayPray( + @Parameter(description = "기도제목 ID", required = true) Long prayId, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "기도 완료하기") + @ApiResponse( + responseCode = "200", + description = "기도제목 완료하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto> completePray( + @Parameter(description = "기도제목 ID", required = true) Long prayId, + @Parameter(hidden = true) User user + ); + + @Operation(summary = "기도제목 취소하기") + @ApiResponse( + responseCode = "200", + description = "오늘 기도 취소하기", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) + ApiResponseDto> cancelPray( + @Parameter(description = "기도제목 ID", required = true) Long prayId, + @Parameter(hidden = true) User user + ); +} diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java index 1b8b3619..aebd202f 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/PrayController.java @@ -1,25 +1,17 @@ package com.uspray.uspray.domain.pray.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; import com.uspray.uspray.domain.pray.dto.pray.PrayListResponseDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayRequestDto; import com.uspray.uspray.domain.pray.dto.pray.request.PrayUpdateRequestDto; import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; -import com.uspray.uspray.global.exception.SuccessStatus; import com.uspray.uspray.domain.pray.service.PrayFacade; import com.uspray.uspray.domain.pray.service.PrayService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import com.uspray.uspray.global.exception.SuccessStatus; import java.util.List; import javax.validation.Valid; import lombok.RequiredArgsConstructor; -import org.springframework.http.HttpStatus; import org.springframework.security.core.annotation.AuthenticationPrincipal; import org.springframework.security.core.userdetails.User; import org.springframework.web.bind.annotation.DeleteMapping; @@ -29,125 +21,85 @@ import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/pray") -@Tag(name = "Pray", description = "기도제목 관련 API") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -public class PrayController { +public class PrayController implements PrayApi { private final PrayService prayService; private final PrayFacade prayFacade; - @Operation(summary = "기도제목 목록 조회") - @ApiResponse( - responseCode = "200", - description = "기도제목 목록 반환", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @GetMapping public ApiResponseDto> getPrayList( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "기도제목 종류(personal, shared)", required = true, example = "personal") String prayType + @AuthenticationPrincipal User user, + String prayType ) { return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, prayFacade.getPrayList(user.getUsername(), prayType)); } @GetMapping("/{prayId}") - @ApiResponse( - responseCode = "200", - description = "기도제목 조회", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 조회") public ApiResponseDto getPrayDetail( - @Parameter(hidden = true) @AuthenticationPrincipal User user, - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId + @AuthenticationPrincipal User user, + Long prayId ) { return ApiResponseDto.success(SuccessStatus.GET_PRAY_SUCCESS, prayService.getPrayDetail(prayId, user.getUsername())); } @PostMapping - @ApiResponse( - responseCode = "201", - description = "기도제목 생성", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 생성") - @ResponseStatus(HttpStatus.CREATED) public ApiResponseDto createPray( @RequestBody @Valid PrayRequestDto prayRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS, prayFacade.createPray(prayRequestDto, user.getUsername())); } @DeleteMapping("/{prayId}") - @ApiResponse(responseCode = "204", description = "기도제목 삭제") - @Operation(summary = "기도제목 삭제") public ApiResponseDto deletePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, prayFacade.deletePray(prayId, user.getUsername())); } @PutMapping("/{prayId}") - @ApiResponse( - responseCode = "200", - description = "기도제목 수정", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) - @Operation(summary = "기도제목 수정") public ApiResponseDto updatePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, + @PathVariable("prayId") Long prayId, @RequestBody @Valid PrayUpdateRequestDto prayUpdateRequestDto, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS, prayFacade.updatePray(prayId, user.getUsername(), prayUpdateRequestDto)); } - @Operation(summary = "오늘 기도하기") - @ApiResponse( - responseCode = "200", - description = "오늘 기도하기", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @PutMapping("/{prayId}/today") public ApiResponseDto> todayPray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS, prayFacade.todayPray(prayId, user.getUsername())); } - @Operation(summary = "기도 완료하기") - @ApiResponse( - responseCode = "200", - description = "기도제목 완료하기", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @PutMapping("/{prayId}/complete") public ApiResponseDto> completePray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user ) { + prayFacade.createHistory(user.getUsername(), prayId); return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, prayFacade.completePray(prayId, user.getUsername())); } - @Operation(summary = "기도제목 취소하기") - @ApiResponse( - responseCode = "200", - description = "오늘 기도 취소하기", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class))) @PutMapping("/{prayId}/cancel") public ApiResponseDto> cancelPray( - @Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId, - @Parameter(hidden = true) @AuthenticationPrincipal User user + @PathVariable("prayId") Long prayId, + @AuthenticationPrincipal User user ) { return ApiResponseDto.success(SuccessStatus.CANCEL_PRAY_SUCCESS, prayFacade.cancelPray(prayId, user.getUsername())); diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/ShareApi.java b/src/main/java/com/uspray/uspray/domain/pray/controller/ShareApi.java new file mode 100644 index 00000000..2d706db3 --- /dev/null +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/ShareApi.java @@ -0,0 +1,62 @@ +package com.uspray.uspray.domain.pray.controller; + +import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; +import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayDeleteRequestDto; +import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayRequestDto; +import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPraySaveRequestDto; +import com.uspray.uspray.domain.pray.dto.sharedpray.response.SharedPrayResponseDto; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.security.SecurityRequirement; +import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; +import org.springframework.security.core.userdetails.User; + +@SecurityRequirement(name = "JWT Auth") +@Tag(name = "Shared pray", description = "기도제목 공유 관련 API") +public interface ShareApi { + + @ApiResponse( + responseCode = "200", + description = "공유받은 기도제목 조회 (보관함 조회)", + content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class)) + ) + @Operation(summary = "공유받은 기도제목 조회 (보관함 조회)") + ApiResponseDto> getSharedPrayList( + @Parameter(hidden = true) User user); + + @ApiResponse( + responseCode = "201", + description = "공유받은 기도제목을 보관함에 넣습니다", + content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class)) + ) + @Operation(summary = "기도제목 공유받기") + ApiResponseDto receiveSharedPray( + @Parameter(hidden = true) User user, + SharedPrayRequestDto sharedPrayRequestDto); + + @ApiResponse( + responseCode = "204", + description = "공유받은 기도제목 삭제", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) + ) + @Operation(summary = "공유받은 기도제목 삭제") + ApiResponseDto deletePray( + @Parameter(hidden = true) User user, + SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto); + + @ApiResponse( + responseCode = "201", + description = "보관함에 있는 공유받은 기도제목을 개인 기도제목으로 저장합니다", + content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) + ) + @Operation(summary = "공유받은 기도제목 저장") + ApiResponseDto savePray( + @Parameter(hidden = true) User user, + SharedPraySaveRequestDto sharedPraySaveRequestDto); + +} diff --git a/src/main/java/com/uspray/uspray/domain/pray/controller/ShareController.java b/src/main/java/com/uspray/uspray/domain/pray/controller/ShareController.java index 2ac95eac..9d07bc91 100644 --- a/src/main/java/com/uspray/uspray/domain/pray/controller/ShareController.java +++ b/src/main/java/com/uspray/uspray/domain/pray/controller/ShareController.java @@ -1,21 +1,13 @@ package com.uspray.uspray.domain.pray.controller; -import com.uspray.uspray.global.common.dto.ApiResponseDto; -import com.uspray.uspray.domain.pray.dto.pray.response.PrayResponseDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayDeleteRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPrayRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.request.SharedPraySaveRequestDto; import com.uspray.uspray.domain.pray.dto.sharedpray.response.SharedPrayResponseDto; -import com.uspray.uspray.global.exception.SuccessStatus; import com.uspray.uspray.domain.pray.service.ShareFacade; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.security.SecurityRequirement; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.uspray.uspray.global.common.dto.ApiResponseDto; +import com.uspray.uspray.global.exception.SuccessStatus; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.security.core.annotation.AuthenticationPrincipal; @@ -30,62 +22,36 @@ @RestController @RequestMapping("/share") @RequiredArgsConstructor -@SecurityRequirement(name = "JWT Auth") -@Tag(name = "Shared pray", description = "기도제목 공유 관련 API") -public class ShareController { +public class ShareController implements ShareApi { private final ShareFacade shareFacade; @GetMapping - @ApiResponse( - responseCode = "200", - description = "공유받은 기도제목 조회 (보관함 조회)", - content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class)) - ) - @Operation(summary = "공유받은 기도제목 조회 (보관함 조회)") public ApiResponseDto> getSharedPrayList( - @Parameter(hidden = true) @AuthenticationPrincipal User user) { + @AuthenticationPrincipal User user) { return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS, shareFacade.getSharedPrayList(user.getUsername())); } @PostMapping("/receive") - @ApiResponse( - responseCode = "201", - description = "공유받은 기도제목을 보관함에 넣습니다", - content = @Content(schema = @Schema(implementation = SharedPrayRequestDto.class)) - ) - @Operation(summary = "기도제목 공유받기") public ApiResponseDto receiveSharedPray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody SharedPrayRequestDto sharedPrayRequestDto) { return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_SUCCESS, shareFacade.receivedSharedPray(user.getUsername(), sharedPrayRequestDto)); } - @DeleteMapping() - @ApiResponse( - responseCode = "204", - description = "공유받은 기도제목 삭제", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) - ) - @Operation(summary = "공유받은 기도제목 삭제") + @DeleteMapping public ApiResponseDto deletePray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody SharedPrayDeleteRequestDto sharedPrayDeleteRequestDto) { shareFacade.deleteSharedPray(user.getUsername(), sharedPrayDeleteRequestDto); return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS, SuccessStatus.DELETE_PRAY_SUCCESS.getMessage()); } @PostMapping("/save") - @ApiResponse( - responseCode = "201", - description = "보관함에 있는 공유받은 기도제목을 개인 기도제목으로 저장합니다", - content = @Content(schema = @Schema(implementation = PrayResponseDto.class)) - ) - @Operation(summary = "공유받은 기도제목 저장") public ApiResponseDto savePray( - @Parameter(hidden = true) @AuthenticationPrincipal User user, + @AuthenticationPrincipal User user, @RequestBody SharedPraySaveRequestDto sharedPraySaveRequestDto) { shareFacade.saveSharedPray(user.getUsername(), sharedPraySaveRequestDto); return ApiResponseDto.success(SuccessStatus.SHARE_PRAY_AGREE_SUCCESS, SuccessStatus.SHARE_PRAY_AGREE_SUCCESS.getMessage());