CustomerMembershipQueryController.java

package com.deveagles.be15_deveagles_be.features.membership.query.controller;

import com.deveagles.be15_deveagles_be.common.dto.ApiResponse;
import com.deveagles.be15_deveagles_be.features.auth.command.application.model.CustomUser;
import com.deveagles.be15_deveagles_be.features.membership.query.dto.request.CustomerMemebershipFilterRequest;
import com.deveagles.be15_deveagles_be.features.membership.query.dto.response.CustomerExpiringMembershipResult;
import com.deveagles.be15_deveagles_be.features.membership.query.dto.response.CustomerMembershipResult;
import com.deveagles.be15_deveagles_be.features.membership.query.dto.response.CustomerPrepaidPassDetailInfo;
import com.deveagles.be15_deveagles_be.features.membership.query.dto.response.CustomerSessionPassDetailInfo;
import com.deveagles.be15_deveagles_be.features.membership.query.service.CustomerMembershipQueryService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import java.util.List;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.*;

@Tag(name = "회원권 조회", description = "고객 회원권 관련 조회 API")
@RestController
@RequestMapping("/customer-memberships")
@RequiredArgsConstructor
public class CustomerMembershipQueryController {

  private final CustomerMembershipQueryService customerMembershipQueryService;

  @Operation(summary = "고객 회원권 전체 조회", description = "샵에 등록된 모든 고객의 회원권 정보를 조회합니다.")
  @GetMapping
  public ResponseEntity<ApiResponse<CustomerMembershipResult>> getAllCustomerMemberships(
      @AuthenticationPrincipal CustomUser user,
      @RequestParam(defaultValue = "1") int page,
      @RequestParam(defaultValue = "10") int size) {

    CustomerMembershipResult result =
        customerMembershipQueryService.getCustomerMembershipList(user.getShopId(), page, size);
    return ResponseEntity.ok(ApiResponse.success(result));
  }

  @Operation(summary = "고객 회원권 필터 조회", description = "잔여 선불권 금액 등 조건에 따라 고객 회원권 정보를 조회합니다.")
  @PostMapping("/filter")
  public ResponseEntity<ApiResponse<CustomerMembershipResult>> getFilteredCustomerMemberships(
      @AuthenticationPrincipal CustomUser user,
      @RequestBody @Valid CustomerMemebershipFilterRequest filter) {

    CustomerMembershipResult result =
        customerMembershipQueryService.getCustomerMembershipList(user.getShopId(), filter);
    return ResponseEntity.ok(ApiResponse.success(result));
  }

  @Operation(summary = "고객 보유 선불권 상세 조회", description = "특정 고객이 보유한 선불권 상세 목록을 조회합니다.")
  @GetMapping("/prepaid-passes/detail/{customerId}")
  public ResponseEntity<ApiResponse<List<CustomerPrepaidPassDetailInfo>>>
      getCustomerPrepaidPassDetails(@PathVariable Long customerId) {

    List<CustomerPrepaidPassDetailInfo> result =
        customerMembershipQueryService.getPrepaidPassDetailsByCustomerId(customerId);

    return ResponseEntity.ok(ApiResponse.success(result));
  }

  @Operation(summary = "고객 보유 횟수권 상세 조회", description = "특정 고객이 보유한 횟수권 상세 목록을 조회합니다.")
  @GetMapping("/session-passes/detail/{customerId}")
  public ResponseEntity<ApiResponse<List<CustomerSessionPassDetailInfo>>>
      getCustomerSessionPassDetails(@PathVariable Long customerId) {

    List<CustomerSessionPassDetailInfo> result =
        customerMembershipQueryService.getSessionPassDetailsByCustomerId(customerId);

    return ResponseEntity.ok(ApiResponse.success(result));
  }

  @Operation(
      summary = "만료/사용완료된 회원권 목록 조회",
      description = "해당 매장의 만료되었거나 잔여량이 0인 선불권 및 횟수권 목록을 조회합니다.")
  @GetMapping("/expired-or-used-up/{customerId}")
  public ResponseEntity<ApiResponse<CustomerExpiringMembershipResult>>
      getExpiredOrUsedUpMemberships(@PathVariable Long customerId) {

    CustomerExpiringMembershipResult result =
        customerMembershipQueryService.getExpiredOrUsedUpMemberships(customerId);

    return ResponseEntity.ok(ApiResponse.success(result));
  }
}