Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add prayService #54

Merged
merged 18 commits into from
Nov 14, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
158 changes: 85 additions & 73 deletions src/main/java/com/uspray/uspray/controller/PrayController.java
Original file line number Diff line number Diff line change
Expand Up @@ -36,77 +36,89 @@
@RequiredArgsConstructor
@SecurityRequirement(name = "JWT Auth")
public class PrayController {

private final PrayService prayService;

@Operation(summary = "기도제목 목록 조회")

@ApiResponse(
responseCode = "200",
description = "기도제목 목록 반환",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))

@GetMapping()
public ApiResponseDto<List<PrayListResponseDto>> getPrayList(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@Parameter(description = "정렬 기준 (date, count)", required = true, example = "date") String orderType
) {
return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS,
prayService.getPrayList(user.getUsername(), orderType));
}

@GetMapping("/{prayId}")
@ApiResponse(
responseCode = "200",
description = "기도제목 조회",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@Operation(summary = "기도제목 조회")
public ApiResponseDto<PrayResponseDto> getPrayDetail(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") 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<PrayResponseDto> createPray(
@RequestBody @Valid PrayRequestDto prayRequestDto,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS,
prayService.createPray(prayRequestDto, user.getUsername()));
}

@DeleteMapping("/{prayId}")
@ApiResponse(responseCode = "204", description = "기도제목 삭제")
@Operation(summary = "기도제목 삭제")
public ApiResponseDto<PrayResponseDto> deletePray(
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS,
prayService.deletePray(prayId, user.getUsername()));
}

@PutMapping("/{prayId}")
@ApiResponse(
responseCode = "200",
description = "기도제목 수정",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@Operation(summary = "기도제목 수정")
public ApiResponseDto<PrayResponseDto> updatePray(
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId,
@RequestBody @Valid PrayRequestDto prayRequestDto,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS,
prayService.updatePray(prayId, user.getUsername(), prayRequestDto));
}

private final PrayService prayService;

@Operation(summary = "기도제목 목록 조회")
@ApiResponse(
responseCode = "200",
description = "기도제목 목록 반환",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@GetMapping()
public ApiResponseDto<List<PrayListResponseDto>> getPrayList(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@Parameter(description = "정렬 기준 (date, count)", required = true, example = "date") String orderType
) {
return ApiResponseDto.success(SuccessStatus.GET_PRAY_LIST_SUCCESS,
prayService.getPrayList(user.getUsername(), orderType));
}

@GetMapping("/{prayId}")
@ApiResponse(
responseCode = "200",
description = "기도제목 조회",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@Operation(summary = "기도제목 조회")
public ApiResponseDto<PrayResponseDto> getPrayDetail(
@Parameter(hidden = true) @AuthenticationPrincipal User user,
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") 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<PrayResponseDto> createPray(
@RequestBody @Valid PrayRequestDto prayRequestDto,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.CREATE_PRAY_SUCCESS,
prayService.createPray(prayRequestDto, user.getUsername()));
}

@DeleteMapping("/{prayId}")
@ApiResponse(responseCode = "204", description = "기도제목 삭제")
@Operation(summary = "기도제목 삭제")
public ApiResponseDto<PrayResponseDto> deletePray(
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.DELETE_PRAY_SUCCESS,
prayService.deletePray(prayId, user.getUsername()));
}

@PutMapping("/{prayId}")
@ApiResponse(
responseCode = "200",
description = "기도제목 수정",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@Operation(summary = "기도제목 수정")
public ApiResponseDto<PrayResponseDto> updatePray(
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId,
@RequestBody @Valid PrayRequestDto prayRequestDto,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.UPDATE_PRAY_SUCCESS,
prayService.updatePray(prayId, user.getUsername(), prayRequestDto));
}

