The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Rex::Endpoint::HTTP::File;
use Mojo::Base 'Mojolicious::Controller';

use Mojo::JSON;
use MIME::Base64;

use Rex::Endpoint::HTTP::Interface::File;

sub open {
   my $self = shift;

   my $ref = $self->req->json;

   eval {
      $self->_iface->open($ref->{mode}, $self->_path);
      $self->render_json({ok => Mojo::JSON->true});
   } or do {
      $self->render_json({ok => Mojo::JSON->false});
   };

}

sub read {
   my $self = shift;

   my $ref = $self->req->json;
   
   my $file = $self->_path;
   my $start = $ref->{start};
   my $len = $ref->{len};

   eval {
      my $buf = $self->_iface->read($file, $start, $len);
      $self->render_json({ok => Mojo::JSON->true, buf => encode_base64($buf)});
   } or do {
      $self->render_json({ok => Mojo::JSON->false});
   };

}

# this seems odd, but "write" is not allowed as an action
sub write_fh {
   my $self = shift;

   my $ref = $self->req->json;

   my $file = $self->_path;
   my $start = $ref->{start};
   my $buf = decode_base64($ref->{buf});

   eval {
      my $bytes_written = $self->_iface->write_fh($file, $start, $buf);
      $self->render_json({ok => Mojo::JSON->true, bytes_written => $bytes_written});
   } or do {
      $self->render_json({ok => Mojo::JSON->false});
   };
}

sub seek {
   my $self = shift;

   eval {
      $self->_iface->seek;
      $self->render_json({ok => Mojo::JSON->true});
   } or do {
      $self->render_json({ok => Mojo::JSON->false});
   };
}

sub close {
   my $self = shift;

   eval {
      $self->_iface->close;
      $self->render_json({ok => Mojo::JSON->true});
   } or do {
      $self->render_json({ok => Mojo::JSON->false});
   };
}

sub _path {
   my $self = shift;
   
   my $ref = $self->req->json;
   return $ref->{path};
}

sub _iface {
   my ($self) = @_;
   return Rex::Endpoint::HTTP::Interface::File->create;
}

1;