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

Issue/#79 #88

Merged
merged 24 commits into from
Sep 12, 2024
Merged

Issue/#79 #88

merged 24 commits into from
Sep 12, 2024

Conversation

kwonssshyeon
Copy link
Member

@kwonssshyeon kwonssshyeon commented Sep 9, 2024

🔎 작업 내용

  • 챌린지 인증 검토(pre_approve인거 approve로 마크변경)or(취소로 바꾸고 경험치 롤백)
  • 챌린지 인증 조회 (챌린지로 그룹화)
    • 챌린지로 그룹화 하려니까 페이징 단위도 애매해지고 그룹화하면 어쨋든 그룹으로 정렬이 필요한대 그런 요구사항이 필요없을것 같아서 그냥 최신순으로 반환했습니다. 대신, 챌린지제목으로 검색이 가능하도록 구현
  • 챌린지 삭제, 수정, 생성 ( 수정기능 구현 / 삭제,생성은 고칠꺼 있는지 확인)
    • 챌린지 그룹 수정시 챌린지 리스트를 수정할때 request에 없으면 삭제, id=-1로 하는 챌린지는 생성, 존재하는 id로 있는 경우 수정으로 구현했습니다.
    • 챌린지 생성 command와 대부분의 필드가 겹치지만, id를 필수값으로 받기 위해 새로운 command를 정의(그리고 챌린지 그룹생성 command가 challenge group이 아니라 admin쪽에 있던데 이거 challenge group으로 옮기는거 어떻게 생각하시나요?)
  • 매니저, 어드민 계정 조회
    • 일반 사용자가 자신의 계정 조회할때 사용하는 Model dto 공유하도록 피드백 반영 완!

이미지 첨부

To Reviewers 📢

변경감지 코드가 많은데 헥사고날 아키텍쳐에서 이렇게 코드를 쓰는게 괜찮은지 여전히 의문...입니다
main브랜치가 아니라 admin브랜치로 올렸습니당

체크 리스트

  • 테스트를 작성했습니다.
  • 테스트를 통과했습니다.
  • API 변경사항이 존재합니다.
  • API 호출을 직접 실시하였고, 해당 데이터가 정상적으로 표시됩니다.
  • 기존 코드에 영향을 주는 작업 내용이 존재합니다.
  • 향후 추가적인 작업이 필요한 부분이 있습니다.

➕ 관련 이슈

Comment on lines 44 to 79
@Transactional
public void updateChallengeGroup(ChallengeGroupCommand.Update command) {
ChallengeGroup challengeGroup = challengeGroupReader.getById(command.getId());

List<Challenge> challenges = new ArrayList<>();
Set<Challenge> existedChallenges = new HashSet<>();

for (ChallengeGroupCommand.UpdateChallenge challenge : command.getUpdateChallenges()) {
processChallenge(challenge, challengeGroup, challenges, existedChallenges);
}

challengeGroup.update(command);
removeChallenges(challengeGroup, existedChallenges);
challengeGroup.addChallenges(challenges);
}

private void processChallenge(ChallengeGroupCommand.UpdateChallenge updateChallengeCommand,
ChallengeGroup challengeGroup,
List<Challenge> newChallenges,
Set<Challenge> existingChallenges)
{
if (updateChallengeCommand.getId().equals(-1L)) {
newChallenges.add(Challenge.create(updateChallengeCommand.convertCreate(), challengeGroup));
} else {
Challenge updateChallenge = challengeReader.getById(updateChallengeCommand.getId());
existingChallenges.add(updateChallenge);
updateChallenge.update(updateChallengeCommand);
}
}

