diff --git a/.gitignore b/.gitignore index 162f436..e9d8ac3 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,7 @@ out/ ### application.yml ### application.yaml +application.yml ### DS_Store .DS_Store diff --git a/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java b/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java index f8c3421..83be69c 100644 --- a/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java +++ b/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java @@ -3,6 +3,7 @@ import lombok.*; import org.springframework.web.multipart.MultipartFile; +import javax.annotation.Nullable; import javax.validation.constraints.DecimalMax; import javax.validation.constraints.NotNull; @@ -16,4 +17,10 @@ public class CreateFeedRequestDto { private MultipartFile feedImage; @NotNull @DecimalMax(value = "9999999") private Long feedMoney; + @Nullable + private String feedType = null; + + public void setFeedType(String type) { + this.feedType = type; + } } diff --git a/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java b/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java index 4071046..8e4b893 100644 --- a/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/feed/GetFeedResponseDto.java @@ -18,6 +18,7 @@ public class GetFeedResponseDto { private String nickName; private int writerLevel; // 여기까쥐 + private String feedType; private String feedTitle; private String feedImage; private Long feedMoney; @@ -28,8 +29,8 @@ public class GetFeedResponseDto { private LocalDateTime createdAt; - public static GetFeedResponseDto of(Long feedId, Long userId, String nickName, int writerLevel, String feedTitle, String feedImage, + public static GetFeedResponseDto of(Long feedId, Long userId, String nickName, int writerLevel, String feedType, String feedTitle, String feedImage, Long feedMoney, Boolean isLiked, Long likes, Long comments, String timeAgo, LocalDateTime createdAt) { - return new GetFeedResponseDto(feedId, userId, nickName, writerLevel, feedTitle, feedImage, feedMoney, isLiked, likes, comments, timeAgo, createdAt); + return new GetFeedResponseDto(feedId, userId, nickName, writerLevel, feedType, feedTitle, feedImage, feedMoney, isLiked, likes, comments, timeAgo, createdAt); } } diff --git a/src/main/java/org/winey/server/domain/feed/Feed.java b/src/main/java/org/winey/server/domain/feed/Feed.java index 09a3cc8..3c11ac7 100644 --- a/src/main/java/org/winey/server/domain/feed/Feed.java +++ b/src/main/java/org/winey/server/domain/feed/Feed.java @@ -1,16 +1,8 @@ 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 javax.persistence.*; + import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -40,6 +32,10 @@ public class Feed extends AuditingTimeEntity { @Column(nullable = false) private String feedImage; + @Column + @Enumerated(EnumType.STRING) + private FeedType feedType; + @Column(nullable = false) private Long feedMoney; @@ -54,11 +50,12 @@ public class Feed extends AuditingTimeEntity { private List comments; @Builder - public Feed(User user, String feedTitle, String feedImage, Long feedMoney) { + public Feed(User user, String feedTitle, String feedImage, Long feedMoney, FeedType feedType) { this.user = user; this.feedTitle = feedTitle; this.feedImage = feedImage; this.feedMoney = feedMoney; + this.feedType = feedType; this.goal = null; } } diff --git a/src/main/java/org/winey/server/domain/feed/FeedType.java b/src/main/java/org/winey/server/domain/feed/FeedType.java new file mode 100644 index 0000000..03c5272 --- /dev/null +++ b/src/main/java/org/winey/server/domain/feed/FeedType.java @@ -0,0 +1,23 @@ +package org.winey.server.domain.feed; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +@Getter +@AllArgsConstructor +public enum FeedType { + + SAVE("SAVE"), + CONSUME("CONSUME"); + + private final String stringVal; + + public static boolean isValidFeedType(String type) { + for (FeedType feed : FeedType.values()) { + if (Objects.equals(feed.getStringVal(), type)) return true; + } + return false; + } +} diff --git a/src/main/java/org/winey/server/domain/user/User.java b/src/main/java/org/winey/server/domain/user/User.java index adff709..29454ad 100644 --- a/src/main/java/org/winey/server/domain/user/User.java +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -131,8 +131,8 @@ public void increaseSavedAmountAndCount(Long money) { } public void decreaseSavedAmountAndCount(Long money) { - this.savedCount -= money; this.savedCount -= 1; + this.savedAmount -= money; } public String getFcmToken() { diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index 171f6ac..8d90356 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -17,6 +17,7 @@ public enum Error { LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."), INVALID_PASSWORD_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 비밀번호가 입력됐습니다."), NOT_FOUND_IMAGE_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 이미지 파일입니다"), + INVALID_FEEDTYPE(HttpStatus.BAD_REQUEST, "잘못된 피드유형 입니다"), VALIDATION_REQUEST_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청값이 입력되지 않았습니다."), VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 헤더값이 입력되지 않았습니다."), VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 파라미터값이 입력되지 않았습니다."), diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index da9d0a1..fcebadb 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -19,11 +19,13 @@ import org.winey.server.controller.response.feed.GetFeedResponseDto; import org.winey.server.domain.block.BlockUser; import org.winey.server.domain.feed.Feed; +import org.winey.server.domain.feed.FeedType; import org.winey.server.domain.notification.NotiType; import org.winey.server.domain.notification.Notification; import org.winey.server.domain.user.User; import org.winey.server.domain.user.UserLevel; import org.winey.server.exception.Error; +import org.winey.server.exception.model.BadRequestException; import org.winey.server.exception.model.NotFoundException; import org.winey.server.exception.model.UnauthorizedException; import org.winey.server.infrastructure.BlockUserRepository; @@ -50,19 +52,26 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI User presentUser = userRepository.findByUserId(userId) .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); - // 2. 피드를 생성한다. + // 2. 피드 타입 값을 받아와 올바른 피드유형인가 판별 + String feedType = request.getFeedType(); +// if (!FeedType.isValidFeedType(feedType)) +// throw new BadRequestException(Error.INVALID_FEEDTYPE, Error.INVALID_FEEDTYPE.getMessage()); + + // 3. 피드를 생성한다. Feed feed = Feed.builder() .feedImage(imageUrl) + .feedType(feedType == null || feedType.isEmpty() ? null : FeedType.valueOf(feedType)) .feedMoney(request.getFeedMoney()) .feedTitle(request.getFeedTitle()) .user(presentUser) .build(); + feedRepository.save(feed); - // 3. 유저의 누적 절약 금액, 누적 절약 횟수를 업데이트한다. - presentUser.increaseSavedAmountAndCount(feed.getFeedMoney()); + // 4. 유저의 피드 유형이 절약인 경우 누적 절약 금액과 누적 절약 피드 개수 업데이트한다. + if (Objects.equals(feedType, "SAVE")) presentUser.increaseSavedAmountAndCount(feed.getFeedMoney()); - // 4. 레벨업을 체크한다. + // 5. 레벨업을 체크한다. UserLevel newUserLevel = UserLevel.calculateUserLevel(presentUser.getSavedAmount(), presentUser.getSavedCount()); if (presentUser.getUserLevel() != newUserLevel) { @@ -103,8 +112,10 @@ public String deleteFeed(Long userId, Long feedId) { throw new UnauthorizedException(Error.DELETE_UNAUTHORIZED, Error.DELETE_UNAUTHORIZED.getMessage()); // 삭제하는 사람 아니면 삭제 못함 처리. } - // 4. 유저의 누적 절약 금액, 누적 절약 횟수를 업데이트한다. - presentUser.decreaseSavedAmountAndCount(wantDeleteFeed.getFeedMoney()); + // 4. 절약 피드가 삭제되면 유저의 누적 절약 금액과 누적 절약 피드 개수 감소 + if (wantDeleteFeed.getFeedType() == FeedType.SAVE) { + presentUser.decreaseSavedAmountAndCount(wantDeleteFeed.getFeedMoney()); + } // 5. 레벨다운을 체크한다. UserLevel newUserLevel = UserLevel.calculateUserLevel(presentUser.getSavedAmount(), presentUser.getSavedCount()); @@ -161,6 +172,7 @@ public GetAllFeedResponseDto getAllFeed(int page, Long userId) { feed.getUser().getUserId(), feed.getUser().getNickname(), feed.getUser().getUserLevel().getLevelNumber(), + feed.getFeedType() == null ? null : feed.getFeedType().getStringVal(), feed.getFeedTitle(), feed.getFeedImage(), feed.getFeedMoney(), @@ -185,6 +197,7 @@ public GetAllFeedResponseDto getMyFeed(int page, Long userId) { myFeed.getUser().getUserId(), myFeed.getUser().getNickname(), myFeed.getUser().getUserLevel().getLevelNumber(), + myFeed.getFeedType() == null ? null : myFeed.getFeedType().getStringVal(), myFeed.getFeedTitle(), myFeed.getFeedImage(), myFeed.getFeedMoney(), @@ -218,6 +231,7 @@ public GetFeedDetailResponseDto getFeedDetail(Long feedId, Long userId) { detailFeed.getUser().getUserId(), detailFeed.getUser().getNickname(), detailFeed.getUser().getUserLevel().getLevelNumber(), + detailFeed.getFeedType() == null ? null : detailFeed.getFeedType().getStringVal(), detailFeed.getFeedTitle(), detailFeed.getFeedImage(), detailFeed.getFeedMoney(),