From 97575939cfe39fd9b8fa251004b46bfb5af9aace Mon Sep 17 00:00:00 2001 From: sunny Date: Mon, 3 Jul 2023 17:23:10 +0900 Subject: [PATCH 01/40] =?UTF-8?q?#1=20[FEAT]=20user,=20goal,=20recommend?= =?UTF-8?q?=20entity=20=EC=9E=91=EC=84=B1=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/domain/goal/Goal.java | 47 +++++++++++++++++++ .../server/domain/recommend/Recommend.java | 45 ++++++++++++++++++ .../org/winey/server/domain/user/User.java | 45 ++++++++++++++++++ .../winey/server/domain/user/UserLevel.java | 16 +++++++ 4 files changed, 153 insertions(+) create mode 100644 src/main/java/org/winey/server/domain/goal/Goal.java create mode 100644 src/main/java/org/winey/server/domain/recommend/Recommend.java create mode 100644 src/main/java/org/winey/server/domain/user/User.java create mode 100644 src/main/java/org/winey/server/domain/user/UserLevel.java diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java new file mode 100644 index 0000000..d4b8936 --- /dev/null +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -0,0 +1,47 @@ +package org.winey.server.domain.goal; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; +import org.winey.server.domain.AuditingTimeEntity; +import org.winey.server.domain.user.User; + +import javax.persistence.*; +import java.time.LocalDate; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Goal extends AuditingTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long goalId; + + @Column(nullable = false) + private Long targetMoney; + + @Column(nullable = false) + private LocalDate targetDate; + + @Column(nullable = false) + @ColumnDefault("0") + private Long duringGoalAmount; + + @Column(nullable = false) + @ColumnDefault("false") + private boolean isAttained; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT)) + private User user; + + @Builder + public Goal(Long targetMoney, LocalDate targetDate, User user) { + this.targetMoney = targetMoney; + this.targetDate = targetDate; + this.user = user; + } +} diff --git a/src/main/java/org/winey/server/domain/recommend/Recommend.java b/src/main/java/org/winey/server/domain/recommend/Recommend.java new file mode 100644 index 0000000..40072fa --- /dev/null +++ b/src/main/java/org/winey/server/domain/recommend/Recommend.java @@ -0,0 +1,45 @@ +package org.winey.server.domain.recommend; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.winey.server.domain.AuditingTimeEntity; +import org.winey.server.domain.user.User; + +import javax.persistence.*; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Recommend extends AuditingTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long recommendId; + + @Column(nullable = false) + private String recommendLink; + + @Column(nullable = false) + private String recommendTitle; + + @Column(nullable = false) + private Long recommendPrice; + + @Column(nullable = false) + private String recommendImage; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT)) + private User user; + + @Builder + public Recommend(String recommendLink, String recommendTitle, Long recommendPrice, String recommendImage, User user) { + this.recommendLink = recommendLink; + this.recommendTitle = recommendTitle; + this.recommendPrice = recommendPrice; + this.recommendImage = recommendImage; + this.user = user; + } +} diff --git a/src/main/java/org/winey/server/domain/user/User.java b/src/main/java/org/winey/server/domain/user/User.java new file mode 100644 index 0000000..b91e467 --- /dev/null +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -0,0 +1,45 @@ +package org.winey.server.domain.user; + +import lombok.*; +import org.winey.server.domain.AuditingTimeEntity; +import org.winey.server.domain.goal.Goal; +import org.winey.server.domain.recommend.Recommend; + +import javax.persistence.*; +import java.util.List; + +@Entity +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class User extends AuditingTimeEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long userId; + + @Column(nullable = false, unique = true) + private String nickname; + + @Column(nullable = false) + private UserLevel userLevel; + + @Column(nullable = false) + private Long accumulatedAmount; + + @Column(nullable = false) + private Long feedCount; + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "user", orphanRemoval = true) + private List goals; + + @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE, mappedBy = "user", orphanRemoval = true) + private List recommends; + + @Builder + public User(String nickname, UserLevel userLevel, Long accumulatedAmount, Long feedCount) { + this.nickname = nickname; + this.userLevel = userLevel; + this.accumulatedAmount = accumulatedAmount; + this.feedCount = feedCount; + } +} diff --git a/src/main/java/org/winey/server/domain/user/UserLevel.java b/src/main/java/org/winey/server/domain/user/UserLevel.java new file mode 100644 index 0000000..5303744 --- /dev/null +++ b/src/main/java/org/winey/server/domain/user/UserLevel.java @@ -0,0 +1,16 @@ +package org.winey.server.domain.user; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum UserLevel { + COMMONER("평민", 1), + KNIGHT("기사", 2), + ARISTOCRAT("귀족", 3), + EMPEROR("황제", 4); + + private final String name; + private final int levelNumber; +} From 6370d37ae701ee7e8bb5a3e5fcd1a4495d0744de Mon Sep 17 00:00:00 2001 From: sunny Date: Mon, 3 Jul 2023 17:45:31 +0900 Subject: [PATCH 02/40] =?UTF-8?q?[Refactor]=20=EC=9D=B4=EC=8A=88=20?= =?UTF-8?q?=ED=85=9C=ED=94=8C=EB=A6=BF=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/ISSUE_TEMPLATE.md | 26 ++++++++++++++++++++++++++ .github/PULL_REQUEST_TEMPLATE.md | 25 +++++++++++++++++++++++++ 2 files changed, 51 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE.md create mode 100644 .github/PULL_REQUEST_TEMPLATE.md diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..3fe65bc --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,26 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: feat +assignees: sss4920 + +--- + +--- +name: Feature request +about: Suggest an idea for this project +title: '' +labels: '' +assignees: '' +--- + +## ✨ Description + +구현할 기능 작성 + +## ✅ To Do List + +- [ ] 작업 1 +- [ ] 작업 2 +- [ ] 작업 3 diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..96a6e18 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,25 @@ +## 🚩 관련 이슈 +- close #1 + +## 📋 구현 기능 명세 +- [x] + +## 📌 PR Point +- 무슨 이유로 어떻게 코드를 변경했는지 + + +- 어떤 부분에 리뷰어가 집중해야 하는지 + + +- 개발하면서 어떤 점이 궁금했는지 + +## 📸 결과물 스크린샷 +```java +@Pattern(regexp = "^[\\S][가-힣a-zA-Z0-9\\s]{0,20}$", message = "위니 피드 제목 형식에 맞지 않습니다.") +``` + +## 🛠️ 테스트 +- [x] 테스트 + +## 🚀 API Endpoint +- / From b938e520028602883c7faa6054715c289678a96b Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 3 Jul 2023 17:54:30 +0900 Subject: [PATCH 03/40] =?UTF-8?q?#2=20Feed,FeedLike=20domain=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/domain/feed/Feed.java | 40 +++++++++++++++++++ .../winey/server/domain/feed/FeedLike.java | 29 ++++++++++++++ .../server/domain/recommend/Recommend.java | 15 +++---- 3 files changed, 77 insertions(+), 7 deletions(-) create mode 100644 src/main/java/org/winey/server/domain/feed/Feed.java create mode 100644 src/main/java/org/winey/server/domain/feed/FeedLike.java diff --git a/src/main/java/org/winey/server/domain/feed/Feed.java b/src/main/java/org/winey/server/domain/feed/Feed.java new file mode 100644 index 0000000..6102532 --- /dev/null +++ b/src/main/java/org/winey/server/domain/feed/Feed.java @@ -0,0 +1,40 @@ +package org.winey.server.domain.feed; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.winey.server.domain.AuditingTimeEntity; +import org.winey.server.domain.user.User; + +import javax.persistence.*; + +@Getter +@Entity +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class Feed extends AuditingTimeEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "feed_id") + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="user_id") + private User user; + + @Column(nullable = false) + private String feedTitle; + + @Column(nullable = false) + private String feedImage; + + @Column(nullable = false) + private Long feed_money; + + @Builder + public Feed(User user, String feedTitle, String feedImage, Long feed_money){ + this.user = user; + this.feedTitle = feedTitle; + this.feedImage = feedImage; + this.feed_money = feed_money; + } +} diff --git a/src/main/java/org/winey/server/domain/feed/FeedLike.java b/src/main/java/org/winey/server/domain/feed/FeedLike.java new file mode 100644 index 0000000..2e4d75e --- /dev/null +++ b/src/main/java/org/winey/server/domain/feed/FeedLike.java @@ -0,0 +1,29 @@ +package org.winey.server.domain.feed; + +import lombok.*; +import org.winey.server.domain.user.User; + +import javax.persistence.*; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +@Entity +public class FeedLike { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "feed_like_id") + private Long id; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name="user_id") + private User user; + + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name ="feed_id") + private Feed feed; + + @Builder + private FeedLike(User user, Feed feed){ + this.user = user; + this.feed = feed; + } +} diff --git a/src/main/java/org/winey/server/domain/recommend/Recommend.java b/src/main/java/org/winey/server/domain/recommend/Recommend.java index 40072fa..8edbe10 100644 --- a/src/main/java/org/winey/server/domain/recommend/Recommend.java +++ b/src/main/java/org/winey/server/domain/recommend/Recommend.java @@ -1,9 +1,6 @@ package org.winey.server.domain.recommend; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.winey.server.domain.AuditingTimeEntity; import org.winey.server.domain.user.User; @@ -24,8 +21,13 @@ public class Recommend extends AuditingTimeEntity { @Column(nullable = false) private String recommendTitle; - @Column(nullable = false) - private Long recommendPrice; + @Column + @Setter + private Long recommendWon; + + @Column + @Setter + private Long recommendPercent; @Column(nullable = false) private String recommendImage; @@ -38,7 +40,6 @@ public class Recommend extends AuditingTimeEntity { public Recommend(String recommendLink, String recommendTitle, Long recommendPrice, String recommendImage, User user) { this.recommendLink = recommendLink; this.recommendTitle = recommendTitle; - this.recommendPrice = recommendPrice; this.recommendImage = recommendImage; this.user = user; } From 8ec5ee6743263a2b62e09a7e35502a264400dc79 Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 4 Jul 2023 18:03:16 +0900 Subject: [PATCH 04/40] =?UTF-8?q?#7=20[Feat]=20dto=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RecommendController.java | 34 +++++++++++++++++++ .../controller/response/PageResponseDto.java | 18 ++++++++++ .../recommend/RecommendResponseDto.java | 27 +++++++++++++++ .../recommend/RecommendResponseUserDto.java | 15 ++++++++ .../server/service/RecommendService.java | 5 +++ 5 files changed, 99 insertions(+) create mode 100644 src/main/java/org/winey/server/controller/RecommendController.java create mode 100644 src/main/java/org/winey/server/controller/response/PageResponseDto.java create mode 100644 src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java create mode 100644 src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java create mode 100644 src/main/java/org/winey/server/service/RecommendService.java diff --git a/src/main/java/org/winey/server/controller/RecommendController.java b/src/main/java/org/winey/server/controller/RecommendController.java new file mode 100644 index 0000000..e4aa20a --- /dev/null +++ b/src/main/java/org/winey/server/controller/RecommendController.java @@ -0,0 +1,34 @@ +package org.winey.server.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.winey.server.common.dto.ApiResponse; +import org.winey.server.service.RecommendService; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/recommend") +public class RecommendController { + + private final RecommendService recommendService; + + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public ApiResponse<> getRecommend(@RequestParam final int page) { + + } + + + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public ApiResponse getOne(@RequestParam final String date){ + RetrospectResponseDto data = retrospectService.getOne(date); + if (data == null) { + return ApiResponse.success(Success.GET_RETROSPECT_NO_CONTENT_SUCCESS); + } else { + return ApiResponse.success(Success.GET_RETROSPECT_SUCCESS, data); + } + } + +} diff --git a/src/main/java/org/winey/server/controller/response/PageResponseDto.java b/src/main/java/org/winey/server/controller/response/PageResponseDto.java new file mode 100644 index 0000000..54f12b5 --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/PageResponseDto.java @@ -0,0 +1,18 @@ +package org.winey.server.controller.response; + +import lombok.Builder; +import lombok.Getter; + +@Getter +public class PageResponseDto { + private final int totalPageSize; + private final int currentPageIndex; + private final boolean isEnd; + + @Builder + public PageResponseDto(int totalPageSize, int currentPageIndex, boolean isEnd) { + this.totalPageSize = totalPageSize; + this.currentPageIndex = currentPageIndex; + this.isEnd = isEnd; + } +} diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java new file mode 100644 index 0000000..9c8b1e1 --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java @@ -0,0 +1,27 @@ +package org.winey.server.controller.response.recommend; + +import lombok.*; + +import java.time.LocalDateTime; + +@Getter +public class RecommendResponseDto { + private final Long recommendId; + @Setter + private String recommendLink; + private final String recommendTitle; + @Setter + private Long recommendWon; + @Setter + private Long recommendPercent; + private final String recommendImage; + private final LocalDateTime createdAt; + + @Builder + public RecommendResponseDto(Long recommendId, String recommendTitle, String recommendImage, LocalDateTime createdAt) { + this.recommendId = recommendId; + this.recommendTitle = recommendTitle; + this.recommendImage = recommendImage; + this.createdAt = createdAt; + } +} diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java new file mode 100644 index 0000000..d0ca170 --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java @@ -0,0 +1,15 @@ +package org.winey.server.controller.response.recommend; + +import lombok.*; + +@Getter +public class RecommendResponseUserDto { + private final Long userId; + private final String nickname; + + @Builder + public RecommendResponseUserDto(Long userId, String nickname) { + this.userId = userId; + this.nickname = nickname; + } +} diff --git a/src/main/java/org/winey/server/service/RecommendService.java b/src/main/java/org/winey/server/service/RecommendService.java new file mode 100644 index 0000000..a537ee7 --- /dev/null +++ b/src/main/java/org/winey/server/service/RecommendService.java @@ -0,0 +1,5 @@ +package org.winey.server.service; + + +public class RecommendService { +} From 30a7809e2982e4fa14d31d56fb3052f56e33fc61 Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 4 Jul 2023 18:04:38 +0900 Subject: [PATCH 05/40] =?UTF-8?q?#7=20[Fix]=20Recommend=20entity=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/domain/recommend/Recommend.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/winey/server/domain/recommend/Recommend.java b/src/main/java/org/winey/server/domain/recommend/Recommend.java index 8edbe10..7e5bce0 100644 --- a/src/main/java/org/winey/server/domain/recommend/Recommend.java +++ b/src/main/java/org/winey/server/domain/recommend/Recommend.java @@ -15,7 +15,8 @@ public class Recommend extends AuditingTimeEntity { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long recommendId; - @Column(nullable = false) + @Column + @Setter private String recommendLink; @Column(nullable = false) @@ -37,8 +38,7 @@ public class Recommend extends AuditingTimeEntity { private User user; @Builder - public Recommend(String recommendLink, String recommendTitle, Long recommendPrice, String recommendImage, User user) { - this.recommendLink = recommendLink; + public Recommend(String recommendTitle, String recommendImage, User user) { this.recommendTitle = recommendTitle; this.recommendImage = recommendImage; this.user = user; From b12f7c18b2ace965038e43d29d445c687c37d3df Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 4 Jul 2023 21:37:24 +0900 Subject: [PATCH 06/40] =?UTF-8?q?#7=20[Feat]=20getRecommend=20dto=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20=EB=B0=8F=20=EC=9E=91=EC=84=B1=20=EC=99=84?= =?UTF-8?q?=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/RecommendController.java | 3 ++- .../recommend/RecommendListResponseDto.java | 21 +++++++++++++++++++ .../server/service/RecommendService.java | 3 +++ 3 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java diff --git a/src/main/java/org/winey/server/controller/RecommendController.java b/src/main/java/org/winey/server/controller/RecommendController.java index e4aa20a..0aecdf8 100644 --- a/src/main/java/org/winey/server/controller/RecommendController.java +++ b/src/main/java/org/winey/server/controller/RecommendController.java @@ -4,6 +4,7 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import org.winey.server.common.dto.ApiResponse; +import org.winey.server.controller.response.recommend.RecommendListResponseDto; import org.winey.server.service.RecommendService; @RestController @@ -15,7 +16,7 @@ public class RecommendController { @GetMapping("") @ResponseStatus(HttpStatus.OK) - public ApiResponse<> getRecommend(@RequestParam final int page) { + public ApiResponse getRecommend(@RequestParam final int page) { } diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java new file mode 100644 index 0000000..f9a984f --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java @@ -0,0 +1,21 @@ +package org.winey.server.controller.response.recommend; + +import lombok.Builder; +import lombok.Getter; +import org.winey.server.controller.response.PageResponseDto; + +import java.util.List; + +@Getter +public class RecommendListResponseDto { + private final RecommendResponseUserDto recommendResponseUserDto; + private final PageResponseDto pageResponseDto; + private final List recommendsResponseDto; + + @Builder + public RecommendListResponseDto(RecommendResponseUserDto recommendResponseUserDto, PageResponseDto pageResponseDto, List recommendsResponseDto) { + this.recommendResponseUserDto = recommendResponseUserDto; + this.pageResponseDto = pageResponseDto; + this.recommendsResponseDto = recommendsResponseDto; + } +} diff --git a/src/main/java/org/winey/server/service/RecommendService.java b/src/main/java/org/winey/server/service/RecommendService.java index a537ee7..def49cf 100644 --- a/src/main/java/org/winey/server/service/RecommendService.java +++ b/src/main/java/org/winey/server/service/RecommendService.java @@ -1,5 +1,8 @@ package org.winey.server.service; +import org.springframework.stereotype.Service; + +@Service public class RecommendService { } From 61d7e9552d6b3c1f3951fd8566e4b67e5f6c99f7 Mon Sep 17 00:00:00 2001 From: soohyun Date: Tue, 4 Jul 2023 22:06:19 +0900 Subject: [PATCH 07/40] =?UTF-8?q?#6=20[Feat]=20FeedController=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/feed/FeedController.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/main/java/org/winey/server/controller/feed/FeedController.java diff --git a/src/main/java/org/winey/server/controller/feed/FeedController.java b/src/main/java/org/winey/server/controller/feed/FeedController.java new file mode 100644 index 0000000..0b29c29 --- /dev/null +++ b/src/main/java/org/winey/server/controller/feed/FeedController.java @@ -0,0 +1,31 @@ +package org.winey.server.controller.feed; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.*; +import org.winey.server.common.dto.ApiResponse; +import org.winey.server.controller.feed.request.CreateFeedRequestDto; +import org.winey.server.exception.Success; +import org.winey.server.external.client.aws.S3Service; +import org.winey.server.service.FeedService; + +import javax.validation.Valid; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/feed") +public class FeedController { + private final S3Service s3Service; + private final FeedService feedService; + + @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) + @ResponseStatus(HttpStatus.CREATED) + public ApiResponse create( + @RequestHeader("userId") Long userId, + @ModelAttribute @Valid final CreateFeedRequestDto request) { + String feedImageUrl = s3Service.uploadImage(request.getFeedImage(), "feed"); + return ApiResponse.success(Success.CREATE_BOARD_SUCCESS); + } + +} From de94b325c593217cd7312f6edcc6a9d80fd6e59e Mon Sep 17 00:00:00 2001 From: soohyun Date: Tue, 4 Jul 2023 22:07:53 +0900 Subject: [PATCH 08/40] =?UTF-8?q?#6=20[Fix]=20Feed=20dto=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/domain/feed/Feed.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) 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 6102532..99656bb 100644 --- a/src/main/java/org/winey/server/domain/feed/Feed.java +++ b/src/main/java/org/winey/server/domain/feed/Feed.java @@ -28,13 +28,13 @@ public class Feed extends AuditingTimeEntity { private String feedImage; @Column(nullable = false) - private Long feed_money; + private Long feedMoney; @Builder - public Feed(User user, String feedTitle, String feedImage, Long feed_money){ + public Feed(User user, String feedTitle, String feedImage, Long feedMoney){ this.user = user; this.feedTitle = feedTitle; this.feedImage = feedImage; - this.feed_money = feed_money; + this.feedMoney = feedMoney; } } From c23805502eb957a36ce39378feefaf5f90481a3c Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 4 Jul 2023 22:20:43 +0900 Subject: [PATCH 09/40] =?UTF-8?q?#7=20[Feat]=20getRecommend=20Service=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/response/PageResponseDto.java | 18 ++++--- .../recommend/RecommendListResponseDto.java | 18 ++++--- .../recommend/RecommendResponseDto.java | 23 ++++----- .../recommend/RecommendResponseUserDto.java | 12 ++--- .../org/winey/server/exception/Error.java | 1 + .../infrastructure/RecommendRepository.java | 19 ++++++++ .../server/infrastructure/UserRepository.java | 15 ++++++ .../server/service/RecommendService.java | 47 +++++++++++++++++++ 8 files changed, 114 insertions(+), 39 deletions(-) create mode 100644 src/main/java/org/winey/server/infrastructure/RecommendRepository.java create mode 100644 src/main/java/org/winey/server/infrastructure/UserRepository.java diff --git a/src/main/java/org/winey/server/controller/response/PageResponseDto.java b/src/main/java/org/winey/server/controller/response/PageResponseDto.java index 54f12b5..5416224 100644 --- a/src/main/java/org/winey/server/controller/response/PageResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/PageResponseDto.java @@ -1,18 +1,16 @@ package org.winey.server.controller.response; -import lombok.Builder; -import lombok.Getter; +import lombok.*; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class PageResponseDto { - private final int totalPageSize; - private final int currentPageIndex; - private final boolean isEnd; + private int totalPageSize; + private int currentPageIndex; + private boolean isEnd; - @Builder - public PageResponseDto(int totalPageSize, int currentPageIndex, boolean isEnd) { - this.totalPageSize = totalPageSize; - this.currentPageIndex = currentPageIndex; - this.isEnd = isEnd; + public static PageResponseDto of(int totalPageSize, int currentPageIndex, boolean isEnd) { + return new PageResponseDto(totalPageSize, currentPageIndex, isEnd); } } diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java index f9a984f..edfe9a7 100644 --- a/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendListResponseDto.java @@ -1,21 +1,19 @@ package org.winey.server.controller.response.recommend; -import lombok.Builder; -import lombok.Getter; +import lombok.*; import org.winey.server.controller.response.PageResponseDto; import java.util.List; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class RecommendListResponseDto { - private final RecommendResponseUserDto recommendResponseUserDto; - private final PageResponseDto pageResponseDto; - private final List recommendsResponseDto; + private RecommendResponseUserDto recommendResponseUserDto; + private PageResponseDto pageResponseDto; + private List recommendsResponseDto; - @Builder - public RecommendListResponseDto(RecommendResponseUserDto recommendResponseUserDto, PageResponseDto pageResponseDto, List recommendsResponseDto) { - this.recommendResponseUserDto = recommendResponseUserDto; - this.pageResponseDto = pageResponseDto; - this.recommendsResponseDto = recommendsResponseDto; + public static RecommendListResponseDto of(RecommendResponseUserDto recommendResponseUserDto, PageResponseDto pageResponseDto, List recommendsResponseDto) { + return new RecommendListResponseDto(recommendResponseUserDto, pageResponseDto, recommendsResponseDto); } } diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java index 9c8b1e1..b87a429 100644 --- a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseDto.java @@ -1,27 +1,24 @@ package org.winey.server.controller.response.recommend; +import com.fasterxml.jackson.annotation.JsonInclude; import lombok.*; import java.time.LocalDateTime; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@JsonInclude(JsonInclude.Include.NON_NULL) public class RecommendResponseDto { - private final Long recommendId; - @Setter + private Long recommendId; private String recommendLink; - private final String recommendTitle; - @Setter + private String recommendTitle; private Long recommendWon; - @Setter private Long recommendPercent; - private final String recommendImage; - private final LocalDateTime createdAt; + private String recommendImage; + private LocalDateTime createdAt; - @Builder - public RecommendResponseDto(Long recommendId, String recommendTitle, String recommendImage, LocalDateTime createdAt) { - this.recommendId = recommendId; - this.recommendTitle = recommendTitle; - this.recommendImage = recommendImage; - this.createdAt = createdAt; + public static RecommendResponseDto of(Long recommendId, String recommendLink, String recommendTitle, Long recommendWon, Long recommendPercent, String recommendImage, LocalDateTime createdAt) { + return new RecommendResponseDto(recommendId, recommendLink, recommendTitle, recommendWon, recommendPercent, recommendImage, createdAt); } } diff --git a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java index d0ca170..a485d1c 100644 --- a/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java +++ b/src/main/java/org/winey/server/controller/response/recommend/RecommendResponseUserDto.java @@ -3,13 +3,13 @@ import lombok.*; @Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) public class RecommendResponseUserDto { - private final Long userId; - private final String nickname; + private Long userId; + private String nickname; - @Builder - public RecommendResponseUserDto(Long userId, String nickname) { - this.userId = userId; - this.nickname = nickname; + public static RecommendResponseUserDto of(Long userId, String nickname) { + return new RecommendResponseUserDto(userId, nickname); } } diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index 0c575a6..54ea3fb 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -26,6 +26,7 @@ public enum Error { * 404 NOT FOUND */ NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"), + NOT_FOUND_RECOMMEND_PAGE_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 추천 위니 페이지입니다."), /** * 409 CONFLICT diff --git a/src/main/java/org/winey/server/infrastructure/RecommendRepository.java b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java new file mode 100644 index 0000000..bc9b83d --- /dev/null +++ b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java @@ -0,0 +1,19 @@ +package org.winey.server.infrastructure; + +import org.springframework.data.domain.Page; +import org.springframework.data.jpa.repository.JpaRepository; +import org.winey.server.domain.recommend.Recommend; + +import java.awt.print.Pageable; +import java.util.Optional; + +public interface RecommendRepository extends JpaRepository { + // CREATE + + // READ + Optional> findAllOrderByCreatedAtDesc(Pageable pageable); + // UPDATE + + // DELETE + +} diff --git a/src/main/java/org/winey/server/infrastructure/UserRepository.java b/src/main/java/org/winey/server/infrastructure/UserRepository.java new file mode 100644 index 0000000..22d5e31 --- /dev/null +++ b/src/main/java/org/winey/server/infrastructure/UserRepository.java @@ -0,0 +1,15 @@ +package org.winey.server.infrastructure; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.winey.server.domain.user.User; + +public interface UserRepository extends JpaRepository { + // CREATE + + // READ + User findByUserId(Long userId); + + // UPDATE + + // DELETE +} diff --git a/src/main/java/org/winey/server/service/RecommendService.java b/src/main/java/org/winey/server/service/RecommendService.java index def49cf..0f44158 100644 --- a/src/main/java/org/winey/server/service/RecommendService.java +++ b/src/main/java/org/winey/server/service/RecommendService.java @@ -1,8 +1,55 @@ package org.winey.server.service; +import lombok.RequiredArgsConstructor; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.winey.server.controller.response.PageResponseDto; +import org.winey.server.controller.response.recommend.RecommendListResponseDto; +import org.winey.server.controller.response.recommend.RecommendResponseDto; +import org.winey.server.controller.response.recommend.RecommendResponseUserDto; +import org.winey.server.domain.recommend.Recommend; +import org.winey.server.domain.user.User; +import org.winey.server.exception.Error; +import org.winey.server.exception.model.NotFoundException; +import org.winey.server.infrastructure.RecommendRepository; +import org.winey.server.infrastructure.UserRepository; + +import java.awt.print.Pageable; +import java.util.List; +import java.util.stream.Collectors; @Service +@RequiredArgsConstructor public class RecommendService { + private final UserRepository userRepository; + private final RecommendRepository recommendRepository; + + @Transactional + public RecommendListResponseDto getRecommend(int page, Long userId) { + User user = userRepository.findByUserId(userId); + RecommendResponseUserDto userInfo = RecommendResponseUserDto.of(user.getUserId(), user.getNickname()); + + PageRequest pageRequest = PageRequest.of(page, 50); + Page recommendPage = recommendRepository.findAllOrderByCreatedAtDesc((Pageable) pageRequest) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_RECOMMEND_PAGE_EXCEPTION, Error.NOT_FOUND_RECOMMEND_PAGE_EXCEPTION.getMessage())); + + PageResponseDto pageInfo = PageResponseDto.of(recommendPage.getTotalPages(), recommendPage.getNumber(), (recommendPage.getTotalPages() < recommendPage.getNumber())); + + List recommendInfos = recommendPage.stream() + .map(recommend -> RecommendResponseDto.of( + recommend.getRecommendId(), + recommend.getRecommendLink(), + recommend.getRecommendTitle(), + recommend.getRecommendWon(), + recommend.getRecommendPercent(), + recommend.getRecommendImage(), + recommend.getCreatedAt() + )).collect(Collectors.toList()); + + return RecommendListResponseDto.of(userInfo, pageInfo, recommendInfos); + + } } From 7b638334e0ebdd8c0f94ad22100979a16eaa746f Mon Sep 17 00:00:00 2001 From: Sunny Date: Tue, 4 Jul 2023 23:11:49 +0900 Subject: [PATCH 10/40] =?UTF-8?q?#7=20[Feat]=20getRecommend=20Controller?= =?UTF-8?q?=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/RecommendController.java | 16 +++------------- .../controller/response/PageResponseDto.java | 1 + .../java/org/winey/server/exception/Success.java | 5 +++++ .../infrastructure/RecommendRepository.java | 5 ++--- .../winey/server/service/RecommendService.java | 9 +++------ 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/src/main/java/org/winey/server/controller/RecommendController.java b/src/main/java/org/winey/server/controller/RecommendController.java index 0aecdf8..3c70587 100644 --- a/src/main/java/org/winey/server/controller/RecommendController.java +++ b/src/main/java/org/winey/server/controller/RecommendController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.*; import org.winey.server.common.dto.ApiResponse; import org.winey.server.controller.response.recommend.RecommendListResponseDto; +import org.winey.server.exception.Success; import org.winey.server.service.RecommendService; @RestController @@ -16,20 +17,9 @@ public class RecommendController { @GetMapping("") @ResponseStatus(HttpStatus.OK) - public ApiResponse getRecommend(@RequestParam final int page) { - + public ApiResponse getRecommend(@RequestParam final int page, @RequestHeader final Long userId) { + return ApiResponse.success(Success.GET_RECOMMEND_LIST_SUCCESS, recommendService.getRecommend(page, userId)); } - @GetMapping("") - @ResponseStatus(HttpStatus.OK) - public ApiResponse getOne(@RequestParam final String date){ - RetrospectResponseDto data = retrospectService.getOne(date); - if (data == null) { - return ApiResponse.success(Success.GET_RETROSPECT_NO_CONTENT_SUCCESS); - } else { - return ApiResponse.success(Success.GET_RETROSPECT_SUCCESS, data); - } - } - } diff --git a/src/main/java/org/winey/server/controller/response/PageResponseDto.java b/src/main/java/org/winey/server/controller/response/PageResponseDto.java index 5416224..31cdf4f 100644 --- a/src/main/java/org/winey/server/controller/response/PageResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/PageResponseDto.java @@ -1,5 +1,6 @@ package org.winey.server.controller.response; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; @Getter diff --git a/src/main/java/org/winey/server/exception/Success.java b/src/main/java/org/winey/server/exception/Success.java index d79b877..ac2877d 100644 --- a/src/main/java/org/winey/server/exception/Success.java +++ b/src/main/java/org/winey/server/exception/Success.java @@ -9,6 +9,11 @@ @AllArgsConstructor(access = AccessLevel.PRIVATE) public enum Success { + /** + * 200 OK + */ + GET_RECOMMEND_LIST_SUCCESS(HttpStatus.OK, "추천 위니 전체 조회 성공"), + /** * 201 CREATED */ diff --git a/src/main/java/org/winey/server/infrastructure/RecommendRepository.java b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java index bc9b83d..f454df1 100644 --- a/src/main/java/org/winey/server/infrastructure/RecommendRepository.java +++ b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java @@ -4,14 +4,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.winey.server.domain.recommend.Recommend; -import java.awt.print.Pageable; -import java.util.Optional; +import org.springframework.data.domain.Pageable; public interface RecommendRepository extends JpaRepository { // CREATE // READ - Optional> findAllOrderByCreatedAtDesc(Pageable pageable); + Page findAllByOrderByCreatedAtDesc(Pageable pageable); // UPDATE // DELETE diff --git a/src/main/java/org/winey/server/service/RecommendService.java b/src/main/java/org/winey/server/service/RecommendService.java index 0f44158..f29e852 100644 --- a/src/main/java/org/winey/server/service/RecommendService.java +++ b/src/main/java/org/winey/server/service/RecommendService.java @@ -3,6 +3,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; import org.springframework.data.domain.PageRequest; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,12 +13,9 @@ import org.winey.server.controller.response.recommend.RecommendResponseUserDto; import org.winey.server.domain.recommend.Recommend; import org.winey.server.domain.user.User; -import org.winey.server.exception.Error; -import org.winey.server.exception.model.NotFoundException; import org.winey.server.infrastructure.RecommendRepository; import org.winey.server.infrastructure.UserRepository; -import java.awt.print.Pageable; import java.util.List; import java.util.stream.Collectors; @@ -33,10 +31,9 @@ public RecommendListResponseDto getRecommend(int page, Long userId) { RecommendResponseUserDto userInfo = RecommendResponseUserDto.of(user.getUserId(), user.getNickname()); PageRequest pageRequest = PageRequest.of(page, 50); - Page recommendPage = recommendRepository.findAllOrderByCreatedAtDesc((Pageable) pageRequest) - .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_RECOMMEND_PAGE_EXCEPTION, Error.NOT_FOUND_RECOMMEND_PAGE_EXCEPTION.getMessage())); + Page recommendPage = recommendRepository.findAllByOrderByCreatedAtDesc(pageRequest); - PageResponseDto pageInfo = PageResponseDto.of(recommendPage.getTotalPages(), recommendPage.getNumber(), (recommendPage.getTotalPages() < recommendPage.getNumber())); + PageResponseDto pageInfo = PageResponseDto.of(recommendPage.getTotalPages(), recommendPage.getNumber() + 1, (recommendPage.getTotalPages() == recommendPage.getNumber() + 1)); List recommendInfos = recommendPage.stream() .map(recommend -> RecommendResponseDto.of( From aa5c661ed7dcf2c76a5c121d1a222747398a6f6c Mon Sep 17 00:00:00 2001 From: Sunny Date: Wed, 5 Jul 2023 00:39:30 +0900 Subject: [PATCH 11/40] =?UTF-8?q?#7=20[Feat]=20=EC=98=88=EC=99=B8=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/advice/ControllerExceptionAdvice.java | 16 +++++++++++++++- .../server/controller/RecommendController.java | 4 +++- .../controller/response/PageResponseDto.java | 1 - .../java/org/winey/server/exception/Error.java | 3 +++ .../server/infrastructure/UserRepository.java | 4 +++- .../winey/server/service/RecommendService.java | 5 ++++- 6 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/winey/server/common/advice/ControllerExceptionAdvice.java b/src/main/java/org/winey/server/common/advice/ControllerExceptionAdvice.java index c3062f9..dd47bf4 100644 --- a/src/main/java/org/winey/server/common/advice/ControllerExceptionAdvice.java +++ b/src/main/java/org/winey/server/common/advice/ControllerExceptionAdvice.java @@ -4,6 +4,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.MissingRequestHeaderException; +import org.springframework.web.bind.MissingServletRequestParameterException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; @@ -23,7 +25,19 @@ public class ControllerExceptionAdvice { @ExceptionHandler(MethodArgumentNotValidException.class) protected ApiResponse handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { FieldError fieldError = Objects.requireNonNull(e.getFieldError()); - return ApiResponse.error(Error.REQUEST_VALIDATION_EXCEPTION, String.format("%s. (%s)", fieldError.getDefaultMessage(), fieldError.getField())); + return ApiResponse.error(Error.VALIDATION_REQUEST_MISSING_EXCEPTION, String.format("%s. (%s)", fieldError.getDefaultMessage(), fieldError.getField())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingRequestHeaderException.class) + protected ApiResponse handleMissingRequestHeaderException(final MissingRequestHeaderException e) { + return ApiResponse.error(Error.VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION, String.format("%s. (%s)", Error.VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION.getMessage(), e.getHeaderName())); + } + + @ResponseStatus(HttpStatus.BAD_REQUEST) + @ExceptionHandler(MissingServletRequestParameterException.class) + protected ApiResponse handleMissingRequestParameterException(final MissingServletRequestParameterException e) { + return ApiResponse.error(Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION, String.format("%s. (%s)", Error.VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION.getMessage(), e.getParameterName())); } /** diff --git a/src/main/java/org/winey/server/controller/RecommendController.java b/src/main/java/org/winey/server/controller/RecommendController.java index 3c70587..ea802fd 100644 --- a/src/main/java/org/winey/server/controller/RecommendController.java +++ b/src/main/java/org/winey/server/controller/RecommendController.java @@ -2,6 +2,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.winey.server.common.dto.ApiResponse; import org.winey.server.controller.response.recommend.RecommendListResponseDto; @@ -11,13 +12,14 @@ @RestController @RequiredArgsConstructor @RequestMapping("/recommend") +@Validated public class RecommendController { private final RecommendService recommendService; @GetMapping("") @ResponseStatus(HttpStatus.OK) - public ApiResponse getRecommend(@RequestParam final int page, @RequestHeader final Long userId) { + public ApiResponse getRecommend(@RequestParam int page, @RequestHeader Long userId) { return ApiResponse.success(Success.GET_RECOMMEND_LIST_SUCCESS, recommendService.getRecommend(page, userId)); } diff --git a/src/main/java/org/winey/server/controller/response/PageResponseDto.java b/src/main/java/org/winey/server/controller/response/PageResponseDto.java index 31cdf4f..5416224 100644 --- a/src/main/java/org/winey/server/controller/response/PageResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/PageResponseDto.java @@ -1,6 +1,5 @@ package org.winey.server.controller.response; -import com.fasterxml.jackson.annotation.JsonProperty; import lombok.*; @Getter diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index 54ea3fb..13a5d62 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -16,6 +16,9 @@ public enum Error { LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."), INVALID_PASSWORD_EXCEPTION(HttpStatus.BAD_REQUEST, "잘못된 비밀번호가 입력됐습니다."), NOT_FOUND_IMAGE_EXCEPTION(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, "요청 파라미터값이 입력되지 않았습니다."), /** * 401 UNAUTHORIZED diff --git a/src/main/java/org/winey/server/infrastructure/UserRepository.java b/src/main/java/org/winey/server/infrastructure/UserRepository.java index 22d5e31..76ba633 100644 --- a/src/main/java/org/winey/server/infrastructure/UserRepository.java +++ b/src/main/java/org/winey/server/infrastructure/UserRepository.java @@ -3,11 +3,13 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.winey.server.domain.user.User; +import java.util.Optional; + public interface UserRepository extends JpaRepository { // CREATE // READ - User findByUserId(Long userId); + Optional findByUserId(Long userId); // UPDATE diff --git a/src/main/java/org/winey/server/service/RecommendService.java b/src/main/java/org/winey/server/service/RecommendService.java index f29e852..081cddc 100644 --- a/src/main/java/org/winey/server/service/RecommendService.java +++ b/src/main/java/org/winey/server/service/RecommendService.java @@ -13,6 +13,8 @@ import org.winey.server.controller.response.recommend.RecommendResponseUserDto; import org.winey.server.domain.recommend.Recommend; import org.winey.server.domain.user.User; +import org.winey.server.exception.Error; +import org.winey.server.exception.model.NotFoundException; import org.winey.server.infrastructure.RecommendRepository; import org.winey.server.infrastructure.UserRepository; @@ -27,7 +29,8 @@ public class RecommendService { @Transactional public RecommendListResponseDto getRecommend(int page, Long userId) { - User user = userRepository.findByUserId(userId); + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); RecommendResponseUserDto userInfo = RecommendResponseUserDto.of(user.getUserId(), user.getNickname()); PageRequest pageRequest = PageRequest.of(page, 50); From c3912c2180fbcd17bca6c3fbee1435cf2a9b825a Mon Sep 17 00:00:00 2001 From: Sunny Date: Wed, 5 Jul 2023 00:44:44 +0900 Subject: [PATCH 12/40] =?UTF-8?q?#7=20[Refactor]=20=EB=B6=88=ED=95=84?= =?UTF-8?q?=EC=9A=94=ED=95=9C=20=EC=95=A0=EB=84=88=ED=85=8C=EC=9D=B4?= =?UTF-8?q?=EC=85=98=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/controller/RecommendController.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/winey/server/controller/RecommendController.java b/src/main/java/org/winey/server/controller/RecommendController.java index ea802fd..758233e 100644 --- a/src/main/java/org/winey/server/controller/RecommendController.java +++ b/src/main/java/org/winey/server/controller/RecommendController.java @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.winey.server.common.dto.ApiResponse; import org.winey.server.controller.response.recommend.RecommendListResponseDto; @@ -12,7 +11,6 @@ @RestController @RequiredArgsConstructor @RequestMapping("/recommend") -@Validated public class RecommendController { private final RecommendService recommendService; From 6b7fb2b668a3cfddd2ef03b915454772a13ab5e2 Mon Sep 17 00:00:00 2001 From: soohyun Date: Wed, 5 Jul 2023 12:26:25 +0900 Subject: [PATCH 13/40] =?UTF-8?q?[Feat]=20dev=EC=99=80=20=EB=A8=B8?= =?UTF-8?q?=EC=A7=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/domain/feed/Feed.java | 3 +++ 1 file changed, 3 insertions(+) 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 99656bb..f273551 100644 --- a/src/main/java/org/winey/server/domain/feed/Feed.java +++ b/src/main/java/org/winey/server/domain/feed/Feed.java @@ -4,10 +4,12 @@ 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.user.User; import javax.persistence.*; +import java.time.LocalDateTime; @Getter @Entity @@ -30,6 +32,7 @@ public class Feed extends AuditingTimeEntity { @Column(nullable = false) private Long feedMoney; + @Builder public Feed(User user, String feedTitle, String feedImage, Long feedMoney){ this.user = user; From ba436d4204e0e62501679e068300ef067fdccdfc Mon Sep 17 00:00:00 2001 From: soohyun Date: Wed, 5 Jul 2023 14:03:51 +0900 Subject: [PATCH 14/40] =?UTF-8?q?[Fix]=20404=20=EC=9B=90=EC=9D=B8=EC=B0=BE?= =?UTF-8?q?=EA=B8=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/controller/{feed => }/FeedController.java | 1 + 1 file changed, 1 insertion(+) rename src/main/java/org/winey/server/controller/{feed => }/FeedController.java (94%) diff --git a/src/main/java/org/winey/server/controller/feed/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java similarity index 94% rename from src/main/java/org/winey/server/controller/feed/FeedController.java rename to src/main/java/org/winey/server/controller/FeedController.java index 0b29c29..f0d6c6c 100644 --- a/src/main/java/org/winey/server/controller/feed/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -25,6 +25,7 @@ public ApiResponse create( @RequestHeader("userId") Long userId, @ModelAttribute @Valid final CreateFeedRequestDto request) { String feedImageUrl = s3Service.uploadImage(request.getFeedImage(), "feed"); + feedService.createFeed(request,userId,feedImageUrl); return ApiResponse.success(Success.CREATE_BOARD_SUCCESS); } From 8c88b7dd16701ad3bd8a0932878e0604404df8a7 Mon Sep 17 00:00:00 2001 From: soohyun Date: Wed, 5 Jul 2023 14:09:20 +0900 Subject: [PATCH 15/40] [chore] repush --- .../server/infrastructure/FeedRepository.java | 11 ++++++ .../org/winey/server/service/FeedService.java | 34 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 src/main/java/org/winey/server/infrastructure/FeedRepository.java create mode 100644 src/main/java/org/winey/server/service/FeedService.java diff --git a/src/main/java/org/winey/server/infrastructure/FeedRepository.java b/src/main/java/org/winey/server/infrastructure/FeedRepository.java new file mode 100644 index 0000000..4e69d9a --- /dev/null +++ b/src/main/java/org/winey/server/infrastructure/FeedRepository.java @@ -0,0 +1,11 @@ +package org.winey.server.infrastructure; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.Repository; +import org.winey.server.domain.feed.Feed; + +import java.util.Optional; + +public interface FeedRepository extends Repository { + void save(Feed feed); +} diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java new file mode 100644 index 0000000..a3fb406 --- /dev/null +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -0,0 +1,34 @@ +package org.winey.server.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.winey.server.controller.request.CreateFeedRequestDto; +import org.winey.server.domain.feed.Feed; +import org.winey.server.domain.user.User; +import org.winey.server.exception.Error; +import org.winey.server.exception.model.NotFoundException; +import org.winey.server.infrastructure.FeedRepository; +import org.winey.server.infrastructure.UserRepository; + +@Service +@RequiredArgsConstructor +public class FeedService { + private final FeedRepository feedRepository; + private final UserRepository userRepository; + + @Transactional + public Long createFeed(CreateFeedRequestDto request, Long userId,String imageUrl){ + System.out.println("durlsdhsk"); + User presentUser = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + Feed feed = Feed.builder() + .feedImage(imageUrl) + .feedMoney(request.getFeedMoney()) + .feedTitle(request.getFeedTitle()) + .user(presentUser) + .build(); + feedRepository.save(feed); + return userId; + } +} From fdee12e2e0d90b0675be7dabac7c80e9e1bc9bb1 Mon Sep 17 00:00:00 2001 From: soohyun Date: Wed, 5 Jul 2023 14:14:46 +0900 Subject: [PATCH 16/40] [Chore] repush2 --- .../request/CreateFeedRequestDto.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java diff --git a/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java b/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java new file mode 100644 index 0000000..b2fcf66 --- /dev/null +++ b/src/main/java/org/winey/server/controller/request/CreateFeedRequestDto.java @@ -0,0 +1,18 @@ +package org.winey.server.controller.request; + +import lombok.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.validation.constraints.NotNull; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor +public class CreateFeedRequestDto { + @NotNull + private String feedTitle; + @NotNull + private MultipartFile feedImage; + @NotNull + private Long feedMoney; +} From e076200bd33034a1101335e83bd45e7b39e6fea6 Mon Sep 17 00:00:00 2001 From: soohyun Date: Thu, 6 Jul 2023 16:32:43 +0900 Subject: [PATCH 17/40] =?UTF-8?q?[feat]=20createFeed=20=EC=88=98=EC=A0=95?= =?UTF-8?q?=20but=20500=20=ED=95=B4=EA=B2=B0=EB=AA=BB=ED=95=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/FeedController.java | 9 +-- .../response/feed/CreateFeedResponseDto.java | 21 +++++++ .../org/winey/server/domain/goal/Goal.java | 14 +++-- .../org/winey/server/domain/user/User.java | 1 + .../org/winey/server/exception/Error.java | 2 + .../server/infrastructure/GoalRepository.java | 22 +++++++ .../org/winey/server/service/FeedService.java | 61 ++++++++++++++++++- 7 files changed, 119 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/winey/server/controller/response/feed/CreateFeedResponseDto.java create mode 100644 src/main/java/org/winey/server/infrastructure/GoalRepository.java diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index f0d6c6c..1964792 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -1,11 +1,12 @@ -package org.winey.server.controller.feed; +package org.winey.server.controller; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import org.winey.server.common.dto.ApiResponse; -import org.winey.server.controller.feed.request.CreateFeedRequestDto; +import org.winey.server.controller.request.CreateFeedRequestDto; +import org.winey.server.controller.response.feed.CreateFeedResponseDto; import org.winey.server.exception.Success; import org.winey.server.external.client.aws.S3Service; import org.winey.server.service.FeedService; @@ -21,9 +22,9 @@ public class FeedController { @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public ApiResponse create( + public ApiResponse create( @RequestHeader("userId") Long userId, - @ModelAttribute @Valid final CreateFeedRequestDto request) { + @ModelAttribute CreateFeedRequestDto request) { String feedImageUrl = s3Service.uploadImage(request.getFeedImage(), "feed"); feedService.createFeed(request,userId,feedImageUrl); return ApiResponse.success(Success.CREATE_BOARD_SUCCESS); diff --git a/src/main/java/org/winey/server/controller/response/feed/CreateFeedResponseDto.java b/src/main/java/org/winey/server/controller/response/feed/CreateFeedResponseDto.java new file mode 100644 index 0000000..7fcb7ea --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/feed/CreateFeedResponseDto.java @@ -0,0 +1,21 @@ +package org.winey.server.controller.response.feed; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class CreateFeedResponseDto { + private Long feedId; + private LocalDateTime createdAt; + + public static CreateFeedResponseDto of(Long feedId, LocalDateTime createdAt){ + return new CreateFeedResponseDto(feedId, createdAt); + } + +} diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index d4b8936..4c16042 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -1,9 +1,6 @@ package org.winey.server.domain.goal; -import lombok.AccessLevel; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; +import lombok.*; import org.hibernate.annotations.ColumnDefault; import org.winey.server.domain.AuditingTimeEntity; import org.winey.server.domain.user.User; @@ -28,12 +25,21 @@ public class Goal extends AuditingTimeEntity { @Column(nullable = false) @ColumnDefault("0") + @Setter private Long duringGoalAmount; @Column(nullable = false) @ColumnDefault("false") + @Setter private boolean isAttained; + @Column(nullable = false) + @ColumnDefault("0") + @Setter + private Long duringGoalCount; + + + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT)) private User user; 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 b91e467..206f1cd 100644 --- a/src/main/java/org/winey/server/domain/user/User.java +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -20,6 +20,7 @@ public class User extends AuditingTimeEntity { @Column(nullable = false, unique = true) private String nickname; + @Setter @Column(nullable = false) private UserLevel userLevel; diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index 13a5d62..a8f01dd 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -31,6 +31,8 @@ public enum Error { NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"), NOT_FOUND_RECOMMEND_PAGE_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 추천 위니 페이지입니다."), + NOT_FOUND_GOAL_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 목표입니다"), + /** * 409 CONFLICT */ diff --git a/src/main/java/org/winey/server/infrastructure/GoalRepository.java b/src/main/java/org/winey/server/infrastructure/GoalRepository.java new file mode 100644 index 0000000..29f98f0 --- /dev/null +++ b/src/main/java/org/winey/server/infrastructure/GoalRepository.java @@ -0,0 +1,22 @@ +package org.winey.server.infrastructure; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.winey.server.domain.goal.Goal; +import org.winey.server.domain.user.User; + +import java.util.List; +import java.util.Optional; + +public interface GoalRepository extends JpaRepository { + // CREATE + + // READ + Optional findByUser(Long userId); + List findAllByUser(Long userId); + + int countByUserAndIsAttained(Long userId,boolean isAttained); + + // UPDATE + + // DELETE +} \ No newline at end of file diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index a3fb406..fe2f528 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -4,22 +4,32 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.winey.server.controller.request.CreateFeedRequestDto; +import org.winey.server.controller.response.feed.CreateFeedResponseDto; import org.winey.server.domain.feed.Feed; +import org.winey.server.domain.goal.Goal; 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.NotFoundException; import org.winey.server.infrastructure.FeedRepository; +import org.winey.server.infrastructure.GoalRepository; import org.winey.server.infrastructure.UserRepository; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; +import java.util.Optional; + @Service @RequiredArgsConstructor public class FeedService { private final FeedRepository feedRepository; private final UserRepository userRepository; + private final GoalRepository goalRepository; + @Transactional - public Long createFeed(CreateFeedRequestDto request, Long userId,String imageUrl){ - System.out.println("durlsdhsk"); + public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userId, String imageUrl){ User presentUser = userRepository.findByUserId(userId) .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); Feed feed = Feed.builder() @@ -29,6 +39,51 @@ public Long createFeed(CreateFeedRequestDto request, Long userId,String imageUrl .user(presentUser) .build(); feedRepository.save(feed); - return userId; + + Goal presentGoal = goalRepository.findByUser(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_GOAL_EXCEPTION, Error.NOT_FOUND_GOAL_EXCEPTION.getMessage())); + presentGoal.setDuringGoalCount(presentGoal.getDuringGoalCount()+1); //기간 중 달성한 목표개수 늘리기 + updateDuringGoalByCreateFeed(presentGoal,feed.getFeedMoney(),presentUser); + + + return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); + } + private void updateDuringGoalByCreateFeed(Goal presentGoal, Long feedMoney, User presentUser){ + updateUserGoalAmount(presentUser, feedMoney,true); //누적 금액 피드 금액 업데이트 + if (!presentGoal.isAttained()){ //목표달성을 못한 상태인데 + if (LocalDate.now().isBefore(presentGoal.getTargetDate())){ //타켓날짜를 지나지 않았으면 + if (presentGoal.getTargetMoney() <= presentGoal.getDuringGoalAmount()){ //현재까지 누적 + 피드가격으로 업데이트된 금액 >= 목표금액 + presentGoal.setAttained(true); // 달성여부 체크 + checkUserLevelUp(presentUser); // userLevel 변동사항 체크 + } + } + + } + } + private void checkUserLevelUp(User presentUser) { + int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser.getUserId(),true); //Goal 중 userid가 맞고 isAttained true 개수 세기 + switch (userAchievedGoals){ + case 1: + presentUser.setUserLevel(UserLevel.KNIGHT); + break; + case 3: + presentUser.setUserLevel(UserLevel.ARISTOCRAT); + break; + case 9: + presentUser.setUserLevel(UserLevel.EMPEROR); + break; + default: + break; + } + } + private void updateUserGoalAmount(User presentUser, Long feedMoney,Boolean upOrDown){ //true : 돈 올리기, down : 내리기 + Optional wantUpdateGoal = goalRepository.findByUser(presentUser.getUserId()); + Goal myGoal = wantUpdateGoal.get(); + if (upOrDown){ + myGoal.setDuringGoalAmount(myGoal.getDuringGoalAmount()+feedMoney); + } + else{ + myGoal.setDuringGoalAmount(myGoal.getDuringGoalAmount()-feedMoney); + } } } From a201928b374cc56711fb991a44f72e87978f9e11 Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Jul 2023 16:34:24 +0900 Subject: [PATCH 18/40] =?UTF-8?q?#9=20[Chore]=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../winey/server/controller/GoalController.java | 11 +++++++++++ .../request/goal/GoalRequestCreateDto.java | 13 +++++++++++++ .../server/infrastructure/GoalRepository.java | 15 +++++++++++++++ .../org/winey/server/service/GoalService.java | 13 +++++++++++++ 4 files changed, 52 insertions(+) create mode 100644 src/main/java/org/winey/server/controller/GoalController.java create mode 100644 src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java create mode 100644 src/main/java/org/winey/server/infrastructure/GoalRepository.java create mode 100644 src/main/java/org/winey/server/service/GoalService.java diff --git a/src/main/java/org/winey/server/controller/GoalController.java b/src/main/java/org/winey/server/controller/GoalController.java new file mode 100644 index 0000000..222f16f --- /dev/null +++ b/src/main/java/org/winey/server/controller/GoalController.java @@ -0,0 +1,11 @@ +package org.winey.server.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/goal") +public class GoalController { +} diff --git a/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java new file mode 100644 index 0000000..2d388fc --- /dev/null +++ b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java @@ -0,0 +1,13 @@ +package org.winey.server.controller.request.goal; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GoalRequestCreateDto { + +} diff --git a/src/main/java/org/winey/server/infrastructure/GoalRepository.java b/src/main/java/org/winey/server/infrastructure/GoalRepository.java new file mode 100644 index 0000000..4d81dc5 --- /dev/null +++ b/src/main/java/org/winey/server/infrastructure/GoalRepository.java @@ -0,0 +1,15 @@ +package org.winey.server.infrastructure; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.winey.server.domain.goal.Goal; + +public interface GoalRepository extends JpaRepository { + // CREATE + Goal save(Goal goal); + + // READ + + // UPDATE + + // DELETE +} diff --git a/src/main/java/org/winey/server/service/GoalService.java b/src/main/java/org/winey/server/service/GoalService.java new file mode 100644 index 0000000..e6f0f41 --- /dev/null +++ b/src/main/java/org/winey/server/service/GoalService.java @@ -0,0 +1,13 @@ +package org.winey.server.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@RequiredArgsConstructor +public class GoalService { + + @Transactional + public +} From 5384ee6de92ecc31855a10e2e97c1cf6729b6b04 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 6 Jul 2023 17:15:25 +0900 Subject: [PATCH 19/40] #9 [Feat] requestDto, responseDto --- .../request/goal/GoalRequestCreateDto.java | 3 ++- .../response/goal/GoalResponseCreateDto.java | 23 +++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/winey/server/controller/response/goal/GoalResponseCreateDto.java diff --git a/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java index 2d388fc..3eb8b89 100644 --- a/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java +++ b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java @@ -9,5 +9,6 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class GoalRequestCreateDto { - + private Long targetMoney; + private int targetDay; } diff --git a/src/main/java/org/winey/server/controller/response/goal/GoalResponseCreateDto.java b/src/main/java/org/winey/server/controller/response/goal/GoalResponseCreateDto.java new file mode 100644 index 0000000..762c1fc --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/goal/GoalResponseCreateDto.java @@ -0,0 +1,23 @@ +package org.winey.server.controller.response.goal; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class GoalResponseCreateDto { + private Long userId; + private Long targetMoney; + private LocalDate targetDate; + private LocalDateTime createdAt; + + public static GoalResponseCreateDto of(Long userId, Long targetMoney, LocalDate targetDate, LocalDateTime createdAt) { + return new GoalResponseCreateDto(userId, targetMoney, targetDate, createdAt); + } +} From 177c3bce0128b5d0014ef667200c4a88b30d6407 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 6 Jul 2023 17:32:00 +0900 Subject: [PATCH 20/40] #9 [Feat] Goal Service --- .../org/winey/server/service/GoalService.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/winey/server/service/GoalService.java b/src/main/java/org/winey/server/service/GoalService.java index e6f0f41..b9a073e 100644 --- a/src/main/java/org/winey/server/service/GoalService.java +++ b/src/main/java/org/winey/server/service/GoalService.java @@ -3,11 +3,35 @@ import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.winey.server.controller.request.goal.GoalRequestCreateDto; +import org.winey.server.controller.response.goal.GoalResponseCreateDto; +import org.winey.server.domain.goal.Goal; +import org.winey.server.domain.user.User; +import org.winey.server.exception.Error; +import org.winey.server.exception.model.NotFoundException; +import org.winey.server.infrastructure.GoalRepository; +import org.winey.server.infrastructure.UserRepository; + +import java.time.LocalDate; @Service @RequiredArgsConstructor public class GoalService { + private final GoalRepository goalRepository; + private final UserRepository userRepository; @Transactional - public + public GoalResponseCreateDto createGoal(GoalRequestCreateDto requestDto, Long userId) { + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + + LocalDate targetDate = LocalDate.now().plusDays(requestDto.getTargetDay()); + Goal createGoal = goalRepository.save(Goal.builder() + .targetMoney(requestDto.getTargetMoney()) + .targetDate(targetDate) + .user(user) + .build()); + + return GoalResponseCreateDto.of(userId, createGoal.getTargetMoney(), createGoal.getTargetDate(), createGoal.getCreatedAt()); + } } From 9938f2da41ea142253b74b70e3e5da340ef717fd Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 6 Jul 2023 17:36:10 +0900 Subject: [PATCH 21/40] #9 [Feat] Goal Controller --- .../winey/server/controller/GoalController.java | 17 +++++++++++++++-- .../org/winey/server/exception/Success.java | 1 + 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/winey/server/controller/GoalController.java b/src/main/java/org/winey/server/controller/GoalController.java index 222f16f..a62d28e 100644 --- a/src/main/java/org/winey/server/controller/GoalController.java +++ b/src/main/java/org/winey/server/controller/GoalController.java @@ -1,11 +1,24 @@ package org.winey.server.controller; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.winey.server.common.dto.ApiResponse; +import org.winey.server.controller.request.goal.GoalRequestCreateDto; +import org.winey.server.controller.response.goal.GoalResponseCreateDto; +import org.winey.server.exception.Success; +import org.winey.server.service.GoalService; @RestController @RequiredArgsConstructor @RequestMapping("/goal") public class GoalController { + + private final GoalService goalService; + + @PostMapping("") + @ResponseStatus(HttpStatus.CREATED) + public ApiResponse create(@RequestBody final GoalRequestCreateDto requestDto, @RequestHeader Long userId) { + return ApiResponse.success(Success.CREATE_GOAL_SUCCESS, goalService.createGoal(requestDto, userId)); + } } diff --git a/src/main/java/org/winey/server/exception/Success.java b/src/main/java/org/winey/server/exception/Success.java index ac2877d..a22a93f 100644 --- a/src/main/java/org/winey/server/exception/Success.java +++ b/src/main/java/org/winey/server/exception/Success.java @@ -20,6 +20,7 @@ public enum Success { LOGIN_SUCCESS(HttpStatus.OK, "로그인에 성공했습니다."), SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료됐습니다."), CREATE_BOARD_SUCCESS(HttpStatus.CREATED, "게시물 생성이 완료됐습니다."), + CREATE_GOAL_SUCCESS(HttpStatus.CREATED, "목표 생성이 완료됐습니다."), ; private final HttpStatus httpStatus; From e02fd7f4a4099e139a29e4a2103eed6988b1f6f3 Mon Sep 17 00:00:00 2001 From: sunny Date: Thu, 6 Jul 2023 17:50:02 +0900 Subject: [PATCH 22/40] =?UTF-8?q?#9=20[Feat]=20targetDay,=20targetMoney=20?= =?UTF-8?q?validation=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/controller/GoalController.java | 4 +++- .../server/controller/request/goal/GoalRequestCreateDto.java | 4 ++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/winey/server/controller/GoalController.java b/src/main/java/org/winey/server/controller/GoalController.java index a62d28e..b2e51aa 100644 --- a/src/main/java/org/winey/server/controller/GoalController.java +++ b/src/main/java/org/winey/server/controller/GoalController.java @@ -9,6 +9,8 @@ import org.winey.server.exception.Success; import org.winey.server.service.GoalService; +import javax.validation.Valid; + @RestController @RequiredArgsConstructor @RequestMapping("/goal") @@ -18,7 +20,7 @@ public class GoalController { @PostMapping("") @ResponseStatus(HttpStatus.CREATED) - public ApiResponse create(@RequestBody final GoalRequestCreateDto requestDto, @RequestHeader Long userId) { + public ApiResponse create(@RequestBody @Valid final GoalRequestCreateDto requestDto, @RequestHeader Long userId) { return ApiResponse.success(Success.CREATE_GOAL_SUCCESS, goalService.createGoal(requestDto, userId)); } } diff --git a/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java index 3eb8b89..82fcb2b 100644 --- a/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java +++ b/src/main/java/org/winey/server/controller/request/goal/GoalRequestCreateDto.java @@ -5,10 +5,14 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import javax.validation.constraints.DecimalMin; + @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class GoalRequestCreateDto { + @DecimalMin(value = "30000") private Long targetMoney; + @DecimalMin(value = "5") private int targetDay; } From 82ff2083b4a1ee1445dbdeb2bc0c32cee55b8715 Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 6 Jul 2023 23:36:49 +0900 Subject: [PATCH 23/40] =?UTF-8?q?#9=20[Fix]=20createdAt=20null=20=EB=AC=B8?= =?UTF-8?q?=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/ServerApplication.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/winey/server/ServerApplication.java b/src/main/java/org/winey/server/ServerApplication.java index 4c80e25..1979173 100644 --- a/src/main/java/org/winey/server/ServerApplication.java +++ b/src/main/java/org/winey/server/ServerApplication.java @@ -2,8 +2,10 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @SpringBootApplication +@EnableJpaAuditing public class ServerApplication { public static void main(String[] args) { From e5a3fcf920e5efee95725eafa7db36452ea1654c Mon Sep 17 00:00:00 2001 From: Sunny Date: Thu, 6 Jul 2023 23:41:05 +0900 Subject: [PATCH 24/40] =?UTF-8?q?#9=20[Fix]=20Goal=20defulat=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/domain/goal/Goal.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index d4b8936..28bbe9e 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -43,5 +43,7 @@ public Goal(Long targetMoney, LocalDate targetDate, User user) { this.targetMoney = targetMoney; this.targetDate = targetDate; this.user = user; + this.duringGoalAmount = 0L; + this.isAttained = false; } } From 46046fa0259b6ab11cdac85e2a02a072f81234ec Mon Sep 17 00:00:00 2001 From: soohyun Date: Fri, 7 Jul 2023 00:18:47 +0900 Subject: [PATCH 25/40] =?UTF-8?q?[Feat]=20createFeed=20api=20=EC=9E=91?= =?UTF-8?q?=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/ServerApplication.java | 2 ++ .../server/controller/FeedController.java | 3 +-- .../org/winey/server/exception/Error.java | 5 +++++ .../exception/model/ForbiddenException.java | 10 +++++++++ .../server/infrastructure/GoalRepository.java | 9 +++++--- .../org/winey/server/service/FeedService.java | 21 +++++++++++-------- 6 files changed, 36 insertions(+), 14 deletions(-) create mode 100644 src/main/java/org/winey/server/exception/model/ForbiddenException.java diff --git a/src/main/java/org/winey/server/ServerApplication.java b/src/main/java/org/winey/server/ServerApplication.java index 4c80e25..51a19ba 100644 --- a/src/main/java/org/winey/server/ServerApplication.java +++ b/src/main/java/org/winey/server/ServerApplication.java @@ -2,7 +2,9 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +@EnableJpaAuditing @SpringBootApplication public class ServerApplication { diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index 1964792..d880c91 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -26,8 +26,7 @@ public ApiResponse create( @RequestHeader("userId") Long userId, @ModelAttribute CreateFeedRequestDto request) { String feedImageUrl = s3Service.uploadImage(request.getFeedImage(), "feed"); - feedService.createFeed(request,userId,feedImageUrl); - return ApiResponse.success(Success.CREATE_BOARD_SUCCESS); + return ApiResponse.success(Success.CREATE_BOARD_SUCCESS, feedService.createFeed(request,userId,feedImageUrl)); } } diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index a8f01dd..a759ff2 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -25,6 +25,11 @@ public enum Error { */ TOKEN_TIME_EXPIRED_EXCEPTION(HttpStatus.UNAUTHORIZED, "만료된 토큰입니다."), + /** + * 403 FORBIDDEN + */ + FEED_FORBIDDEN_EXCEPTION(HttpStatus.FORBIDDEN,"목표를 설정하지 않아 피드를 생성할 수 없습니다."), + /** * 404 NOT FOUND */ diff --git a/src/main/java/org/winey/server/exception/model/ForbiddenException.java b/src/main/java/org/winey/server/exception/model/ForbiddenException.java new file mode 100644 index 0000000..3326a11 --- /dev/null +++ b/src/main/java/org/winey/server/exception/model/ForbiddenException.java @@ -0,0 +1,10 @@ +package org.winey.server.exception.model; + +import org.winey.server.exception.Error; + +public class ForbiddenException extends CustomException{ + public ForbiddenException(Error error, String message) { + super(error, message); + } + +} diff --git a/src/main/java/org/winey/server/infrastructure/GoalRepository.java b/src/main/java/org/winey/server/infrastructure/GoalRepository.java index 29f98f0..8052bbd 100644 --- a/src/main/java/org/winey/server/infrastructure/GoalRepository.java +++ b/src/main/java/org/winey/server/infrastructure/GoalRepository.java @@ -1,6 +1,7 @@ package org.winey.server.infrastructure; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.winey.server.domain.goal.Goal; import org.winey.server.domain.user.User; @@ -11,10 +12,12 @@ public interface GoalRepository extends JpaRepository { // CREATE // READ - Optional findByUser(Long userId); - List findAllByUser(Long userId); + List findAllByUser(User user); - int countByUserAndIsAttained(Long userId,boolean isAttained); + int countByUserAndIsAttained(User user,boolean isAttained); + + @Query("select g from Goal g where g.user = ?1 order by g.createdAt DESC") + List findByUserOrderByCreatedAtDesc(User user); // UPDATE diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index fe2f528..0ce8f03 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -10,6 +10,7 @@ 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.ForbiddenException; import org.winey.server.exception.model.NotFoundException; import org.winey.server.infrastructure.FeedRepository; import org.winey.server.infrastructure.GoalRepository; @@ -39,12 +40,14 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI .user(presentUser) .build(); feedRepository.save(feed); - - Goal presentGoal = goalRepository.findByUser(userId) - .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_GOAL_EXCEPTION, Error.NOT_FOUND_GOAL_EXCEPTION.getMessage())); - presentGoal.setDuringGoalCount(presentGoal.getDuringGoalCount()+1); //기간 중 달성한 목표개수 늘리기 - updateDuringGoalByCreateFeed(presentGoal,feed.getFeedMoney(),presentUser); - + System.out.println("여기1"); + Goal myGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst() + .orElseThrow(()-> new ForbiddenException(Error.FEED_FORBIDDEN_EXCEPTION, Error.FEED_FORBIDDEN_EXCEPTION.getMessage())); //목표 설정 안하면 피드 못만듬 -> 에러처리 + System.out.println("여기2"); + myGoal.setDuringGoalCount(myGoal.getDuringGoalCount()+1); //기간 중 달성한 목표개수 늘리기 + System.out.println("여기3"); + updateDuringGoalByCreateFeed(myGoal,feed.getFeedMoney(),presentUser); + System.out.println("여기4"); return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); } @@ -61,7 +64,7 @@ private void updateDuringGoalByCreateFeed(Goal presentGoal, Long feedMoney, User } } private void checkUserLevelUp(User presentUser) { - int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser.getUserId(),true); //Goal 중 userid가 맞고 isAttained true 개수 세기 + int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser,true); //Goal 중 userid가 맞고 isAttained true 개수 세기 switch (userAchievedGoals){ case 1: presentUser.setUserLevel(UserLevel.KNIGHT); @@ -77,8 +80,8 @@ private void checkUserLevelUp(User presentUser) { } } private void updateUserGoalAmount(User presentUser, Long feedMoney,Boolean upOrDown){ //true : 돈 올리기, down : 내리기 - Optional wantUpdateGoal = goalRepository.findByUser(presentUser.getUserId()); - Goal myGoal = wantUpdateGoal.get(); + List wantUpdateGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser); + Goal myGoal = wantUpdateGoal.stream().findFirst().get(); if (upOrDown){ myGoal.setDuringGoalAmount(myGoal.getDuringGoalAmount()+feedMoney); } From 35d9f05ca8c388062b0410cb0110183a28eee7e6 Mon Sep 17 00:00:00 2001 From: sunny Date: Sat, 8 Jul 2023 16:57:01 +0900 Subject: [PATCH 26/40] #6 [Fix] @DynamicInsert --- src/main/java/org/winey/server/domain/goal/Goal.java | 4 ++-- src/main/java/org/winey/server/domain/user/User.java | 7 +++++-- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index 28bbe9e..e1c197f 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -5,6 +5,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; import org.winey.server.domain.AuditingTimeEntity; import org.winey.server.domain.user.User; @@ -13,6 +14,7 @@ @Entity @Getter +@DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Goal extends AuditingTimeEntity { @@ -43,7 +45,5 @@ public Goal(Long targetMoney, LocalDate targetDate, User user) { this.targetMoney = targetMoney; this.targetDate = targetDate; this.user = user; - this.duringGoalAmount = 0L; - this.isAttained = 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 b91e467..977e65d 100644 --- a/src/main/java/org/winey/server/domain/user/User.java +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -1,6 +1,8 @@ package org.winey.server.domain.user; import lombok.*; +import org.hibernate.annotations.ColumnDefault; +import org.hibernate.annotations.DynamicInsert; import org.winey.server.domain.AuditingTimeEntity; import org.winey.server.domain.goal.Goal; import org.winey.server.domain.recommend.Recommend; @@ -10,6 +12,7 @@ @Entity @Getter +@DynamicInsert @NoArgsConstructor(access = AccessLevel.PROTECTED) public class User extends AuditingTimeEntity { @@ -21,6 +24,7 @@ public class User extends AuditingTimeEntity { private String nickname; @Column(nullable = false) + @ColumnDefault("1") private UserLevel userLevel; @Column(nullable = false) @@ -36,9 +40,8 @@ public class User extends AuditingTimeEntity { private List recommends; @Builder - public User(String nickname, UserLevel userLevel, Long accumulatedAmount, Long feedCount) { + public User(String nickname, Long accumulatedAmount, Long feedCount) { this.nickname = nickname; - this.userLevel = userLevel; this.accumulatedAmount = accumulatedAmount; this.feedCount = feedCount; } From 0ce36e584e63a016b9f809f66446a39447bda9aa Mon Sep 17 00:00:00 2001 From: sunny Date: Sat, 8 Jul 2023 17:06:03 +0900 Subject: [PATCH 27/40] =?UTF-8?q?#6=20[Fix]=20JpaRepository=20->=20Reposit?= =?UTF-8?q?ory=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/infrastructure/GoalRepository.java | 4 ++-- .../org/winey/server/infrastructure/RecommendRepository.java | 4 ++-- .../java/org/winey/server/infrastructure/UserRepository.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/winey/server/infrastructure/GoalRepository.java b/src/main/java/org/winey/server/infrastructure/GoalRepository.java index 4d81dc5..38db415 100644 --- a/src/main/java/org/winey/server/infrastructure/GoalRepository.java +++ b/src/main/java/org/winey/server/infrastructure/GoalRepository.java @@ -1,9 +1,9 @@ package org.winey.server.infrastructure; -import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.Repository; import org.winey.server.domain.goal.Goal; -public interface GoalRepository extends JpaRepository { +public interface GoalRepository extends Repository { // CREATE Goal save(Goal goal); diff --git a/src/main/java/org/winey/server/infrastructure/RecommendRepository.java b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java index f454df1..21b3e99 100644 --- a/src/main/java/org/winey/server/infrastructure/RecommendRepository.java +++ b/src/main/java/org/winey/server/infrastructure/RecommendRepository.java @@ -1,12 +1,12 @@ package org.winey.server.infrastructure; import org.springframework.data.domain.Page; -import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.Repository; import org.winey.server.domain.recommend.Recommend; import org.springframework.data.domain.Pageable; -public interface RecommendRepository extends JpaRepository { +public interface RecommendRepository extends Repository { // CREATE // READ diff --git a/src/main/java/org/winey/server/infrastructure/UserRepository.java b/src/main/java/org/winey/server/infrastructure/UserRepository.java index 76ba633..89672d4 100644 --- a/src/main/java/org/winey/server/infrastructure/UserRepository.java +++ b/src/main/java/org/winey/server/infrastructure/UserRepository.java @@ -1,11 +1,11 @@ package org.winey.server.infrastructure; -import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.repository.Repository; import org.winey.server.domain.user.User; import java.util.Optional; -public interface UserRepository extends JpaRepository { +public interface UserRepository extends Repository { // CREATE // READ From bcfd78ff99c16b9fedf7e92daa4eb25bfd609d80 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 02:13:52 +0900 Subject: [PATCH 28/40] =?UTF-8?q?#14=20[Fix]=20goal=20entity=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/domain/goal/Goal.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index e1c197f..2cb2e86 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -32,6 +32,10 @@ public class Goal extends AuditingTimeEntity { @ColumnDefault("0") private Long duringGoalAmount; + @Column(nullable = false) + @ColumnDefault("0") + private Long duringGoalCount; + @Column(nullable = false) @ColumnDefault("false") private boolean isAttained; From 8a88db42544c163ee51af01e606d12d9e8b8fed0 Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 10 Jul 2023 04:15:17 +0900 Subject: [PATCH 29/40] =?UTF-8?q?[Refactor]=20updateUserGoalAmountAndCount?= =?UTF-8?q?=ED=95=A8=EC=88=98=20=EB=A7=8C=EB=93=A4=EA=B8=B0,=20checkUserLe?= =?UTF-8?q?vel=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95,=20updateIsAttained?= =?UTF-8?q?=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/winey/server/ServerApplication.java | 1 - .../org/winey/server/domain/goal/Goal.java | 18 ++++++ .../org/winey/server/service/FeedService.java | 56 +++++-------------- 3 files changed, 33 insertions(+), 42 deletions(-) diff --git a/src/main/java/org/winey/server/ServerApplication.java b/src/main/java/org/winey/server/ServerApplication.java index ef87c33..51a19ba 100644 --- a/src/main/java/org/winey/server/ServerApplication.java +++ b/src/main/java/org/winey/server/ServerApplication.java @@ -6,7 +6,6 @@ @EnableJpaAuditing @SpringBootApplication -@EnableJpaAuditing public class ServerApplication { public static void main(String[] args) { diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index ab34ef1..2eda159 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -52,4 +52,22 @@ public Goal(Long targetMoney, LocalDate targetDate, User user) { this.targetDate = targetDate; this.user = user; } + public void updateIsAttained(Goal presentGoal){ + if (presentGoal.duringGoalAmount>=presentGoal.targetMoney){ + presentGoal.isAttained = true; + } + else{ + presentGoal.isAttained = false; + } + } + public void updateGoalCountAndAmount(Goal presentGoal, Long feedMoney, boolean createOrDelete){ + if (createOrDelete){ + presentGoal.duringGoalCount+=1; + presentGoal.duringGoalAmount+=feedMoney; + } + else { + presentGoal.duringGoalCount-=1; + presentGoal.duringGoalAmount-=feedMoney; + } + } } diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index 0ce8f03..8682333 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -40,53 +40,27 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI .user(presentUser) .build(); feedRepository.save(feed); - System.out.println("여기1"); Goal myGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst() .orElseThrow(()-> new ForbiddenException(Error.FEED_FORBIDDEN_EXCEPTION, Error.FEED_FORBIDDEN_EXCEPTION.getMessage())); //목표 설정 안하면 피드 못만듬 -> 에러처리 - System.out.println("여기2"); - myGoal.setDuringGoalCount(myGoal.getDuringGoalCount()+1); //기간 중 달성한 목표개수 늘리기 - System.out.println("여기3"); - updateDuringGoalByCreateFeed(myGoal,feed.getFeedMoney(),presentUser); - System.out.println("여기4"); - - return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); - } - private void updateDuringGoalByCreateFeed(Goal presentGoal, Long feedMoney, User presentUser){ - updateUserGoalAmount(presentUser, feedMoney,true); //누적 금액 피드 금액 업데이트 - if (!presentGoal.isAttained()){ //목표달성을 못한 상태인데 - if (LocalDate.now().isBefore(presentGoal.getTargetDate())){ //타켓날짜를 지나지 않았으면 - if (presentGoal.getTargetMoney() <= presentGoal.getDuringGoalAmount()){ //현재까지 누적 + 피드가격으로 업데이트된 금액 >= 목표금액 - presentGoal.setAttained(true); // 달성여부 체크 - checkUserLevelUp(presentUser); // userLevel 변동사항 체크 - } - } - + if ((myGoal.isAttained() || !(LocalDate.now().isBefore(myGoal.getTargetDate())) || (myGoal.getTargetMoney() < myGoal.getDuringGoalAmount()))){ //만약 목표가 이미 달성되어있거나, 목표일자를 이미 지났거나 목표금액을 이미 넘겼다. -> 업데이트 필요없음 + System.out.println("이미 목표달성 or 목표일자 넘김 or 목표금액 넘김"); + return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); } + myGoal.updateGoalCountAndAmount(myGoal, feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. + myGoal.updateIsAttained(myGoal); // 달성여부 체크 + checkUserLevelUp(presentUser); // userLevel 변동사항 체크 + return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); } private void checkUserLevelUp(User presentUser) { int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser,true); //Goal 중 userid가 맞고 isAttained true 개수 세기 - switch (userAchievedGoals){ - case 1: - presentUser.setUserLevel(UserLevel.KNIGHT); - break; - case 3: - presentUser.setUserLevel(UserLevel.ARISTOCRAT); - break; - case 9: - presentUser.setUserLevel(UserLevel.EMPEROR); - break; - default: - break; - } - } - private void updateUserGoalAmount(User presentUser, Long feedMoney,Boolean upOrDown){ //true : 돈 올리기, down : 내리기 - List wantUpdateGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser); - Goal myGoal = wantUpdateGoal.stream().findFirst().get(); - if (upOrDown){ - myGoal.setDuringGoalAmount(myGoal.getDuringGoalAmount()+feedMoney); - } - else{ - myGoal.setDuringGoalAmount(myGoal.getDuringGoalAmount()-feedMoney); + if (userAchievedGoals<1) { + presentUser.setUserLevel(UserLevel.COMMONER); + } else if (1<=userAchievedGoals && userAchievedGoals<3) { + presentUser.setUserLevel(UserLevel.KNIGHT); + } else if (3<=userAchievedGoals && userAchievedGoals<9) { + presentUser.setUserLevel(UserLevel.ARISTOCRAT); + } else { + presentUser.setUserLevel(UserLevel.EMPEROR); } } } From e66dbb77b63a4df7596ce969330182916cc9c70b Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 11:01:48 +0900 Subject: [PATCH 30/40] =?UTF-8?q?#14=20[Feat]=20UserResponseDto=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/user/UserResponseDto.java | 49 +++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/org/winey/server/controller/response/user/UserResponseDto.java diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java new file mode 100644 index 0000000..4885dde --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java @@ -0,0 +1,49 @@ +package org.winey.server.controller.response.user; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class UserResponseDto { + private UserDto userDto; + private GoalDto goalDto; + + public static UserResponseDto of(UserDto userDto, GoalDto goalDto) { + return new UserResponseDto(userDto, goalDto); + } +} + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +class UserDto { + private Long userId; + private String nickname; + private String userLevel; + + public static UserDto of(Long userId, String nickname, String userLevel) { + return new UserDto(userId, nickname, userLevel); + } +} + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +class GoalDto { + private Long duringGoalAmount; + private Long duringGoalCount; + private Long targetMoney; + private int targetDay; + private boolean isOver; + private boolean isAttained; + + public static GoalDto of(Long duringGoalAmount, Long duringGoalCount, Long targetMoney, int targetDay, boolean isOver, boolean isAttained) { + return new GoalDto(duringGoalAmount, duringGoalCount, targetMoney, targetDay, isOver, isAttained); + } + +} From 52ef69a1ce48bb2c3cca8aef2112003a5c783b9f Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 11:12:26 +0900 Subject: [PATCH 31/40] #14 [Feat] repository --- .../server/controller/UserController.java | 22 +++++++++++++++++++ .../org/winey/server/exception/Success.java | 1 + .../server/infrastructure/GoalRepository.java | 7 +++++- 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/winey/server/controller/UserController.java diff --git a/src/main/java/org/winey/server/controller/UserController.java b/src/main/java/org/winey/server/controller/UserController.java new file mode 100644 index 0000000..fa6b43b --- /dev/null +++ b/src/main/java/org/winey/server/controller/UserController.java @@ -0,0 +1,22 @@ +package org.winey.server.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import org.winey.server.common.dto.ApiResponse; +import org.winey.server.controller.response.user.UserResponseDto; +import org.winey.server.exception.Success; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/user") +public class UserController { + + private final UserService userService; + + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public ApiResponse getUser(@RequestHeader Long userId) { + return ApiResponse.success(Success.GET_USER_SUCCESS, userService.) + } +} diff --git a/src/main/java/org/winey/server/exception/Success.java b/src/main/java/org/winey/server/exception/Success.java index a22a93f..e0b919b 100644 --- a/src/main/java/org/winey/server/exception/Success.java +++ b/src/main/java/org/winey/server/exception/Success.java @@ -13,6 +13,7 @@ public enum Success { * 200 OK */ GET_RECOMMEND_LIST_SUCCESS(HttpStatus.OK, "추천 위니 전체 조회 성공"), + GET_USER_SUCCESS(HttpStatus.OK, "유저 조회 성공"), /** * 201 CREATED diff --git a/src/main/java/org/winey/server/infrastructure/GoalRepository.java b/src/main/java/org/winey/server/infrastructure/GoalRepository.java index 38db415..fbb1179 100644 --- a/src/main/java/org/winey/server/infrastructure/GoalRepository.java +++ b/src/main/java/org/winey/server/infrastructure/GoalRepository.java @@ -1,14 +1,19 @@ package org.winey.server.infrastructure; +import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.Repository; import org.winey.server.domain.goal.Goal; +import org.winey.server.domain.user.User; + +import java.util.List; public interface GoalRepository extends Repository { // CREATE Goal save(Goal goal); // READ - + @Query("select g from Goal g where g.user = ?1 order by g.createdAt DESC") + List findByUserOrderByCreatedAtDesc(User user); // UPDATE // DELETE From 046e4320b48216089915c7553e3951d4cf4b0433 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 13:22:17 +0900 Subject: [PATCH 32/40] =?UTF-8?q?#14=20[Refactor]=20dto=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../response/user/UserResponseDto.java | 37 ++----------------- .../response/user/UserResponseGoalDto.java | 23 ++++++++++++ .../response/user/UserResponseUserDto.java | 19 ++++++++++ .../org/winey/server/service/UserService.java | 27 ++++++++++++++ 4 files changed, 73 insertions(+), 33 deletions(-) create mode 100644 src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java create mode 100644 src/main/java/org/winey/server/controller/response/user/UserResponseUserDto.java create mode 100644 src/main/java/org/winey/server/service/UserService.java diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java index 4885dde..7425703 100644 --- a/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseDto.java @@ -10,40 +10,11 @@ @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) public class UserResponseDto { - private UserDto userDto; - private GoalDto goalDto; + private UserResponseUserDto userResponseUserDto; + private UserResponseGoalDto userResponseGoalDto; - public static UserResponseDto of(UserDto userDto, GoalDto goalDto) { - return new UserResponseDto(userDto, goalDto); + public static UserResponseDto of(UserResponseUserDto userResponseUserDto, UserResponseGoalDto userResponseGoalDto) { + return new UserResponseDto(userResponseUserDto, userResponseGoalDto); } } -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -class UserDto { - private Long userId; - private String nickname; - private String userLevel; - - public static UserDto of(Long userId, String nickname, String userLevel) { - return new UserDto(userId, nickname, userLevel); - } -} - -@Getter -@NoArgsConstructor(access = AccessLevel.PRIVATE) -@AllArgsConstructor(access = AccessLevel.PRIVATE) -class GoalDto { - private Long duringGoalAmount; - private Long duringGoalCount; - private Long targetMoney; - private int targetDay; - private boolean isOver; - private boolean isAttained; - - public static GoalDto of(Long duringGoalAmount, Long duringGoalCount, Long targetMoney, int targetDay, boolean isOver, boolean isAttained) { - return new GoalDto(duringGoalAmount, duringGoalCount, targetMoney, targetDay, isOver, isAttained); - } - -} diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java new file mode 100644 index 0000000..b6158d1 --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java @@ -0,0 +1,23 @@ +package org.winey.server.controller.response.user; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +class UserResponseGoalDto { + private Long duringGoalAmount; + private Long duringGoalCount; + private Long targetMoney; + private int targetDay; + private boolean isOver; + private boolean isAttained; + + public static UserResponseGoalDto of(Long duringGoalAmount, Long duringGoalCount, Long targetMoney, int targetDay, boolean isOver, boolean isAttained) { + return new UserResponseGoalDto(duringGoalAmount, duringGoalCount, targetMoney, targetDay, isOver, isAttained); + } + +} diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseUserDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseUserDto.java new file mode 100644 index 0000000..49e5d6e --- /dev/null +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseUserDto.java @@ -0,0 +1,19 @@ +package org.winey.server.controller.response.user; + +import lombok.AccessLevel; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PRIVATE) +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class UserResponseUserDto { + private Long userId; + private String nickname; + private String userLevel; + + public static UserResponseUserDto of(Long userId, String nickname, String userLevel) { + return new UserResponseUserDto(userId, nickname, userLevel); + } +} \ No newline at end of file diff --git a/src/main/java/org/winey/server/service/UserService.java b/src/main/java/org/winey/server/service/UserService.java new file mode 100644 index 0000000..2c0208d --- /dev/null +++ b/src/main/java/org/winey/server/service/UserService.java @@ -0,0 +1,27 @@ +package org.winey.server.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.winey.server.controller.response.user.UserResponseDto; +import org.winey.server.domain.user.User; +import org.winey.server.exception.Error; +import org.winey.server.exception.model.NotFoundException; +import org.winey.server.infrastructure.GoalRepository; +import org.winey.server.infrastructure.UserRepository; + +@Service +@RequiredArgsConstructor +public class UserService { + private final UserRepository userRepository; + private final GoalRepository goalRepository; + + @Transactional + public UserResponseDto getUser(Long userId) { + User user = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + + + + } +} From 4fa02396a3af1e46d9ae8e201c32a1ba6c2bb31d Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 10 Jul 2023 14:20:41 +0900 Subject: [PATCH 33/40] =?UTF-8?q?#13=20[Refactor]=20createFeed=20=EB=A6=AC?= =?UTF-8?q?=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/domain/goal/Goal.java | 7 +------ .../java/org/winey/server/domain/user/User.java | 4 ++++ .../org/winey/server/service/FeedService.java | 15 +++++++++------ 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index 2eda159..66db606 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -53,12 +53,7 @@ public Goal(Long targetMoney, LocalDate targetDate, User user) { this.user = user; } public void updateIsAttained(Goal presentGoal){ - if (presentGoal.duringGoalAmount>=presentGoal.targetMoney){ - presentGoal.isAttained = true; - } - else{ - presentGoal.isAttained = false; - } + presentGoal.isAttained = true; } public void updateGoalCountAndAmount(Goal presentGoal, Long feedMoney, boolean createOrDelete){ if (createOrDelete){ 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 02c3ff0..cd61e21 100644 --- a/src/main/java/org/winey/server/domain/user/User.java +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -46,4 +46,8 @@ public User(String nickname, Long accumulatedAmount, Long feedCount) { this.accumulatedAmount = accumulatedAmount; this.feedCount = feedCount; } + + public void updateUserLevel(UserLevel userLevel){ + this.userLevel = userLevel; + } } diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index 8682333..b0d8fd8 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -40,27 +40,30 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI .user(presentUser) .build(); feedRepository.save(feed); + Goal myGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst() .orElseThrow(()-> new ForbiddenException(Error.FEED_FORBIDDEN_EXCEPTION, Error.FEED_FORBIDDEN_EXCEPTION.getMessage())); //목표 설정 안하면 피드 못만듬 -> 에러처리 + myGoal.updateGoalCountAndAmount(myGoal, feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. if ((myGoal.isAttained() || !(LocalDate.now().isBefore(myGoal.getTargetDate())) || (myGoal.getTargetMoney() < myGoal.getDuringGoalAmount()))){ //만약 목표가 이미 달성되어있거나, 목표일자를 이미 지났거나 목표금액을 이미 넘겼다. -> 업데이트 필요없음 System.out.println("이미 목표달성 or 목표일자 넘김 or 목표금액 넘김"); return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); } - myGoal.updateGoalCountAndAmount(myGoal, feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. - myGoal.updateIsAttained(myGoal); // 달성여부 체크 + if (myGoal.getDuringGoalAmount()>= myGoal.getTargetMoney()) { + myGoal.updateIsAttained(myGoal); // 달성여부 체크 + } checkUserLevelUp(presentUser); // userLevel 변동사항 체크 return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); } private void checkUserLevelUp(User presentUser) { int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser,true); //Goal 중 userid가 맞고 isAttained true 개수 세기 if (userAchievedGoals<1) { - presentUser.setUserLevel(UserLevel.COMMONER); + presentUser.updateUserLevel(UserLevel.COMMONER); } else if (1<=userAchievedGoals && userAchievedGoals<3) { - presentUser.setUserLevel(UserLevel.KNIGHT); + presentUser.updateUserLevel(UserLevel.KNIGHT); } else if (3<=userAchievedGoals && userAchievedGoals<9) { - presentUser.setUserLevel(UserLevel.ARISTOCRAT); + presentUser.updateUserLevel(UserLevel.ARISTOCRAT); } else { - presentUser.setUserLevel(UserLevel.EMPEROR); + presentUser.updateUserLevel(UserLevel.EMPEROR); } } } From 17efe0b12aff44cba26985d5e92e62be6db511a1 Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 10 Jul 2023 14:41:59 +0900 Subject: [PATCH 34/40] =?UTF-8?q?createFeed=20merge=20=EB=A7=88=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=EB=9E=9C=EC=B9=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/service/FeedService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index b0d8fd8..efc6c1b 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -46,7 +46,7 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI myGoal.updateGoalCountAndAmount(myGoal, feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. if ((myGoal.isAttained() || !(LocalDate.now().isBefore(myGoal.getTargetDate())) || (myGoal.getTargetMoney() < myGoal.getDuringGoalAmount()))){ //만약 목표가 이미 달성되어있거나, 목표일자를 이미 지났거나 목표금액을 이미 넘겼다. -> 업데이트 필요없음 System.out.println("이미 목표달성 or 목표일자 넘김 or 목표금액 넘김"); - return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); + return CreateFeedResponseDto.of(feed햐.getId(),feed.getCreatedAt()); } if (myGoal.getDuringGoalAmount()>= myGoal.getTargetMoney()) { myGoal.updateIsAttained(myGoal); // 달성여부 체크 From 4355b47bd531a4191c8b8777660198f51bb152c7 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 14:44:40 +0900 Subject: [PATCH 35/40] #14 [Feat] User Service --- .../response/user/UserResponseGoalDto.java | 2 +- .../org/winey/server/exception/Error.java | 1 + .../org/winey/server/service/UserService.java | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java index b6158d1..ca0c77f 100644 --- a/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java @@ -8,7 +8,7 @@ @Getter @NoArgsConstructor(access = AccessLevel.PRIVATE) @AllArgsConstructor(access = AccessLevel.PRIVATE) -class UserResponseGoalDto { +public class UserResponseGoalDto { private Long duringGoalAmount; private Long duringGoalCount; private Long targetMoney; diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index 13a5d62..2e597ab 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -30,6 +30,7 @@ public enum Error { */ NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"), NOT_FOUND_RECOMMEND_PAGE_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 추천 위니 페이지입니다."), + NOT_FOUND_GOAL_EXCEPTION(HttpStatus.NOT_FOUND, "목표가 존재하지 않습니다."), /** * 409 CONFLICT diff --git a/src/main/java/org/winey/server/service/UserService.java b/src/main/java/org/winey/server/service/UserService.java index 2c0208d..e363c5e 100644 --- a/src/main/java/org/winey/server/service/UserService.java +++ b/src/main/java/org/winey/server/service/UserService.java @@ -4,12 +4,19 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.winey.server.controller.response.user.UserResponseDto; +import org.winey.server.controller.response.user.UserResponseGoalDto; +import org.winey.server.controller.response.user.UserResponseUserDto; +import org.winey.server.domain.goal.Goal; import org.winey.server.domain.user.User; import org.winey.server.exception.Error; import org.winey.server.exception.model.NotFoundException; import org.winey.server.infrastructure.GoalRepository; import org.winey.server.infrastructure.UserRepository; +import java.time.Duration; +import java.time.LocalDate; +import java.util.List; + @Service @RequiredArgsConstructor public class UserService { @@ -21,7 +28,19 @@ public UserResponseDto getUser(Long userId) { User user = userRepository.findByUserId(userId) .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + UserResponseUserDto userDto = UserResponseUserDto.of(user.getUserId(), user.getNickname(), user.getUserLevel().getName()); + + List goalList = goalRepository.findByUserOrderByCreatedAtDesc(user); + + if (goalList.size() == 0) { + return UserResponseDto.of(userDto, null); + } + Goal presentGoal = goalList.stream().findFirst() + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_GOAL_EXCEPTION, Error.NOT_FOUND_GOAL_EXCEPTION.getMessage())); + int targetDay = (int) Duration.between(presentGoal.getTargetDate(), presentGoal.getCreatedAt().toLocalDate()).toDays(); + UserResponseGoalDto goalDto = UserResponseGoalDto.of(presentGoal.getDuringGoalAmount(), presentGoal.getDuringGoalCount(), presentGoal.getTargetMoney(), targetDay, LocalDate.now().isAfter(presentGoal.getTargetDate()), presentGoal.isAttained()); + return UserResponseDto.of(userDto, goalDto); } } From ee987814b26661f0152af052b9e5bf445dd372ed Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 15:00:41 +0900 Subject: [PATCH 36/40] =?UTF-8?q?#14=20[Fix]=20targetDays=20=EA=B3=84?= =?UTF-8?q?=EC=82=B0=20=EB=B0=A9=EB=B2=95=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/controller/UserController.java | 3 ++- src/main/java/org/winey/server/service/UserService.java | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/winey/server/controller/UserController.java b/src/main/java/org/winey/server/controller/UserController.java index fa6b43b..a52416d 100644 --- a/src/main/java/org/winey/server/controller/UserController.java +++ b/src/main/java/org/winey/server/controller/UserController.java @@ -6,6 +6,7 @@ import org.winey.server.common.dto.ApiResponse; import org.winey.server.controller.response.user.UserResponseDto; import org.winey.server.exception.Success; +import org.winey.server.service.UserService; @RestController @RequiredArgsConstructor @@ -17,6 +18,6 @@ public class UserController { @GetMapping("") @ResponseStatus(HttpStatus.OK) public ApiResponse getUser(@RequestHeader Long userId) { - return ApiResponse.success(Success.GET_USER_SUCCESS, userService.) + return ApiResponse.success(Success.GET_USER_SUCCESS, userService.getUser(userId)); } } diff --git a/src/main/java/org/winey/server/service/UserService.java b/src/main/java/org/winey/server/service/UserService.java index e363c5e..50dd03c 100644 --- a/src/main/java/org/winey/server/service/UserService.java +++ b/src/main/java/org/winey/server/service/UserService.java @@ -15,6 +15,7 @@ import java.time.Duration; import java.time.LocalDate; +import java.time.Period; import java.util.List; @Service @@ -38,9 +39,9 @@ public UserResponseDto getUser(Long userId) { Goal presentGoal = goalList.stream().findFirst() .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_GOAL_EXCEPTION, Error.NOT_FOUND_GOAL_EXCEPTION.getMessage())); - int targetDay = (int) Duration.between(presentGoal.getTargetDate(), presentGoal.getCreatedAt().toLocalDate()).toDays(); - UserResponseGoalDto goalDto = UserResponseGoalDto.of(presentGoal.getDuringGoalAmount(), presentGoal.getDuringGoalCount(), presentGoal.getTargetMoney(), targetDay, LocalDate.now().isAfter(presentGoal.getTargetDate()), presentGoal.isAttained()); + int targetDay = (int) Period.between(presentGoal.getCreatedAt().toLocalDate(), presentGoal.getTargetDate()).getDays(); + UserResponseGoalDto goalDto = UserResponseGoalDto.of(presentGoal.getDuringGoalAmount(), presentGoal.getDuringGoalCount(), presentGoal.getTargetMoney(), targetDay, LocalDate.now().isAfter(presentGoal.getTargetDate()), presentGoal.isAttained()); return UserResponseDto.of(userDto, goalDto); } } From 897687ab66108176634e98d4792f639737dbebaa Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 15:06:36 +0900 Subject: [PATCH 37/40] =?UTF-8?q?[Fix]=20response=20=EA=B0=92=EC=A4=91?= =?UTF-8?q?=EC=97=90=20isXX=20=EB=AC=B8=EC=A0=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/response/user/UserResponseGoalDto.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java index ca0c77f..8f6294f 100644 --- a/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java +++ b/src/main/java/org/winey/server/controller/response/user/UserResponseGoalDto.java @@ -1,5 +1,6 @@ package org.winey.server.controller.response.user; +import com.fasterxml.jackson.annotation.JsonProperty; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Getter; @@ -13,8 +14,8 @@ public class UserResponseGoalDto { private Long duringGoalCount; private Long targetMoney; private int targetDay; - private boolean isOver; - private boolean isAttained; + private Boolean isOver; + private Boolean isAttained; public static UserResponseGoalDto of(Long duringGoalAmount, Long duringGoalCount, Long targetMoney, int targetDay, boolean isOver, boolean isAttained) { return new UserResponseGoalDto(duringGoalAmount, duringGoalCount, targetMoney, targetDay, isOver, isAttained); From 888d96a7510f32853d2117e2ebae32908caf9ba5 Mon Sep 17 00:00:00 2001 From: soohyun Date: Mon, 10 Jul 2023 16:15:41 +0900 Subject: [PATCH 38/40] =?UTF-8?q?#12=20[Refactor]=20createFeed=20=EB=A6=AC?= =?UTF-8?q?=ED=8C=A9=ED=86=A0=EB=A7=81=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../server/controller/FeedController.java | 13 ++++- .../org/winey/server/domain/feed/Feed.java | 3 +- .../org/winey/server/domain/goal/Goal.java | 32 +++++------ .../org/winey/server/domain/user/User.java | 4 +- .../org/winey/server/exception/Error.java | 1 + .../org/winey/server/exception/Success.java | 5 ++ .../server/infrastructure/FeedRepository.java | 2 + .../org/winey/server/service/FeedService.java | 55 +++++++++++++------ 8 files changed, 77 insertions(+), 38 deletions(-) diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index d880c91..db4d113 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -22,11 +22,22 @@ public class FeedController { @PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseStatus(HttpStatus.CREATED) - public ApiResponse create( + public ApiResponse createFeed( @RequestHeader("userId") Long userId, @ModelAttribute CreateFeedRequestDto request) { String feedImageUrl = s3Service.uploadImage(request.getFeedImage(), "feed"); return ApiResponse.success(Success.CREATE_BOARD_SUCCESS, feedService.createFeed(request,userId,feedImageUrl)); } + @DeleteMapping(value = "/user/{feedId}") + @ResponseStatus(HttpStatus.OK) + public ApiResponse deleteFeed( + @RequestHeader("userId")Long userId, + @PathVariable Long feedId + ){ + String imageUrl = feedService.deleteFeed(userId,feedId); + s3Service.deleteFile(imageUrl); + return ApiResponse.success(Success.DELETE_FEED_SUCCESS); + } + } 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 f273551..d4b1618 100644 --- a/src/main/java/org/winey/server/domain/feed/Feed.java +++ b/src/main/java/org/winey/server/domain/feed/Feed.java @@ -6,6 +6,7 @@ import lombok.NoArgsConstructor; import org.springframework.data.annotation.CreatedDate; import org.winey.server.domain.AuditingTimeEntity; +import org.winey.server.domain.goal.Goal; import org.winey.server.domain.user.User; import javax.persistence.*; @@ -18,7 +19,7 @@ public class Feed extends AuditingTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "feed_id") - private Long id; + private Long feedId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name="user_id") private User user; diff --git a/src/main/java/org/winey/server/domain/goal/Goal.java b/src/main/java/org/winey/server/domain/goal/Goal.java index 66db606..022e59f 100644 --- a/src/main/java/org/winey/server/domain/goal/Goal.java +++ b/src/main/java/org/winey/server/domain/goal/Goal.java @@ -26,22 +26,15 @@ public class Goal extends AuditingTimeEntity { private LocalDate targetDate; @Column(nullable = false) - @ColumnDefault("0") - @Setter private Long duringGoalAmount; @Column(nullable = false) - @ColumnDefault("false") - @Setter private boolean isAttained; @Column(nullable = false) - @ColumnDefault("0") - @Setter private Long duringGoalCount; - @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false, foreignKey = @ForeignKey(ConstraintMode.CONSTRAINT)) private User user; @@ -51,18 +44,23 @@ public Goal(Long targetMoney, LocalDate targetDate, User user) { this.targetMoney = targetMoney; this.targetDate = targetDate; this.user = user; + this.duringGoalCount = 0L; + this.isAttained = false; + this.duringGoalAmount = 0L; + } - public void updateIsAttained(Goal presentGoal){ - presentGoal.isAttained = true; + + public void updateIsAttained(boolean isAttained) { + this.isAttained = isAttained; } - public void updateGoalCountAndAmount(Goal presentGoal, Long feedMoney, boolean createOrDelete){ - if (createOrDelete){ - presentGoal.duringGoalCount+=1; - presentGoal.duringGoalAmount+=feedMoney; - } - else { - presentGoal.duringGoalCount-=1; - presentGoal.duringGoalAmount-=feedMoney; + + public void updateGoalCountAndAmount(Long feedMoney, boolean createOrDelete) { + if (createOrDelete) { + this.duringGoalCount += 1; + this.duringGoalAmount += feedMoney; + } else { + this.duringGoalCount -= 1; + this.duringGoalAmount -= feedMoney; } } } 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 cd61e21..61a0a98 100644 --- a/src/main/java/org/winey/server/domain/user/User.java +++ b/src/main/java/org/winey/server/domain/user/User.java @@ -23,9 +23,8 @@ public class User extends AuditingTimeEntity { @Column(nullable = false, unique = true) private String nickname; - @Setter @Column(nullable = false) - @ColumnDefault("1") + @Enumerated(EnumType.STRING) private UserLevel userLevel; @Column(nullable = false) @@ -45,6 +44,7 @@ public User(String nickname, Long accumulatedAmount, Long feedCount) { this.nickname = nickname; this.accumulatedAmount = accumulatedAmount; this.feedCount = feedCount; + this.userLevel = UserLevel.COMMONER; } public void updateUserLevel(UserLevel userLevel){ diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index a759ff2..f78b479 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -19,6 +19,7 @@ public enum Error { VALIDATION_REQUEST_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청값이 입력되지 않았습니다."), VALIDATION_REQUEST_HEADER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 헤더값이 입력되지 않았습니다."), VALIDATION_REQUEST_PARAMETER_MISSING_EXCEPTION(HttpStatus.BAD_REQUEST, "요청 파라미터값이 입력되지 않았습니다."), + NOT_FOUND_CREATED_AT_EXCEPTION(HttpStatus.BAD_REQUEST, "요청한 피드의 생성일이 존재하지 않습니다."), /** * 401 UNAUTHORIZED diff --git a/src/main/java/org/winey/server/exception/Success.java b/src/main/java/org/winey/server/exception/Success.java index a22a93f..b2ab20c 100644 --- a/src/main/java/org/winey/server/exception/Success.java +++ b/src/main/java/org/winey/server/exception/Success.java @@ -21,6 +21,11 @@ public enum Success { SIGNUP_SUCCESS(HttpStatus.CREATED, "회원가입이 완료됐습니다."), CREATE_BOARD_SUCCESS(HttpStatus.CREATED, "게시물 생성이 완료됐습니다."), CREATE_GOAL_SUCCESS(HttpStatus.CREATED, "목표 생성이 완료됐습니다."), + + /** + * 204 NO CONTENT + */ + DELETE_FEED_SUCCESS(HttpStatus.NO_CONTENT, "피드가 정상적으로 삭제되었습니다.") ; private final HttpStatus httpStatus; diff --git a/src/main/java/org/winey/server/infrastructure/FeedRepository.java b/src/main/java/org/winey/server/infrastructure/FeedRepository.java index 4e69d9a..7295dfd 100644 --- a/src/main/java/org/winey/server/infrastructure/FeedRepository.java +++ b/src/main/java/org/winey/server/infrastructure/FeedRepository.java @@ -8,4 +8,6 @@ public interface FeedRepository extends Repository { void save(Feed feed); + Optional findByFeedId(Long feedId); + void delete(Feed feed); } diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index efc6c1b..23c9691 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -10,6 +10,7 @@ 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.ForbiddenException; import org.winey.server.exception.model.NotFoundException; import org.winey.server.infrastructure.FeedRepository; @@ -17,9 +18,6 @@ import org.winey.server.infrastructure.UserRepository; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; -import java.util.Optional; @Service @RequiredArgsConstructor @@ -30,7 +28,7 @@ public class FeedService { private final GoalRepository goalRepository; @Transactional - public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userId, String imageUrl){ + public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userId, String imageUrl) { User presentUser = userRepository.findByUserId(userId) .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); Feed feed = Feed.builder() @@ -40,30 +38,53 @@ public CreateFeedResponseDto createFeed(CreateFeedRequestDto request, Long userI .user(presentUser) .build(); feedRepository.save(feed); - Goal myGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst() - .orElseThrow(()-> new ForbiddenException(Error.FEED_FORBIDDEN_EXCEPTION, Error.FEED_FORBIDDEN_EXCEPTION.getMessage())); //목표 설정 안하면 피드 못만듬 -> 에러처리 - myGoal.updateGoalCountAndAmount(myGoal, feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. - if ((myGoal.isAttained() || !(LocalDate.now().isBefore(myGoal.getTargetDate())) || (myGoal.getTargetMoney() < myGoal.getDuringGoalAmount()))){ //만약 목표가 이미 달성되어있거나, 목표일자를 이미 지났거나 목표금액을 이미 넘겼다. -> 업데이트 필요없음 + .orElseThrow(() -> new ForbiddenException(Error.FEED_FORBIDDEN_EXCEPTION, Error.FEED_FORBIDDEN_EXCEPTION.getMessage())); //목표 설정 안하면 피드 못만듬 -> 에러처리 + myGoal.updateGoalCountAndAmount(feed.getFeedMoney(), true); // 절약 금액, 피드 횟수 업데이트. + + if (myGoal.isAttained() || LocalDate.now().isAfter(myGoal.getTargetDate())) { System.out.println("이미 목표달성 or 목표일자 넘김 or 목표금액 넘김"); - return CreateFeedResponseDto.of(feed햐.getId(),feed.getCreatedAt()); + return CreateFeedResponseDto.of(feed.getFeedId(), feed.getCreatedAt()); } - if (myGoal.getDuringGoalAmount()>= myGoal.getTargetMoney()) { - myGoal.updateIsAttained(myGoal); // 달성여부 체크 + if (myGoal.getDuringGoalAmount() >= myGoal.getTargetMoney()) { + myGoal.updateIsAttained(true); // 달성여부 체크 + checkUserLevelUp(presentUser); // userLevel 변동사항 체크 } - checkUserLevelUp(presentUser); // userLevel 변동사항 체크 - return CreateFeedResponseDto.of(feed.getId(),feed.getCreatedAt()); + return CreateFeedResponseDto.of(feed.getFeedId(), feed.getCreatedAt()); } + private void checkUserLevelUp(User presentUser) { - int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser,true); //Goal 중 userid가 맞고 isAttained true 개수 세기 - if (userAchievedGoals<1) { + int userAchievedGoals = goalRepository.countByUserAndIsAttained(presentUser, true); //Goal 중 userid가 맞고 isAttained true 개수 세기 + if (userAchievedGoals < 1) { presentUser.updateUserLevel(UserLevel.COMMONER); - } else if (1<=userAchievedGoals && userAchievedGoals<3) { + } else if (userAchievedGoals < 3) { presentUser.updateUserLevel(UserLevel.KNIGHT); - } else if (3<=userAchievedGoals && userAchievedGoals<9) { + } else if (userAchievedGoals < 9) { presentUser.updateUserLevel(UserLevel.ARISTOCRAT); } else { presentUser.updateUserLevel(UserLevel.EMPEROR); } } + + @Transactional + public String deleteFeed(Long userId, Long feedId) { + User presentUser = userRepository.findByUserId(userId).get(); + Goal presentGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst().get(); + Feed wantDeleteFeed = feedRepository.findByFeedId(feedId).get(); + if (presentGoal.getCreatedAt() == null) { + new BadRequestException(Error.NOT_FOUND_CREATED_AT_EXCEPTION, Error.NOT_FOUND_CREATED_AT_EXCEPTION.getMessage()); + } else if ((!presentGoal.getCreatedAt().isBefore(wantDeleteFeed.getCreatedAt())) || (!presentGoal.getTargetDate().isAfter(wantDeleteFeed.getCreatedAt().toLocalDate()))) { + feedRepository.delete(wantDeleteFeed); + return wantDeleteFeed.getFeedImage(); + } + presentGoal.updateGoalCountAndAmount(wantDeleteFeed.getFeedMoney(), false); + if (presentGoal.getTargetMoney() > presentGoal.getDuringGoalAmount()) { //현재까지 누적 + 피드가격으로 업데이트된 금액 >= 목표금액 + presentGoal.updateIsAttained(false); // 달성여부 체크 + checkUserLevelUp(presentUser); // userLevel 변동사항 체크 + } + feedRepository.delete(wantDeleteFeed); + return wantDeleteFeed.getFeedImage(); + + + } } From 698b6202635e53cb7e8413c6c3cadb79ca9b6db7 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 16:29:04 +0900 Subject: [PATCH 39/40] =?UTF-8?q?#12=20[Refactor]=20=ED=94=BC=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20=EB=A6=AC=ED=8C=A9=ED=84=B0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/winey/server/exception/Error.java | 2 +- .../org/winey/server/service/FeedService.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/org/winey/server/exception/Error.java b/src/main/java/org/winey/server/exception/Error.java index f78b479..76b0e88 100644 --- a/src/main/java/org/winey/server/exception/Error.java +++ b/src/main/java/org/winey/server/exception/Error.java @@ -36,8 +36,8 @@ public enum Error { */ NOT_FOUND_USER_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 유저입니다"), NOT_FOUND_RECOMMEND_PAGE_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 추천 위니 페이지입니다."), - NOT_FOUND_GOAL_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 목표입니다"), + NOT_FOUND_FEED_EXCEPTION(HttpStatus.NOT_FOUND, "존재하지 않는 피드입니다"), /** * 409 CONFLICT diff --git a/src/main/java/org/winey/server/service/FeedService.java b/src/main/java/org/winey/server/service/FeedService.java index 23c9691..0f6bce5 100644 --- a/src/main/java/org/winey/server/service/FeedService.java +++ b/src/main/java/org/winey/server/service/FeedService.java @@ -68,23 +68,23 @@ private void checkUserLevelUp(User presentUser) { @Transactional public String deleteFeed(Long userId, Long feedId) { - User presentUser = userRepository.findByUserId(userId).get(); - Goal presentGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst().get(); - Feed wantDeleteFeed = feedRepository.findByFeedId(feedId).get(); - if (presentGoal.getCreatedAt() == null) { - new BadRequestException(Error.NOT_FOUND_CREATED_AT_EXCEPTION, Error.NOT_FOUND_CREATED_AT_EXCEPTION.getMessage()); - } else if ((!presentGoal.getCreatedAt().isBefore(wantDeleteFeed.getCreatedAt())) || (!presentGoal.getTargetDate().isAfter(wantDeleteFeed.getCreatedAt().toLocalDate()))) { + User presentUser = userRepository.findByUserId(userId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_USER_EXCEPTION, Error.NOT_FOUND_USER_EXCEPTION.getMessage())); + Goal presentGoal = goalRepository.findByUserOrderByCreatedAtDesc(presentUser).stream().findFirst() + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_GOAL_EXCEPTION, Error.NOT_FOUND_GOAL_EXCEPTION.getMessage())); + Feed wantDeleteFeed = feedRepository.findByFeedId(feedId) + .orElseThrow(() -> new NotFoundException(Error.NOT_FOUND_FEED_EXCEPTION, Error.NOT_FOUND_FEED_EXCEPTION.getMessage())); + + if ((!presentGoal.getCreatedAt().isBefore(wantDeleteFeed.getCreatedAt())) || (!presentGoal.getTargetDate().isAfter(wantDeleteFeed.getCreatedAt().toLocalDate()))) { feedRepository.delete(wantDeleteFeed); return wantDeleteFeed.getFeedImage(); } presentGoal.updateGoalCountAndAmount(wantDeleteFeed.getFeedMoney(), false); - if (presentGoal.getTargetMoney() > presentGoal.getDuringGoalAmount()) { //현재까지 누적 + 피드가격으로 업데이트된 금액 >= 목표금액 + if (presentGoal.getTargetMoney() > presentGoal.getDuringGoalAmount()) { presentGoal.updateIsAttained(false); // 달성여부 체크 checkUserLevelUp(presentUser); // userLevel 변동사항 체크 } feedRepository.delete(wantDeleteFeed); return wantDeleteFeed.getFeedImage(); - - } } From 602b0b334b3b15a70321573856fe849174fb0288 Mon Sep 17 00:00:00 2001 From: Sunny Date: Mon, 10 Jul 2023 16:31:23 +0900 Subject: [PATCH 40/40] =?UTF-8?q?#12=20[Fix]=20=ED=94=BC=EB=93=9C=20?= =?UTF-8?q?=EC=82=AD=EC=A0=9C=20url=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/org/winey/server/controller/FeedController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/winey/server/controller/FeedController.java b/src/main/java/org/winey/server/controller/FeedController.java index db4d113..733776e 100644 --- a/src/main/java/org/winey/server/controller/FeedController.java +++ b/src/main/java/org/winey/server/controller/FeedController.java @@ -29,7 +29,7 @@ public ApiResponse createFeed( return ApiResponse.success(Success.CREATE_BOARD_SUCCESS, feedService.createFeed(request,userId,feedImageUrl)); } - @DeleteMapping(value = "/user/{feedId}") + @DeleteMapping(value = "/{feedId}") @ResponseStatus(HttpStatus.OK) public ApiResponse deleteFeed( @RequestHeader("userId")Long userId,