Skip to content

Commit

Permalink
Merge pull request #44 from KNU-HAEDAL/issue/43
Browse files Browse the repository at this point in the history
Issue/43
  • Loading branch information
momnpa333 authored Jul 21, 2024
2 parents d354c6f + 7a942df commit 84263be
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 20 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -63,4 +63,12 @@ public static Challenge create(ChallengeGroupCommand.CreateChallenge command, Ch
.endDate(command.getEndDate())
.build();
}

/**
* 챌린지 그룹 아이디 반환
* FK는 LAZY 여도 이미 영속성 컨텍스트에 존재하므로 추가 조회 없이 바로 접근 가능
*/
public Long getChallengeGroupId() {
return challengeGroup.getId();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package org.haedal.zzansuni.domain.challengegroup.userchallenge;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor(staticName = "of")
public class AddExpToChallengeGroupEvent {
private Long userId;
private Integer acquiredExp;
private Long challengeGroupId;
}
Original file line number Diff line number Diff line change
Expand Up @@ -61,20 +61,32 @@ public static UserChallenge create(Challenge challenge, User user) {
.build();
}

public void addChallengeVerification(ChallengeCommand.VerificationCreate command) {
/**
* 챌린지 인증 추가
* 1. 챌린지 인증을 추가
* 2. 챌린지 인증을 추가하면서 챌린지 인증에 따른 경험치를 추가
* 3. 챌린지를 완료한 경우 챌린지 완료로 변경, 경험치 추가
* 4. 챌린지그룹-경험치 추가 이벤트를 반환
*/
public AddExpToChallengeGroupEvent addChallengeVerification(ChallengeCommand.VerificationCreate command) {
ChallengeVerification challengeVerification = ChallengeVerification.create(command, this);
this.challengeVerifications.add(challengeVerification);

int acquiredExp = this.challenge.getOnceExp();
user.addExp(challenge.getOnceExp());

// 만약 챌린지 인증 참여횟수와 필요참여획수가 같으면 챌린지 완료로 변경
if (this.challengeVerifications.size() == this.challenge.getRequiredCount()) {
user.addExp(challenge.getSuccessExp());
complete();
acquiredExp += challenge.getSuccessExp();
this.completeChallengeStatus();
}
return AddExpToChallengeGroupEvent
.of(user.getId(), acquiredExp, challenge.getChallengeGroupId());
}


private void complete() {
private void completeChallengeStatus() {
this.status = ChallengeStatus.SUCCESS;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ public class UserChallengeService {
private final ChallengeGroupReader challengeGroupReader;
private final ChallengeGroupUserExpStore challengeGroupUserExpStore;
/**
* 챌린지 참여하기 1. 유저와 챌린지 정보를 받아서 UserChallenge 테이블에 데이터 추가
* 챌린지 참여하기 <br>
* 1. 유저와 챌린지 정보를 받아서 UserChallenge 테이블에 데이터 추가
* 2. 챌린지그룹-유저 경험치 테이블에 데이터 추가
*/
@Transactional
public void participateChallenge(Long userId, Long challengeId) {
User user = userReader.getById(userId);
Challenge challenge = challengeReader.getById(challengeId);

/**
* 이미 참여한 챌린지인지 확인
*/
//이미 참여한 챌린지인지 확인
userChallengeReader.findByUserIdAndChallengeId(userId, challengeId)
.ifPresent(userChallenge -> {
throw new IllegalArgumentException("이미 참여한 챌린지입니다.");
Expand All @@ -50,12 +50,20 @@ public void participateChallenge(Long userId, Long challengeId) {
UserChallenge userChallenge = UserChallenge.create(challenge, user);
userChallengeStore.store(userChallenge);


ChallengeGroupUserExp entity = ChallengeGroupUserExp
.create(challenge.getChallengeGroup(), user);
challengeGroupUserExpStore.store(entity);

// TODO: 챌린지 그룹 누적 참여자수 증가 로직 추가
}

/**
* 챌린지 인증하기 <p> 1. ChallengeVerification 테이블에 데이터 추가 <br> 2. Challenge 엔티티에서 필요참여횟수 가져오기 <br> 3.
* UserChallenge 엔티티에서 참여횟수 가져오기 <br> 4. 참여횟수와 필요참여횟수가 같으면 챌린지 완료로 변경
* 챌린지 인증하기 <p>
* 1. ChallengeVerification 테이블에 데이터 추가 <br>
* 2. Challenge 엔티티에서 필요참여횟수 가져오기 <br>
* 3. UserChallenge 엔티티에서 참여횟수 가져오기 <br>
* 4. 참여횟수와 필요참여횟수가 같으면 챌린지 완료로 변경
*/
@Transactional
public ChallengeModel.ChallengeVerificationResult verification(
Expand All @@ -69,20 +77,14 @@ public ChallengeModel.ChallengeVerificationResult verification(
throw new IllegalArgumentException("해당 챌린지에 참여한 유저가 아닙니다.");
}

Integer beforeExp = userChallenge.getUser().getExp();
userChallenge.addChallengeVerification(command);
Integer afterExp = userChallenge.getUser().getExp();

AddExpToChallengeGroupEvent addExpToChallengeGroupEvent = userChallenge.addChallengeVerification(command);

// 챌린지 경험치 획득 로직
Long challengeGroupId = userChallenge.getChallenge().getChallengeGroupId();
ChallengeGroupUserExp challengeGroupUserExp = challengeGroupReader
.findByChallengeGroupIdAndUserId(userChallenge.getChallenge().getChallengeGroup().getId(),
userId)
.orElseGet(() -> {
ChallengeGroupUserExp entity = ChallengeGroupUserExp
.create(userChallenge.getChallenge().getChallengeGroup(), userChallenge.getUser());
return challengeGroupUserExpStore.store(entity);
});
challengeGroupUserExp.addExp(afterExp - beforeExp);
.findByChallengeGroupIdAndUserId(challengeGroupId, userId).orElseThrow();
challengeGroupUserExp.addExp(addExpToChallengeGroupEvent.getAcquiredExp());

// 챌린지 RequiredCount 가져오기 위해 챌린지 정보 가져온다
Challenge challenge = userChallenge.getChallenge();
Expand Down

0 comments on commit 84263be

Please sign in to comment.