diff options
Diffstat (limited to 'lib/VNDB/Releases.pm')
-rw-r--r-- | lib/VNDB/Releases.pm | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/lib/VNDB/Releases.pm b/lib/VNDB/Releases.pm new file mode 100644 index 00000000..0012d324 --- /dev/null +++ b/lib/VNDB/Releases.pm @@ -0,0 +1,178 @@ + +package VNDB::Releases; + +use strict; +use warnings; +use Exporter 'import'; +use Digest::MD5; + +use vars ('$VERSION', '@EXPORT'); +$VERSION = $VNDB::VERSION; +@EXPORT = qw| RPage REdit RLock RDel RHide |; + + +sub RPage { + my $self = shift; + my $id = shift; + + my $r = $self->FormCheck( + { name => 'rev', required => 0, default => 0, template => 'int' }, + { name => 'diff', required => 0, default => 0, template => 'int' }, + ); + + my $v = $self->DBGetRelease( + id => $id, + what => 'producers platforms media vn'.($r->{rev} ? ' changes':''), + $r->{rev} ? ( rev => $r->{rev} ) : () + )->[0]; + return $self->ResNotFound if !$v->{id}; + + $r->{diff} ||= $v->{prev} if $r->{rev}; + my $c = $r->{diff} && $self->DBGetRelease(id => $id, rev => $r->{diff}, what => 'changes producers platforms media vn')->[0]; + $v->{next} = $self->DBGetHist(type => 'r', id => $id, next => $v->{cid}, showhid => 1)->[0]{id} if $r->{rev}; + + $self->ResRedirect('/v'.$v->{vn}[0]{vid}) + if ($self->ReqHeader('Referer')||'') =~ m{^http://[^/]*(yahoo|google)} && @{$v->{vn}} == 1; + + return $self->ResAddTpl(rpage => { + rel => $v, + prev => $c, + change => $r->{diff}||$r->{rev}, + }); +} + + +sub REdit { + my $self = shift; + my $act = shift||'v'; + my $id = shift || 0; + + my $rid = $act eq 'r' ? $id : 0; + + my $rev = $self->FormCheck({ name => 'rev', required => 0, default => 0, template => 'int' })->{rev}; + + my $r = $self->DBGetRelease(id => $rid, what => 'changes producers platforms media vn', $rev ? ( rev => $rev ) : ())->[0] if $rid; + my $ivn = $self->DBGetVN(id => $id)->[0] if !$rid; + return $self->ResNotFound() if ($rid && !$r) || (!$rid && !$ivn); + + my $vn = $rid ? $r->{vn} : [ { vid => $id, title => $ivn->{title} } ]; + + return $self->ResDenied if !$self->AuthCan('edit') || ($r->{locked} && !$self->AuthCan('lock')); + + my %b4 = $rid ? ( + (map { $_ => $r->{$_} } qw|title original language website notes minage type platforms|), + released => $r->{released} =~ /^([0-9]{4})([0-9]{2})([0-9]{2})$/ ? [ $1, $2, $3 ] : [ 0, 0, 0 ], + media => join(',', map { $_->{medium} =~ /^(cd|dvd|gdr|blr)$/ ? ($_->{medium}.'_'.$_->{qty}) : $_->{medium} } @{$r->{media}}), + producers => join('|||', map { $_->{id}.','.$_->{name} } @{$r->{producers}}), + ) : (); + $b4{vn} = join('|||', map { $_->{vid}.','.$_->{title} } @$vn); + + my $frm = {}; + if($self->ReqMethod() eq 'POST') { + $frm = $self->FormCheck( + { name => 'type', required => 1, enum => [ 0..$#{$VNDB::RTYP} ] }, + { name => 'title', required => 1, maxlength => 250 }, + { name => 'original', required => 0, maxlength => 250, default => '' }, + { name => 'language', required => 1, enum => [ keys %{$VNDB::LANG} ] }, + { name => 'website', required => 0, template => 'url', default => '' }, + { name => 'released', required => 0, multi => 1, template => 'int', default => 0 }, + { name => 'minage' , required => 0, enum => [ keys %{$VNDB::VRAGES} ], default => -1 }, + { name => 'notes', required => 0, maxlength => 10240, default => '' }, + { name => 'platforms', required => 0, multi => 1, enum => [ keys %$VNDB::PLAT ], default => '' }, + { name => 'media', required => 0, default => '' }, + { name => 'producers', required => 0, default => '' }, + { name => 'vn', required => 1, maxlength => 10240 }, + { name => 'comm', required => 0, default => '' }, + ); + + my $released = !$frm->{released}[0] ? 0 : + $frm->{released}[0] == 9999 ? 99999999 : + sprintf '%04d%02d%02d', $frm->{released}[0]||0, $frm->{released}[1]||0, $frm->{released}[2]||0; + my $media = [ map { /_/ ? [ split /_/ ] : [ $_, 0 ] } split /,/, $frm->{media} ]; + my $producers = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{producers} ]; + my $new_vn = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{vn} ]; + + $frm->{_err} = $frm->{_err} ? [ @{$frm->{_err}}, 'vn_1' ] : [ 'vn_1' ] + if !@$new_vn; + + # weed out empty string + $frm->{platforms} = [ map { $_ ? $_ : () } @{$frm->{platforms}} ]; + + return $self->ResRedirect('/r'.$rid, 'post') + if $rid && $released == $r->{released} && + (join(',', sort @{$b4{platforms}}) eq join(',', sort @{$frm->{platforms}})) && + 10 == scalar grep { $_ ne 'comm' && $_ ne 'released' && $_ ne 'platforms' && $frm->{$_} eq $b4{$_} } keys %b4; + + if(!$frm->{_err}) { + my %opts = ( + vn => $new_vn, + (map { $_ => $frm->{$_} } qw|title original language website notes minage type comm platforms|), + released => $released, + media => $media, + producers => $producers, + ); + my $cid; + $cid = $self->DBEditRelease($rid, %opts) if $rid; # edit + ($rid, $cid) = $self->DBAddRelease(%opts) if !$rid; # add + return $self->ResRedirect('/r'.$rid.'?rev='.$cid, 'post'); + } + } + + if($rid) { + $frm->{$_} ||= $b4{$_} for (keys %b4); + $frm->{comm} = sprintf 'Reverted to revision %d by %s.', $r->{cid}, $r->{username} if $r->{cid} != $r->{latest}; + } else { + $frm->{language} = 'ja'; + $frm->{vn} = $b4{vn}; + } + + $self->AddHid($frm); + $frm->{_hid} = {map{$_=>1} qw| info pnm prod |} + if !$frm->{_hid} && !$rid; + $self->ResAddTpl(redit => { + form => $frm, + id => $rid, + rel => $r, + vn => !$rid ? $ivn : $vn, + }); +} + + +sub RLock { + my $self = shift; + my $id = shift; + + my $r = $self->DBGetRelease(id => $id)->[0]; + return $self->ResNotFound() if !$r; + return $self->ResDenied if !$self->AuthCan('lock'); + $self->DBLockItem('releases', $id, $r->{locked}?0:1); + return $self->ResRedirect('/r'.$id, 'perm'); +} + + +sub RDel { + my $self = shift; + my $id = shift; + + return $self->ResDenied if !$self->AuthCan('del'); + my $r = $self->DBGetRelease(id => $id, what => 'vn')->[0]; + return $self->ResNotFound if !$r; + $self->DBDelRelease([ map { $_->{vid} } @{$r->{vn}} ], $id); + return $self->ResRedirect('/v'.$r->{vn}[0]{id}, 'perm'); +} + + +sub RHide { + my $self = shift; + my $id = shift; + + return $self->ResDenied if !$self->AuthCan('del'); + my $r = $self->DBGetRelease(id => $id, what => 'vn')->[0]; + return $self->ResNotFound if !$r; + $self->DBHideRelease($id, $r->{hidden}?0:1, [ map { $_->{vid} } @{$r->{vn}} ]); + return $self->ResRedirect('/r'.$id, 'perm'); +} + + +1; + |