@Operation(summary = "오늘 기도하기")
@ApiResponse(
responseCode = "200",
description = "오늘 기도하기",
content = @Content(schema = @Schema(implementation = PrayResponseDto.class)))
@PutMapping("/{prayId}/today")
baebae02 marked this conversation as resolved.
Show resolved Hide resolved
public ApiResponseDto<List<PrayListResponseDto>> todayPray(
@Parameter(description = "기도제목 ID", required = true) @PathVariable("prayId") Long prayId,
@Parameter(hidden = true) @AuthenticationPrincipal User user
) {
return ApiResponseDto.success(SuccessStatus.INCREASE_PRAY_COUNT_SUCCESS,
prayService.todayPray(prayId, user.getUsername()));
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/uspray/uspray/domain/Pray.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,8 @@ public void update(PrayRequestDto prayRequestDto) {
public String getContent() {
return new String(Base64.getDecoder().decode(content));
}

public void countUp() {
this.count++;
}
}
57 changes: 29 additions & 28 deletions src/main/java/com/uspray/uspray/exception/ErrorStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,27 @@
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum ErrorStatus {

/*
* 400 BAD_REQUEST
*/
VALIDATION_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
ALREADY_EXIST_ID_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 사용중인 아이디입니다."),
INVALID_TOKEN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "토큰 혹은 만료시간 설정이 잘못되었습니다."),
SENDER_RECEIVER_SAME_EXCEPTION(HttpStatus.BAD_REQUEST, "자신에게는 기도제목을 공유할 수 없습니다."),
CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."),
CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."),

/*
* 401 UNAUTHORIZED
*/
PRAY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 기도제목에 대한 권한이 없습니다."),
TOKEN_NOT_VALID_EXCEPTION(HttpStatus.UNAUTHORIZED, "유효하지 않는 토큰입니다."),
SHARE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 공유할 권한이 없습니다."),
DELETE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 삭제할 권한이 없습니다."),
CATEGORY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다."),


/*
* 400 BAD_REQUEST
*/
VALIDATION_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 요청입니다."),
ALREADY_EXIST_ID_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 사용중인 아이디입니다."),
INVALID_TOKEN_INFO_EXCEPTION(HttpStatus.BAD_REQUEST, "토큰 혹은 만료시간 설정이 잘못되었습니다."),
SENDER_RECEIVER_SAME_EXCEPTION(HttpStatus.BAD_REQUEST, "자신에게는 기도제목을 공유할 수 없습니다."),
CATEGORY_ALREADY_EXIST_EXCEPTION(HttpStatus.BAD_REQUEST, "이미 존재하는 카테고리입니다."),
CATEGORY_LIMIT_EXCEPTION(HttpStatus.BAD_REQUEST, "카테고리는 최대 7개까지 생성 가능합니다."),
ALREADY_PRAYED_TODAY(HttpStatus.BAD_REQUEST, "오늘은 이미 기도하셨습니다."),
baebae02 marked this conversation as resolved.
Show resolved Hide resolved

/*
* 401 UNAUTHORIZED
*/
PRAY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 기도제목에 대한 권한이 없습니다."),
TOKEN_NOT_VALID_EXCEPTION(HttpStatus.UNAUTHORIZED, "유효하지 않는 토큰입니다."),
SHARE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 공유할 권한이 없습니다."),
DELETE_NOT_AUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "기도제목을 삭제할 권한이 없습니다."),
CATEGORY_UNAUTHORIZED_EXCEPTION(HttpStatus.UNAUTHORIZED, "해당 카테고리에 대한 권한이 없습니다."),

/**
* 404 NOT FOUND
*/
Expand All @@ -37,12 +38,12 @@ public enum ErrorStatus {
PRAY_NOT_FOUND_EXCEPTION(HttpStatus.NOT_FOUND, "해당 기도제목을 찾을 수 없습니다."),
PRAY_ALREADY_DELETED_EXCEPTION(HttpStatus.NOT_FOUND, "원본 기도제목이 삭제되었습니다."),
NOT_FOUND_SHARED_PRAY_EXCEPTION(HttpStatus.NOT_FOUND, "해당 공유기도제목을 찾을 수 없습니다."),
;

private final HttpStatus httpStatus;
private final String message;

public int getHttpStatusCode() {
return httpStatus.value();
}
;
private final HttpStatus httpStatus;
private final String message;
public int getHttpStatusCode() {
return httpStatus.value();
}
}
93 changes: 47 additions & 46 deletions src/main/java/com/uspray/uspray/exception/SuccessStatus.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,50 +8,51 @@
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public enum SuccessStatus {

/**
* 200 OK
*/
LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."),
GET_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."),
GET_GROUP_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."),
GET_PRAY_SUCCESS(HttpStatus.OK, "기도제목 조회에 성공했습니다."),
SEND_SMS_SUCCESS(HttpStatus.OK, "SMS를 성공적으로 전송했습니다."),
CERTIFICATION_SUCCESS(HttpStatus.OK, "전화번호 인증에 성공했습니다."),
CHANGE_PHONE_SUCCESS(HttpStatus.OK, "전화번호를 성공적으로 변경했습니다."),
FIND_USER_ID_SUCCESS(HttpStatus.OK, "아이디를 성공적으로 조회했습니다."),
CHANGE_USER_PW_SUCCESS(HttpStatus.OK, "비밀번호를 성공적으로 변경했습니다."),
CHECK_USER_ID_SUCCESS(HttpStatus.OK, "사용 가능한 아이디입니다."),
UPDATE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."),
UPDATE_GROUP_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."),
REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다."),
PUSH_SUCCESS(HttpStatus.OK, "푸쉬 알림을 성공적으로 전송했습니다."),
CHANGE_PUSH_AGREE_SUCCESS(HttpStatus.OK, "푸쉬 알림 설정을 성공적으로 변경했습니다."),
UPDATE_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 수정에 성공했습니다."),
GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 조회에 성공했습니다."),
GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."),
GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."),

/*
* 201 created
*/
SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료되었습니다."),
CREATE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 생성에 성공했습니다."),
CREATE_GROUP_PRAY_SUCCESS(HttpStatus.CREATED, "모임 기도제목 생성에 성공했습니다."),
CREATE_CATEGORY_SUCCESS(HttpStatus.CREATED, "카테고리 생성에 성공했습니다."),
SHARE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 공유에 성공했습니다."),
SHARE_PRAY_AGREE_SUCCESS(HttpStatus.CREATED, "기도제목 공유 수락에 성공했습니다."),

/*
* 204 deleted
*/
DELETE_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "기도제목 삭제에 성공했습니다."),
DELETE_GROUP_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "모임 기도제목 삭제에 성공했습니다."),
WITHDRAWAL_SUCCESS(HttpStatus.NO_CONTENT, "회원 탈퇴에 성공했습니다."),
DELETE_CATEGORY_SUCCESS(HttpStatus.NO_CONTENT, "카테고리 삭제에 성공했습니다.");


