App-Mxpress-PDF

 view release on metacpan or  search on metacpan

lib/App/Mxpress/Client.pm  view on Meta::CPAN

package App::Mxpress::Client;

use Moo;
use Compiled::Params::OO qw/cpo/;
use Types::Standard qw/Object Str StrMatch Enum Optional HashRef Bool/;
use Future::HTTP;
use HTTP::CookieJar;
use JSON;

our ($validate, $session);
BEGIN {
	$validate = cpo(
		login => {
			username => Str,
			password => Str
		},
		generate => {
			name => Str,
			size => Str,
			params => Optional->of(HashRef),
			save => Optional->of(Str),
			filename => Optional->of(Str)
		},
		pod => {
			styles => Optional->of(HashRef),
        		type => Enum[qw/module distribution raw/],
        		module => Optional->of(StrMatch[ qr{([a-zA-Z0-9\-\:]*)} ]),
        		distribution => Optional->of(StrMatch[ qr{([a-zA-Z0-9\-\:]*)} ],),
			name => Optional->of(Str),
			raw => Optional->of(Str),
			save => Optional->of(Str),
			filename => Optional->of(Str)
		},
		save => [Object, Object, Str]
	);
}

has host => (
	is => 'ro',
	isa => Str,
	default => sub {
		return 'http://localhost:5000'
	}
);

has [qw/csrf/] => (
	is => 'rw',
	isa => Str
);

has json => (
	is => 'ro',
	default => sub {
		return JSON->new->allow_blessed->convert_blessed;
	}
);

has ua => (
	is => 'ro',
	default => sub {
		return Future::HTTP->new(
			cookie_jar => HTTP::CookieJar->new
		);
	}
);

sub session {
	my $self = shift;
	return $self->ua->http_get(
		sprintf("%s/api/session", $self->host),
		headers => {
			'Accept' => 'application/json'
		}
	)->then(sub {
		my ($body, $headers) = @_;
		$self->csrf($headers->{token});
		return Future->new->done($body);
	});
}

sub login {
	my $self = shift;
	my $params = $validate->login->(@_);
	$self->session->then(sub {
		return $self->ua->http_post(
			sprintf("%s/api/login", $self->host),
			$self->json->encode({%$params}),
			headers => {
				'Token' => $self->csrf,
				'Content-Type' => 'application/json',
				'Accept' => 'application/json'
			}
		)->then(sub {
			my ($body, $headers) = @_;
			$self->csrf($headers->{token});
			return Future->new->done($body);
		});
	})->get
}

sub templates {
	my $self = shift;
	$self->ua->http_get(
		sprintf("%s/api/templates", $self->host),
		headers => {
			'Accept' => 'application/json'
		}
	)->then(sub {
		my ($body, $headers) = @_;
		$body = $self->json->decode($body);
		return Future->new->done($body);
	})->else(sub {
		return Future->new->done($_[0]);
	})->get;
}

sub generate {
	my $self = shift;
	my $params = $validate->generate->(@_);
	$self->ua->http_post(
		sprintf("%s/api/generate/pdf", $self->host),
		$self->json->encode({



( run in 0.599 second using v1.01-cache-2.11-cpan-39bf76dae61 )