diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/VNDB/Func.pm | 28 | ||||
-rw-r--r-- | lib/VNDB/Handler/Staff.pm | 15 | ||||
-rw-r--r-- | lib/VNDB/Handler/VNEdit.pm | 31 |
3 files changed, 23 insertions, 51 deletions
diff --git a/lib/VNDB/Func.pm b/lib/VNDB/Func.pm index 40af8e73..02489980 100644 --- a/lib/VNDB/Func.pm +++ b/lib/VNDB/Func.pm @@ -11,7 +11,7 @@ use VNDBUtil; our @EXPORT = (@VNDBUtil::EXPORT, qw| clearfloat cssicon tagscore mt minage fil_parse fil_serialize parenttags childtags charspoil imgpath imgurl fmtvote - json_encode json_decode script_json json_validate + json_encode json_decode script_json mtvoiced mtani mtvnlen mtrlstat mtvnlstat mtbloodt |); @@ -228,32 +228,6 @@ sub script_json { } -# Special validation function for simple JSON structures as form fields. It can -# only validate arrays of key-value objects. The key-value objects are then -# validated using kv_validate. -# Returns the parsed json object on success, undef on error and sets $frm->{_err}. -# Doesn't provide a user-friendly error message if validation fails. It's the -# responsibility of the JS code to handle the interface with the user. -sub json_validate { - my($frm, $name, @fields) = @_; - my $data = eval { json_decode $frm->{$name} }; - goto error if $@ || ref $data ne 'ARRAY'; - my %known_fields = map +($_->{field},1), @fields; - for my $i (0..$#$data) { - goto error if ref $data->[$i] ne 'HASH'; - # Require that all keys are known and have a scalar value. - goto error if grep !$known_fields{$_} || ref($data->[$i]{$_}), keys %{$data->[$i]}; - $data->[$i] = kv_validate({ field => sub { $data->[$i]{shift()} } }, $TUWF::OBJ->{_TUWF}{validate_templates}, \@fields); - goto error if $data->[$i]{_err}; - } - - return $data; -error: - push @{$frm->{_err}}, [ 'aliases', 'template', 'json' ] ; - return undef; -} - - # mt() wrappers for data-dependent translation strings that have a special # value for 'unknown'. sub mtvoiced { !$_[0] ? mt '_unknown' : mt '_voiced_'.$_[0]; } diff --git a/lib/VNDB/Handler/Staff.pm b/lib/VNDB/Handler/Staff.pm index 52b2e1f1..753a1ef8 100644 --- a/lib/VNDB/Handler/Staff.pm +++ b/lib/VNDB/Handler/Staff.pm @@ -209,26 +209,25 @@ sub edit { { post => 'l_site', required => 0, template => 'weburl', maxlength => 250, default => '' }, { post => 'l_twitter', required => 0, maxlength => 16, default => '', regex => [ qr/^\S+$/, mt('_staffe_form_tw_err') ] }, { post => 'l_anidb', required => 0, template => 'id', default => undef }, - { post => 'aliases', required => 0, maxlength => 5000, default => '' }, + { post => 'aliases', template => 'json', json_fields => [ + { field => 'name', required => 1, maxlength => 200 }, + { field => 'orig', required => 0, maxlength => 200, default => '' }, + { field => 'aid', required => 0, template => 'uint', default => 0 }, + ]}, { post => 'editsum', template => 'editsum' }, { post => 'ihid', required => 0 }, { post => 'ilock', required => 0 }, ); - my $aliases = json_validate($frm, 'aliases', - { field => 'name', required => 1, maxlength => 200 }, - { field => 'orig', required => 0, maxlength => 200, default => '' }, - { field => 'aid', required => 0, template => 'id', default => 0 }, - ); if(!$frm->{_err}) { + my $aliases = json_decode $frm->{aliases}; $aliases = [ sort { $a->{name} cmp $b->{name} } @$aliases ]; my %old_aliases = $sid ? ( map +($_->{id} => 1), @{$self->dbStaffAliasIds($sid)} ) : (); $frm->{primary} = 0 unless exists $old_aliases{$frm->{primary}}; # reset aid to zero for newly added aliases. $_->{aid} *= $old_aliases{$_->{aid}} ? 1 : 0 for (sort { $a->{name} cmp $b->{name} } @$aliases); - } - if(!$frm->{_err}) { + $frm->{aliases} = json_encode $aliases; $frm->{ihid} = $frm->{ihid} ?1:0; $frm->{ilock} = $frm->{ilock}?1:0; diff --git a/lib/VNDB/Handler/VNEdit.pm b/lib/VNDB/Handler/VNEdit.pm index 409c80cb..1883b072 100644 --- a/lib/VNDB/Handler/VNEdit.pm +++ b/lib/VNDB/Handler/VNEdit.pm @@ -117,38 +117,37 @@ sub edit { { post => 'anime', required => 0, default => '' }, { post => 'image', required => 0, default => 0, template => 'id' }, { post => 'img_nsfw', required => 0, default => 0 }, - { post => 'credits', required => 0, default => '[]', maxlength => 5000 }, - { post => 'seiyuu', required => 0, default => '[]', maxlength => 5000 }, + { post => 'credits', template => 'json', json_fields => [ + { field => 'aid', required => 1, template => 'id' }, + { field => 'role', required => 1, enum => $self->{staff_roles} }, + { field => 'note', required => 0, maxlength => 250, default => '' }, + ]}, + { post => 'seiyuu', template => 'json', json_fields => [ + { field => 'aid', required => 1, template => 'id' }, + { field => 'cid', required => 1, template => 'id' }, + { field => 'note', required => 0, maxlength => 250, default => '' }, + ]}, { post => 'vnrelations', required => 0, default => '', maxlength => 5000 }, { post => 'screenshots', required => 0, default => '', maxlength => 1000 }, { post => 'editsum', required => !$nosubmit, template => 'editsum' }, { post => 'ihid', required => 0 }, { post => 'ilock', required => 0 }, ); - my $raw_c = !$frm->{_err} && json_validate($frm, 'credits', - { field => 'aid', required => 1, template => 'id' }, - { field => 'role', required => 1, enum => $self->{staff_roles} }, - { field => 'note', required => 0, maxlength => 300, default => '' }, - ); - my $raw_s = !$frm->{_err} && json_validate($frm, 'seiyuu', - { field => 'aid', required => 1, template => 'id' }, - { field => 'cid', required => 1, template => 'id' }, - { field => 'note', required => 0, maxlength => 300, default => '' }, - ); - # handle image upload $frm->{image} = _uploadimage($self, $frm) if !$nosubmit; + my $raw_c = !$frm->{_err} && json_decode $frm->{credits}; + my $raw_s = !$frm->{_err} && json_decode $frm->{seiyuu}; my (@credits, @seiyuu); if(!$nosubmit && !$frm->{_err}) { # ensure submitted alias IDs exist within database my @alist = map $_->{aid}, @$raw_c, @$raw_s; - my %staff = @alist ? map +($_->{aid} => 1), @{$self->dbStaffGet(aid => \@alist, results => 200)} : (); + my %staff = @alist ? map +($_->{aid}, 1), @{$self->dbStaffGet(aid => \@alist, results => 200)} : (); # check for duplicate credits my $last_c = { aid => 0, role => '' }; for my $c (sort { $a->{aid} <=> $b->{aid} || $a->{role} cmp $b->{role} } @$raw_c) { - next unless exists $staff{$c->{aid}}; + next unless exists $staff{0+$c->{aid}}; # discard entries with identical name & role next if $last_c->{aid} == $c->{aid} && $last_c->{role} eq $c->{role}; push @credits, $c; @@ -160,7 +159,7 @@ sub edit { my %vn_chars = map +($_->{id} => 1), @$chars; my $last_s = { aid => 0, cid => 0 }; for my $s (sort { $a->{aid} <=> $b->{aid} || $a->{cid} <=> $b->{cid} } @$raw_s) { - next unless $staff{$s->{aid}} && $vn_chars{$s->{cid}}; # weed out odd credits + next unless $staff{0+$s->{aid}} && $vn_chars{0+$s->{cid}}; # weed out odd credits next if $last_s->{aid} == $s->{aid} && $last_s->{cid} == $s->{cid}; push @seiyuu, $s; $last_s = $s; |