Articulate

 view release on metacpan or  search on metacpan

lib/Articulate/Service/SimplePreviews.pm  view on Meta::CPAN

package Articulate::Service::SimplePreviews;

use strict;
use warnings;

use Articulate::Syntax;

use Moo;
with 'Articulate::Role::Service';

use Try::Tiny;
use Scalar::Util qw(blessed);

=head1 NAME

Articulate::Service::SimplePreviews - provide preview

=cut

=head1 METHODS

=head3 handle_preview

  preview => {
    meta     => {}
    content  => '...',
    location => '...'
  }

This is in almost all respects identical to the C<create> verb in
L<Articulate::Service::Simple> with the exception that nothing is
written.

Throws an error if the content already exists or if the user has no
write permission on that location.

=cut

sub handle_preview {
  my $self    = shift;
  my $request = shift;

  my $item =
    blessed $request->data
    ? $request->data
    : $self->construction->construct(
    { ( %{ $request->data } ? %{ $request->data } : () ), } );

  my $location = $item->location;

  my $user = $request->user_id;
  my $permission = $self->authorisation->permitted( $user, write => $location );

  if ($permission)
  { # no point offering this service to people who can't write there

    $self->validation->validate($item)
      or throw_error BadRequest => 'The content did not validate'; # or throw
    $self->enrichment->enrich( $item, $request ); # this will throw if it fails

    # skip the storage interaction
    my $item_class = $item->location->[-2];

    $self->augmentation->augment($item_class);    # this will throw if it fails

    return new_response $item_class, {
      $item_class => {
        schema   => $item->meta->{schema},
        content  => $item->content,
        location => $item->location,              # as string or arrayref?
      },



( run in 1.849 second using v1.01-cache-2.11-cpan-d8267643d1d )