ImageService.java
package org.petify.image.service;
import org.petify.image.dto.ImageResponse;
import org.petify.image.exception.ImageNotFoundException;
import org.petify.image.exception.MaxImagesReachedException;
import org.petify.image.mapper.ImageMapper;
import org.petify.image.model.Image;
import org.petify.image.repository.ImageRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@RequiredArgsConstructor
@Service
public class ImageService {
private final ImageRepository imageRepository;
private final ImageMapper imageMapper;
private final StorageService storageService;
public ImageResponse getImageById(Long imageId) {
Image image = imageRepository.findById(imageId)
.orElseThrow(() -> new ImageNotFoundException(imageId));
return imageMapper.toDto(image);
}
public List<ImageResponse> getImagesByEntityId(Long entityId, String entityType) {
return imageRepository.findAllByEntityIdAndEntityType(entityId, entityType).stream()
.map(imageMapper::toDto)
.toList();
}
@Transactional
public ImageResponse uploadImage(Long entityId, String entityType, MultipartFile file) throws IOException {
int currentImageCount = imageRepository.countByEntityIdAndEntityType(entityId, entityType);
if (currentImageCount >= 5) {
throw new MaxImagesReachedException(entityId, entityType);
}
String storedFileName = storageService.uploadImage(file);
Image image = new Image();
image.setEntityId(entityId);
image.setEntityType(entityType);
image.setImageName(storedFileName);
Image savedImage = imageRepository.save(image);
return imageMapper.toDto(savedImage);
}
@Transactional
public List<ImageResponse> uploadImages(Long entityId, String entityType, List<MultipartFile> images) throws IOException {
List<ImageResponse> savedImages = new ArrayList<>();
for (MultipartFile image : images) {
savedImages.add(uploadImage(entityId, entityType, image));
}
return savedImages;
}
@Transactional
public void deleteImage(Long imageId) {
Image image = imageRepository.findById(imageId)
.orElseThrow(() -> new ImageNotFoundException(imageId));
storageService.deleteImage(image.getImageName());
imageRepository.delete(image);
}
}