Skip to content

Commit

Permalink
Achievement
Browse files Browse the repository at this point in the history
  • Loading branch information
KyunghoYeom committed Nov 21, 2024
1 parent 299a04f commit d84960a
Show file tree
Hide file tree
Showing 26 changed files with 688 additions and 4 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package com.alom.dorundorunbe.domain.Achievement.controller;

import com.alom.dorundorunbe.domain.Achievement.domain.Achievement;
import com.alom.dorundorunbe.domain.Achievement.domain.UserAchievement;
import com.alom.dorundorunbe.domain.Achievement.dto.assign.AssignAchievementRequestDto;
import com.alom.dorundorunbe.domain.Achievement.dto.assign.AssignAchievementResponseDto;
import com.alom.dorundorunbe.domain.Achievement.dto.create.CreateAchievementRequestDto;
import com.alom.dorundorunbe.domain.Achievement.dto.create.CreateAchievementResponseDto;
import com.alom.dorundorunbe.domain.Achievement.dto.query.AchievementDto;
import com.alom.dorundorunbe.domain.Achievement.dto.reward.RewardAchievementRequestDto;
import com.alom.dorundorunbe.domain.Achievement.dto.reward.RewardAchievementResponseDto;
import com.alom.dorundorunbe.domain.Achievement.dto.update.UpdateAchievementRequestDto;
import com.alom.dorundorunbe.domain.Achievement.dto.update.UpdateAchievementResponseDto;
import com.alom.dorundorunbe.domain.Achievement.service.AchievementService;
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/achievement")
public class AchievementController {

private final AchievementService achievementService;

@PostMapping
public ResponseEntity<CreateAchievementResponseDto> createAchievement(@RequestBody CreateAchievementRequestDto requestDto) {
Long id = achievementService.createAchievement(requestDto.name(), requestDto.rewardType(), requestDto.rewardValue(), requestDto.condition());
Achievement achievement = achievementService.findOneAchievement(id);
return ResponseEntity.ok(CreateAchievementResponseDto.of(achievement));

}

@PutMapping("/{id}")
public ResponseEntity<UpdateAchievementResponseDto> updateAchievement(
@PathVariable Long id,
@RequestBody UpdateAchievementRequestDto requestDto) {

achievementService.updateAchievement(id, requestDto.name(), requestDto.rewardValue());
Achievement updatedAchievement = achievementService.findOneAchievement(id);
return ResponseEntity.ok(UpdateAchievementResponseDto.of(updatedAchievement));
}

@GetMapping("/user/{userId}")
public ResponseEntity<Slice<AchievementDto>> fetchUserAchievements(@PathVariable Long userId,
@PageableDefault(size = 10) Pageable pageable) {

Slice<AchievementDto> achievementDtosSlice = achievementService.fetchAllUserAchievements(userId, pageable);
return ResponseEntity.ok(achievementDtosSlice);

}

@PostMapping("/assign")
public ResponseEntity<AssignAchievementResponseDto> assignAchievement(@RequestBody AssignAchievementRequestDto requestDto) {
Long id = achievementService.checkAndAssignAchievement(requestDto.userId(), requestDto.achievementId());
UserAchievement userAchievement = achievementService.findOneUserAchievement(id);
return ResponseEntity.ok(AssignAchievementResponseDto.of(userAchievement));
}

@PostMapping("/reward")
public ResponseEntity<RewardAchievementResponseDto> claimReward(@RequestBody RewardAchievementRequestDto requestDto) {
Long id = achievementService.claimReward(requestDto.userId(), requestDto.achievementId());
UserAchievement userAchievement = achievementService.findOneUserAchievement(id);
return ResponseEntity.ok(RewardAchievementResponseDto.of(userAchievement));
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,58 @@
import lombok.Getter;
import lombok.NoArgsConstructor;

/**
* 상속관계를 만들어서 controller단에서 /distance, /cadence, /week, /rank(비기너,프로 등등)를 각각 받는 controller를 만들지 아니면 그냥
* condition으로받아서 필요정보를 처리할지 고민
* 확장성이 그렇게까지 있을까 싶어서 일단 condition으로 작성(item처럼 확장성이 있어보이진 않아서..)
* "totalDistance>=50"
* "averageCadence=170~180"
* "weeklyRuns>=3"
* "rank=BEGINNER" 이 형태로 받으면 처리 가능(숫자, rank 이런것들은 형태만 지키면 확장, 수정 다 가능)
*/

@Entity @Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "achievement")
public class Achievement extends BaseEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "achievement_id")
private Long id;

