Catalyst-Controller-Atompub

 view release on metacpan or  search on metacpan

samples/MyBlog/lib/MyBlog/Controller/MediaCollection.pm  view on Meta::CPAN

    1;
}

sub create_resource :Atompub(create) {
    my($self, $c) = @_;

    # URIs were determined by C::C::Atompub
    my $entry_uri = $self->media_link_entry->uri;
    my $media_uri = $self->media_resource->uri;

    return $self->error($c, RC_CONFLICT, "Resource name is used (change Slug): $entry_uri")
	if $c->model($MODEL)->search({ entry_uri => $entry_uri })->count;

    # Edit $entry and $media if needed ...

    my $vals = {
	edited     => $self->edited->epoch,
	entry_uri  => $entry_uri,
	entry_etag => $self->calculate_new_etag($c, $entry_uri),
	entry_body => $self->media_link_entry->body->as_xml,
	media_uri  => $media_uri,
	media_etag => $self->calculate_new_etag($c, $media_uri),
	media_body => MIME::Base64::encode($self->media_resource->body),
	media_type => $self->media_resource->type,
    };

    $c->model($MODEL)->create($vals)
	or return $self->error($c, RC_INTERNAL_SERVER_ERROR,
                               'Cannot create new media resource');

    1;
}

sub get_resource :Atompub(read) {
    my($self, $c) = @_;

    my $uri = $c->req->uri;

    my $cond = {
        '-or' => [
            { entry_uri => $uri },
            { media_uri => $uri },
        ],
    };

    my $rs = $c->model($MODEL)->search($cond)->first
	or return $self->error($c, RC_NOT_FOUND);

    if ($rs->entry_uri eq $uri) {
	$self->media_link_entry->body( XML::Atom::Entry->new(\$rs->entry_body) );
	$self->media_resource->type(media_type('entry'));
    }
    else {
	$self->media_resource->body( MIME::Base64::decode($rs->media_body) );
	$self->media_resource->type($rs->media_type);
    }

    1;
}

sub update_resource :Atompub(update) {
    my($self, $c) = @_;

    my $uri = $c->req->uri;

    my $cond = {
        '-or' => [
            { entry_uri => $uri },
            { media_uri => $uri },
        ],
    };

    my $rs = $c->model($MODEL)->search($cond)->first
	or return $self->error($c, RC_NOT_FOUND);

    my $vals = { edited => $self->edited->epoch };

    my($media_link_entry, $media_type);
    if ($rs->entry_uri eq $uri) {
	$media_link_entry = $self->media_link_entry->body;
        $media_type = $rs->media_type;

	# Don't update the Last-Modified value of the corresponding
        # Media Resource if you use it
    }
    else {
	$media_link_entry = XML::Atom::Entry->new(\$rs->entry_body)
	    or return $self->error($c);

	$vals->{media_etag} = $self->calculate_new_etag($c, $rs->media_uri);
	$vals->{media_body} = MIME::Base64::encode($self->media_resource->body);
	$vals->{media_type} = $media_type = $self->media_resource->type;

	# Do update the Last-Modified value of the Media Resource if you use it
    }

    # app:edited and atom:content in Media Link Entry MUST be updated
    $media_link_entry->edited($self->edited->w3c);
    my $content = XML::Atom::Content->new;
    $content->src($rs->media_uri);
    $content->type($media_type);
    $media_link_entry->content($content);

    $vals->{entry_body} = $media_link_entry->as_xml;
    $vals->{entry_etag} = $self->calculate_new_etag($c, $rs->entry_uri);

    $rs->update($vals)
	or return $self->error($c, RC_INTERNAL_SERVER_ERROR, "Cannot update resource: $uri");

    1;
}

sub delete_resource :Atompub(delete) {
    my($self, $c) = @_;

    my $uri = $c->req->uri;

    my $cond = {
        '-or' => [
            { entry_uri => $uri },
            { media_uri => $uri },



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