Skip to content

Commit

Permalink
feat: 리뷰작성
Browse files Browse the repository at this point in the history
  • Loading branch information
koo995 committed Oct 10, 2024
1 parent e4206b2 commit 023bdcb
Show file tree
Hide file tree
Showing 16 changed files with 389 additions and 24 deletions.
2 changes: 2 additions & 0 deletions src/main/java/flab/nutridiary/commom/config/JdbcConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jdbc.core.convert.JdbcCustomConversions;
import org.springframework.data.jdbc.repository.config.AbstractJdbcConfiguration;
import org.springframework.data.jdbc.repository.config.EnableJdbcAuditing;

import java.util.Arrays;

@EnableJdbcAuditing
@Configuration
public class JdbcConfig extends AbstractJdbcConfiguration {

Expand Down
50 changes: 26 additions & 24 deletions src/main/java/flab/nutridiary/commom/file/FileService.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,21 +28,11 @@ public class FileService {
@Value("${cloud.aws.s3.bucketName}")
private String bucketName;

public String uploadImage(MultipartFile image) {
String originalFilename = image.getOriginalFilename();
String extension = getFileExtension(originalFilename);
String s3FileName = generateS3FileName(extension);
public String uploadReviewImage(MultipartFile image) {
String directory = "review/";

try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(image.getBytes())) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(getContentType(extension));
metadata.setContentLength(image.getSize());

uploadToS3(s3FileName, byteArrayInputStream, metadata);
return getS3FileUrl(s3FileName);
} catch (IOException e) {
throw new SystemException("이미지 업로드 중 오류가 발생했습니다.");
}
String s3FileName = directory + generateS3FileName(image);
return uploadToS3(s3FileName, image);
}

public void deleteImageFromS3(String imageAddress){
Expand All @@ -54,27 +44,39 @@ public void deleteImageFromS3(String imageAddress){
}
}

private String getFileExtension(String filename) {
return filename.substring(filename.lastIndexOf(".") + 1).toLowerCase();
private String getExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1).toLowerCase();
}

