MojoMojo

 view release on metacpan or  search on metacpan

lib/MojoMojo/Schema/Result/Page.pm  view on Meta::CPAN

    "MojoMojo::Schema::Result::PageVersion",
    { page => "id", version => "version" }
);
__PACKAGE__->has_many(
    "tags",
    "MojoMojo::Schema::Result::Tag",
    { "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
    "links_from",
    "MojoMojo::Schema::Result::Link",
    { "foreign.from_page" => "self.id" }
);
__PACKAGE__->has_many(
    "links_to",
    "MojoMojo::Schema::Result::Link",
    { "foreign.to_page" => "self.id" }
);
__PACKAGE__->has_many(
    "roleprivileges",
    "MojoMojo::Schema::Result::RolePrivilege",
    { "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
    "attachments",
    "MojoMojo::Schema::Result::Attachment",
    { "foreign.page" => "self.id" },
    { order_by       => 'name asc' }
);
__PACKAGE__->has_many(
    "comments",
    "MojoMojo::Schema::Result::Comment",
    { "foreign.page" => "self.id" }
);
__PACKAGE__->has_many(
    "journals",
    "MojoMojo::Schema::Result::Journal",
    { "foreign.pageid" => "self.id" }
);

=head1 NAME

MojoMojo::Schema::Result::Page - store pages

=head1 METHODS

=cut

=head2 update_content <%args>

Create a new content version for this page.

%args is each column of L<MojoMojo::Schema::Result::Content>.

=cut

# update_content: this whole method may need work to deal with workflow.
# maybe it can't even be called if the site uses workflow...
# may need fixing for better conflict handling, too. maybe use a transaction?

sub update_content {
    my ( $self, %args ) = @_;

    my $content_version = (
          $self->content
        ? $self->content->max_version()
        : undef
    );
    my %content_data =
      map { $_ => $args{$_} }
      $self->result_source->related_source('content')->columns;
    my $now = DateTime->now;
    @content_data{qw/page version status release_date/} = (
        $self->id, ( $content_version ? $content_version + 1 : 1 ),
        'released', $now,
    );
    my $content =
      $self->result_source->related_source('content')
      ->resultset->create( \%content_data );
    $self->content_version( $content->version );
    $self->update;

    $self->page_version->content_version_first($content_version)
      unless defined $self->page_version->content_version_first;
    $self->page_version->content_version_last($content_version);
    $self->page_version->update;

    if ( my $previous_content = $content->previous ) {
        $previous_content->remove_date($now);
        $previous_content->status('removed');
        $previous_content->comments("Replaced by version $content_version.");
        $previous_content->update;
    }
    else {
        $self->result_source->resultset->set_paths($self);
    }
    foreach my $want_me ( $self->result_source->schema->resultset('WantedPage')
        ->search( { to_path => $self->path } ) )
    {
        my $wantme_page = $want_me->from_page;

        # convert the wanted into links
        $self->result_source->schema->resultset('Link')->create(
            {
                from_page => $wantme_page,
                to_page   => $self,
            }
        );

        # clear the precompiled (will be recompiled on view)
        if ( my $wantme_content = $wantme_page->content ) {
            $wantme_content->precompiled(undef);
            $wantme_content->update;
        }

        # ok, she don't want me anymore ;)
        $want_me->delete();
    }

}    # end sub update_content

=head2 add_version

    my $page_version_new = $page->add_version(
        creator => $user_id,
        name_orig => $page_new_name,
    );

Arguments: %replacementdata

Returns: The new L<PageVersion|MojoMojo::Schema::Result::PageVersion>
object.
    
Creates a new page version by cloning the latest version (hence pointing
to the same content), and replacing its values with data in the replacement
hash.

Used for renaming pages.

=cut

sub add_version {
    my ( $self, %args ) = @_;
    my $now = DateTime->now;

    my $page_version_last = $self->page_version->latest_version();

    # clone the last version and update fields passed in %args
    my %page_version_data = map {
        exists $args{$_}
          ? ( $_ => $args{$_} )
          : ( $_ => $page_version_last->$_ )
    } $self->result_source->related_source('page_version')->columns;

    delete $args{creator};    # creator is a field in page_version, not in page

    # for the new version, set the version number, status, and release date
    @page_version_data{
        qw/
          version                           status     release_date/
      }
      = ( $page_version_last->version + 1, 'released', $now );

    my $page_version_new;

# commit the new version to the database and update the previously last version to indicate its removal
    $self->result_source->schema->txn_do(
        sub {

            $page_version_new =
              $self->result_source->related_source('page_version')
              ->resultset->create( \%page_version_data );

            $page_version_last->update(
                {
                    remove_date => $now,
                    status      => 'removed',
                    comments    => 'Replaced by version '
                      . $page_version_data{version}
                }



( run in 0.632 second using v1.01-cache-2.11-cpan-5837b0d9d2c )