CampaignQueryController.java

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

import com.deveagles.be15_deveagles_be.common.dto.ApiResponse;
import com.deveagles.be15_deveagles_be.common.dto.PagedResponse;
import com.deveagles.be15_deveagles_be.common.dto.PagedResult;
import com.deveagles.be15_deveagles_be.features.campaigns.query.dto.request.CampaignSearchRequest;
import com.deveagles.be15_deveagles_be.features.campaigns.query.dto.response.CampaignQueryResponse;
import com.deveagles.be15_deveagles_be.features.campaigns.query.service.CampaignQueryService;
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.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@Tag(name = "캠페인 조회", description = "캠페인 조회 API")
@RestController
@RequestMapping("/campaigns")
@RequiredArgsConstructor
@Validated
@Slf4j
public class CampaignQueryController {

  private final CampaignQueryService campaignQueryService;

  @Operation(summary = "매장별 캠페인 조회", description = "매장 ID로 캠페인을 페이징 조회합니다. 삭제되지 않은 캠페인만 조회됩니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "캠페인 조회 성공",
        content = @Content(schema = @Schema(implementation = PagedResponse.class))),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "400",
        description = "잘못된 요청 파라미터")
  })
  @GetMapping
  public ResponseEntity<ApiResponse<PagedResponse<CampaignQueryResponse>>> getCampaignsByShop(
      @Parameter(description = "매장 ID", required = true, example = "1") @RequestParam Long shopId,
      @Parameter(description = "페이지 번호 (0부터 시작)", example = "0") @RequestParam(defaultValue = "0")
          int page,
      @Parameter(description = "페이지 크기", example = "10") @RequestParam(defaultValue = "10")
          int size) {
    log.info("매장별 캠페인 조회 요청 - 매장ID: {}, 페이지: {}, 크기: {}", shopId, page, size);

    CampaignSearchRequest request = new CampaignSearchRequest(shopId, page, size);
    PagedResult<CampaignQueryResponse> pagedResult =
        campaignQueryService.getCampaignsByShop(request);
    PagedResponse<CampaignQueryResponse> response = PagedResponse.from(pagedResult);

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

  @Operation(summary = "캠페인 상세 조회", description = "캠페인 ID로 특정 캠페인의 상세 정보를 조회합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "캠페인 조회 성공",
        content = @Content(schema = @Schema(implementation = CampaignQueryResponse.class))),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "404",
        description = "캠페인을 찾을 수 없음")
  })
  @GetMapping("/{id}")
  public ResponseEntity<ApiResponse<CampaignQueryResponse>> getCampaignById(
      @Parameter(description = "캠페인 ID", required = true, example = "1") @PathVariable Long id) {
    log.info("캠페인 상세 조회 요청 - ID: {}", id);

    CampaignQueryResponse campaign =
        campaignQueryService
            .getCampaignById(id)
            .orElseThrow(() -> new RuntimeException("캠페인을 찾을 수 없습니다."));

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