From 6008370a8b2286e5648cd8fb28487a54f987d51b Mon Sep 17 00:00:00 2001 From: Ganghee-Lee-0522 Date: Sun, 28 Apr 2024 04:26:45 +0900 Subject: [PATCH 1/5] =?UTF-8?q?style:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파일 위치를 수정하였습니다. --- .../java/zero/eight/donut/dto/{ => donation}/GiftAssignDto.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/main/java/zero/eight/donut/dto/{ => donation}/GiftAssignDto.java (87%) diff --git a/src/main/java/zero/eight/donut/dto/GiftAssignDto.java b/src/main/java/zero/eight/donut/dto/donation/GiftAssignDto.java similarity index 87% rename from src/main/java/zero/eight/donut/dto/GiftAssignDto.java rename to src/main/java/zero/eight/donut/dto/donation/GiftAssignDto.java index 3f3d52d..373d294 100644 --- a/src/main/java/zero/eight/donut/dto/GiftAssignDto.java +++ b/src/main/java/zero/eight/donut/dto/donation/GiftAssignDto.java @@ -1,4 +1,4 @@ -package zero.eight.donut.dto; +package zero.eight.donut.dto.donation; import lombok.Builder; import lombok.Getter; From 6909a1fe646cf2db9f9fcbbba0a8f295cba41a6a Mon Sep 17 00:00:00 2001 From: Ganghee-Lee-0522 Date: Sun, 28 Apr 2024 04:27:10 +0900 Subject: [PATCH 2/5] =?UTF-8?q?style:=20=EB=94=94=EB=A0=89=ED=86=A0?= =?UTF-8?q?=EB=A6=AC=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 파일 위치를 수정하였습니다. --- .../java/zero/eight/donut/service/SerialDonationService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/zero/eight/donut/service/SerialDonationService.java b/src/main/java/zero/eight/donut/service/SerialDonationService.java index 80d8658..a7cc6c7 100644 --- a/src/main/java/zero/eight/donut/service/SerialDonationService.java +++ b/src/main/java/zero/eight/donut/service/SerialDonationService.java @@ -12,13 +12,12 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; -import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import reactor.core.publisher.Mono; import zero.eight.donut.common.response.ApiResponse; import zero.eight.donut.config.jwt.AuthUtils; import zero.eight.donut.domain.*; -import zero.eight.donut.dto.GiftAssignDto; +import zero.eight.donut.dto.donation.GiftAssignDto; import zero.eight.donut.dto.auth.Role; import zero.eight.donut.dto.donation.DonateGiftRequestDto; import zero.eight.donut.dto.donation.GiftValueDto; From a5757574c19a164f0b25cffd6d1b537cb90bfaf4 Mon Sep 17 00:00:00 2001 From: Ganghee-Lee-0522 Date: Sun, 28 Apr 2024 05:03:37 +0900 Subject: [PATCH 3/5] =?UTF-8?q?feat:=20Giver,=20Message=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기부자 별 메세지 개수를 세기 위해 엔티티를 수정하였습니다. --- src/main/java/zero/eight/donut/domain/Giver.java | 4 ++++ src/main/java/zero/eight/donut/domain/Message.java | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/zero/eight/donut/domain/Giver.java b/src/main/java/zero/eight/donut/domain/Giver.java index 03be382..c31d030 100644 --- a/src/main/java/zero/eight/donut/domain/Giver.java +++ b/src/main/java/zero/eight/donut/domain/Giver.java @@ -38,5 +38,9 @@ public class Giver extends BaseTimeEntity { //신고 @OneToMany(mappedBy = "giver", fetch = FetchType.LAZY) private List reportList = new ArrayList<>(); + + //메세지 + @OneToMany(mappedBy = "giver", fetch = FetchType.LAZY) + private List messagesList = new ArrayList<>(); } diff --git a/src/main/java/zero/eight/donut/domain/Message.java b/src/main/java/zero/eight/donut/domain/Message.java index daf670f..81855b5 100644 --- a/src/main/java/zero/eight/donut/domain/Message.java +++ b/src/main/java/zero/eight/donut/domain/Message.java @@ -28,4 +28,8 @@ public class Message { @JoinColumn(name = "gift_id") private Gift gift; + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "giver_id") + private Giver giver; + } From c4fe37cba314a4e6f42c60db7c47536c8035832d Mon Sep 17 00:00:00 2001 From: Ganghee-Lee-0522 Date: Sun, 28 Apr 2024 05:18:18 +0900 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80(=EA=B8=B0=EB=B6=80=EC=9E=90)=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 기부자의 마이페이지 조회를 구현하였습니다. --- .../donut/controller/MypageController.java | 20 ++++++ .../dto/mypage/GiverInfoResponseDto.java | 10 +++ .../zero/eight/donut/dto/mypage/StatsDto.java | 12 ++++ .../zero/eight/donut/exception/Success.java | 1 + .../donut/repository/GiftRepository.java | 6 ++ .../donut/repository/MessageRepository.java | 5 ++ .../eight/donut/service/MypageService.java | 68 +++++++++++++++++++ 7 files changed, 122 insertions(+) create mode 100644 src/main/java/zero/eight/donut/controller/MypageController.java create mode 100644 src/main/java/zero/eight/donut/dto/mypage/GiverInfoResponseDto.java create mode 100644 src/main/java/zero/eight/donut/dto/mypage/StatsDto.java create mode 100644 src/main/java/zero/eight/donut/service/MypageService.java diff --git a/src/main/java/zero/eight/donut/controller/MypageController.java b/src/main/java/zero/eight/donut/controller/MypageController.java new file mode 100644 index 0000000..8194b6a --- /dev/null +++ b/src/main/java/zero/eight/donut/controller/MypageController.java @@ -0,0 +1,20 @@ +package zero.eight.donut.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import zero.eight.donut.common.response.ApiResponse; +import zero.eight.donut.service.MypageService; + +@RequiredArgsConstructor +@RequestMapping("/api/mypage") +@RestController +public class MypageController { + private final MypageService mypageService; + + @GetMapping("/giver") + public ApiResponse giverInfo() { + return mypageService.getGiverMypage(); + } +} diff --git a/src/main/java/zero/eight/donut/dto/mypage/GiverInfoResponseDto.java b/src/main/java/zero/eight/donut/dto/mypage/GiverInfoResponseDto.java new file mode 100644 index 0000000..f00326c --- /dev/null +++ b/src/main/java/zero/eight/donut/dto/mypage/GiverInfoResponseDto.java @@ -0,0 +1,10 @@ +package zero.eight.donut.dto.mypage; + +import lombok.Builder; + +@Builder +public class GiverInfoResponseDto { + private int years; // 기부 기간(연) + private double donation; // 총 기부 금액 + private StatsDto stats; // 통계 +} diff --git a/src/main/java/zero/eight/donut/dto/mypage/StatsDto.java b/src/main/java/zero/eight/donut/dto/mypage/StatsDto.java new file mode 100644 index 0000000..0d4b41a --- /dev/null +++ b/src/main/java/zero/eight/donut/dto/mypage/StatsDto.java @@ -0,0 +1,12 @@ +package zero.eight.donut.dto.mypage; + +import lombok.Builder; +import lombok.Getter; + +@Getter +@Builder +public class StatsDto { + private int unreceived; // 기부한 것 중 할당 안된 것 + private int received; // 기부한 것 중 할당 된 것 + private int msg; // 받은 메세지 개수 +} diff --git a/src/main/java/zero/eight/donut/exception/Success.java b/src/main/java/zero/eight/donut/exception/Success.java index a2681c6..35d1b70 100644 --- a/src/main/java/zero/eight/donut/exception/Success.java +++ b/src/main/java/zero/eight/donut/exception/Success.java @@ -13,6 +13,7 @@ public enum Success { SUCCESS(HttpStatus.OK, "Request successfully processed"), // 200 OK SUCCESS + MYPAGE_GIVER_SUCCESS(HttpStatus.OK, "Get request for giver's info completed successfully"), GET_WALLET_SUCCESS(HttpStatus.OK, "Success in getting wallet info"), HOME_GIVER_SUCCESS(HttpStatus.OK, "Get request for giver's home info completed successfully"), HOME_RECEIVER_SUCCESS(HttpStatus.OK, "Get request for receiver's home info completed successfully"), diff --git a/src/main/java/zero/eight/donut/repository/GiftRepository.java b/src/main/java/zero/eight/donut/repository/GiftRepository.java index 7bbbfdd..c15649b 100644 --- a/src/main/java/zero/eight/donut/repository/GiftRepository.java +++ b/src/main/java/zero/eight/donut/repository/GiftRepository.java @@ -27,4 +27,10 @@ public interface GiftRepository extends JpaRepository { @Query(value = "SELECT * FROM gift g WHERE g.auto_donation = true AND g.status = 'stored' AND g.giver_id = :giverId AND g.due_date >= :today", nativeQuery = true) List findAllByGiverAndStatusAndDueDateAfterOrToday(@Param("giverId") Long giverId, @Param("today") LocalDateTime today); + + @Query(value = "SELECT COUNT(g) FROM gift g WHERE g.giver_id = :giverId AND g.is_assigned = false", nativeQuery = true) + int findNotAssignedByGiverIdAndIsAssigned(@Param("giverId") Long giverId); + + @Query(value = "SELECT COUNT(g) FROM gift g WHERE g.giver_id = :giverId AND g.is_assigned = true", nativeQuery = true) + int findIsAssignedByGiverIdAndIsAssigned(@Param("giverId") Long giverId); } diff --git a/src/main/java/zero/eight/donut/repository/MessageRepository.java b/src/main/java/zero/eight/donut/repository/MessageRepository.java index 6a58d9a..60767a0 100644 --- a/src/main/java/zero/eight/donut/repository/MessageRepository.java +++ b/src/main/java/zero/eight/donut/repository/MessageRepository.java @@ -1,8 +1,13 @@ package zero.eight.donut.repository; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import zero.eight.donut.domain.Message; public interface MessageRepository extends JpaRepository { Message findByGiftId(Long giftId); + + @Query(value = "SELECT COUNT(m) FROM message m WHERE m.giver_id = :giverId", nativeQuery = true) + int countByGiverId(@Param("giverId") Long giverId); } diff --git a/src/main/java/zero/eight/donut/service/MypageService.java b/src/main/java/zero/eight/donut/service/MypageService.java new file mode 100644 index 0000000..f0283a2 --- /dev/null +++ b/src/main/java/zero/eight/donut/service/MypageService.java @@ -0,0 +1,68 @@ +package zero.eight.donut.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import zero.eight.donut.common.response.ApiResponse; +import zero.eight.donut.config.jwt.AuthUtils; +import zero.eight.donut.domain.Giver; +import zero.eight.donut.dto.home.giver.GiverHomeResponseDto; +import zero.eight.donut.dto.mypage.GiverInfoResponseDto; +import zero.eight.donut.dto.mypage.StatsDto; +import zero.eight.donut.exception.Success; +import zero.eight.donut.repository.DonationInfoRepository; +import zero.eight.donut.repository.DonationRepository; +import zero.eight.donut.repository.GiftRepository; +import zero.eight.donut.repository.MessageRepository; + +import java.time.Duration; +import java.time.LocalDateTime; + +@RequiredArgsConstructor +@Service +public class MypageService { + + private final AuthUtils authUtils; + private final GiftRepository giftRepository; + private final DonationRepository donationRepository; + private final DonationInfoRepository donationInfoRepository; + private final MessageRepository messageRepository; + + public ApiResponse getGiverMypage() { + // 기부 기간(연) 계산 + Giver giver = authUtils.getGiver(); + LocalDateTime now = LocalDateTime.now(); + Duration duration = Duration.between(giver.getCreatedAt(), now); // 현재 시간과 기부자 계정 생성 시간 비교 + long days = duration.toDays(); // Duration 객체의 총 일(day) 수를 가져옴 + int years = (int) (days / 365); // 평년을 기준으로 연수 계산 + + // 총 기부 금액 계산 + double donation = 0d; + Long donationInfo = donationRepository.getSumByGiverId(giver.getId()); + if (donationInfo != null) { + donation = donationInfo.doubleValue(); + } + + // 기부-할당x 기프티콘 수 계산 + int unreceived = giftRepository.findNotAssignedByGiverIdAndIsAssigned(giver.getId()); + + // 기부-할당o 기프티콘 수 계산 + int received = giftRepository.findIsAssignedByGiverIdAndIsAssigned(giver.getId()); + + // 받은 메세지 수 계산 + int msg = messageRepository.countByGiverId(giver.getId()); + + // DTO 생성 및 반환 + StatsDto statsDto = StatsDto.builder() + .unreceived(unreceived) + .received(received) + .msg(msg) + .build(); + GiverInfoResponseDto responseDto = GiverInfoResponseDto.builder() + .years(years) + .donation(donation) + .stats(statsDto) + .build(); + + return ApiResponse.success(Success.MYPAGE_GIVER_SUCCESS, responseDto); + } +} From f9b56a4c99dfd140772ea8a550d8c4f117bff853 Mon Sep 17 00:00:00 2001 From: Ganghee-Lee-0522 Date: Sun, 28 Apr 2024 05:34:40 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EB=A7=88=EC=9D=B4=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80(=EC=88=98=ED=98=9C=EC=9E=90)=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 수혜자의 마이페이지 조회를 구현하였습니다. --- .../donut/controller/MypageController.java | 5 ++++ .../donut/dto/ReceiverInfoResponseDto.java | 8 ++++++ .../zero/eight/donut/exception/Success.java | 1 + .../donut/repository/BenefitRepository.java | 4 +++ .../eight/donut/service/MypageService.java | 26 ++++++++++++++++--- 5 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 src/main/java/zero/eight/donut/dto/ReceiverInfoResponseDto.java diff --git a/src/main/java/zero/eight/donut/controller/MypageController.java b/src/main/java/zero/eight/donut/controller/MypageController.java index 8194b6a..55073fe 100644 --- a/src/main/java/zero/eight/donut/controller/MypageController.java +++ b/src/main/java/zero/eight/donut/controller/MypageController.java @@ -17,4 +17,9 @@ public class MypageController { public ApiResponse giverInfo() { return mypageService.getGiverMypage(); } + + @GetMapping("/receiver") + public ApiResponse receiverInfo() { + return mypageService.getReceiverMypage(); + } } diff --git a/src/main/java/zero/eight/donut/dto/ReceiverInfoResponseDto.java b/src/main/java/zero/eight/donut/dto/ReceiverInfoResponseDto.java new file mode 100644 index 0000000..db2e970 --- /dev/null +++ b/src/main/java/zero/eight/donut/dto/ReceiverInfoResponseDto.java @@ -0,0 +1,8 @@ +package zero.eight.donut.dto; + +import lombok.Builder; + +@Builder +public class ReceiverInfoResponseDto { + private double total; +} diff --git a/src/main/java/zero/eight/donut/exception/Success.java b/src/main/java/zero/eight/donut/exception/Success.java index 35d1b70..988b8e7 100644 --- a/src/main/java/zero/eight/donut/exception/Success.java +++ b/src/main/java/zero/eight/donut/exception/Success.java @@ -13,6 +13,7 @@ public enum Success { SUCCESS(HttpStatus.OK, "Request successfully processed"), // 200 OK SUCCESS + MYPAGE_RECEIVER_SUCCESS(HttpStatus.OK, "Get request for receiver's info completed successfully"), MYPAGE_GIVER_SUCCESS(HttpStatus.OK, "Get request for giver's info completed successfully"), GET_WALLET_SUCCESS(HttpStatus.OK, "Success in getting wallet info"), HOME_GIVER_SUCCESS(HttpStatus.OK, "Get request for giver's home info completed successfully"), diff --git a/src/main/java/zero/eight/donut/repository/BenefitRepository.java b/src/main/java/zero/eight/donut/repository/BenefitRepository.java index d4d5d21..60131c5 100644 --- a/src/main/java/zero/eight/donut/repository/BenefitRepository.java +++ b/src/main/java/zero/eight/donut/repository/BenefitRepository.java @@ -2,6 +2,7 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository; import zero.eight.donut.domain.Benefit; import zero.eight.donut.domain.Receiver; @@ -13,4 +14,7 @@ public interface BenefitRepository extends JpaRepository { @Query("SELECT b FROM Benefit b WHERE b.receiver.id =?1 AND b.year = ?2 AND b.month= ?3") Benefit findByReceiverIdAndThisMonth(Long receiverId, Integer year, Integer month); + + @Query(value = "SELECT SUM(b.sum) FROM benefit b WHERE b.receiver_id = :receiverId", nativeQuery = true) + Integer sumBenefitByReceiverId(@Param("receiverId") Long receiverId); } diff --git a/src/main/java/zero/eight/donut/service/MypageService.java b/src/main/java/zero/eight/donut/service/MypageService.java index f0283a2..4c6c92e 100644 --- a/src/main/java/zero/eight/donut/service/MypageService.java +++ b/src/main/java/zero/eight/donut/service/MypageService.java @@ -5,14 +5,13 @@ import zero.eight.donut.common.response.ApiResponse; import zero.eight.donut.config.jwt.AuthUtils; import zero.eight.donut.domain.Giver; +import zero.eight.donut.domain.Receiver; +import zero.eight.donut.dto.ReceiverInfoResponseDto; import zero.eight.donut.dto.home.giver.GiverHomeResponseDto; import zero.eight.donut.dto.mypage.GiverInfoResponseDto; import zero.eight.donut.dto.mypage.StatsDto; import zero.eight.donut.exception.Success; -import zero.eight.donut.repository.DonationInfoRepository; -import zero.eight.donut.repository.DonationRepository; -import zero.eight.donut.repository.GiftRepository; -import zero.eight.donut.repository.MessageRepository; +import zero.eight.donut.repository.*; import java.time.Duration; import java.time.LocalDateTime; @@ -26,6 +25,7 @@ public class MypageService { private final DonationRepository donationRepository; private final DonationInfoRepository donationInfoRepository; private final MessageRepository messageRepository; + private final BenefitRepository benefitRepository; public ApiResponse getGiverMypage() { // 기부 기간(연) 계산 @@ -57,6 +57,7 @@ public ApiResponse getGiverMypage() { .received(received) .msg(msg) .build(); + GiverInfoResponseDto responseDto = GiverInfoResponseDto.builder() .years(years) .donation(donation) @@ -65,4 +66,21 @@ public ApiResponse getGiverMypage() { return ApiResponse.success(Success.MYPAGE_GIVER_SUCCESS, responseDto); } + + public ApiResponse getReceiverMypage() { + // 수혜 금액 계산 + Receiver receiver = authUtils.getReceiver(); + double total = 0d; + Integer summed = benefitRepository.sumBenefitByReceiverId(receiver.getId()); + if (summed != null) { + total = summed.doubleValue(); + } + + // DTO 생성 및 반환 + ReceiverInfoResponseDto responseDto = ReceiverInfoResponseDto.builder() + .total(total) + .build(); + + return ApiResponse.success(Success.MYPAGE_RECEIVER_SUCCESS, responseDto); + } }