Skip to content
Original file line number Diff line number Diff line change
@@ -1,12 +1,19 @@
package devkor.com.teamcback.domain.common.repository;

import devkor.com.teamcback.domain.common.entity.File;
import devkor.com.teamcback.domain.review.repository.CustomFileRepository;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface FileRepository extends JpaRepository<File, Long> {
public interface FileRepository extends JpaRepository<File, Long>, CustomFileRepository {
List<File> findAllByFileUuid(String fileUuid);

List<File> findTop10AllByFileUuidOrderBySortNumAsc(String fileUuid);

List<File> findTop5AllByFileUuidOrderBySortNumAsc(String fileUuid);

List<File> findTop3AllByFileUuidOrderBySortNumAsc(String fileUuid);

File findByFileUuidAndSortNum(String fileUuid, Long sortNum);
}
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,7 @@ public void uploadThumb(File savedFile, MultipartFile file, Integer width, Integ
InputStream inputStream = new ByteArrayInputStream(os.toByteArray());

// 저장
String thumbSavedName = s3Util.uploadFile(inputStream, savedFile.getFileUuid(), filePath, file.getContentType());
String thumbSavedName = s3Util.uploadFile(inputStream, savedFile.getFileOriginalName(), filePath, file.getContentType());
savedFile.setThumbSavedName(thumbSavedName);
}

Expand Down Expand Up @@ -167,6 +167,22 @@ public void deleteFile(String fileUuid) {
fileRepository.deleteAll(savedFileList);
}

public List<File> getFiles(String fileUuid) {
return fileRepository.findAllByFileUuid(fileUuid);
}

public List<File> getTop10Files(String fileUuid) {
return fileRepository.findTop10AllByFileUuidOrderBySortNumAsc(fileUuid);
}

public List<File> getTop5Files(String fileUuid) {
return fileRepository.findTop5AllByFileUuidOrderBySortNumAsc(fileUuid);
}

public List<File> getTop3Files(String fileUuid) {
return fileRepository.findTop3AllByFileUuidOrderBySortNumAsc(fileUuid);
}

public List<String> getOriginalFiles(String fileUuid) {
List<String> fileList = fileRepository.findAllByFileUuid(fileUuid).stream().map(File::getFileSavedName).toList();

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package devkor.com.teamcback.domain.place.controller;

import devkor.com.teamcback.domain.building.dto.response.SaveBuildingMainImageRes;
import devkor.com.teamcback.domain.place.dto.request.CreatePlaceReq;
import devkor.com.teamcback.domain.place.dto.request.ModifyPlaceReq;
import devkor.com.teamcback.domain.place.dto.response.CreatePlaceRes;
Expand All @@ -18,7 +17,6 @@
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

Expand Down Expand Up @@ -92,7 +90,7 @@ public CommonResponse<DeletePlaceRes> deletePlace(
return CommonResponse.success(adminPlaceService.deletePlace(placeId));
}

@PostMapping(value = "/{placeId}/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
// @PostMapping(value = "/{placeId}/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
@Operation(summary = "장소 사진 저장", description = "장소 사진 저장(첫 사진이 대표 사진)")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,17 @@ public class Place extends BaseEntity {
private Integer maskIndex;

@Column(nullable = false)
private Integer starSum = 0;
private double starSum = 0;

@Column(nullable = false)
private Integer starNum = 0;
private int starNum = 0;

@Column
private String contact; // 연락처 등

@Column
private String foodType;

@ManyToOne
@JoinColumn(name = "building_id")
private Building building;
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,131 @@
package devkor.com.teamcback.domain.review.controller;

import devkor.com.teamcback.domain.review.dto.request.CreateReviewReq;
import devkor.com.teamcback.domain.review.dto.request.ModifyReviewReq;
import devkor.com.teamcback.domain.review.dto.response.*;
import devkor.com.teamcback.domain.review.service.ReviewService;
import devkor.com.teamcback.global.response.CommonResponse;
import devkor.com.teamcback.global.security.UserDetailsImpl;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.Schema;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

import java.util.List;


@RestController
@RequiredArgsConstructor
@RequestMapping("/api/reviews")
public class ReviewController {

private final ReviewService reviewService;

@Operation(summary = "리뷰 태그 종류 검색")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@GetMapping("/tags")
public CommonResponse<GetReviewTagListRes> getReviewTagList() {
return CommonResponse.success(reviewService.getReviewTagList());
}

@Operation(summary = "리뷰가 있는 장소의 리뷰 목록 포함 상세 검색",
description = "식당, 카페")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@GetMapping("/places/{placeId}")
public CommonResponse<GetReviewPlaceDetailRes> getReviewPlaceDetail(
@Parameter(name = "placeId", description = "장소 ID") @PathVariable Long placeId) {

return CommonResponse.success(reviewService.getReviewPlaceDetail(placeId));
}

@Operation(summary = "리뷰가 있는 장소의 리뷰 목록 포함 상세 검색 - 무한스크롤로 리뷰 사진 추가 조회",
description = "식당, 카페")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@GetMapping("/places/{placeId}/images")
public CommonResponse<List<SearchReviewImageRes>> getReviewPlaceDetailImages(
@Parameter(name = "placeId", description = "장소 ID") @PathVariable Long placeId,
@Parameter(name = "lastFileId", description = "마지막 조회한 사진 id") @RequestParam Long lastFileId) {

return CommonResponse.success(reviewService.getReviewPlaceDetailImages(placeId, lastFileId));
}

// TODO: 리뷰 작성 시 포인트 부여
@Operation(summary = "리뷰 작성",
description = "식당, 카페에 대한 리뷰를 작성")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@PostMapping(value = "/places/{placeId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResponse<CreateReviewRes> createReview(
@Parameter(description = "사용자정보", required = true) @AuthenticationPrincipal UserDetailsImpl userDetail,
@Parameter(name = "placeId", description = "장소 ID") @PathVariable Long placeId,
@Parameter(description = "리뷰 작성 내용", required = true) @Valid @ModelAttribute CreateReviewReq createReviewReq) {

return CommonResponse.success(reviewService.createReview(userDetail.getUser().getUserId(), placeId, createReviewReq));
}

@Operation(summary = "리뷰 조회",
description = "식당, 카페에 대한 리뷰 조회")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@GetMapping("/{reviewId}")
public CommonResponse<GetReviewRes> getReview(
@Parameter(name = "reviewId", description = "리뷰 ID") @PathVariable Long reviewId) {
return CommonResponse.success(reviewService.getReview(reviewId));
}

@Operation(summary = "리뷰 수정",
description = "식당, 카페에 대한 리뷰를 수정")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@PutMapping(value = "/{reviewId}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public CommonResponse<ModifyReviewRes> modifyReview(
@Parameter(description = "사용자정보", required = true) @AuthenticationPrincipal UserDetailsImpl userDetail,
@Parameter(name = "reviewId", description = "리뷰 ID") @PathVariable Long reviewId,
@Parameter(description = "리뷰 작성 내용", required = true) @Valid @ModelAttribute ModifyReviewReq modifyReviewReq) {

return CommonResponse.success(reviewService.modifyReview(userDetail.getUser().getUserId(), reviewId, modifyReviewReq));
}

// TODO: 리뷰 삭제 시 포인트 제거
@Operation(summary = "리뷰 삭제",
description = "식당, 카페에 대한 리뷰를 삭제")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "정상 처리 되었습니다."),
@ApiResponse(responseCode = "401", description = "권한이 없습니다.",
content = @Content(schema = @Schema(implementation = CommonResponse.class))),
})
@DeleteMapping( "/{reviewId}")
public CommonResponse<DeleteReviewRes> deleteReview(
@Parameter(description = "사용자정보", required = true) @AuthenticationPrincipal UserDetailsImpl userDetail,
@Parameter(name = "reviewId", description = "리뷰 ID") @PathVariable Long reviewId) {
return CommonResponse.success(reviewService.deleteReview(userDetail.getUser().getUserId(), reviewId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package devkor.com.teamcback.domain.review.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@Schema(description = "저장할 리뷰 정보")
@Getter
@Setter
public class CreateReviewReq {

@Schema(description = "별점", example = "1.5")
@DecimalMin(value = "0.5", message = "별점을 입력해주세요.")
private double score;

@Schema(description = "재방문 여부", example = "false")
private boolean isRevisit = false;

@Schema(description = "리뷰 태그 리스트")
@Size(max = 5, message = "태그는 최대 5개까지 가능합니다.")
private List<Long> tagIds = new ArrayList<>();

@Schema(description = "한줄평", example = "맛있고 좋아요.")
private String comment;

@Size(max = 3)
@Schema(description = "첨부 사진")
private List<MultipartFile> images = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package devkor.com.teamcback.domain.review.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.DecimalMin;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

@Schema(description = "수정할 리뷰 정보")
@Getter
@Setter
public class ModifyReviewReq {

@Schema(description = "별점", example = "1.5")
@DecimalMin(value = "0.5", message = "별점을 입력해주세요.")
private double score;

@Schema(description = "재방문 여부", example = "false")
private boolean isRevisit = false;

@Schema(description = "리뷰 태그 리스트")
@Size(max = 5, message = "태그는 최대 5개까지 가능합니다.")
private List<Long> tagIds = new ArrayList<>();

@Schema(description = "한줄평", example = "맛있고 좋아요.")
private String comment;

@Size(max = 3)
@Schema(description = "첨부 사진")
private List<MultipartFile> images = new ArrayList<>();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package devkor.com.teamcback.domain.review.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;

@Schema(description = "리뷰 생성 응답 dto")
@Getter
public class CreateReviewRes {
private Long reviewId;

public CreateReviewRes(Long id) {
this.reviewId = id;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package devkor.com.teamcback.domain.review.dto.response;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.v3.oas.annotations.media.Schema;

@Schema(description = "리뷰 삭제 응답 dto")
@JsonIgnoreProperties
public class DeleteReviewRes {
}
Loading