Kwiki-Purple

 view release on metacpan or  search on metacpan

lib/Kwiki/Purple/Sequence.pm  view on Meta::CPAN

package Kwiki::Purple::Sequence;
use Kwiki::Plugin '-Base';
use Kwiki::Installer '-base';
use Carp;

const class_id             => 'purple_sequence';
const class_title          => 'Purple Sequence';
const css_file             => 'purple.css';
const config_file          => 'purple_sequence.yaml';
const cgi_class            => 'Kwiki::Purple::Sequence::CGI';

field remote_sequence => -init =>
  '$self->config->can("purple_sequence_remote") ?  $self->config->purple_sequence_remote : ""';

our $VERSION = '0.03';

sub register {
    my $registry = shift;
    $registry->add(action => 'purple_post');
    $registry->add(action => 'purple_query');
}

sub purple_post {
    my $url = $self->cgi->url;
    my $nid = $self->cgi->nid;

    warn "URL: $url\n";
    warn "NID: $nid\n";

    if ($nid && $url) {
        $self->_local_update_index($url, $nid);
    } elsif ($url) {
        $nid = $self->_local_get_next_and_update($url);
    } else {
        $nid = $self->_local_get_next;
    }

    $self->hub->headers->content_type('text/plain');
    return $nid;
}

sub purple_query {
    my $nid = $self->cgi->nid;
    my $url = $self->_local_query_index($nid);
    $self->hub->headers->content_type('text/plain');
    return $url;
}

sub query_index {
    my $nid = shift;
    return $self->_remote_query_index($nid) if
      $self->remote_sequence;
    return $self->_local_query_index($nid);
}

# XXX do permissions checking a la PurpleWiki 0.9[56]
# XXX Error Handling!!!??
sub update_index {
    my $url = shift or croak "must supply url";
    my $nid = shift;

    return $self->_remote_update_index($url, $nid) if
      $self->remote_sequence;
    return $self->_local_update_index($url, $nid);
}

sub get_next {
    return $self->_remote_get_next if
      $self->remote_sequence;
    return $self->_local_get_next;
}

sub get_next_and_update {
    my $url = shift;

    return $self->_remote_get_next_and_update($url) if 
      $self->remote_sequence;

    return $self->_local_get_next_and_update($url);
}

#### PRIVATE

sub _local_get_next {
    $self->_lock;
    my $nid = $self->_update_value($self->_increment_value($self->_get_value));
    $self->_unlock;
    return $nid;
}


sub _remote_get_next {
    return $self->_remote_get_next_and_update;
}

sub _remote_update_index {
    $self->_remote_get_next_and_update(@_);
}

sub _remote_get_next_and_update {
    my $url = shift;
    my $nid = shift;

    my $request_url = $self->remote_sequence;

    my $new_nid = $self->hub->purple->web_request(
        method => 'POST',
        request_url => $request_url,
        post_data => [
            action => 'purple_post',
            $url ? (url => $url) : (),
            $nid ? (nid => $nid) : (),
        ],
    );

    return $new_nid;
}



( run in 0.354 second using v1.01-cache-2.11-cpan-13bb782fe5a )