Untitled

Anonymous
plain_text
02/10/2026 8:08 AM
14.9 KB
10
Indexable
package com.vnpay.controller;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.vnpay.common.BaseResponse;
import com.vnpay.common.CommonUtils;
import com.vnpay.common.ErrorCode;
import com.vnpay.dto.PageResponse;
import com.vnpay.dto.facility.FacilitiesSearchResponse;
import com.vnpay.dto.facility.GeneralFacilitySearchRequest;
import com.vnpay.dto.facility.LocationOptionsResponse;
import com.vnpay.dto.request.facility.FacilityDetailRequest;
import com.vnpay.dto.request.facility.FavoriteFacilitySearchRequest;
import com.vnpay.dto.request.facility.LikeFacilityRequest;
import com.vnpay.dto.request.facility.LocationOptionRequest;
import com.vnpay.dto.request.facility.MapFacilitySearchRequest;
import com.vnpay.dto.response.facility.FacilityDetailResponse;
import com.vnpay.pickle.repo.dto.FacilityReviewsResponse;
import com.vnpay.service.CourtService;
import com.vnpay.service.FacilityService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

@Slf4j
@RestController
@RequestMapping(value = "/facility")
@RequiredArgsConstructor
@Tag(name = "Facility Controller", description = "API lấy ra thông tin cụm sân")
public class FacilityController {
    private final CourtService courtService;
    private final FacilityService facilityService;
    private final ObjectMapper objectMapper;

    @Operation(
            summary = "Tìm kiếm danh sách cụm sân theo tiêu chí",
            description = "API tìm kiếm danh sách cụm sân dựa trên vị trí, bán kính và các tiêu chí lọc như sân trống hoặc sự kiện"
    )
    @ApiResponses(value = {
            @ApiResponse(responseCode = "00", description = "Truy vấn thành công"),
            @ApiResponse(responseCode = "400", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "90", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "99", description = "Exception")
    })
    @PostMapping("/search")
    public BaseResponse<PageResponse<FacilitiesSearchResponse>> searchFacilities(
            @RequestHeader(value = "X-Userinfo") String xUser,
            @Valid @RequestBody GeneralFacilitySearchRequest request
    ) {
        MDC.put(CommonUtils.TOKEN, request.getRequestId());

        long startTime = System.currentTimeMillis();

        BaseResponse<PageResponse<FacilitiesSearchResponse>> response =
                courtService.searchFacilitiesByCriteria(xUser, request);

        log.info(
                "Finish search facilities by criteria, requestId={}, code={}, message={}, duration={} ms",
                request.getRequestId(),
                response.getCode(),
                response.getMessage(),
                System.currentTimeMillis() - startTime
        );

        return response;
    }

