package com.krylov.refound.controller.advertising; import com.krylov.refound.dto.advertising.CampaignCreateRequestDto; import com.krylov.refound.dto.advertising.CampaignResponseDto; import com.krylov.refound.dto.advertising.CampaignStatusUpdateRequestDto; import com.krylov.refound.dto.advertising.CampaignUpdateRequestDto; import com.krylov.refound.service.advertising.CampaignService; import jakarta.persistence.EntityNotFoundException; import jakarta.validation.Valid; import java.util.List; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController @RequestMapping("/api/v1/admin/campaigns") @RequiredArgsConstructor public class CampaignAdminController { private final CampaignService campaignService; @GetMapping @PreAuthorize("hasRole('ADMIN')") public ResponseEntity> getAllCampaigns() { List campaigns = campaignService.getCampaign(); return ResponseEntity .ok(campaigns); } @GetMapping("/{campaignId}") @PreAuthorize("hasRole('ADMIN')") public ResponseEntity getCampaignById(@PathVariable Long campaignId) { log.info("getCampaignById {}", campaignId); CampaignResponseDto campaign = campaignService.getCampaignById(campaignId) .orElseThrow(() -> new EntityNotFoundException("Campaign not found: " + campaignId)); return ResponseEntity.ok(campaign); } @PostMapping @PreAuthorize("hasRole('ADMIN')") public ResponseEntity createCampaign(@Valid @RequestBody CampaignCreateRequestDto request) { log.info("createCampaign {}", request); if (!request.startDate().isBefore(request.endDate())) { return ResponseEntity.badRequest().build(); } if (request.dailyImpressionCap() <= 0) { return ResponseEntity.badRequest().build(); } CampaignResponseDto campaign = campaignService.createCampaign(request); return ResponseEntity.status(HttpStatus.CREATED).body(campaign); } @PutMapping("/{campaignId}") @PreAuthorize("hasRole('ADMIN')") public ResponseEntity updateCampaign(@PathVariable Long campaignId, @Valid @RequestBody CampaignUpdateRequestDto request) { log.info("updateCampaign {}", campaignId); CampaignResponseDto campaign = campaignService.updateCampaign(campaignId, request); return ResponseEntity.ok(campaign); } @PatchMapping("/{campaignId}/status") @PreAuthorize("hasRole('ADMIN')") @Transactional public ResponseEntity updateStatus(@PathVariable Long campaignId, @Valid @RequestBody CampaignStatusUpdateRequestDto request) { log.info("updateStatus company {}", campaignId); CampaignResponseDto campaign = campaignService.updateCampaignStatus(campaignId, request); return ResponseEntity.ok(campaign); } }