private void removeChallenges(ChallengeGroup challengeGroup, Set<Challenge> existingChallenges) {
List<Challenge> removeChallenges = challengeGroup.getChallenges().stream()
.filter(challenge -> !existingChallenges.contains(challenge))
.toList();
challengeGroup.removeChallenges(removeChallenges);
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

이부분 서비스 레이어에 들어갈만한 내용이 아니라 생각이 드는데, challengeGroup에 oneToMany에서 처리하는게 어떤ㄱ요?
변경감지 쓰는게 좋을거같슴다..!

@@ -16,4 +18,6 @@ public interface UserReader {
Optional<User> findByAuthToken(String authToken);

Page<User> getUserPagingByRanking(Pageable pageable);

List<User> getManagerAndAdmin();
Copy link
Collaborator

Choose a reason for hiding this comment

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

infra에 로직을 두는거보다 그냥 인자로 받는건 별로일까요?
role을 결정하는거는 서비스레이어가 하는게 좋다라고 저는 생각이 드네요

Copy link
Member Author

Choose a reason for hiding this comment

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

다운님이랑 정반대의 리뷰네용
저도 이부분 좀 더 생각해보겠습니다

Comment on lines +34 to +41
public void confirm(Long verificationId, ChallengeVerificationStatus status) {
ChallengeVerification verification = challengeVerificationReader.getById(verificationId); // verification 가져올때 user, challenge, userChallenge도 join해서 가져오는게 좋을듯
if (status == ChallengeVerificationStatus.REJECTED && verification.getStatus() != ChallengeVerificationStatus.REJECTED) {
rejectVerification(verification);
} else if (status == ChallengeVerificationStatus.APPROVED && verification.getStatus() != ChallengeVerificationStatus.APPROVED) {
approveVerification(verification);
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

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

status 인자로 받지말고 메소드2개로 분할하는 방법은 별로일까요?
랭킹 경험치 롤백도 추가해주세용

Copy link
Member Author

Choose a reason for hiding this comment

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

엔드포인트를 나누자는 말씀인가요 ??
경험치 롤백은 구현되어있습니다

Copy link
Collaborator

Choose a reason for hiding this comment

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

엔드포인트의 문제보다, 현재 Service에서 함수가 인자로 status를 받아서, if(status== REJECT)이면 reject행위, else status==xx이면 xx행위인데
confirm이라는 메소드명보다 rejectVerification, approveVerification으로 메소드를 분할하자는 의미였습니다 🧐

challenge_group_user_exp롤백이 빠져있어요

Copy link
Member Author

Choose a reason for hiding this comment

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

컨트롤러에서 함수를 나눠서 호출하게 되는건가요 ...?

Copy link
Collaborator

Choose a reason for hiding this comment

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

api를 2개로 하거나 컨트롤러에서 if else해도 되는데 api2개가 좋겠네요!

Copy link
Member Author

Choose a reason for hiding this comment

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

혹시 이유가 뭘까요??
앤드포인트를 나누는 거랑 status 인자를 받는 것의 장단점을 잘 모르겠네용

Copy link
Collaborator

Choose a reason for hiding this comment

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

클린코드에서 함수는 하나의 일만 해라인데(status에 대해 내부구현의 노출, if else의 조건분기)
억지클린코드라면 안해도 좋습니다

Copy link
Collaborator

@momnpa333 momnpa333 Sep 10, 2024

Choose a reason for hiding this comment

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

@Transactional
    public void confirm(Long verificationId, ChallengeVerificationStatus status) {
        ChallengeVerification verification = challengeVerificationReader.getById(verificationId); // verification 가져올때 user, challenge, userChallenge도 join해서 가져오는게 좋을듯
        if (status == ChallengeVerificationStatus.REJECTED) {
            rejectVerification(verification);
        }
        if (status == ChallengeVerificationStatus.APPROVED) {
            approveVerification(verification);
        }
    }

저라면 이런식으로 가독성만 높일것 같아여! 조건문 뒤에 두번째 조건은 필요없을것 같고 처음에 읽을때 가독성이 오히려 떨어지는거 같더라구여!

Copy link
Member Author

Choose a reason for hiding this comment

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

두번째 조건은 중복 승인을 피하려고 추가한거에요 approve->approve로 변경을 시도하면 경험치가 두번 더해지니까 이거 피하려고 둔겁니다. !

Copy link
Member Author

Choose a reason for hiding this comment

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

길어서 가독성이 떨어지는 거면 verification.getStatue != status 이렇게 바꿀까요 ?

@bayy1216
Copy link
Collaborator

bayy1216 commented Sep 9, 2024

챌린지 그룹 수정시 챌린지 리스트를 수정할때 request에 없으면 삭제, id=-1로 하는 챌린지는 생성, 존재하는 id로 있는 경우 수정으로 구현했습니다.

이거

    public static class Update extends SelfValidating<Update> {
        @NotNull(message = "id는 필수값입니다.")
        private final Long id;
        @NotBlank(message = "title은 필수값입니다.")
        private final String title;
        @NotBlank(message = "content는 필수값입니다.")
        private final String content;
        @NotBlank(message = "guide는 필수값입니다.")
        private final String guide;
        @NotNull(message = "category는 필수값입니다.")
        private final ChallengeCategory category;
        @NotNull(message = "joinStartDate는 필수값입니다.")
        private final LocalDate joinStartDate;
        @NotNull(message = "joinEndDate는 필수값입니다.")
        private final LocalDate joinEndDate;
        @NotNull(message = "challenges는 필수값입니다.")
        private final List<UpdateChallenge> updateChallenges;

        private final List<CreateChallenge> createChallenges;

이렇게 필드추가하는게 더 좋지 않을까요?>

@kwonssshyeon
Copy link
Member Author

챌린지 그룹 수정시 챌린지 리스트를 수정할때 request에 없으면 삭제, id=-1로 하는 챌린지는 생성, 존재하는 id로 있는 경우 수정으로 구현했습니다.

이거

    public static class Update extends SelfValidating<Update> {
        @NotNull(message = "id는 필수값입니다.")
        private final Long id;
        @NotBlank(message = "title은 필수값입니다.")
        private final String title;
        @NotBlank(message = "content는 필수값입니다.")
        private final String content;
        @NotBlank(message = "guide는 필수값입니다.")
        private final String guide;
        @NotNull(message = "category는 필수값입니다.")
        private final ChallengeCategory category;
        @NotNull(message = "joinStartDate는 필수값입니다.")
        private final LocalDate joinStartDate;
        @NotNull(message = "joinEndDate는 필수값입니다.")
        private final LocalDate joinEndDate;
        @NotNull(message = "challenges는 필수값입니다.")
        private final List<UpdateChallenge> updateChallenges;

        private final List<CreateChallenge> createChallenges;

이렇게 필드추가하는게 더 좋지 않을까요?>

아 create는 따로 받자는거네요 확인했습니다!

@kwonssshyeon kwonssshyeon changed the base branch from admin to main September 9, 2024 15:45
Copy link

Unit Test Results

31 tests   31 ✔️  2s ⏱️
  9 suites    0 💤
  9 files      0

Results for commit e605148.

@kwonssshyeon kwonssshyeon merged commit 6aae7bf into main Sep 12, 2024
3 checks passed
@kwonssshyeon kwonssshyeon deleted the issue/#79 branch September 12, 2024 07:27
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.

어드민 api 구현
3 participants