    @Operation(
            summary = "Thích/ Bỏ thích cụm sân",
            description = "User like hoặc unlike một cụm sân"
    )
    @ApiResponses({
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "400", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "02", description = "Không tìm thấy cụm sân"),
            @ApiResponse(responseCode = "99", description = "Exception")
    })
    @PostMapping("/like")
    public BaseResponse<?> likeOrUnlikeFacility(
            @RequestHeader(value = "X-Userinfo") String xUser,
            @Valid @RequestBody LikeFacilityRequest request
    ) {
        MDC.put(CommonUtils.TOKEN, request.getRequestId());

        long startTime = System.currentTimeMillis();
        BaseResponse<?> response = courtService.likeOrUnlikeFacility(xUser, request);

        log.info("Finish like/unlike facility, requestId={}, code={}, message={}, duration={} ms",
                request.getRequestId(),
                response.getCode(),
                response.getMessage(),
                System.currentTimeMillis() - startTime
        );
        return response;
    }

    @Operation(
            summary = "Lấy danh sách cụm sân yêu thích của người dùng",
            description = "User tìm kiếm danh sách các cụm sân đã được đánh dấu yêu thích"
    )
    @ApiResponses({
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "400", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "99", description = "Exception")
    })
    @PostMapping("/favorite")
    public BaseResponse<PageResponse<FacilitiesSearchResponse>> getFavoriteFacilities(
            @RequestHeader(value = "X-Userinfo") String xUser,
            @Valid @RequestBody FavoriteFacilitySearchRequest request
    ) {
        MDC.put(CommonUtils.TOKEN, request.getRequestId());

        long startTime = System.currentTimeMillis();
        BaseResponse<PageResponse<FacilitiesSearchResponse>> response =
                courtService.getFavoriteFacilities(xUser, request);

        log.info(
                "Finish search favorite facilities, requestId={}, code={}, message={}, duration={} ms",
                request.getRequestId(),
                response.getCode(),
                response.getMessage(),
                System.currentTimeMillis() - startTime
        );

        return response;
    }

    @Operation(
            summary = "Lấy danh sách cụm sân gần vị trí người dùng",
            description = "User tìm kiếm danh sách các cụm sân xung quanh vị trí hiện tại"
    )
    @ApiResponses({
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "400", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "99", description = "Exception")
    })
    @PostMapping("/nearby")
    public BaseResponse<List<FacilitiesSearchResponse>> searchFacilitiesNearby(
            @RequestHeader(value = "X-Userinfo") String xUser,
            @Valid @RequestBody MapFacilitySearchRequest request
    ) {
        MDC.put(CommonUtils.TOKEN, request.getRequestId());

        long startTime = System.currentTimeMillis();
        BaseResponse<List<FacilitiesSearchResponse>> response =
                courtService.searchFacilitiesByLocation(xUser, request);

        log.info(
                "Finish search facilities nearby, requestId={}, code={}, message={}, duration={} ms",
                request.getRequestId(),
                response.getCode(),
                response.getMessage(),
                System.currentTimeMillis() - startTime
        );

        return response;
    }

    @Operation(
            summary = "Lấy danh sách tỉnh/thành phố, phường/xã",
            description = "API dùng để lấy danh sách tỉnh/thành phố và phường/xã phục vụ option select"
    )
    @ApiResponses({
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "400", description = "Tham số đầu vào không hợp lệ"),
            @ApiResponse(responseCode = "99", description = "Exception")
    })
    @PostMapping("/location-options")
    public BaseResponse<LocationOptionsResponse> getLocationOptions(
            @RequestHeader(value = "X-Userinfo") String xUser,
            @Valid @RequestBody LocationOptionRequest request
    ) {
        MDC.put(CommonUtils.TOKEN, request.getRequestId());

        long startTime = System.currentTimeMillis();

        BaseResponse<LocationOptionsResponse> response =
                courtService.getLocationOptions(xUser, request);

        log.info(
                "Finish get location options, requestId={}, code={}, message={}, duration={} ms",
                request.getRequestId(),
                response.getCode(),
                response.getMessage(),
                System.currentTimeMillis() - startTime
        );

        return response;
    }

    @Operation(summary = "Api lấy thông tin chi tiết của sân (dịch vụ, thông tin, thư viện)", description = "Trả về thông tin chi tiết sân (dịch vụ, thông tin, thư viện)")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "02", description = "Không tìm thấy cơ sở sân"),
            @ApiResponse(responseCode = "99", description = "Hệ thống xảy ra lỗi khi xử lý!"),
    })
    @GetMapping("/detail")
    public BaseResponse<FacilityDetailResponse> getFacilityDetail(
            @RequestHeader(value = "X-Userinfo", required = false) String xUser,
            @Valid @RequestBody FacilityDetailRequest request) {
        long startTime = System.currentTimeMillis();
        BaseResponse<FacilityDetailResponse> response = new BaseResponse<>();
        try {
            log.info("Begin getFacilityDetail req={} ", objectMapper.writeValueAsString(request));
            response = facilityService.getDetail(xUser, request);
            log.info("End getFacilityDetail, req_id={}, duration={}", request.getRequestId(), System.currentTimeMillis() - startTime);
        } catch (Exception ex) {
            log.error("Process getCourtDetail Exception, request_id={}, Ex= {}", request.getRequestId(), ex);
            response.setCode(ErrorCode.EXCEPTION.getCode());
            response.setMessage(ErrorCode.EXCEPTION.getMessage());
        }
        return response;
    }

    @Operation(summary = "Api lấy danh sách đánh giá của cơ sở sân", description = "Trả về điểm trung bình, tổng số đánh giá và danh sách đánh giá kèm ảnh")
    @ApiResponses(value = {
            @ApiResponse(responseCode = "00", description = "Thành công"),
            @ApiResponse(responseCode = "02", description = "Không tìm thấy cơ sở sân"),
            @ApiResponse(responseCode = "99", description = "Hệ thống xảy ra lỗi khi xử lý!"),
    })
    @GetMapping("/reviews")
    public BaseResponse<FacilityReviewsResponse> getFacilityReviews(
            @RequestHeader(value = "X-Userinfo", required = false) String xUser,
            @Valid @RequestBody FacilityDetailRequest request) {
        long startTime = System.currentTimeMillis();
        BaseResponse<FacilityReviewsResponse> response = new BaseResponse<>();
        try {
            log.info("Begin getFacilityReviews req={} ", objectMapper.writeValueAsString(request));
            response = facilityService.getReviews(xUser, request);
            log.info("End getFacilityReviews, req_id={}, duration={}", request.getRequestId(), System.currentTimeMillis() - startTime);
        } catch (Exception ex) {
            log.error("Process getFacilityReviews Exception, request_id={}, Ex= {}", request.getRequestId(), ex);
            response.setCode(ErrorCode.EXCEPTION.getCode());
            response.setMessage(ErrorCode.EXCEPTION.getMessage());
        }
        return response;
    }
}
Editor is loading...
Leave a Comment