StorageService.java
package com.learning.yasminishop.storage;
import com.google.cloud.storage.Acl;
import com.google.cloud.storage.Blob;
import com.google.cloud.storage.Bucket;
import com.google.firebase.cloud.StorageClient;
import com.learning.yasminishop.common.entity.Storage;
import com.learning.yasminishop.common.exception.AppException;
import com.learning.yasminishop.common.exception.ErrorCode;
import com.learning.yasminishop.common.utility.FirebaseUtility;
import com.learning.yasminishop.storage.dto.response.StorageResponse;
import com.learning.yasminishop.storage.mapper.StorageMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class StorageService {
private final StorageRepository storageRepository;
private final StorageMapper storageMapper;
private final FirebaseUtility firebaseUtility;
@Transactional
@PreAuthorize("hasRole('ADMIN')")
public StorageResponse saveFile(MultipartFile file, String folder) {
try {
String name = UUID.randomUUID().toString().concat(firebaseUtility.getExtension(Objects.requireNonNull(file.getOriginalFilename())));
String url = saveFileToFirebase(file, folder + "/" + name);
Storage storage = Storage.builder()
.name(name)
.type(file.getContentType())
.url(url)
.size(file.getSize())
.build();
return storageMapper.toStorageResponse(storageRepository.save(storage));
} catch (IOException e) {
log.error("Error saving file: {}", e.getMessage());
throw new AppException(ErrorCode.FILE_UPLOAD_FAILED);
}
}
private String saveFileToFirebase(MultipartFile file, String name) throws IOException {
Bucket bucket = StorageClient.getInstance().bucket();
Blob blob = bucket.create(name, file.getBytes(), file.getContentType());
blob.createAcl(Acl.of(Acl.User.ofAllUsers(), Acl.Role.READER));
return firebaseUtility.generatePublicUrl(bucket.getName(), name);
}
}