103 lines
3.9 KiB
Java
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());
|
|
}
|
|
|
|
|
|
}
|