Skip to content

Commit

Permalink
[Feat] 목표 쳬계 개편 (#214)
Browse files Browse the repository at this point in the history
* [Feat] GoalType enum 클래스 생성

* [Feat] Goal entity 변경사항 적용

* [Feat] 신규 유저 가입시 목표 자동 설정

* [Feat] 피드 생성시 목표 달성 로직 수정

* [Feat] 목표 달성 시 새로운 목표 자동 시작

* [Feat] 마이페이지에서 현재 진행중인 목표 반환 로직 수정

* [Feat] 목표 달성시 새로운 목표 자동 시작

* [Feat] 피드 삭제 시 목표 달성 체크 로직 수정

* [Feat] 마이페이지 조회에 transaction read-only 해제

* [Feat] 목표 체계 개편
  • Loading branch information
funnysunny08 authored Jan 9, 2024
1 parent f3e9a57 commit be94ae1
Show file tree
Hide file tree
Showing 15 changed files with 276 additions and 266 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,14 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserResponseDto {
private UserResponseUserDto userResponseUserDto;
private UserResponseGoalDto userResponseGoalDto;
private Long userId;
private String nickname;
private String userLevel;
private Boolean fcmIsAllowed;
private Long savedAmount;
private Long savedCount;

public static UserResponseDto of(UserResponseUserDto userResponseUserDto, UserResponseGoalDto userResponseGoalDto) {
return new UserResponseDto(userResponseUserDto, userResponseGoalDto);
public static UserResponseDto of(Long userId, String nickname, String userLevel, Boolean fcmIsAllowed, Long savedAmount, Long savedCount) {
return new UserResponseDto(userId, nickname, userLevel, fcmIsAllowed, savedAmount, savedCount);
}
}

This file was deleted.

This file was deleted.

22 changes: 15 additions & 7 deletions src/main/java/org/winey/server/domain/feed/Feed.java
Original file line number Diff line number Diff line change
@@ -1,27 +1,35 @@
package org.winey.server.domain.feed;

import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.winey.server.domain.AuditingTimeEntity;
import org.winey.server.domain.comment.Comment;
import org.winey.server.domain.goal.Goal;
import org.winey.server.domain.user.User;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.List;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Feed extends AuditingTimeEntity {

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

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="user_id")
private User user;
Expand All @@ -46,11 +54,11 @@ public class Feed extends AuditingTimeEntity {
private List<Comment> comments;

@Builder
public Feed(User user, String feedTitle, String feedImage, Long feedMoney, Goal goal){
public Feed(User user, String feedTitle, String feedImage, Long feedMoney) {
this.user = user;
this.feedTitle = feedTitle;
this.feedImage = feedImage;
this.feedMoney = feedMoney;
this.goal = goal;
this.goal = null;
}
}
50 changes: 32 additions & 18 deletions src/main/java/org/winey/server/domain/goal/Goal.java
Original file line number Diff line number Diff line change
@@ -1,32 +1,49 @@
package org.winey.server.domain.goal;

import java.util.ArrayList;
import java.util.List;
import lombok.*;
import org.hibernate.annotations.ColumnDefault;
import java.time.LocalDate;
import javax.persistence.Column;
import javax.persistence.ConstraintMode;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.ForeignKey;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.UniqueConstraint;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.hibernate.annotations.DynamicInsert;
import org.winey.server.domain.AuditingTimeEntity;
import org.winey.server.domain.feed.Feed;
import org.winey.server.domain.notification.Notification;
import org.winey.server.domain.user.User;

import javax.persistence.*;
import java.time.LocalDate;

@Entity
@Getter
@DynamicInsert
@Table(uniqueConstraints = {
@UniqueConstraint(columnNames = {"user_id", "goal_type"})
})
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Goal extends AuditingTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long goalId;

@Column(nullable = false)
@Column(name = "goal_type")
@Enumerated(EnumType.STRING)
private GoalType goalType;

@Column
private Long targetMoney;

@Column(nullable = false)
@Column
private LocalDate targetDate;

@Column(nullable = false)
Expand All @@ -38,23 +55,20 @@ public class Goal extends AuditingTimeEntity {
@Column(nullable = false)
private Long duringGoalCount;


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT))
private User user;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "goal", orphanRemoval = true)
private List<Feed> feeds = new ArrayList<>();
// @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "goal", orphanRemoval = true)
// private List<Feed> feeds = new ArrayList<>();

@Builder
public Goal(Long targetMoney, LocalDate targetDate, User user) {
this.targetMoney = targetMoney;
this.targetDate = targetDate;
public Goal(GoalType goalType, User user) {
this.goalType = goalType;
this.user = user;
this.duringGoalCount = 0L;
this.isAttained = false;
this.duringGoalAmount = 0L;

}

public void updateIsAttained(boolean isAttained) {
Expand Down
28 changes: 28 additions & 0 deletions src/main/java/org/winey/server/domain/goal/GoalType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package org.winey.server.domain.goal;

import lombok.AllArgsConstructor;
import lombok.Getter;
import org.winey.server.domain.user.UserLevel;

@Getter
@AllArgsConstructor
public enum GoalType {
COMMONER_GOAL(UserLevel.COMMONER, 5000, 2, "아메리카노"),
KNIGHT_GOAL(UserLevel.KNIGHT, 30000, 7, "치킨"),
ARISTOCRAT_GOAL(UserLevel.ARISTOCRAT, 150000, 10, "운동화"),
EMPEROR_GOAL(UserLevel.EMPEROR, 300000, 20, "에어팟");

private final UserLevel userLevel;
private final int targetMoney;
private final int targetCount;
private final String targetProduct;

public static GoalType findGoalTypeByUserLevel(UserLevel userLevel) {
for (GoalType goalType : GoalType.values()) {
if (goalType.getUserLevel() == userLevel) {
return goalType;
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,6 @@

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

import javax.validation.constraints.Null;

@Getter
@AllArgsConstructor
Expand All @@ -18,8 +14,7 @@ public enum NotiType {
//삭제로 등급 강등
DELETERANKDOWNTO3("게시글이 삭제되어 등급이 귀족으로 내려갔어요."),
DELETERANKDOWNTO2("게시글이 삭제되어 등급이 기사로 내려갔어요."),

DELETERANKDOWNTO1("게시글이 삭제되어 등급이 귀족으로 내려갔어요."),
DELETERANKDOWNTO1("게시글이 삭제되어 등급이 평민으로 내려갔어요."),

//목표 달성 실패
GOALFAILED("이번에는 아쉽지만 힘내서 다음 목표를 세워볼까요?"),
Expand Down
38 changes: 37 additions & 1 deletion src/main/java/org/winey/server/domain/user/User.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package org.winey.server.domain.user;

import static org.winey.server.domain.user.UserLevel.COMMONER;

import java.util.List;
import java.util.Objects;
import javax.persistence.CascadeType;
Expand Down Expand Up @@ -58,6 +60,12 @@ public class User extends AuditingTimeEntity {
@Column(nullable = true)
private Boolean fcmIsAllowed = true;

@Column
private Long savedAmount;

@Column
private Long savedCount;

@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "user", orphanRemoval = true)
private List<Goal> goals;

Expand All @@ -78,15 +86,33 @@ public class User extends AuditingTimeEntity {
@Builder
public User(String nickname, String socialId, SocialType socialType) {
this.nickname = nickname;
this.userLevel = UserLevel.COMMONER;
this.userLevel = COMMONER;
this.socialId = socialId;
this.socialType = socialType;
this.savedCount = 0L;
this.savedAmount = 0L;
}

public void updateUserLevel(UserLevel userLevel){
this.userLevel = userLevel;
}

public void upgradeUserLevel() {
switch (this.userLevel) {
case COMMONER:
this.userLevel = UserLevel.KNIGHT;
break;
case KNIGHT:
this.userLevel = UserLevel.ARISTOCRAT;
break;
case ARISTOCRAT:
this.userLevel = UserLevel.EMPEROR;
break;
case EMPEROR:
break;
}
}

public void updateRefreshToken(String refreshToken) {
this.refreshToken = refreshToken;
}
Expand All @@ -99,6 +125,16 @@ public void updateNickname(String nickname) {

public void updateFcmIsAllowed(Boolean isAllowed){this.fcmIsAllowed = isAllowed;}

public void increaseSavedAmountAndCount(Long money) {
this.savedAmount += money;
this.savedCount += 1;
}

public void decreaseSavedAmountAndCount(Long money) {
this.savedCount -= money;
this.savedCount -= 1;
}

public String getFcmToken() {
if (Objects.nonNull(this.fcmToken)) {
return this.fcmToken;
Expand Down
21 changes: 17 additions & 4 deletions src/main/java/org/winey/server/domain/user/UserLevel.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,24 @@
@Getter
@AllArgsConstructor
public enum UserLevel {
COMMONER("평민", 1),
KNIGHT("기사", 2),
ARISTOCRAT("귀족", 3),
EMPEROR("황제", 4);
COMMONER("평민", 1, 0L, 0L),
KNIGHT("기사", 2, 30000L, 2L),
ARISTOCRAT("귀족", 3, 150000L, 4L),
EMPEROR("황제", 4, 300000L, 6L);

private final String name;
private final int levelNumber;
private final Long minimumAmount;
private final Long minimumCount;

public static UserLevel calculateUserLevel(Long amount, Long count) {
if (amount >= EMPEROR.minimumAmount && count >= EMPEROR.minimumCount) {
return EMPEROR;
} else if (amount >= ARISTOCRAT.minimumAmount && count >= ARISTOCRAT.minimumCount) {
return ARISTOCRAT;
} else if (amount >= KNIGHT.minimumAmount && count >= KNIGHT.minimumCount) {
return KNIGHT;
}
return COMMONER;
}
}
1 change: 1 addition & 0 deletions src/main/java/org/winey/server/exception/Error.java
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ public enum Error {
INVALID_APPLE_CLAIMS(HttpStatus.BAD_REQUEST, "Apple OAuth Claims 값이 올바르지 않습니다."),
INVALID_ENCRYPT_COMMUNICATION(HttpStatus.BAD_REQUEST, "Apple OAuth 통신 암호화 과정 중 문제가 발생했습니다."),
CREATE_PUBLIC_KEY_EXCEPTION(HttpStatus.BAD_REQUEST, "Apple OAuth 로그인 중 public verify 생성에 문제가 발생했습니다."),
INVALID_USER_LEVEL_EXCEPTION(HttpStatus.BAD_REQUEST, "존재하지 않는 유저 레벨입니다."),

/**
* 401 UNAUTHORIZED
Expand Down
Loading

0 comments on commit be94ae1

Please sign in to comment.