Mojito

 view release on metacpan or  search on metacpan

lib/Mojito/Collection/CRUD/Deep.pm  view on Meta::CPAN

a document name.

The motivation for collections of docs collection is so that we can group 
documents together form display purposes.  Form example, say I'm working 
on a project with multiple documents.  I'd like to be able to "identify/tag" 
them to the project so I can narrow my viewing focus to just those documents.

=cut

sub create {
    my ( $self, $params ) = @_;

    # We don't need to store the form submit value
    delete $params->{collect};
    my $page_ids = $params->{collected_page_ids};
    
    # NOTE: The $page_ids input can come in two different forms: 
    # - String:   "$page_id1,$page_id2,...$page_id_n";
    # - ArrayRef: [$page_id1,$page_id2,..., $page_id_n];
    $params->{collected_page_ids} = [split ',', $page_ids] if (!ref($page_ids));
    
    # add save time as last_modified and created
    $params->{last_modified} = $params->{created} = time();

    my $collection_struct = $self->collection->export;
    my @collections = values %{$collection_struct};
    my $collection = first { $_->{collection_name} eq $params->{collection_name} } @collections;
    my $id;
    if ( $id = $collection->{_id}||$collection->{id} ) {
        $params->{id} = $id;
        $self->update($params);
    } 
    else {
        $id = $self->generate_mongo_like_oid;
        $params->{id} = $id;
        $self->collection->{$id} = $params;
    }
    return $id;
}

=head2 read

Read a collection from the database.

=cut

sub read {
    my ( $self, $id ) = @_;
    if ($self->collection->{$id}) {
        return $self->collection->{$id}->export;
    }
    return;
}

=head2 update

Update a collection in the database.

=cut

sub update {
    my ( $self, $params) = @_;

    my $id = $params->{id};
    $params->{last_modified} = time();
    $self->collection->{$id} = $params;
}

=head2 delete

Delete a collection from the database.

=cut

sub delete {
    my ( $self, $id ) = @_;
    $self->collection->delete($id);
}

=head2 get_all

Get all pages in the notes collection.
Returns a MongoDB cursor one can iterate over.

=cut

sub get_all {
    my $self = shift;
    return $self->collection->export;
}

=head2 collection_for_page

Get all the collection ids for which this page is a member of.

=cut

sub collections_for_page {
    my ( $self, $page_id ) = @_;

    $page_id //= '';
    my @collection_ids = ();
    foreach my $collection (@{$self->get_all}) {
        if ($page_id eq any(@{$collection->{collected_page_ids}})) {
            push @collection_ids, $collection->{id};
        }
    }

    return @collection_ids;
}

=head2 BUILD

Set the collection we want to work with.
In this case it's the collection named 'collection'.
It's a bit meta is why the funny naming.

=cut

sub BUILD {
    my $self = shift;



( run in 2.128 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )