summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Producers/Page.pm
blob: 802218d648534f0f48c0506e6a2962ef352bb83a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
package VNWeb::Producers::Page;

use VNWeb::Prelude;
use VNWeb::Releases::Lib;


sub enrich_item {
    my($p) = @_;
    enrich_extlinks p => $p;
    enrich_merge pid => 'SELECT id AS pid, name, original FROM producers WHERE id IN', $p->{relations};
    $p->{relations} = [ sort { $a->{name} cmp $b->{name} || $a->{pid} <=> $b->{pid} } $p->{relations}->@* ];
}


sub rev_ {
    my($p) = @_;
    revision_ p => $p, \&enrich_item,
        [ name       => 'Name'           ],
        [ original   => 'Original name'  ],
        [ alias      => 'Aliases'        ],
        [ desc       => 'Description'    ],
        [ type       => 'Type',          fmt => \%PRODUCER_TYPE ],
        [ lang       => 'Language',      fmt => \%LANGUAGE ],
        [ relations  => 'Relations',     fmt => sub {
            txt_ $PRODUCER_RELATION{$_->{relation}}{txt}.': ';
            a_ href => "/p$_->{pid}", title => $_->{original}||$_->{name}, $_->{name};
        } ],
        revision_extlinks 'p'
}


sub info_ {
    my($p) = @_;
    h1_ $p->{name};
    h2_ class => 'alttitle', lang => $p->{lang}, $p->{original} if length $p->{original};

    p_ class => 'center', sub {
        txt_ $PRODUCER_TYPE{$p->{type}};
        br_;
        txt_ "Primary language: $LANGUAGE{$p->{lang}}";
        if(length $p->{alias}) {
            br_;
            txt_ 'a.k.a. ';
            txt_ $p->{alias} =~ s/\n/, /gr;
        }
        br_ if $p->{extlinks}->@*;
        join_ ' - ', sub { a_ href => $_->[1], $_->[0] }, $p->{extlinks}->@*;
    };

    p_ class => 'center', sub {
        my %rel;
        push $rel{$_->{relation}}->@*, $_ for $p->{relations}->@*;
        br_;
        join_ \&br_, sub {
            txt_ $PRODUCER_RELATION{$_}{txt}.': ';
            join_ ', ', sub {
                a_ href => "/p$_->{pid}", title => $_->{original}||$_->{name}, $_->{name};
            }, $rel{$_}->@*;
        }, grep $rel{$_}, keys %PRODUCER_RELATION;
    } if $p->{relations}->@*;

    p_ class => 'description', sub { lit_ bb2html $p->{desc} } if length $p->{desc};
}


sub rel_ {
    my($p) = @_;

    my $r = tuwf->dbAlli('
        SELECT r.id, r.type, r.patch, r.released, r.gtin, rp.publisher, rp.developer, ', sql_extlinks(r => 'r.'), '
          FROM releases r
          JOIN releases_producers rp ON rp.id = r.id
         WHERE rp.pid =', \$p->{id}, ' AND NOT r.hidden
         ORDER BY r.released, r.id
    ');
    enrich_extlinks r => $r;
    enrich_release $r;
    enrich vn => id => rid => sub { sql '
        SELECT rv.id as rid, v.id, v.title, v.original
          FROM vn v
          JOIN releases_vn rv ON rv.vid = v.id
         WHERE NOT v.hidden AND rv.id IN', $_, '
         ORDER BY v.title
    '}, $r;

    my(%vn, @vn);
    for my $rel (@$r) {
        for ($rel->{vn}->@*) {
            push @vn, $_ if !$vn{$_->{id}};
            push $vn{$_->{id}}->@*, $rel;
        }
    }

    h1_ 'Releases';
    debug_ $r;
    table_ class => 'releases', sub {
        for my $v (@vn) {
            tr_ class => 'vn', sub {
                # TODO: VN list status & management
                td_ colspan => 8, sub {
                    a_ href => "/v$v->{id}", title => $v->{original}||$v->{title}, $v->{title};
                };
                release_row_ $_, $v->{id}, 1 for $vn{$v->{id}}->@*;
            };
        }
    } if @$r;
    p_ 'This producer has no releases in the database.' if !@$r;
}


sub vns_ {
    my($p) = @_;
    my $v = tuwf->dbAlli(q{
        SELECT v.id, v.title, v.original, rels.developer, rels.publisher, rels.released
          FROM vn v
          JOIN (
               SELECT rv.vid, bool_or(rp.developer), bool_or(rp.publisher)
                    , COALESCE(MIN(r.released) FILTER(WHERE r.type <> 'trial'), MIN(r.released))
                 FROM releases_vn rv
                 JOIN releases r ON r.id = rv.id
                 JOIN releases_producers rp ON rp.id = rv.id
                WHERE NOT r.hidden AND rp.pid =}, \$p->{id}, '
                GROUP BY rv.vid
               ) rels(vid, developer, publisher, released) ON rels.vid = v.id
         WHERE NOT v.hidden
         ORDER BY rels.released
    ');

    h1_ 'Visual Novels';
    debug_ $v;
    # TODO: Perhaps something more table-like, also showing languages, platforms & VN list status
    ul_ class => 'prodvns', sub {
        li_ sub {
            span_ sub { rdate_ $_->{released} };
            a_ href => "/v$_->{id}", title => $_->{original}||$_->{title}, $_->{title};
            span_ join ' & ',
                $_->{publisher} ? 'Publisher' : (),
                $_->{developer} ? 'Developer' : ();
        } for @$v;
    };
    p_ 'This producer has no releases in the database.' if !@$v;
}


TUWF::get qr{/$RE{prev}(?:/(?<tab>vn|rel))?}, sub {
    my $p = db_entry p => tuwf->capture('id'), tuwf->capture('rev');
    return tuwf->resNotFound if !$p;
    enrich_item $p;

    my $pref = tuwf->reqCookie('prodrelexpand') ? 'vn' : 'rel';
    my $tab = tuwf->capture('tab') || $pref;
    tuwf->resCookie(prodrelexpand => $tab eq 'vn' ? 1 : undef, expires => time + 315360000) if $tab && $tab ne $pref;
    $tab = 'rel' if !$tab;

    framework_ title => $p->{name}, index => !tuwf->capture('rev'), type => 'p', dbobj => $p, hiddenmsg => 1,
    og => {
        title       => $p->{name},
        description => bb2text($p->{desc}),
    },
    sub {
        rev_ $p if tuwf->capture('rev');
        div_ class => 'mainbox', sub {
            itemmsg_ p => $p;
            info_ $p;
        };
        div_ class => 'maintabs right', sub {
            ul_ sub {
                li_ mkclass(tabselected => $tab eq 'vn'),  sub { a_ href => "/p$p->{id}/vn",  'Visual Novels' };
                li_ mkclass(tabselected => $tab eq 'rel'), sub { a_ href => "/p$p->{id}/rel", 'Releases' };
            };
        };
        div_ class => 'mainbox', sub { rel_ $p } if $tab eq 'rel';
        div_ class => 'mainbox', sub { vns_ $p } if $tab eq 'vn';
    }
};

1;