private final HttpStatus httpStatus;
private final String message;


/**
* 200 OK
*/
LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."),
GET_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."),
GET_GROUP_PRAY_LIST_SUCCESS(HttpStatus.OK, "기도제목 목록 조회에 성공했습니다."),
GET_PRAY_SUCCESS(HttpStatus.OK, "기도제목 조회에 성공했습니다."),
SEND_SMS_SUCCESS(HttpStatus.OK, "SMS를 성공적으로 전송했습니다."),
CERTIFICATION_SUCCESS(HttpStatus.OK, "전화번호 인증에 성공했습니다."),
CHANGE_PHONE_SUCCESS(HttpStatus.OK, "전화번호를 성공적으로 변경했습니다."),
FIND_USER_ID_SUCCESS(HttpStatus.OK, "아이디를 성공적으로 조회했습니다."),
CHANGE_USER_PW_SUCCESS(HttpStatus.OK, "비밀번호를 성공적으로 변경했습니다."),
CHECK_USER_ID_SUCCESS(HttpStatus.OK, "사용 가능한 아이디입니다."),
UPDATE_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."),
UPDATE_GROUP_PRAY_SUCCESS(HttpStatus.OK, "기도제목 수정에 성공했습니다."),
REISSUE_SUCCESS(HttpStatus.OK, "토큰 재발급에 성공했습니다."),
PUSH_SUCCESS(HttpStatus.OK, "푸쉬 알림을 성공적으로 전송했습니다."),
CHANGE_PUSH_AGREE_SUCCESS(HttpStatus.OK, "푸쉬 알림 설정을 성공적으로 변경했습니다."),
UPDATE_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 수정에 성공했습니다."),
GET_CATEGORY_SUCCESS(HttpStatus.OK, "카테고리 조회에 성공했습니다."),
GET_HISTORY_LIST_SUCCESS(HttpStatus.OK, "히스토리 목록 조회에 성공했습니다."),
GET_HISTORY_DETAIL_SUCCESS(HttpStatus.OK, "히스토리 상세 조회에 성공했습니다."),
INCREASE_PRAY_COUNT_SUCCESS(HttpStatus.OK, "기도제목 카운트 증가에 성공했습니다."),

/*
* 201 created
*/
SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료되었습니다."),
CREATE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 생성에 성공했습니다."),
CREATE_GROUP_PRAY_SUCCESS(HttpStatus.CREATED, "모임 기도제목 생성에 성공했습니다."),
CREATE_CATEGORY_SUCCESS(HttpStatus.CREATED, "카테고리 생성에 성공했습니다."),
SHARE_PRAY_SUCCESS(HttpStatus.CREATED, "기도제목 공유에 성공했습니다."),
SHARE_PRAY_AGREE_SUCCESS(HttpStatus.CREATED, "기도제목 공유 수락에 성공했습니다."),

/*
* 204 deleted
*/
DELETE_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "기도제목 삭제에 성공했습니다."),
DELETE_GROUP_PRAY_SUCCESS(HttpStatus.NO_CONTENT, "모임 기도제목 삭제에 성공했습니다."),
WITHDRAWAL_SUCCESS(HttpStatus.NO_CONTENT, "회원 탈퇴에 성공했습니다."),
DELETE_CATEGORY_SUCCESS(HttpStatus.NO_CONTENT, "카테고리 삭제에 성공했습니다.");


private final HttpStatus httpStatus;
private final String message;

}
21 changes: 15 additions & 6 deletions src/main/java/com/uspray/uspray/infrastructure/PrayRepository.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,23 @@

@Repository
public interface PrayRepository extends JpaRepository<Pray, Long>, PrayRepositoryCustom {

default Pray getPrayById(Long id) {
return findById(id).orElseThrow(
() -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION,
ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage()));
return findById(id).orElseThrow(
() -> new NotFoundException(ErrorStatus.PRAY_NOT_FOUND_EXCEPTION,
ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage()));
}


default Pray getPrayByIdAndMemberId(Long prayId, String username) throws NotFoundException {
return findById(prayId)
.filter(pray -> pray.getMember().getUserId().equals(username))
.orElseThrow(() -> new NotFoundException(
ErrorStatus.PRAY_NOT_FOUND_EXCEPTION,
ErrorStatus.PRAY_NOT_FOUND_EXCEPTION.getMessage()
));
}

List<Pray> findAllByIdIn(List<Long> prayIds);

List<Pray> findAllByDeadlineBefore(LocalDate date);
}
Loading