@Column(nullable = false, length = 32)
@Column(nullable = false, length = 64)
private String name;

private RewardType rewardType;
private int rewardValue;
@Enumerated(EnumType.STRING)
private RewardType rewardType;// COIN, BACKGROUND

@Column(nullable = false)
private String rewardValue; // 보상 값 (숫자나 Background 이름)

@Column(name = "achievement_condition", nullable = false)
private String condition;

public static Achievement of(Achievement achievement) {
return Achievement.builder()
.id(achievement.getId())
.name(achievement.getName())
.rewardType(achievement.getRewardType())
.rewardValue(achievement.getRewardValue())
.build();
}
public void updateRewardValue(String rewardValue) {
this.rewardValue = rewardValue;


}
public void updateName(String name) {
this.name = name;
}




}
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
package com.alom.dorundorunbe.domain.Achievement.domain;




public enum RewardType {
CASH
COIN, BACKGROUND

}
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,10 @@ public class UserAchievement extends BaseEntity {
@ManyToOne(fetch = LAZY)
@JoinColumn(name = "achievement_id", nullable = false)
private Achievement achievement;

private boolean rewardClaimed;//보상 지급여부

public void markRewardAsClaimed() {
this.rewardClaimed = true;
}//보상 지급되었을 때 또 보상이 지급되는 것 방지
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.alom.dorundorunbe.domain.Achievement.dto.assign;

public record AssignAchievementRequestDto(
Long userId,
Long achievementId
) {

public static AssignAchievementRequestDto of(Long userId, Long achievementId) {
return new AssignAchievementRequestDto(userId, achievementId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.alom.dorundorunbe.domain.Achievement.dto.assign;

import com.alom.dorundorunbe.domain.Achievement.domain.UserAchievement;

import java.time.LocalDateTime;

public record AssignAchievementResponseDto(
Long userId,
Long achievementId,
String achievementName,
boolean rewardClaimed,
LocalDateTime createdAt
) {
public static AssignAchievementResponseDto of(UserAchievement userAchievement) {
return new AssignAchievementResponseDto(
userAchievement.getUser().getId(),
userAchievement.getAchievement().getId(),
userAchievement.getAchievement().getName(),
userAchievement.isRewardClaimed(),
userAchievement.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.alom.dorundorunbe.domain.Achievement.dto.create;

import com.alom.dorundorunbe.domain.Achievement.domain.RewardType;

public record CreateAchievementRequestDto(
String name, // 업적 이름
RewardType rewardType, // 보상 유형
String rewardValue, // 보상 값
String condition // 업적 조건
) {
public static CreateAchievementRequestDto of(String name, RewardType rewardType, String rewardValue, String condition) {
return new CreateAchievementRequestDto(name, rewardType, rewardValue, condition);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.alom.dorundorunbe.domain.Achievement.dto.create;

import com.alom.dorundorunbe.domain.Achievement.domain.Achievement;
import com.alom.dorundorunbe.domain.Achievement.domain.RewardType;

import java.time.LocalDateTime;


public record CreateAchievementResponseDto(
Long id,
String name,
RewardType rewardType,
String rewardValue,
String condition,
LocalDateTime createdAt
) {
public static CreateAchievementResponseDto of(Achievement achievement) {
return new CreateAchievementResponseDto(
achievement.getId(),
achievement.getName(),
achievement.getRewardType(),
achievement.getRewardValue(),
achievement.getCondition(),
achievement.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.alom.dorundorunbe.domain.Achievement.dto.query;

import com.alom.dorundorunbe.domain.Achievement.domain.Achievement;

import java.time.LocalDateTime;

public record AchievementDto(
Long id,
String name,
String rewardType,
String rewardValue,

LocalDateTime createdAt
) {
public static AchievementDto of(Achievement achievement) {
return new AchievementDto(
achievement.getId(),
achievement.getName(),
achievement.getRewardType().toString(),
achievement.getRewardValue(),
achievement.getCreatedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.alom.dorundorunbe.domain.Achievement.dto.reward;

public record RewardAchievementRequestDto(
Long userId,
Long achievementId
) {
public static RewardAchievementRequestDto of(Long userId, Long achievementId) {
return new RewardAchievementRequestDto(userId, achievementId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.alom.dorundorunbe.domain.Achievement.dto.reward;

import com.alom.dorundorunbe.domain.Achievement.domain.UserAchievement;

import java.time.LocalDateTime;

public record RewardAchievementResponseDto(
Long userId,
Long achievementId,
String achievementName,
String rewardType,
String rewardValue,
boolean rewardClaimed,
LocalDateTime createdAt,
LocalDateTime modifiedAt
) {

public static RewardAchievementResponseDto of(UserAchievement userAchievement) {
return new RewardAchievementResponseDto(
userAchievement.getUser().getId(),
userAchievement.getAchievement().getId(),
userAchievement.getAchievement().getName(),
userAchievement.getAchievement().getRewardType().toString(),
userAchievement.getAchievement().getRewardValue(),
userAchievement.isRewardClaimed(),
userAchievement.getCreatedAt(),
userAchievement.getModifiedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.alom.dorundorunbe.domain.Achievement.dto.update;

public record UpdateAchievementRequestDto(
String name, // 수정할 업적 이름 (Optional)
String rewardValue // 수정할 보상 값 (Optional)

) {
public static UpdateAchievementRequestDto of(String name, String rewardValue) {
return new UpdateAchievementRequestDto(name, rewardValue);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.alom.dorundorunbe.domain.Achievement.dto.update;

import com.alom.dorundorunbe.domain.Achievement.domain.Achievement;
import com.alom.dorundorunbe.domain.Achievement.domain.RewardType;

import java.time.LocalDateTime;

public record UpdateAchievementResponseDto(
Long id,
String name,
RewardType rewardType,
String rewardValue,
String condition,
LocalDateTime createdAt,
LocalDateTime modifiedAt
) {
public static UpdateAchievementResponseDto of(Achievement achievement) {
return new UpdateAchievementResponseDto(
achievement.getId(),
achievement.getName(),
achievement.getRewardType(),
achievement.getRewardValue(),
achievement.getCondition(),
achievement.getCreatedAt(),
achievement.getModifiedAt()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.alom.dorundorunbe.domain.Achievement.exception;


public class AchievementAlreadyExistsException extends RuntimeException {
public AchievementAlreadyExistsException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alom.dorundorunbe.domain.Achievement.exception;

public class AchievementConditionNotMetException extends RuntimeException {
public AchievementConditionNotMetException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alom.dorundorunbe.domain.Achievement.exception;

public class AchievementNotFoundException extends RuntimeException {
public AchievementNotFoundException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alom.dorundorunbe.domain.Achievement.exception;

public class RewardAlreadyClaimedException extends RuntimeException {
public RewardAlreadyClaimedException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alom.dorundorunbe.domain.Achievement.exception;

public class UserAchievementAlreadyClaimedException extends RuntimeException {
public UserAchievementAlreadyClaimedException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.alom.dorundorunbe.domain.Achievement.exception;

public class UserAchievementNotFoundException extends RuntimeException {
public UserAchievementNotFoundException(String message) {
super(message);
}
}
Loading

0 comments on commit d84960a

Please sign in to comment.