LibreCat/LibreCat

View on GitHub
lib/LibreCat/App/Catalogue/Route/upload.pm

Summary

Maintainability
Test Coverage
package LibreCat::App::Catalogue::Route::upload;

=head1 NAME LibreCat::App::Catalogue::Route::upload

Route handler for uploading files.

=cut

use Catmandu::Sane;
use Catmandu::Util qw(:is);
use LibreCat::App::Catalogue::Controller::File qw/upload_temp_file remove_temp_file/;
use Dancer ':syntax';

=head1 REST METHODS

All methods for file uploads

=cut

=head2 POST /librecat/upload?file=[FILE_UPLOAD]

Needs a login session. Any login can upload files. These files are given
a random unique identifier. When these files ids are attached to the publication
record, they will be moved to a permanent storage when saving the file.

Upload a File to temporary storage. Returns a JSON document containing
the upload details and default metadata on success or a JSON error
document on failure:

  # success
  {
    'file_name'    => '183589768.pdf',
    'file_size'    => '1174241',
    'tempid'       => 'sK_QXY7vmd',
    'content_type' => 'application/pdf',
    'access_level' => 'open_access',
    'rac_email'    => 'me@example.com' # in case access_level is rac
    'relation'     => 'main_file',
    'creator'      => 'einstein',
    'date_created' => '2016-05-30T11:20:34Z',
    'date_updated' => '2016-05-30T11:20:34Z',
    'success'      => 1
  }

  # failure
  {
    success        => 0,
    error_message  => 'Sorry! The file upload failed.'
  }

=cut

post '/librecat/upload' => sub {
    my $file      = request->upload('file');
    my $creator   = session->{user};

    # Upload the data and add some metadata on the origin of the request...
    my $res       = upload_temp_file($file, $creator, {
        address      => request->address,
        referer      => request->referer,
    });

    defined $res->{error_message} ? status(500) : status(200);

    return to_json($res);
};

=head2 DEL /librecat/upload/ID

Request the deletion of a temporary file upload (when available). This command
will not remove files from permanent storage. To do this, the complete record
needs to be saved.

=cut

del '/librecat/upload/:id' => sub {
    my $fileid    = param("id");
    my $creator   = session->{user};

    my $res       = remove_temp_file($fileid, $creator, {
        address      => request->address,
        referer      => request->referer,
    });

    ($res->{success} == 1) ? status(200) : status(500);

    return to_json($res);
};

1;