package com.tourguide.api.mini;
|
|
import com.tourguide.common.api.ApiResponse;
|
import com.tourguide.modules.review.dto.OrderReviewCreateRequest;
|
import com.tourguide.modules.review.dto.OrderReviewResponse;
|
import com.tourguide.modules.review.service.OrderReviewService;
|
import com.tourguide.modules.review.dto.ReviewImageUploadResponse;
|
import com.tourguide.modules.review.service.ReviewImageStorageService;
|
import com.tourguide.security.AppUserPrincipal;
|
import org.springframework.http.MediaType;
|
import org.springframework.security.core.annotation.AuthenticationPrincipal;
|
import org.springframework.web.bind.annotation.*;
|
import javax.validation.Valid;
|
import org.springframework.web.multipart.MultipartFile;
|
|
/**
|
* 游客小程序订单评价接口。
|
* 评价身份取自当前 MINI Token,防止客户端伪造其他游客身份提交评价。
|
*/
|
@RestController
|
@RequestMapping("/api/mini/reviews")
|
public class MiniOrderReviewController {
|
private final OrderReviewService reviewService;
|
private final ReviewImageStorageService imageStorageService;
|
public MiniOrderReviewController(OrderReviewService reviewService, ReviewImageStorageService imageStorageService) {
|
this.reviewService = reviewService;
|
this.imageStorageService = imageStorageService;
|
}
|
|
@PostMapping(value = "/images", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
|
public ApiResponse<ReviewImageUploadResponse> uploadImage(
|
@AuthenticationPrincipal AppUserPrincipal principal,
|
@RequestPart("file") MultipartFile file) {
|
return ApiResponse.success(new ReviewImageUploadResponse(imageStorageService.store(file)));
|
}
|
|
/**
|
* 为当前游客本人的已完成订单创建评价,并在成功后重新计算导游平均评分。
|
* 仅允许评价已完成、已关联导游且尚未评价的本人订单。
|
*
|
* @param principal 安全过滤器解析出的当前游客身份
|
* @param request 订单主键、评分和评价内容
|
* @return 新建的订单评价
|
*/
|
@PostMapping
|
public ApiResponse<OrderReviewResponse> create(@AuthenticationPrincipal AppUserPrincipal principal,
|
@Valid @RequestBody OrderReviewCreateRequest request) {
|
return ApiResponse.success(reviewService.create(principal.getUserId(), request));
|
}
|
|
@GetMapping("/orders/{orderId}")
|
public ApiResponse<OrderReviewResponse> detailByOrder(@AuthenticationPrincipal AppUserPrincipal principal,
|
@PathVariable Long orderId) {
|
return ApiResponse.success(reviewService.detailByOrder(principal.getUserId(), orderId));
|
}
|
}
|