212 lines
6.2 KiB
Perl
212 lines
6.2 KiB
Perl
# This code was forked from the LiveJournal project owned and operated
|
|
# by Live Journal, Inc. The code has been modified and expanded by
|
|
# Dreamwidth Studios, LLC. These files were originally licensed under
|
|
# the terms of the license supplied by Live Journal, Inc, which can
|
|
# currently be found at:
|
|
#
|
|
# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt
|
|
#
|
|
# In accordance with the original license, this code and all its
|
|
# modifications are provided under the GNU General Public License.
|
|
# A copy of that license can be found in the LICENSE file included as
|
|
# part of this distribution.
|
|
|
|
# this class represents a pending subscription, used for presenting to the user
|
|
# a subscription that doesn't exist yet
|
|
|
|
package LJ::Subscription::Pending;
|
|
use base 'LJ::Subscription';
|
|
use strict;
|
|
use Carp qw(croak carp);
|
|
use LJ::Event;
|
|
use LJ::NotificationMethod;
|
|
|
|
sub new {
|
|
my $class = shift;
|
|
my $u = shift;
|
|
my %opts = @_;
|
|
|
|
die "No user" unless LJ::isu($u);
|
|
|
|
my $journalu = delete $opts{journal} || 0;
|
|
my $etypeid = delete $opts{etypeid};
|
|
my $ntypeid = delete $opts{ntypeid};
|
|
my $event = delete $opts{event};
|
|
my $method = delete $opts{method};
|
|
my $arg1 = delete $opts{arg1} || 0;
|
|
my $arg2 = delete $opts{arg2} || 0;
|
|
my $default_selected = delete $opts{default_selected} || 0;
|
|
my $flags = delete $opts{flags} || 0;
|
|
|
|
# optional entry arg
|
|
# used to provide need additional context, not saved
|
|
my $entry = delete $opts{entry};
|
|
|
|
$journalu = LJ::want_user($journalu) if $journalu;
|
|
|
|
croak "Invalid user object passed to LJ::Subscription::Pending->new"
|
|
if $journalu && !LJ::isu($journalu);
|
|
|
|
# force autoload of LJ::Event and it's subclasses
|
|
LJ::Event->can('');
|
|
|
|
# optional journalid arg
|
|
$journalu ||= LJ::want_user( delete $opts{journalid} );
|
|
|
|
# don't care about disabled for pending
|
|
# FIXME: care
|
|
delete $opts{disabled};
|
|
|
|
croak "Invalid params passed to LJ::Subscription::Pending->new: " . join( ',', keys %opts )
|
|
if scalar keys %opts;
|
|
|
|
croak "etypeid or event required" unless ( $etypeid xor $event );
|
|
if ($event) {
|
|
$etypeid = LJ::Event::etypeid("LJ::Event::$event") or croak "Invalid event: $event";
|
|
}
|
|
croak "No etypeid" unless $etypeid;
|
|
|
|
$method = 'Inbox' unless $ntypeid || $method;
|
|
if ($method) {
|
|
$ntypeid = LJ::NotificationMethod::ntypeid("LJ::NotificationMethod::$method")
|
|
or croak "Invalid method: $method";
|
|
}
|
|
croak "No ntypeid" unless $ntypeid;
|
|
|
|
my $self = {
|
|
userid => $u->{userid},
|
|
u => $u,
|
|
journal => $journalu,
|
|
entry => $entry,
|
|
etypeid => $etypeid,
|
|
ntypeid => $ntypeid,
|
|
arg1 => $arg1,
|
|
arg2 => $arg2,
|
|
default_selected => $default_selected,
|
|
flags => $flags,
|
|
};
|
|
|
|
return bless $self, $class;
|
|
}
|
|
|
|
sub delete { }
|
|
sub pending { 1 }
|
|
|
|
sub journal { $_[0]->{journal} }
|
|
sub journalid { $_[0]->{journal} ? $_[0]->{journal}->{userid} : 0 }
|
|
sub entry { $_[0]->{entry} }
|
|
sub default_selected { $_[0]->{default_selected} && !$_[0]->disabled }
|
|
|
|
sub disabled {
|
|
my $self = shift;
|
|
return !$self->available_for_user;
|
|
}
|
|
|
|
sub enabled {
|
|
my $self = shift;
|
|
return !$self->disabled;
|
|
}
|
|
|
|
# overload create because you should never be calling it on this object
|
|
# (if you want to turn a pending subscription into a real subscription call "commit")
|
|
sub create { die "Create called on LJ::Subscription::Pending" }
|
|
|
|
sub commit {
|
|
my ($self) = @_;
|
|
|
|
return if $self->disabled;
|
|
|
|
return $self->{u}->subscribe(
|
|
etypeid => $self->{etypeid},
|
|
ntypeid => $self->{ntypeid},
|
|
journal => $self->{journal},
|
|
arg1 => $self->{arg1},
|
|
arg2 => $self->{arg2},
|
|
flags => $self->flags,
|
|
);
|
|
}
|
|
|
|
# class method
|
|
sub thaw {
|
|
my ( $class, $data, $u, $POST ) = @_;
|
|
|
|
my ( $type, $userid, $journalid, $etypeid, $flags, $ntypeid, $arg1, $arg2 ) =
|
|
split( '-', $data );
|
|
|
|
die "Invalid thawed data" unless $type eq 'pending';
|
|
|
|
return undef unless $ntypeid;
|
|
|
|
unless ($u) {
|
|
my $subuser = LJ::load_userid($userid);
|
|
die "no user" unless $subuser;
|
|
$u = LJ::get_authas_user($subuser);
|
|
die "Invalid user $subuser->{user}" unless $u;
|
|
}
|
|
|
|
if ( $arg1 && $arg1 eq '?' ) {
|
|
die "Arg1 option passed without POST data" unless $POST;
|
|
|
|
my $arg1_postkey = "$type-$userid-$journalid-$etypeid-0-0-$arg1-$arg2.arg1";
|
|
|
|
die "No input data for $arg1_postkey ntypeid: $ntypeid"
|
|
unless defined $POST->{$arg1_postkey};
|
|
|
|
my $arg1value = $POST->{$arg1_postkey};
|
|
$arg1 = int($arg1value);
|
|
}
|
|
|
|
if ( $arg2 && $arg2 eq '?' ) {
|
|
die "Arg2 option passed without POST data" unless $POST;
|
|
|
|
my $arg2_postkey = "$type-$userid-$journalid-$etypeid-0-0-$arg1-$arg2.arg2";
|
|
|
|
die "No input data for $arg2_postkey" unless defined $POST->{$arg2_postkey};
|
|
|
|
my $arg2value = $POST->{$arg2_postkey};
|
|
$arg2 = int($arg2value);
|
|
}
|
|
|
|
return undef unless $etypeid;
|
|
return $class->new(
|
|
$u,
|
|
journal => $journalid,
|
|
ntypeid => $ntypeid,
|
|
etypeid => $etypeid,
|
|
arg1 => $arg1 || 0,
|
|
arg2 => $arg2 || 0,
|
|
flags => $flags || 0,
|
|
);
|
|
}
|
|
|
|
# instance method
|
|
sub freeze {
|
|
my $self = shift;
|
|
my $arg = shift;
|
|
|
|
my $userid = $self->{u}->id;
|
|
my $journalid = $self->journalid;
|
|
my $etypeid = $self->{etypeid};
|
|
my $flags = $self->flags;
|
|
my $ntypeid = $self->{ntypeid};
|
|
|
|
# if this is for an argument, ntypeid is 0
|
|
$ntypeid = 0 if $arg;
|
|
$flags = 0 if $arg;
|
|
|
|
my @args = ( $userid, $journalid, $etypeid, $flags, $ntypeid );
|
|
|
|
push @args, $self->{arg1} if defined $self->{arg1};
|
|
|
|
# if arg2 is defined but not arg1, put a zero in arg1
|
|
push @args, 0 if !defined $self->{arg1} && defined $self->{arg2};
|
|
|
|
push @args, $self->{arg2} if defined $self->{arg2};
|
|
|
|
my $frozen = join( '-', ( 'pending', @args ) );
|
|
$frozen .= '.' . $arg if $arg;
|
|
|
|
return $frozen;
|
|
}
|
|
|
|
1;
|