package com.krylov.refound.service.advertising; import com.krylov.refound.dto.advertising.AdvertisingAdminResponseDto; import com.krylov.refound.dto.advertising.AdvertisingCreateRequestDto; import com.krylov.refound.dto.advertising.AdvertisingUpdateRequestDto; import com.krylov.refound.dto.advertising.PresignUploadRequestDto; import com.krylov.refound.entity.advertising.Advertising; import com.krylov.refound.entity.advertising.Campaign; import com.krylov.refound.enums.advertising.AdvertisingType; import com.krylov.refound.enums.advertising.TranscodingStatus; import com.krylov.refound.repository.advertising.AdvertisingRepository; import jakarta.persistence.EntityNotFoundException; import java.util.List; import java.util.UUID; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @Slf4j @Service @RequiredArgsConstructor public class AdvertisingAdminService { private final AdvertisingRepository advertisingRepository; public Advertising createAdvertising(Campaign campaign, AdvertisingCreateRequestDto request){ Advertising advertising = new Advertising(); advertising.setCampaign(campaign); advertising.setType(request.type()); advertising.setTargetUrl(request.targetUrl()); advertising.setWeight(request.weight()); if (request.type() == AdvertisingType.IMAGE) { advertising.setMediaKey(request.mediaKey()); advertising.setTranscodingStatus(TranscodingStatus.READY); } else { // VIDEO — media_key появится только после presign-upload → confirm-upload → транскодинга advertising.setMediaKey(null); advertising.setTranscodingStatus(TranscodingStatus.PENDING); } log.info("Advertising {} created", advertising); return advertising; } public void updateTranscodingStatus(Long advertisingId){ advertisingRepository.updateTranscodingStatus(advertisingId, TranscodingStatus.PROCESSING); } public String getSourceKey(Long advertisingId,PresignUploadRequestDto request){ String extensionFor = extensionFor(request.contentType()); return "sources/%d/%s%s".formatted(advertisingId, UUID.randomUUID(), extensionFor); } public String extensionFor(String contentType) { return switch (contentType) { case "video/quicktime" -> ".mov"; case "video/webm" -> ".webm"; default -> ".mp4"; }; } public boolean isAllowedContentType(String contentType) { return contentType != null && (contentType.equals("video/mp4") || contentType.equals("video/quicktime") || contentType.equals("video/webm")); } public AdvertisingAdminResponseDto toAdminDto(Advertising advertising) { Advertising saved = advertisingRepository.save(advertising); return mapToAdminDto(saved); } public List getAdvertisingsByCampaign(Long campaignId) { return advertisingRepository.findAllByCampaignIdOrderByCreatedAtDesc(campaignId) .stream() .map(this::mapToAdminDto) .toList(); } public AdvertisingAdminResponseDto updateAdvertising(Long advertisingId, AdvertisingUpdateRequestDto request) { Advertising advertising = advertisingRepository.findById(advertisingId) .orElseThrow(() -> new EntityNotFoundException("Advertising not found: " + advertisingId)); advertising.setTargetUrl(request.targetUrl()); advertising.setWeight(request.weight()); Advertising saved = advertisingRepository.save(advertising); log.info("Advertising {} updated", saved.getId()); return mapToAdminDto(saved); } private AdvertisingAdminResponseDto mapToAdminDto(Advertising advertising) { return new AdvertisingAdminResponseDto( advertising.getId(), advertising.getCampaign().getId(), advertising.getType(), advertising.getTargetUrl(), advertising.getWeight(), advertising.getTranscodingStatus()); } }