<% $json %> <%once> use JSON::XS; <%args> $action => undef $id => undef $class => undef $tag => undef <%init> my %result; warn Dumper \%ARGS; my $doc = $keeper->get_document_by_id( $id, class => $class ); if ( ref $doc && $ARGS{tag} ) { my @links = $keeper->get_links( class => 'tag::Cloud', dest_id => $id, dest_class => $class, ); my @tags; if ( @links ) { my %ids = map { $_->source_id => 1 } @links; my @ids = keys %ids; @tags = $keeper->get_documents( id => \@ids, class => 'tag::Tag', ) if @ids; } my ($tobj) = $keeper->get_documents( class => 'tag::Tag', name => $ARGS{tag}, ilike => 1, limit => 1, ); if ( $action eq 'add' ) { unless ( ref $tobj ) { $tobj = tag::Tag->new( $keeper ); $tobj->name( $ARGS{tag} ); $tobj->status( 1 ); $tobj->store; } my $exists = (grep { $_->id == $tobj->id } @tags) ? 1 : 0; if ( ref $tobj && !$exists ) { my $link = tag::Cloud->new( $keeper ); $link->source_id( $tobj->id ); $link->source_class( $tobj->class ); $link->dest_id( $id ); $link->dest_class( $class ); $link->status( 1 ); $link->store; } else { $result{fallback} = 1; } } elsif ( $action eq 'remove' ) { if ( ref $tobj ) { my @delete = grep { $_->source_id == $tobj->id } @links; foreach my $obj ( @delete ) { $obj->delete; } my $count = $keeper->get_links( class => 'tag::Cloud', count => 1, source_id => $tobj->id, ); $tobj->delete unless $count; } else { $result{fallback} = 1; } } my ($prop) = grep { $_->{type} eq 'tagset' } $doc->structure; if ( ref $prop && !(exists $prop->{virtual} && $prop->{virtual}) ) { my $class = $doc->class; my $name = $prop->{attr}; my $is_extra = scalar( grep { ref $_ && $_->{attr} eq $name } $class->class_table->required_properties ) ? 0 : 1; my $result; my @tags; if ( $doc->id ) { @tags = $keeper->get_documents( class => 'tag::Tag', lclass => 'tag::Cloud', ldest => $doc->id, ldestclass => $doc->class, ); if ( @tags ) { $result = []; foreach my $tag ( @tags ) { push @$result, { id => $tag->id, name => $is_extra ? $tag->name : Encode::decode('utf-8', $tag->name) }; } unless ( $is_extra ) { $result = Encode::encode('utf-8', JSON::XS->new->encode( $result )); } } warn Dumper $result if $DEBUG; $doc->$name( $result ); $doc->store; } } } $result{ok} = 1 unless exists $result{fallback}; my $json = encode_json \%result;