FileManager.java

package dev.vernite.vernite.cdn;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.sql.SQLException;
import java.util.Date;
import java.util.HexFormat;

import javax.sql.rowset.serial.SerialBlob;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;

@Service
@Component
public class FileManager {

    @Autowired
    private FileRepository fileRepository;
    
    /**
     * Saves a file to the database or returns the existing one.
     * @param contentType
     * @param data
     * @return the file
     */
    public File uploadFile(String contentType, byte[] data) {
        String hash = calculateHash(data);
        File f = fileRepository.findByHash(hash);
        if (f != null) {
            return f;
        }
        f = new File();
        f.setContentType(contentType);
        f.setHash(hash);
        f.setUploaded(new Date());
        try {
            f.setFile(new SerialBlob(data));
        } catch (SQLException e) {
            // never happens
        }
        f = fileRepository.save(f);
        return f;
    }

    private static String calculateHash(byte[] data) {
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-256");
            digest.update(data);
            return HexFormat.of().formatHex(digest.digest());
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException(e);
        }
    }
}