diff options
author | Yorhel <git@yorhel.nl> | 2020-03-19 11:48:50 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2020-03-19 11:48:50 +0100 |
commit | d733208de47d2f71d6f14a97796dbfc8f67f2715 (patch) | |
tree | 35a272daa61863b9fae39427360111c8f9ff2c7f | |
parent | 944b2d60fb3d503238850ad21159563e18a302df (diff) |
imgflag: Fix 500 due to enrich_image() with a single image + filter irrelevant images from history
-rw-r--r-- | lib/VNWeb/Misc/ImageFlagging.pm | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/lib/VNWeb/Misc/ImageFlagging.pm b/lib/VNWeb/Misc/ImageFlagging.pm index 7faf7b86..ea7ab97e 100644 --- a/lib/VNWeb/Misc/ImageFlagging.pm +++ b/lib/VNWeb/Misc/ImageFlagging.pm @@ -7,17 +7,25 @@ use VNWeb::Prelude; sub enrich_image { my($l) = @_; - enrich_merge id => sql(' + # XXX: Can't use "IN($image_ids)" here because of an odd PostgreSQL + # limitation regarding input of composite types. "IN('(ch,1)')" throws an + # error, though IN(..) with multiple values works just fine. + enrich_merge id => sub { sql q{ SELECT i.id, i.width, i.height, i.c_votecount AS votecount , i.c_sexual_avg AS sexual_avg, i.c_sexual_stddev AS sexual_stddev , i.c_violence_avg AS violence_avg, i.c_violence_stddev AS violence_stddev , iv.sexual AS my_sexual, iv.violence AS my_violence + , CASE WHEN v.title IS NOT NULL THEN 'v' WHEN c.name IS NOT NULL THEN 'c' ELSE 'v' END AS entry_type + , COALESCE(v.id, c.id, vsv.id) AS entry_id + , COALESCE(v.title, c.name, vsv.title) AS entry_title FROM images i - LEFT JOIN image_votes iv ON iv.id = i.id AND iv.uid =', \auth->uid, ' - WHERE i.id IN'), $l; - enrich_merge id => q{SELECT image AS id, 'v' AS entry_type, id AS entry_id, title AS entry_title FROM vn WHERE image IN}, grep $_->{id} =~ /cv/, @$l; - enrich_merge id => q{SELECT vs.scr AS id, 'v' AS entry_type, v.id AS entry_id, v.title AS entry_title FROM vn_screenshots vs JOIN vn v ON v.id = vs.id AND vs.scr IN}, grep $_->{id} =~ /sf/, @$l; - enrich_merge id => q{SELECT image AS id, 'c' AS entry_type, id AS entry_id, name AS entry_title FROM chars WHERE image IN}, grep $_->{id} =~ /ch/, @$l; + LEFT JOIN image_votes iv ON iv.id = i.id AND iv.uid =}, \auth->uid, q{ + LEFT JOIN vn v ON (i.id).itype = 'cv' AND v.image = i.id + LEFT JOIN chars c ON (i.id).itype = 'ch' AND c.image = i.id + LEFT JOIN vn_screenshots vs ON (i.id).itype = 'sf' AND vs.scr = i.id + LEFT JOIN vn vsv ON (i.id).itype = 'sf' AND vsv.id = vs.id + WHERE i.id = ANY(ARRAY}, $_, '::image_id[])' + }, $l; $_->{url} = tuwf->imgurl($_->{id}) for @$l; } @@ -85,8 +93,9 @@ elm_api ImageVote => undef, { TUWF::get qr{/img/vote}, sub { return tuwf->resDenied if !auth->permImgvote; - my $recent = [ reverse tuwf->dbAlli('SELECT id FROM image_votes WHERE uid =', \auth->uid, 'ORDER BY date DESC LIMIT', \30)->@* ]; + my $recent = tuwf->dbAlli('SELECT id FROM image_votes WHERE uid =', \auth->uid, 'ORDER BY date DESC LIMIT', \30); enrich_image $recent; + $recent = [ reverse grep $_->{entry_id}, @$recent ]; framework_ title => 'Image flagging', sub { elm_ 'ImageFlagging', $SEND, { history => $recent }; |