Skip to content

[Feat] 정산 api 수정(동일한 api로 정산 완료/미완 상태 변경하기) #364#365

Merged
solgito merged 5 commits intomainfrom
feat/add_some_for_settlement#364
Feb 6, 2025
Merged

[Feat] 정산 api 수정(동일한 api로 정산 완료/미완 상태 변경하기) #364#365
solgito merged 5 commits intomainfrom
feat/add_some_for_settlement#364

Conversation

@solgito
Copy link
Contributor

@solgito solgito commented Feb 6, 2025

개요

  • 챌린지 상태를 추가했습니다.

    • 중도 취소된 챌린지도 정산 처리 여부를 반영하도록 CANCELED_SETTLED 상태를 추가했습니다.
  • 챌린지 정산 API를 수정했습니다.

    • 기존 정산 API는 챌린지 종료 시, 정산 완료상태를 변경하는 로직만 존재했습니다.
    • 이제는 정산 미완 -> 정산 완료, 정산 완료 -> 정산 미완의 상태 변경이 모두 가능합니다.
    • 이를 종료된 챌린지 뿐만 아니라, 중도 취소한 챌린지에도 정산 미완 or 완료 상태 변경이 가능하도록 했습니다.

코드 내용

1. ChallengeStateCANCELED_SETTLED 추가

  • 챌린지 상태를 관리하는 ChallengeState enum에 CANCELED_SETTLED를 추가했습니다.
// ChallengeState.java

public enum ChallengeState {
    ...
    CANCELED,
    CANCELED_SETTLED,
    ...
}
  • 챌린지 중도 취소(정산 X)를 뜻하는 CANCELED, 챌린지 중도 취소(정산 O)를 뜻하는 CANCELED_SETTLED중도 취소 상태를 정산 여부에 따라 나누어 관리할 수 있게 되었습니다.

2. 챌린지 정산 API 수정

  • 챌린지 정산을 위한 /api/challenges/{id}/settlement의 내부 메서드에 상태에 따른 분기문 로직을 추가했습니다.
// ChallengeSettlementService.java

...
public SuccessResponse<Void> settleChallenge(Long challengeId, Member member) {
    ...
    switch (challenge.getState()) {
        case COMPLETED_PENDING_SETTLEMENT -> challenge.setStateCompletedSettled();
        case COMPLETED_SETTLED -> challenge.setStateCompletedPendingSettlement();
        case CANCELED -> challenge.setStateCanceledSettled();
        case CANCELED_SETTLED -> challenge.setStateCanceled();
        default -> throw new BadRequestException(ErrorCode.INVALID_CHALLENGE_STATE_FOR_SETTLEMENT);
    }
...
}
...
  • 챌린지의 7가지 상태 중 정산 관련 네 상태를 제외하고는, 모두 default를 통해 예외 처리가 됩니다.

    • 정산 관련된 네 가지 상태는 switch-case 분기문을 통해 처리됩니다.
    • 종료 - 정산 미완(COMPLETED_PENDING_SETTLEMENT),
      종료 - 정산 완료(COMPLETED_SETTLED),
      중도 취소 - 정산 미완(CANCELED),
      중도 취소 - 정산 완료(CANCELED_SETTLED)
      의 네 가지 상태만 처리합니다.
  • 정산 미완인 경우 정산 완료로, 정산 완료인 경우 정산 미완으로 변경합니다.

  • 종료 상태는 종료 상태 간에만, 중도 취소중도 취소 간에만 정산 상태가 변경됩니다.


3. 챌린지 정보를 담는 DTO에 챌린지 상태 속성 추가

  • Challenge 도메인의 ChallengeDetailsResponse, ChallengeEnrolledListItemResponse DTO에 ChallengeState 속성을 추가했습니다.
// ChallengeDetailsResponse.java

public class ChallengeDetailsResponse {
  ...
  private String challengeState;
...
// ChallengeEnrolledListItemResponse.java

public class ChallengeEnrolledListItemResponse {
  ...
  private String challengeState;
...
  • enum 대신 상태에 해당하는 문자열을 데이터 타입으로 지정했습니다.
    • 추후 챌린지 상태 enum 순서나 개수에 변경이 생겨도, 문자열로 비교하면 문제가 없기 때문입니다.
  • 관련 테스트 코드 및 문서를 수정했습니다.

4. 관련된 코드를 추가 및 수정했습니다.

  • 챌린지 상태 변경을 위해 Challenge 도메인 내부 setter 메서드 추가
  • 에러 코드 및 성공 코드 메시지 수정

@solgito solgito added documentation Improvements or additions to documentation enhancement New feature or request labels Feb 6, 2025
@solgito solgito self-assigned this Feb 6, 2025
@solgito solgito linked an issue Feb 6, 2025 that may be closed by this pull request
@solgito solgito merged commit c4f1de0 into main Feb 6, 2025
1 check passed
@solgito solgito deleted the feat/add_some_for_settlement#364 branch February 6, 2025 12:31
this.state = ChallengeState.COMPLETED_SETTLED;
}

public void setStateCanceledSettled() {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

동일한 기능을 하는 setter가 여러 이름으로 만들어지다보니 나중에 유지보수 할 때 헷갈릴 수 있다는 생각이 드는데요.
setter에 매개변수를 전달하는 방식으로 만드는 건 어떠세요?

public SuccessResponse<Void> settleChallenge(Long challengeId, Member member) {
  // 중략
  
  switch (challenge.getState()) {
      case COMPLETED_PENDING_SETTLEMENT -> changeChallengeState(challenge, false, ChallengeState.COMPLETE_SETTLED);
      // 나머지 케이스 생략
      default -> throw new BadRequestException(ErrorCode.INVALID_CHALLENGE_STATE_FOR_SETTLEMENT);
  }
  
  challengeRepository.save(challenge);
  
  return SuccessResponse.of(SuccessCode.CHALLENGE_SETTLEMENT_SUCCESS);
}

private void changeChallengeState(Challenge challenge, boolean isPaidAll, ChallengeState state) {
  challenge.setIsPaidAll(isPaidAll);
  challenge.setState(state);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 챌린지 정산을 위한 챌린지 상태 추가 및 api 수정

2 participants