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: 과제 히스토리 도메인 로직 및 깃허브 클라이언트 로직 변경 #639

Merged
merged 15 commits into from
Aug 18, 2024

Conversation

uwoobeat
Copy link
Member

@uwoobeat uwoobeat commented Aug 17, 2024

🌱 관련 이슈

📌 작업 내용 및 특이사항

  • 과제 채점 로직을 구현하기 전에 과제 채점 후 성공 / 실패 / 실패사유 등을 업데이트할 과제 히스토리 도메인 로직들을 업데이트했습니다.
  • 실제 채점 로직은 ✨ 과제 제출하기 채점 로직 구현 #640 에서 구현합니다
  • 추가로, 깃허브 클라이언트에서 다양한 예외 케이스에 대한 에러코드를 추가했습니다.

로직 변경사항

  • PENDING 상태가 제거되며 제출상태의 경우 실패성공 상태만 존재합니다.
    • 이로 인해 제출여부 상태 조회 로직이 변경되었습니다.
  • 초기 제출상태는 실패입니다.
  • 제출 실패사유의 경우 NONE 이 추가되었습니다. 제출상태가 성공 인 경우 이 상태를 사용합니다.
  • 초기 제출 실패사유는 NOT_SUBMITTED가 됩니다. (기존에는 null)
  • 제출 실패처리 시, 기존에 성공처리로 저장된 제출정보가 있는 경우 제거됩니다.

