Files
nahodka-back/src/main/java/com/krylov/refound/service/advertising/AdvertisingAdminService.java
2026-09-23 23:34:05 +03:00

103 lines
3.9 KiB
Java

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<AdvertisingAdminResponseDto> 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());
}
}