diff options
author | Yorhel <git@yorhel.nl> | 2020-08-04 13:46:11 +0200 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2020-08-07 12:36:58 +0200 |
commit | 26279ce6283511ac67c00d1ce98eca56ce3e8e60 (patch) | |
tree | b828ac5859e92ff9dee6990ca2c6a96be9a1b759 | |
parent | 53196ed7a121e41c2fbe72aaecf257ca42ea7349 (diff) |
cleanup: Add enrich_release_elm() and releases_by_vn() functions
To abstract some common copy-pasted code.
These functions do cause an extra query on some pages. Several, in the
case of Chars::Edit.
-rw-r--r-- | lib/VNWeb/Chars/Edit.pm | 24 | ||||
-rw-r--r-- | lib/VNWeb/Releases/Elm.pm | 13 | ||||
-rw-r--r-- | lib/VNWeb/Releases/Lib.pm | 18 | ||||
-rw-r--r-- | lib/VNWeb/Reviews/Edit.pm | 20 | ||||
-rw-r--r-- | lib/VNWeb/ULists/List.pm | 9 | ||||
-rw-r--r-- | lib/VNWeb/VN/Edit.pm | 11 |
6 files changed, 33 insertions, 62 deletions
diff --git a/lib/VNWeb/Chars/Edit.pm b/lib/VNWeb/Chars/Edit.pm index 185466e3..2c10c4ec 100644 --- a/lib/VNWeb/Chars/Edit.pm +++ b/lib/VNWeb/Chars/Edit.pm @@ -2,6 +2,7 @@ package VNWeb::Chars::Edit; use VNWeb::Prelude; use VNWeb::Images::Lib 'enrich_image'; +use VNWeb::Releases::Lib; my $FORM = { @@ -59,23 +60,6 @@ my $FORM_IN = form_compile in => $FORM; my $FORM_CMP = form_compile cmp => $FORM; -sub enrich_releases { - my($e) = @_; - my %vns; - $e->{releases} = [ map !$vns{$_->{vid}}++ ? { id => $_->{vid} } : (), $e->{vns}->@* ]; - - enrich rels => id => vid => sub { sql ' - SELECT rv.vid, r.id, r.title, r.original, r.released, r.type as rtype, r.reso_x, r.reso_y - FROM releases r - JOIN releases_vn rv ON rv.id = r.id - WHERE NOT r.hidden AND rv.vid IN', $_, ' - ORDER BY r.released, r.title, r.id' - }, $e->{releases}; - enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, map $_->{rels}, $e->{releases}->@*; - enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, map $_->{rels}, $e->{releases}->@*; -} - - TUWF::get qr{/$RE{crev}/(?<action>edit|copy)} => sub { my $e = db_entry c => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound; my $copy = tuwf->capture('action') eq 'copy'; @@ -89,7 +73,9 @@ TUWF::get qr{/$RE{crev}/(?<action>edit|copy)} => sub { enrich_merge vid => 'SELECT id AS vid, title FROM vn WHERE id IN', $e->{vns}; $e->{vns} = [ sort { $a->{title} cmp $b->{title} || $a->{vid} <=> $b->{vid} || ($a->{rid}||0) <=> ($b->{rid}||0) } $e->{vns}->@* ]; - enrich_releases $e; + + my %vns; + $e->{releases} = [ map !$vns{$_->{vid}}++ ? { id => $_->{vid}, rels => releases_by_vn $_->{vid} } : (), $e->{vns}->@* ]; if($e->{image}) { $e->{image_info} = { id => $e->{image} }; @@ -117,7 +103,7 @@ TUWF::get qr{/$RE{vid}/addchar}, sub { my $e = elm_empty($FORM_OUT); $e->{vns} = [{ vid => $v->{id}, title => $v->{title}, rid => undef, spoil => 0, role => 'primary' }]; - enrich_releases $e; + $e->{releases} = [{ id => $v->{id}, rels => rels => releases_by_vn $v->{id} }]; framework_ title => 'Add character', sub { diff --git a/lib/VNWeb/Releases/Elm.pm b/lib/VNWeb/Releases/Elm.pm index f942488f..f4ab8975 100644 --- a/lib/VNWeb/Releases/Elm.pm +++ b/lib/VNWeb/Releases/Elm.pm @@ -1,22 +1,13 @@ package VNWeb::Releases::Elm; use VNWeb::Prelude; +use VNWeb::Releases::Lib; # Used by UList.Opt and CharEdit to fetch releases from a VN id. elm_api Release => undef, { vid => { id => 1 } }, sub { my($data) = @_; - my $l = tuwf->dbAlli( - 'SELECT r.id, r.title, r.original, r.type AS rtype, r.released, r.reso_x, r.reso_y - FROM releases r - JOIN releases_vn rv ON rv.id = r.id - WHERE NOT r.hidden - AND rv.vid =', \$data->{vid}, - 'ORDER BY r.released, r.title, r.id' - ); - enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, $l; - enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, $l; - elm_Releases $l; + elm_Releases releases_by_vn $data->{vid}; }; 1; diff --git a/lib/VNWeb/Releases/Lib.pm b/lib/VNWeb/Releases/Lib.pm index 234de176..87f9c401 100644 --- a/lib/VNWeb/Releases/Lib.pm +++ b/lib/VNWeb/Releases/Lib.pm @@ -3,7 +3,23 @@ package VNWeb::Releases::Lib; use VNWeb::Prelude; use Exporter 'import'; -our @EXPORT = qw/enrich_release release_row_/; +our @EXPORT = qw/enrich_release_elm releases_by_vn enrich_release release_row_/; + + +# Enrich a list of releases so that it's suitable as 'Releases' Elm response. +sub enrich_release_elm { + enrich_merge id => 'SELECT id, title, original, released, type as rtype, reso_x, reso_y FROM releases WHERE id IN', @_; + enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, @_; + enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, @_; +} + +# Return the list of releases associated with a VN in the format suitable as 'Releases' Elm response. +sub releases_by_vn { + my($id) = @_; + my $l = tuwf->dbAlli('SELECT r.id FROM releases r JOIN releases_vn rv ON rv.id = r.id WHERE NOT r.hidden AND rv.vid =', \$id, 'ORDER BY r.released, r.title, r.id'); + enrich_release_elm $l; + $l +} # Enrich a list of releases so that it's suitable for release_row_(). diff --git a/lib/VNWeb/Reviews/Edit.pm b/lib/VNWeb/Reviews/Edit.pm index 8ff5bd3f..3e05cad7 100644 --- a/lib/VNWeb/Reviews/Edit.pm +++ b/lib/VNWeb/Reviews/Edit.pm @@ -1,6 +1,7 @@ package VNWeb::Reviews::Edit; use VNWeb::Prelude; +use VNWeb::Releases::Lib; my $FORM = { @@ -19,21 +20,6 @@ my $FORM_IN = form_compile in => $FORM; my $FORM_OUT = form_compile out => $FORM; -sub _releases { - my($id) = @_; - my $r = tuwf->dbAlli(' - SELECT rv.vid, r.id, r.title, r.original, r.released, r.type as rtype, r.reso_x, r.reso_y - FROM releases r - JOIN releases_vn rv ON rv.id = r.id - WHERE NOT r.hidden AND rv.vid =', \$id, ' - ORDER BY r.released, r.title, r.id' - ); - enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, $r; - enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, $r; - $r -} - - TUWF::get qr{/$RE{vid}/addreview}, sub { my $v = tuwf->dbRowi('SELECT id, title FROM vn WHERE NOT hidden AND id =', \tuwf->capture('id')); return tuwf->resNotFound if !$v->{id}; @@ -43,7 +29,7 @@ TUWF::get qr{/$RE{vid}/addreview}, sub { return tuwf->resDenied if !can_edit w => {}; framework_ title => "Write review for $v->{title}", sub { - elm_ 'Reviews.Edit' => $FORM_OUT, { elm_empty($FORM_OUT)->%*, vid => $v->{id}, vntitle => $v->{title}, releases => _releases $v->{id} }; + elm_ 'Reviews.Edit' => $FORM_OUT, { elm_empty($FORM_OUT)->%*, vid => $v->{id}, vntitle => $v->{title}, releases => releases_by_vn $v->{id} }; }; }; @@ -56,7 +42,7 @@ TUWF::get qr{/$RE{wid}/edit}, sub { return tuwf->resNotFound if !$e->{id}; return tuwf->resDenied if !can_edit w => $e; - $e->{releases} = _releases $e->{vid}; + $e->{releases} = releases_by_vn $e->{vid}; framework_ title => "Edit review for $e->{vntitle}", sub { elm_ 'Reviews.Edit' => $FORM_OUT, $e; }; diff --git a/lib/VNWeb/ULists/List.pm b/lib/VNWeb/ULists/List.pm index 659c0929..a3716006 100644 --- a/lib/VNWeb/ULists/List.pm +++ b/lib/VNWeb/ULists/List.pm @@ -2,6 +2,7 @@ package VNWeb::ULists::Main; use VNWeb::Prelude; use VNWeb::ULists::Lib; +use VNWeb::Releases::Lib; use POSIX 'strftime'; @@ -209,17 +210,15 @@ sub listing_ { enrich_flatten labels => id => vid => sql('SELECT vid, lbl FROM ulist_vns_labels WHERE uid =', \$uid, 'AND vid IN'), $lst; enrich rels => id => vid => sub { sql ' - SELECT rv.vid, r.id, r.title, r.original, r.released, r.type as rtype, rl.status, r.reso_x, r.reso_y + SELECT rv.vid, r.id, rl.status FROM rlists rl JOIN releases r ON rl.rid = r.id JOIN releases_vn rv ON rv.id = r.id WHERE rl.uid =', \$uid, ' AND rv.vid IN', $_, ' - ORDER BY r.released ASC' + ORDER BY r.released, r.title, r.id' }, $lst; - - enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, map $_->{rels}, @$lst; - enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, map $_->{rels}, @$lst; + enrich_release_elm map $_->{rels}, @$lst; # TODO: Thumbnail view? paginate_ $url, $opt->{p}, [ $count, 50 ], 't', sub { diff --git a/lib/VNWeb/VN/Edit.pm b/lib/VNWeb/VN/Edit.pm index 048af953..0a37e453 100644 --- a/lib/VNWeb/VN/Edit.pm +++ b/lib/VNWeb/VN/Edit.pm @@ -2,6 +2,7 @@ package VNWeb::VN::Edit; use VNWeb::Prelude; use VNWeb::Images::Lib 'enrich_image'; +use VNWeb::Releases::Lib; my $FORM = { @@ -93,15 +94,7 @@ TUWF::get qr{/$RE{vrev}/edit} => sub { $e->{staff} = [ grep $_->{id}, $e->{staff}->@* ]; $e->{seiyuu} = [ grep $_->{id}, $e->{seiyuu}->@* ]; - $e->{releases} = tuwf->dbAlli(' - SELECT rv.vid, r.id, r.title, r.original, r.released, r.type as rtype, r.reso_x, r.reso_y - FROM releases r - JOIN releases_vn rv ON rv.id = r.id - WHERE NOT r.hidden AND rv.vid =', \$e->{id}, ' - ORDER BY r.released, r.title, r.id' - ); - enrich_flatten lang => id => id => sub { sql('SELECT id, lang FROM releases_lang WHERE id IN', $_, 'ORDER BY lang') }, $e->{releases}; - enrich_flatten platforms => id => id => sub { sql('SELECT id, platform FROM releases_platforms WHERE id IN', $_, 'ORDER BY platform') }, $e->{releases}; + $e->{releases} = releases_by_vn $e->{id}; $e->{chars} = tuwf->dbAlli(' SELECT id, name, original FROM chars |