PENDING 제거 및 분리

  • 먼저, 제출상태 중 PENDING의 경우 DB 상에서만 제거되며, 클라이언트 응답을 내려줄 때 별도의 SubmissionDisplayStatus 와 같은 enum 클래스를 통해 변환되는 과정을 거치게 됩니다.
  • 이렇게 한 이유가 있는데요... 먼저 기존에 초기값 PENDING 을 사용하는 경우, 마감기한 이후에는 FAIL 로 설정해줘야 합니다.
  • 이를 위해서는 스케쥴러나 배치를 사용할 수 있습니다.
  • 하지만 이러한 비즈니스 상태 관리를 외부 의존성인 스케쥴러나 배치에 의존하는 것은 바람직하지 못하다고 봤습니다. 배치 도입 비용도 있고, 우연히 스케쥴러가 도는 시간에 배포가 발생하여 무결성이 깨지는 상황 등이 생길 수 있습니다.
  • 따라서 PENDING -> FAIL 배치가 필요하지 않도록 초기에 FAIL 로 시작하도록 하고, 대신 제출기한 도중에는 PENDING으로 조회되어야 하므로, DB에서 사용되는 enum과 클라이언트 응답에 사용되는 enum을 분리하기로 했습니다 (✨ 클라이언트 응답용 과제 제출상태 및 변환 로직 구현 #638 에서 처리 예정)

깃허브 클라이언트 로직 관련

  • 기존에는 모든 예외를 하나의 에러코드로 받았지만, 지금은 각각의 IOException 케이스를 잡아서 각기 다른 에러코드로 변환합니다.
  • 이렇게 하면 문제 원인을 더 원할하게 파악할 수 있을 것으로 기대됩니다.

그 외 자세한 내용은 테스트로 확인 부탁드립니다

📝 참고사항

📚 기타

Summary by CodeRabbit

  • 새로운 기능

    • 제출 상태를 관리하기 위한 successfail 메서드 추가.
    • committedAt 필드를 통해 제출 타임스탬프 저장.
    • AssignmentSubmissionStatus에서 PENDINGCANCELLED 상태 제거, NONE 상태 추가.
  • 버그 수정

    • 제출 실패 유형에 대한 오류 코드 업데이트 및 추가.
  • 테스트

    • AssignmentHistory 클래스에 대한 유닛 테스트 추가로 커버리지 향상.
  • 문서화

    • StudyConstant 클래스에 새로운 상수 추가로 과제 제출 관련 메타데이터 제공.

@uwoobeat uwoobeat self-assigned this Aug 17, 2024
@uwoobeat uwoobeat requested a review from a team as a code owner August 17, 2024 17:28
Copy link

coderabbitai bot commented Aug 17, 2024

Walkthrough

이번 변경사항은 AssignmentHistory 클래스와 GitHub 클라이언트의 로직을 개선하여 과제 제출 상태를 보다 명확하게 관리하도록 하였습니다. 제출 실패 유형을 처리하는 새로운 필드를 추가하고, 성공 및 실패 상태를 관리하는 메서드를 도입하여 코드의 가독성과 유지 보수성을 높였습니다. 또한 GitHub과의 상호작용에서 발생할 수 있는 오류를 더 세분화하여 처리하도록 개선했습니다.

Changes

파일 경로 변경 요약
src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistory.java committedAt 필드를 추가하고, 생성자에서 submissionLink, commitHash, contentLength를 제거했습니다. create 메서드와 isSubmitted 메서드의 로직이 수정되었으며, successfail 메서드가 추가되어 제출 상태 관리가 개선되었습니다.
src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentSubmissionStatus.java PENDINGCANCELLED 상태가 제거되어 상태 관리가 간소화되었습니다.
src/main/java/com/gdschongik/gdsc/domain/study/domain/SubmissionFailureType.java 새로운 상태 NONE이 추가되어 성공적인 제출을 나타내는 기능이 강화되었습니다.
src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java 기존 오류 코드 ASSIGNMENT_CAN_NOT_BE_UPDATEDASSIGNMENT_INVALID_FAILURE_TYPE로 변경되었으며, GitHub 관련 새로운 오류 코드가 추가되었습니다.
src/main/java/com/gdschongik/gdsc/infra/github/client/GithubClient.java getLatestAssignmentSubmission 메서드가 리팩토링되어 여러 헬퍼 메서드로 나뉘어져 모듈성과 가독성이 향상되었습니다. 오류 처리 로직도 개선되었습니다.
src/test/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistoryTest.java AssignmentHistory 클래스의 단위 테스트가 추가되어 다양한 제출 상태 및 실패 이유에 대한 테스트가 포함되었습니다.
src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java 과제 제출과 관련된 새로운 상수들이 추가되어 메타데이터 관리가 개선되었습니다.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant AssignmentHistory
    participant GithubClient

    User->>AssignmentHistory: createAssignment(StudyDetail, Member)
    AssignmentHistory->>AssignmentHistory: Initialize to FAILURE, NOT_SUBMITTED
    User->>AssignmentHistory: submitAssignment(submissionDetails)
    AssignmentHistory->>AssignmentHistory: success(submissionLink, commitHash, contentLength, committedAt)
    AssignmentHistory->>GithubClient: getLatestAssignmentSubmission(repo, week)
    GithubClient->>GithubClient: getFileContent(repo, path)
    GithubClient->>User: return submission details
Loading

Assessment against linked issues

Objective Addressed Explanation
과제 제출 상태 개선 (#637)
GitHub 클라이언트 로직 변경 (#637)
오류 처리 로직 개선 (#637)
테스트 케이스 추가 (#637)

Poem

🐰
과제 제출, 이제는 쉽게,
상태 관리도 이렇게 기쁘게!
성공과 실패, 명확히 구별,
GitHub 클라이언트와 함께 잘 연결.
새로운 상수들, 메타데이터도,
소중한 과제 역사, 함께 노래해요! 🎉


Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (invoked as PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Additionally, you can add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link

Job Summary for Gradle

Check Style and Test to Develop :: build-test
Gradle Root Project Requested Tasks Gradle Version Build Outcome Build Scan®
gdsc check 8.5 Build Scan published

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

Outside diff range, codebase verification and nitpick comments (1)
src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentSubmissionStatus.java (1)

9-11: CANCELLED 상태의 제거에 대한 영향

CANCELLED 상태는 여러 곳에서 사용되고 있으며, 특히 Assignment 클래스와 관련된 로직에서 중요한 역할을 하고 있습니다. 따라서, AssignmentSubmissionStatus에서 이 상태를 제거하는 것은 기능에 영향을 미칠 수 있습니다. PENDING 상태는 다른 도메인(OrderStatus)에서 사용되고 있어 직접적인 영향은 없을 수 있지만, 관련된 모든 사용 사례를 검토하는 것이 좋습니다.

  • CANCELLED 상태는 Assignment 클래스에서 여전히 사용 중입니다.
  • PENDING 상태는 OrderStatus와 관련되어 있으며, AssignmentSubmissionStatus와는 별개의 맥락입니다.

이 변경 사항이 다른 코드에 미치는 영향을 확인하고, 필요한 경우 관련 로직을 업데이트하는 것이 좋습니다.

Analysis chain

PENDINGCANCELLED 상태 제거에 대한 고려

PENDINGCANCELLED 상태가 제거되어 FAILURESUCCESS만 남았습니다. 이는 제출 상태 관리의 단순화를 의미합니다. PENDING 상태에 대한 별도의 enum 클래스 생성 계획이 주석으로 남아 있습니다. 이 변경이 다른 코드에 미치는 영향을 확인하고, 필요한 경우 관련 로직을 업데이트하는 것이 좋습니다.

Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify the impact of removing `PENDING` and `CANCELLED` states.

# Test: Search for `PENDING` and `CANCELLED` usage. Expect: No occurrences.
rg --type java 'PENDING|CANCELLED'

Length of output: 1861

Review details

Configuration used: CodeRabbit UI
Review profile: CHILL

Commits

Files that changed from the base of the PR and between 60dd1fb and 1f57ba6.

Files selected for processing (7)
  • src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistory.java (4 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentSubmissionStatus.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/domain/study/domain/SubmissionFailureType.java (1 hunks)
  • src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java (2 hunks)
  • src/main/java/com/gdschongik/gdsc/infra/github/client/GithubClient.java (2 hunks)
  • src/test/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistoryTest.java (1 hunks)
  • src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java (1 hunks)
Additional comments not posted (21)
src/main/java/com/gdschongik/gdsc/domain/study/domain/SubmissionFailureType.java (1)

9-9: NONE 상태 추가

NONE 상태가 추가되어 제출이 성공적일 때를 명확히 나타냅니다. 이는 제출 결과 관리의 명확성을 높이는 긍정적인 변화입니다.

src/test/java/com/gdschongik/gdsc/global/common/constant/StudyConstant.java (1)

36-39: 새로운 상수 추가

SUBMISSION_LINK, COMMIT_HASH, CONTENT_LENGTH, COMMITTED_AT와 같은 새로운 상수가 추가되었습니다. 이 상수들은 과제 제출과 관련된 메타데이터를 제공하여, 테스트 및 과제 세부 정보 참조에 유용할 수 있습니다. 이러한 상수들이 프로젝트 내에서 어떻게 사용되는지 확인하여, 필요 시 추가적인 문서화를 고려하세요.

src/main/java/com/gdschongik/gdsc/infra/github/client/GithubClient.java (5)

27-30: 좋습니다!

getRepository 메서드는 적절한 예외 처리를 통해 깔끔하게 작성되었습니다.


58-64: 좋습니다!

getFileContent 메서드는 적절한 예외 처리를 통해 깔끔하게 작성되었습니다.


66-72: 좋습니다!

readFileContent 메서드는 파일 내용을 읽고 적절한 예외 처리를 제공합니다.


74-78: 좋습니다!

getCommitDate 메서드는 커밋 날짜를 가져오고 적절한 예외 처리를 제공합니다.


35-55: 리팩토링이 잘 되었습니다!

getLatestAssignmentSubmission 메서드는 모듈화를 통해 가독성과 유지보수성을 높였습니다. 다른 코드와의 통합을 확인하세요.

src/main/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistory.java (7)

51-51: 필드 추가가 적절합니다.

committedAt 필드는 제출 타임스탬프를 추적하는 데 적합합니다.


52-52: 필드 추가가 적절합니다.

submissionFailureType 필드는 제출 실패 유형을 관리하는 데 적합합니다.


62-68: 생성자 변경이 적절합니다.

생성자가 단순화되어 명확성이 향상되었습니다.


73-76: 메서드 구현이 적절합니다.

create 메서드는 제출 상태와 실패 유형을 명확하게 초기화합니다.


81-84: 메서드 구현이 적절합니다.

isSubmitted 메서드는 제출 상태를 효과적으로 확인합니다.


88-95: 메서드 구현이 적절합니다.

success 메서드는 제출 세부 사항과 상태를 성공으로 업데이트합니다.


97-107: 메서드 구현이 적절합니다.

fail 메서드는 제출 실패 시나리오를 처리하며, 실패 유형의 유효성을 검증합니다.

src/test/java/com/gdschongik/gdsc/domain/study/domain/AssignmentHistoryTest.java (3)

34-64: 테스트 클래스가 적절합니다.

빈_과제이력_생성할때 클래스는 초기 상태를 명확하게 테스트합니다.


66-95: 테스트 클래스가 적절합니다.

과제이력_제출_성공할때 클래스는 성공적인 제출 후 상태 변화를 적절히 검증합니다.


97-164: 테스트 클래스가 적절합니다.

과제이력_제출_실패할때 클래스는 실패 시나리오와 실패 유형 제약을 철저히 검증합니다.

src/main/java/com/gdschongik/gdsc/global/exception/ErrorCode.java (4)

151-151: 변경된 에러 코드 확인: ASSIGNMENT_INVALID_FAILURE_TYPE.

이 에러 코드는 과제 업데이트에서 제출 실패 유형으로 초점을 변경한 것입니다. 비즈니스 로직과 문서화가 이 변경 사항과 일치하는지 확인하세요.


161-161: 새로운 에러 코드 추가: GITHUB_CONTENT_NOT_FOUND.

이 에러 코드는 GitHub 파일이 존재하지 않을 때의 구체적인 피드백을 제공합니다. 에러 처리의 세분화를 향상시킵니다.


162-162: 새로운 에러 코드 추가: GITHUB_FILE_READ_FAILED.

이 에러 코드는 GitHub에서 파일 읽기에 실패할 경우를 처리하며, 강력한 에러 관리를 위한 중요한 요소입니다.


163-163: 새로운 에러 코드 추가: GITHUB_COMMIT_DATE_FETCH_FAILED.

이 에러 코드는 GitHub에서 커밋 날짜 조회 실패를 처리하며, 진단 능력을 향상시킵니다.

Copy link
Member

@Sangwook02 Sangwook02 left a comment

Choose a reason for hiding this comment

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

lgtm

Copy link
Member

@AlmondBreez3 AlmondBreez3 left a comment

Choose a reason for hiding this comment

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

lgtm
pr도 다 읽어봤습니당

@uwoobeat uwoobeat merged commit e48c72d into develop Aug 18, 2024
1 check passed
@uwoobeat uwoobeat deleted the feature/637-assignment-submit-judge branch August 18, 2024 05:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

✨ 과제 히스토리 도메인 로직 및 깃허브 클라이언트 로직 변경
3 participants