private String generateS3FileName(String extension) {
private String generateS3FileName(MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
return UUID.randomUUID().toString().substring(0, 10) + "_" + LocalDateTime.now() + "." + extension;
}

private String getContentType(String extension) {
return "image/" + extension;
}

private void uploadToS3(String s3FileName, ByteArrayInputStream inputStream, ObjectMetadata metadata) {
PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, s3FileName, inputStream, metadata);
amazonS3.putObject(putObjectRequest);
private ObjectMetadata getObjectMetadata(MultipartFile file, String extension) {
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("image/" + extension);
metadata.setContentLength(file.getSize());
return metadata;
}

private String getS3FileUrl(String s3FileName) {
return amazonS3.getUrl(bucketName, s3FileName).toString();
}

private String uploadToS3(String s3FileName, MultipartFile file) {
String extension = getExtension(file.getOriginalFilename());
ByteArrayInputStream inputStream = null;
try {
inputStream = new ByteArrayInputStream(file.getBytes());
} catch (IOException e) {
throw new SystemException("이미지처리 중 오류가 발생했습니다.");
}
ObjectMetadata metadata = getObjectMetadata(file, extension);
amazonS3.putObject(new PutObjectRequest(bucketName, s3FileName, inputStream, metadata));
return getS3FileUrl(s3FileName);
}

private String getKeyFromImageAddress(String imageAddress){
try{
URL url = new URL(imageAddress);
Expand Down
29 changes: 29 additions & 0 deletions src/main/java/flab/nutridiary/dietTag/domain/DietTag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package flab.nutridiary.dietTag.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.relational.core.mapping.Column;

import java.time.LocalDateTime;

@NoArgsConstructor
@Getter
public class DietTag {
@Id @Column("diet_tag_id")
private Long id;

private String dietPlan;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

public DietTag(String dietPlan) {
this.dietPlan = dietPlan;
}
}
36 changes: 36 additions & 0 deletions src/main/java/flab/nutridiary/productDietTag/ProductDietTag.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package flab.nutridiary.productDietTag;

import flab.nutridiary.dietTag.domain.DietTag;
import flab.nutridiary.product.domain.Product;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.data.relational.core.mapping.Column;

import java.time.LocalDateTime;

@ToString
@Getter
@NoArgsConstructor
public class ProductDietTag {
@Id @Column("product_diet_tag_id")
private Long id;

private AggregateReference<DietTag, Long> dietTagId;

private AggregateReference<Product, Long> productId;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

@Builder
public ProductDietTag(Long dietTagId, Long productId) {
this.dietTagId = AggregateReference.to(dietTagId);
this.productId = AggregateReference.to(productId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package flab.nutridiary.productDietTag;

import org.springframework.data.repository.CrudRepository;

public interface ProductDietTagRepository extends CrudRepository<ProductDietTag, Long> {
}
36 changes: 36 additions & 0 deletions src/main/java/flab/nutridiary/productStore/ProductStore.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package flab.nutridiary.productStore;

import flab.nutridiary.product.domain.Product;
import flab.nutridiary.store.domain.Store;
import lombok.*;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.data.relational.core.mapping.Column;

import java.time.LocalDateTime;

@ToString
@Getter
@NoArgsConstructor
public class ProductStore {
@Id @Column("product_store_id")
private Long id;

private AggregateReference<Store, Long> storeId;

private AggregateReference<Product, Long> productId;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

@Builder
public ProductStore(Long storeId, Long productId) {
this.storeId = AggregateReference.to(storeId);
this.productId = AggregateReference.to(productId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package flab.nutridiary.productStore;

import org.springframework.data.repository.CrudRepository;

public interface ProductStoreRepository extends CrudRepository<ProductStore, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package flab.nutridiary.review.controller;

import flab.nutridiary.commom.dto.ApiResponse;
import flab.nutridiary.review.dto.request.CreateReviewRequest;
import flab.nutridiary.review.dto.response.CreateReviewResponse;
import flab.nutridiary.review.service.ReviewService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

@RequiredArgsConstructor
@RestController
public class ReviewController {
private final ReviewService reviewService;

@PostMapping("review/new")
public ApiResponse<CreateReviewResponse> createReview(@ModelAttribute @Valid CreateReviewRequest createReviewRequest) {
return ApiResponse.success(reviewService.create(createReviewRequest));
}
}
46 changes: 46 additions & 0 deletions src/main/java/flab/nutridiary/review/domain/Review.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package flab.nutridiary.review.domain;

import flab.nutridiary.product.domain.Product;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.Id;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jdbc.core.mapping.AggregateReference;
import org.springframework.data.relational.core.mapping.Column;

import java.time.LocalDateTime;

@NoArgsConstructor
@ToString
@Getter
public class Review {
@Id @Column("review_id")
private Long id;

private Long memberId = 1L;

private AggregateReference<Product, Long> productId;

private String content;

private Short rating;

private String imageUrl;

@CreatedDate
private LocalDateTime createdAt;

@LastModifiedDate
private LocalDateTime updatedAt;

@Builder
public Review(Long productId, String content, Short rating, String imageUrl) {
this.productId = AggregateReference.to(productId);
this.content = content;
this.rating = rating;
this.imageUrl = imageUrl;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package flab.nutridiary.review.dto.request;

import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.ToString;
import org.springframework.web.multipart.MultipartFile;

@ToString
@Getter
public class CreateReviewRequest {
@NotNull(message = "상품 ID를 입력해주세요.")
private Long productId;

@NotNull(message = "리뷰 내용을 입력해주세요.")
private String content;

@NotNull(message = "식단 태그 ID를 입력해주세요.")
private Long dietTagId;

@NotNull(message = "매장 ID를 입력해주세요.")
private Long storeId;

private MultipartFile image;

@Max(value = 5, message = "평점은 5 이하이어야 합니다.")
@Min(value = 1, message = "평점은 1 이상이어야 합니다.")
@NotNull(message = "평점을 입력해주세요.")
private short rating;

public CreateReviewRequest(Long productId, String content, Long dietTagId, Long storeId, MultipartFile image, short rating) {
this.productId = productId;
this.content = content;
this.dietTagId = dietTagId;
this.storeId = storeId;
this.image = image;
this.rating = rating;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package flab.nutridiary.review.dto.response;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public class CreateReviewResponse {
private final Long reviewId;

public static CreateReviewResponse of(Long reviewId) {
return new CreateReviewResponse(reviewId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package flab.nutridiary.review.repository;

import flab.nutridiary.review.domain.Review;
import org.springframework.data.repository.CrudRepository;

public interface CrudReviewRepository extends CrudRepository<Review, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package flab.nutridiary.review.repository;

import flab.nutridiary.review.domain.Review;

public interface ReviewRepository {
Review save(Review review);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package flab.nutridiary.review.repository;

import flab.nutridiary.review.domain.Review;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

@RequiredArgsConstructor
@Transactional
@Repository
public class ReviewRepositoryImpl implements ReviewRepository {
private final CrudReviewRepository crudReviewRepository;

@Override
public Review save(Review review) {
return crudReviewRepository.save(review);
}
}
Loading

0 comments on commit 023bdcb

Please sign in to comment.