Skip to content

Commit 672ee9a

Browse files
authored
Refactor: 점수,알림,신고 기능 추가 및 기존 로직 리팩토링 (#46)
* 중간 저장 * refactor : 로직 수정 * refactor : 명세에 있지만 누락된 기능 추가 및 리팩토링 * fix : 테스트 수정 * feat : 씨앗 배송 로직 추가
1 parent 97b17a7 commit 672ee9a

119 files changed

Lines changed: 2918 additions & 968 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ dependencies {
4343
implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.8.9' // 버전을 삭제!
4444
implementation 'com.google.firebase:firebase-admin:9.2.0'
4545
implementation 'com.amazonaws:aws-java-sdk-s3:1.12.75' // amazonaws 사용
46+
implementation 'com.fasterxml.jackson.core:jackson-databind'
4647
// JJWT 추가
4748
implementation 'io.jsonwebtoken:jjwt-api:0.12.5'
4849
runtimeOnly 'io.jsonwebtoken:jjwt-impl:0.12.5'

src/main/java/com/example/cp_main_be/domain/admin/presentation/AdminController.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,10 @@
2323
import com.example.cp_main_be.domain.mission.quiz.domain.QuizOptions;
2424
import com.example.cp_main_be.domain.reports.domain.Reports;
2525
import com.example.cp_main_be.domain.reports.enums.ReportStatus;
26+
import com.example.cp_main_be.global.common.ApiResponse;
2627
import com.example.cp_main_be.global.dto.ListResponse;
27-
import com.example.cp_main_be.global.util.ApiResponse;
2828
import io.swagger.v3.oas.annotations.Operation;
29+
import io.swagger.v3.oas.annotations.tags.Tag;
2930
import java.util.List;
3031
import lombok.RequiredArgsConstructor;
3132
import org.springframework.http.ResponseEntity;
@@ -34,6 +35,7 @@
3435
@RestController
3536
@RequestMapping("/api/v1/admin")
3637
@RequiredArgsConstructor
38+
@Tag(name = "어드민 API", description = "어드민 권한의 기능을 제공합니다.")
3739
public class AdminController {
3840

3941
private final AdminService adminService;

src/main/java/com/example/cp_main_be/domain/admin/service/AdminService.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import com.example.cp_main_be.domain.member.user.service.UserService;
88
import com.example.cp_main_be.domain.mission.daily_keywords.domain.DailyKeywords;
99
import com.example.cp_main_be.domain.mission.daily_keywords.domain.repository.DailyKeywordsRepository;
10+
import com.example.cp_main_be.domain.mission.daily_mission_master.MissionType;
1011
import com.example.cp_main_be.domain.mission.daily_mission_master.domain.DailyMissionMaster;
1112
import com.example.cp_main_be.domain.mission.daily_mission_master.domain.repository.DailyMissionMasterRepository;
1213
import com.example.cp_main_be.domain.mission.quiz.domain.QuizOptions;
@@ -80,6 +81,10 @@ public QuizOptions createQuizOption(AdminRequestDTO.CreateQuizRequestDTO request
8081
.findById(requestDTO.getMissionMasterId())
8182
.orElseThrow(() -> new IllegalStateException("해당 ID를 가진 미션이 존재하지 않습니다."));
8283

84+
if (dailyMissionMaster.getMissionType() != MissionType.QUIZ) {
85+
throw new IllegalArgumentException("퀴즈 타입의 미션에만 선지를 추가할 수 있습니다.");
86+
}
87+
8388
return QuizOptions.builder() // QuizOptions 퀴즈의 선지
8489
.optionText(requestDTO.getOptionText())
8590
.optionOrder(requestDTO.getOptionOrder())

src/main/java/com/example/cp_main_be/domain/content/a

Whitespace-only changes.

src/main/java/com/example/cp_main_be/domain/content/avatar/domain/Avatar.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public class Avatar {
1717
@Column(name = "avatar_id")
1818
private Long id;
1919

20+
private String name;
21+
2022
@Column(name = "image_url")
2123
private String imageUrl;
2224

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package com.example.cp_main_be.domain.content.avatar.dto.response;
22

3-
import com.example.cp_main_be.domain.content.avatar.domain.Avatar;
4-
import java.util.ArrayList;
53
import java.util.List;
64
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
76

7+
@Getter
88
@AllArgsConstructor
99
public class AvatarResponse {
10-
11-
List<Avatar> avatars = new ArrayList<>();
10+
List<AvatarSimpleResponse> avatars;
1211
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.example.cp_main_be.domain.content.avatar.dto.response;
2+
3+
import com.example.cp_main_be.domain.content.avatar.domain.Avatar;
4+
import lombok.Getter;
5+
6+
@Getter
7+
public class AvatarSimpleResponse {
8+
private Long id;
9+
private String name;
10+
private String imageUrl;
11+
12+
// Avatar 엔티티를 AvatarDto로 변환하는 생성자
13+
public AvatarSimpleResponse(Avatar avatar) {
14+
this.id = avatar.getId();
15+
this.name = avatar.getName();
16+
this.imageUrl = avatar.getImageUrl();
17+
}
18+
}

src/main/java/com/example/cp_main_be/domain/content/avatar/presentation/AvatarController.java

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package com.example.cp_main_be.domain.content.avatar.presentation;
22

3+
import com.example.cp_main_be.domain.content.avatar.domain.Avatar;
34
import com.example.cp_main_be.domain.content.avatar.dto.response.AvatarResponse;
5+
import com.example.cp_main_be.domain.content.avatar.dto.response.AvatarSimpleResponse;
46
import com.example.cp_main_be.domain.content.avatar.service.AvatarService;
57
import com.example.cp_main_be.domain.member.user.domain.User;
6-
import com.example.cp_main_be.global.util.ApiResponse;
8+
import com.example.cp_main_be.global.common.ApiResponse;
79
import io.swagger.v3.oas.annotations.Operation;
810
import io.swagger.v3.oas.annotations.tags.Tag;
11+
import java.util.List;
912
import lombok.RequiredArgsConstructor;
1013
import org.springframework.http.ResponseEntity;
1114
import org.springframework.security.core.annotation.AuthenticationPrincipal;
@@ -19,11 +22,19 @@ public class AvatarController {
1922

2023
private final AvatarService avatarService;
2124

22-
@Operation(summary = "아바타 선택 목록 조회", description = "선택 가능한 아바타 목록을 반환합니다")
25+
@Operation(summary = "선택 가능 아바타들 조회", description = "선택할 아바타 목록을 조회")
2326
@GetMapping("/register/avatars")
24-
public ResponseEntity<AvatarResponse> selectableAvatars() {
25-
AvatarResponse avatarResponse = new AvatarResponse(avatarService.getAllAvatar());
26-
return ResponseEntity.ok(avatarResponse);
27+
public ResponseEntity<ApiResponse<AvatarResponse>> getSelectableAvatars() {
28+
// 1. 서비스로부터 Avatar 엔티티 리스트를 받습니다.
29+
List<Avatar> avatarEntities = avatarService.getAllAvatar();
30+
31+
// 2. 엔티티 리스트를 DTO 리스트로 변환합니다.
32+
List<AvatarSimpleResponse> avatarDtos =
33+
avatarEntities.stream().map(AvatarSimpleResponse::new).toList();
34+
35+
// 3. DTO 리스트를 최종 응답 객체에 담아 반환합니다.
36+
AvatarResponse avatarResponse = new AvatarResponse(avatarDtos);
37+
return ResponseEntity.ok(ApiResponse.success(avatarResponse));
2738
}
2839

2940
@Operation(summary = "꽃가루 주기", description = "남의 아바타에게 꽃가루를 줍니다")
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
package com.example.cp_main_be.domain.delivery.domain;
2+
3+
import com.example.cp_main_be.domain.member.user.domain.User;
4+
import jakarta.persistence.*;
5+
import java.time.LocalDateTime;
6+
import lombok.AccessLevel;
7+
import lombok.Builder;
8+
import lombok.Getter;
9+
import lombok.NoArgsConstructor;
10+
11+
@Entity
12+
@Getter
13+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
14+
public class Delivery {
15+
16+
@Id
17+
@GeneratedValue(strategy = GenerationType.IDENTITY)
18+
private Long id;
19+
20+
@ManyToOne(fetch = FetchType.LAZY)
21+
@JoinColumn(name = "user_id", nullable = false)
22+
private User user; // 배송을 요청한 사용자
23+
24+
@Column(nullable = false)
25+
private String recipientName;
26+
27+
@Column(nullable = false)
28+
private String recipientPhone;
29+
30+
@Column(nullable = false)
31+
private String postalCode;
32+
33+
@Column(nullable = false)
34+
private String address;
35+
36+
private String addressDetail;
37+
private String message;
38+
39+
// 배송 상태를 관리하기 위한 Enum (추후 확장용)
40+
// @Enumerated(EnumType.STRING)
41+
// private DeliveryStatus status;
42+
43+
private LocalDateTime createdAt;
44+
45+
@PrePersist
46+
public void prePersist() {
47+
this.createdAt = LocalDateTime.now();
48+
// this.status = DeliveryStatus.REQUESTED;
49+
}
50+
51+
@Builder
52+
public Delivery(
53+
User user,
54+
String recipientName,
55+
String recipientPhone,
56+
String postalCode,
57+
String address,
58+
String addressDetail,
59+
String message) {
60+
this.user = user;
61+
this.recipientName = recipientName;
62+
this.recipientPhone = recipientPhone;
63+
this.postalCode = postalCode;
64+
this.address = address;
65+
this.addressDetail = addressDetail;
66+
this.message = message;
67+
}
68+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.example.cp_main_be.domain.delivery.domain.repository;
2+
3+
import com.example.cp_main_be.domain.delivery.domain.Delivery;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
6+
public interface DeliveryRepository extends JpaRepository<Delivery, Long> {}

0 commit comments

Comments
 (0)