S3ObjectService.java

package api.services;

import java.io.InputStream;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import api.entities.S3Object;
import api.repositories.S3ObjectRepository;
import api.services.storage.SimpleStorageService;

/**
 * {@link S3ObjectService} is the connection to the S3 storage and S3 object database.
 */
@Service
public class S3ObjectService {
    @Autowired
    private S3ObjectRepository s3ObjectRepository;
    @Autowired
    private SimpleStorageService simpleStorageService;

    public static final String AVATAR_DIR = "avatar/";

    @Value("${api.s3.max:50000000}")
    private long maxObjectSize;

    /**
     * Download S3 object from storage.
     *
     * @param object Object
     * @return {@link InputStream}
     */
    @Transactional(readOnly = true)
    public InputStream download(S3Object object) {
        return simpleStorageService.downloadObject(object.getKey());
    }

    /**
     * Save object to S3 storage and S3 object database.
     *
     * @param object Object
     * @param in File to save
     */
    @Transactional
    public void save(S3Object object, InputStream in) {
        if (object.getSize() > maxObjectSize) {
            throw new IllegalArgumentException("File size exceeds limit (" + maxObjectSize + " bytes).");
        }
        simpleStorageService.uploadObject(object.getKey(), in, object.getSize());
        s3ObjectRepository.save(object);
    }

    /**
     * Delete object from S3 storage and S3 object database.
     *
     * @param object Object
     */
    @Transactional
    public void delete(S3Object object) {
        s3ObjectRepository.delete(object);
        simpleStorageService.deleteObject(object.getKey());
    }
}