summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-08-04 13:46:11 +0200
committerYorhel <git@yorhel.nl>2020-08-07 12:36:58 +0200
commit26279ce6283511ac67c00d1ce98eca56ce3e8e60 (patch)
treeb828ac5859e92ff9dee6990ca2c6a96be9a1b759
parent53196ed7a121e41c2fbe72aaecf257ca42ea7349 (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.pm24
-rw-r--r--lib/VNWeb/Releases/Elm.pm13
-rw-r--r--lib/VNWeb/Releases/Lib.pm18
-rw-r--r--lib/VNWeb/Reviews/Edit.pm20
-rw-r--r--lib/VNWeb/ULists/List.pm9
-rw-r--r--lib/VNWeb/VN/Edit.pm11
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