CampaignCommandController.java

package com.deveagles.be15_deveagles_be.features.campaigns.command.application.controller;

import com.deveagles.be15_deveagles_be.common.dto.ApiResponse;
import com.deveagles.be15_deveagles_be.features.campaigns.command.application.dto.request.CreateCampaignRequest;
import com.deveagles.be15_deveagles_be.features.campaigns.command.application.dto.response.CampaignResponse;
import com.deveagles.be15_deveagles_be.features.campaigns.command.application.service.CampaignCommandService;
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 jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

@Tag(name = "캠페인 관리", description = "캠페인 생성, 삭제 API")
@RestController
@RequestMapping("/campaigns")
@RequiredArgsConstructor
@Validated
@Slf4j
public class CampaignCommandController {

  private final CampaignCommandService campaignCommandService;

  @Operation(summary = "캠페인 생성", description = "새로운 캠페인을 생성합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "201",
        description = "캠페인 생성 성공",
        content = @Content(schema = @Schema(implementation = CampaignResponse.class))),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "400",
        description = "잘못된 요청 데이터")
  })
  @PostMapping
  public ResponseEntity<ApiResponse<CampaignResponse>> createCampaign(
      @Parameter(description = "캠페인 생성 정보", required = true) @Valid @RequestBody
          CreateCampaignRequest request) {
    log.info("캠페인 생성 요청 - 제목: {}, 매장ID: {}", request.getCampaignTitle(), request.getShopId());

    CampaignResponse response = campaignCommandService.createCampaign(request);
    return ResponseEntity.status(HttpStatus.CREATED).body(ApiResponse.success(response));
  }

  @Operation(summary = "캠페인 삭제", description = "캠페인을 소프트 삭제합니다.")
  @ApiResponses({
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "200",
        description = "캠페인 삭제 성공"),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "404",
        description = "캠페인을 찾을 수 없음"),
    @io.swagger.v3.oas.annotations.responses.ApiResponse(
        responseCode = "400",
        description = "이미 삭제된 캠페인")
  })
  @DeleteMapping("/{campaignId}")
  public ResponseEntity<ApiResponse<String>> deleteCampaign(
      @Parameter(description = "캠페인 ID", required = true) @PathVariable Long campaignId) {
    log.info("캠페인 삭제 요청 - ID: {}", campaignId);

    campaignCommandService.deleteCampaign(campaignId);
    return ResponseEntity.ok(ApiResponse.success("캠페인이 성공적으로 삭제되었습니다."));
  }
}