Skip to content

Commit 3153a15

Browse files
authored
Merge pull request #18 from Decodeat/feat/15-product-update-info
feat: 상품 정보 업데이트 요청, ReportRecord 상속 구조
2 parents e1005c0 + bf3c532 commit 3153a15

File tree

16 files changed

+372
-9
lines changed

16 files changed

+372
-9
lines changed

src/main/java/com/DecodEat/domain/products/controller/ProductController.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,4 @@ public ApiResponse<PageResponseDto<ProductRegisterHistoryDto>> getRegisterHistor
103103
return ApiResponse.onSuccess(productService.getRegisterHistory(user, pageable));
104104
}
105105

106-
107106
}

src/main/java/com/DecodEat/domain/products/entity/Product.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.DecodEat.global.common.BaseEntity;
55
import jakarta.persistence.*;
66
import lombok.*;
7+
import lombok.experimental.SuperBuilder;
78

89
import java.util.ArrayList;
910
import java.util.List;
@@ -12,9 +13,9 @@
1213
@Table(name = "product")
1314
@Getter
1415
@Setter
15-
@NoArgsConstructor
16+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
1617
@AllArgsConstructor
17-
@Builder
18+
@SuperBuilder
1819
public class Product extends BaseEntity {
1920

2021
@Id
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package com.DecodEat.domain.report.controller;
2+
3+
import com.DecodEat.domain.products.dto.response.ProductDetailDto;
4+
import com.DecodEat.domain.report.dto.request.ProductNutritionUpdateRequestDto;
5+
import com.DecodEat.domain.report.dto.response.ReportResponseDto;
6+
import com.DecodEat.domain.report.service.ReportService;
7+
import com.DecodEat.domain.users.entity.User;
8+
import com.DecodEat.global.apiPayload.ApiResponse;
9+
import com.DecodEat.global.common.annotation.CurrentUser;
10+
import io.swagger.v3.oas.annotations.Operation;
11+
import io.swagger.v3.oas.annotations.tags.Tag;
12+
import lombok.RequiredArgsConstructor;
13+
import org.springframework.web.bind.annotation.*;
14+
15+
@RestController
16+
@RequiredArgsConstructor
17+
@RequestMapping("/api/reports")
18+
@Tag(name = "신고")
19+
public class ReportController {
20+
21+
private final ReportService reportService;
22+
23+
@Operation(
24+
summary = "상품 정보 업데이트 요청",
25+
description = "사이트의 영양정보가 실제와 다른 경우 수정 요청")
26+
@PostMapping("/nutrition-info")
27+
public ApiResponse<ReportResponseDto> requestUpdateNutritionInfo(@CurrentUser User user,
28+
@RequestParam Long productId,
29+
@RequestBody ProductNutritionUpdateRequestDto requestDto) {
30+
31+
return ApiResponse.onSuccess(reportService.requestUpdateNutrition(user, productId, requestDto));
32+
}
33+
34+
@Operation(
35+
summary = "상품 사진 확인 요청",
36+
description = "부적절한 이미지인 경우 확인 요청")
37+
@PostMapping("/image")
38+
public ApiResponse<ReportResponseDto> requestCheckImage(@CurrentUser User user,
39+
@RequestParam Long productId,
40+
@RequestParam String imageUrl) {
41+
42+
return ApiResponse.onSuccess(reportService.requestCheckImage(user, productId, imageUrl));
43+
}
44+
}
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.DecodEat.domain.report.converter;
2+
3+
import com.DecodEat.domain.products.entity.Product;
4+
import com.DecodEat.domain.report.dto.request.ProductNutritionUpdateRequestDto;
5+
import com.DecodEat.domain.report.dto.response.ReportResponseDto;
6+
import com.DecodEat.domain.report.entity.ImageReport;
7+
import com.DecodEat.domain.report.entity.NutritionReport;
8+
import com.DecodEat.domain.report.entity.ReportStatus;
9+
import com.DecodEat.domain.users.entity.User;
10+
11+
public class ReportConverter {
12+
public static ReportResponseDto toReportResponseDto(Long productId, String type){
13+
return ReportResponseDto.builder()
14+
.productId(productId)
15+
.reportContent(type)
16+
.build();
17+
}
18+
19+
public static NutritionReport toNutritionReport(Long reporterId, Product product,ProductNutritionUpdateRequestDto requestDto){
20+
return NutritionReport.builder()
21+
.product(product)
22+
.reporterId(reporterId)
23+
.reportStatus(ReportStatus.IN_PROGRESS)
24+
.calcium(requestDto.getCalcium())
25+
.carbohydrate(requestDto.getCarbohydrate())
26+
.cholesterol(requestDto.getCholesterol())
27+
.dietaryFiber(requestDto.getDietaryFiber())
28+
.energy(requestDto.getEnergy())
29+
.fat(requestDto.getFat())
30+
.protein(requestDto.getProtein())
31+
.satFat(requestDto.getSatFat())
32+
.sodium(requestDto.getSodium())
33+
.sugar(requestDto.getSugar())
34+
.transFat(requestDto.getTransFat())
35+
.build();
36+
}
37+
38+
public static ImageReport toImageReport(Long reporterId, Product product, String imageUrl){
39+
return ImageReport.builder()
40+
.product(product)
41+
.reporterId(reporterId)
42+
.reportStatus(ReportStatus.IN_PROGRESS)
43+
.imageUrl(imageUrl)
44+
.build();
45+
}
46+
47+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.DecodEat.domain.report.dto.request;
2+
3+
import jakarta.validation.constraints.NotNull;
4+
import jakarta.validation.constraints.PositiveOrZero;
5+
import lombok.Getter;
6+
import lombok.NoArgsConstructor;
7+
8+
@Getter
9+
@NoArgsConstructor
10+
public class ProductNutritionUpdateRequestDto {
11+
@NotNull(message = "칼슘 정보는 필수입니다.")
12+
@PositiveOrZero(message = "칼슘은 0 이상의 값이어야 합니다.")
13+
private Double calcium;
14+
15+
@NotNull(message = "탄수화물 정보는 필수입니다.")
16+
@PositiveOrZero(message = "탄수화물은 0 이상의 값이어야 합니다.")
17+
private Double carbohydrate;
18+
19+
@NotNull(message = "콜레스테롤 정보는 필수입니다.")
20+
@PositiveOrZero(message = "콜레스테롤은 0 이상의 값이어야 합니다.")
21+
private Double cholesterol;
22+
23+
@NotNull(message = "식이섬유 정보는 필수입니다.")
24+
@PositiveOrZero(message = "식이섬유는 0 이상의 값이어야 합니다.")
25+
private Double dietaryFiber;
26+
27+
@NotNull(message = "열량 정보는 필수입니다.")
28+
@PositiveOrZero(message = "열량은 0 이상의 값이어야 합니다.")
29+
private Double energy;
30+
31+
@NotNull(message = "지방 정보는 필수입니다.")
32+
@PositiveOrZero(message = "지방은 0 이상의 값이어야 합니다.")
33+
private Double fat;
34+
35+
@NotNull(message = "단백질 정보는 필수입니다.")
36+
@PositiveOrZero(message = "단백질은 0 이상의 값이어야 합니다.")
37+
private Double protein;
38+
39+
@NotNull(message = "포화지방 정보는 필수입니다.")
40+
@PositiveOrZero(message = "포화지방은 0 이상의 값이어야 합니다.")
41+
private Double satFat;
42+
43+
@NotNull(message = "나트륨 정보는 필수입니다.")
44+
@PositiveOrZero(message = "나트륨은 0 이상의 값이어야 합니다.")
45+
private Double sodium;
46+
47+
@NotNull(message = "당류 정보는 필수입니다.")
48+
@PositiveOrZero(message = "당류는 0 이상의 값이어야 합니다.")
49+
private Double sugar;
50+
51+
@NotNull(message = "트랜스지방 정보는 필수입니다.")
52+
@PositiveOrZero(message = "트랜스지방은 0 이상의 값이어야 합니다.")
53+
private Double transFat;
54+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package com.DecodEat.domain.report.dto.response;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import jakarta.validation.constraints.NotNull;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Getter;
8+
import lombok.NoArgsConstructor;
9+
10+
@Getter
11+
@NoArgsConstructor
12+
@Builder
13+
@AllArgsConstructor
14+
public class ReportResponseDto {
15+
16+
@NotNull
17+
@Schema(name = "제품 id", example = "1")
18+
Long productId;
19+
20+
@NotNull
21+
@Schema(name = "신고 유형", example = "영양 정보 수정")
22+
String reportContent;
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package com.DecodEat.domain.report.entity;
2+
3+
4+
import jakarta.persistence.Column;
5+
import jakarta.persistence.DiscriminatorValue;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.Table;
8+
import lombok.AccessLevel;
9+
import lombok.AllArgsConstructor;
10+
import lombok.Getter;
11+
import lombok.NoArgsConstructor;
12+
import lombok.experimental.SuperBuilder;
13+
14+
15+
@Entity
16+
@Table(name = "image_reports")
17+
@Getter
18+
@DiscriminatorValue("INAPPROPRIATE_IMAGE")
19+
@SuperBuilder
20+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
21+
public class ImageReport extends ReportRecord {
22+
23+
@Column(name = "image_url")
24+
private String imageUrl;
25+
26+
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package com.DecodEat.domain.report.entity;
2+
3+
import com.DecodEat.domain.products.entity.Product;
4+
import jakarta.persistence.*;
5+
import lombok.*;
6+
import lombok.experimental.SuperBuilder;
7+
8+
@Entity
9+
@Table(name = "nutrition_reports")
10+
@Getter
11+
@SuperBuilder
12+
@AllArgsConstructor
13+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
14+
@DiscriminatorValue("NUTRITION_UPDATE")
15+
public class NutritionReport extends ReportRecord {
16+
17+
@Column(name = "calcium")
18+
private Double calcium;
19+
20+
@Column(name = "carbohydrate")
21+
private Double carbohydrate;
22+
23+
@Column(name = "cholesterol")
24+
private Double cholesterol;
25+
26+
@Column(name = "dietary_fiber")
27+
private Double dietaryFiber;
28+
29+
@Column(name = "energy")
30+
private Double energy;
31+
32+
@Column(name = "fat")
33+
private Double fat;
34+
35+
@Column(name = "protein")
36+
private Double protein;
37+
38+
@Column(name = "sat_fat")
39+
private Double satFat;
40+
41+
@Column(name = "sodium")
42+
private Double sodium;
43+
44+
@Column(name = "sugar")
45+
private Double sugar;
46+
47+
@Column(name = "trans_fat")
48+
private Double transFat;
49+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.DecodEat.domain.report.entity;
2+
3+
import com.DecodEat.domain.products.entity.Product;
4+
import com.DecodEat.global.common.BaseEntity;
5+
import io.swagger.v3.oas.annotations.media.Schema;
6+
import jakarta.persistence.*;
7+
import lombok.*;
8+
import lombok.experimental.SuperBuilder;
9+
10+
@Entity
11+
@Getter
12+
@SuperBuilder // 자식 클래스에서 부모 클래스 필드까지 빌드(컴파일 시점에) <-> @Builder
13+
@AllArgsConstructor
14+
@NoArgsConstructor(access = AccessLevel.PROTECTED) // 서비스 코드 등 다른 곳에서 의미 없는 빈 객체를 실수로 생성하는 것 예방
15+
@Table(name = "report_records")
16+
@Inheritance(strategy = InheritanceType.JOINED) // JOINED 사용
17+
@DiscriminatorColumn(name = "REPORT_TYPE") // 자식 엔티티를 구분할 컬럼 (JPA가 생성)
18+
public abstract class ReportRecord extends BaseEntity {
19+
20+
@Id
21+
@GeneratedValue(strategy = GenerationType.IDENTITY)
22+
private Long id;
23+
24+
@ManyToOne(fetch = FetchType.LAZY)
25+
@JoinColumn(name = "product_id", nullable = false)
26+
private Product product;
27+
28+
@Column(nullable = false)
29+
private Long reporterId;
30+
31+
@Enumerated(EnumType.STRING)
32+
@Column(nullable = false)
33+
@Schema(name = "처리 상태", example = "IN_PROGRESS")
34+
private ReportStatus reportStatus;
35+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.DecodEat.domain.report.entity;
2+
3+
public enum ReportStatus {
4+
IN_PROGRESS,
5+
UPDATED,
6+
CHECKED
7+
}

0 commit comments

Comments
 (0)