Skip to content
GetFileController.java 2.56 KiB
Newer Older
Sonia Zorba's avatar
Sonia Zorba committed
/*
 * This file is part of vospace-file-service
 * Copyright (C) 2021 Istituto Nazionale di Astrofisica
 * SPDX-License-Identifier: GPL-3.0-or-later
 */
Sonia Zorba's avatar
Sonia Zorba committed
package it.inaf.ia2.transfer.controller;

import it.inaf.ia2.transfer.persistence.model.FileInfo;
Sonia Zorba's avatar
Sonia Zorba committed
import it.inaf.ia2.transfer.auth.TokenPrincipal;
import it.inaf.ia2.transfer.persistence.FileDAO;
import it.inaf.ia2.transfer.persistence.JobDAO;
import it.inaf.ia2.transfer.service.AuthorizationService;
import it.inaf.oats.vospace.exception.InvalidArgumentException;
import it.inaf.oats.vospace.exception.NodeNotFoundException;
import it.inaf.oats.vospace.exception.PermissionDeniedException;
Sonia Zorba's avatar
Sonia Zorba committed
import java.io.File;
import java.util.Optional;
import javax.servlet.http.HttpServletResponse;
Sonia Zorba's avatar
Sonia Zorba committed
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
Sonia Zorba's avatar
Sonia Zorba committed
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
Sonia Zorba's avatar
Sonia Zorba committed
import org.springframework.web.bind.annotation.RestController;

@RestController
public class GetFileController extends FileController {
Sonia Zorba's avatar
Sonia Zorba committed

Sonia Zorba's avatar
Sonia Zorba committed
    private static final Logger LOG = LoggerFactory.getLogger(GetFileController.class);

Sonia Zorba's avatar
Sonia Zorba committed
    @Autowired
    private FileDAO fileDAO;

Sonia Zorba's avatar
Sonia Zorba committed
    @Autowired
    private AuthorizationService authorizationService;
Sonia Zorba's avatar
Sonia Zorba committed

    @Autowired
    private HttpServletResponse response;

    @GetMapping("/**")
    public void getFile(@RequestParam(value = "jobId", required = false) String jobId) {
Sonia Zorba's avatar
Sonia Zorba committed

        String path = getPath();
        LOG.debug("getFile called for path {}", path);
        if (jobId == null) {
            LOG.debug("getFile called for path {}", path);
        } else {
            LOG.debug("getFile called for path {} with jobId {}", path, jobId);
Sonia Zorba's avatar
Sonia Zorba committed

            if (!jobDAO.isJobExisting(jobId)) {
                throw new InvalidArgumentException("Job " + jobId + " not found");
Sonia Zorba's avatar
Sonia Zorba committed
            }
        }

        handleFileJob(() -> {
            Optional<FileInfo> optFileInfo = fileDAO.getFileInfo(path);

            if (optFileInfo.isPresent()) {
Sonia Zorba's avatar
Sonia Zorba committed

                FileInfo fileInfo = optFileInfo.get();
Sonia Zorba's avatar
Sonia Zorba committed

                if (!authorizationService.isDownloadable(fileInfo, (TokenPrincipal) request.getUserPrincipal())) {
                    throw PermissionDeniedException.forPath(path);
                }

                File file = new File(fileInfo.getOsPath());
                FileResponseUtil.getFileResponse(response, file, path);
            } else {
                throw new NodeNotFoundException(path);
Sonia Zorba's avatar
Sonia Zorba committed
    }
}