source: server/trunk/web/lib/Sophie/Controller/Distrib.pm @ 21

Last change on this file since 21 was 21, checked in by nanardon, 14 years ago
  • add initial distribution pages
File size: 7.6 KB
Line 
1package Sophie::Controller::Distrib;
2use Moose;
3use namespace::autoclean;
4
5BEGIN {extends 'Catalyst::Controller'; }
6
7=head1 NAME
8
9Sophie::Controller::Distrib - Catalyst Controller
10
11=head1 DESCRIPTION
12
13Catalyst Controller.
14
15=head1 METHODS
16
17=cut
18
19sub list :XMLRPC {
20    my ( $self, $c, $distrib, $release, $arch ) = @_;
21
22    my $distribution;
23    if (ref $distrib) {
24        ($distribution, $release, $arch) = (
25            $distrib->{distribution},
26            $distrib->{release},
27            $distrib->{arch},
28        );
29    } else {
30        $distribution = $distrib;
31    }
32
33    my $rs = $c->model('Base')->resultset('Distribution');
34    if (!$distribution) {
35        return $c->stash->{xmlrpc} = [ map { $_->name }
36            $rs->search(undef, { order_by => ['name'] })->all ];
37    }
38    $rs = $rs->search(name => $distribution)->search_related('Release');
39    if (!$release) {
40        return $c->stash->{xmlrpc} = [ map { $_->version }
41            $rs->search(undef, { order_by => ['version'] })->all ];
42    }
43    $rs = $rs->search(version => $release)->search_related('Arch');
44    if (!$arch) {
45        return $c->stash->{xmlrpc} = [ map { $_->arch } 
46            $rs->search(undef, { order_by => ['arch'] })->all ];
47    }
48    $rs = $rs->search(arch => $arch)->search_related('Medias');
49    return $c->stash->{xmlrpc} = [ map { $_->label }
50        $rs->search(undef, { order_by => ['label'] })->all ];
51}
52
53sub struct :XMLRPC {
54    my ( $self, $c, $distrib, $release, $arch ) = @_;
55
56    my $distribution;
57    if (ref $distrib) {
58        ($distribution, $release, $arch) = (
59            $distrib->{distribution},
60            $distrib->{release},
61            $distrib->{arch},
62        );
63    } else {
64        $distribution = $distrib;
65    }
66
67    my $rs = $c->model('Base')->resultset('Distribution')
68        ->search(name => $distribution)
69        ->search_related('Release', { version => $release })
70        ->search_related('Arch', { arch => $arch })
71        ->search_related('Medias');
72    @{$c->stash->{xmlrpc}} = map { 
73        { 
74            dist_label => $_->dist_label,
75            label => $_->label,
76            group_label => $_->group_label,
77            key => $_->d_media_key,
78        } 
79    } $rs->all;
80}
81
82
83=head2 index
84
85=cut
86
87sub index :Path :Chained :Args(0)  {
88    my ( $self, $c ) = @_;
89
90    $c->forward('list');
91}
92
93=head release
94
95=cut
96
97sub list_release :Path :Args(1) {
98    my ( $self, $c, $distribution ) = @_;
99    $c->stash->{dist}{distribution} = $distribution;
100    $c->forward('list', [ $c->stash->{dist} ] );
101}
102
103sub list_arch :Path :Args(2) {
104    my ( $self, $c, $distribution, $release ) = @_;
105    $c->stash->{dist}{distribution} = $distribution;
106    $c->stash->{dist}{release} = $release;
107    $c->forward('list', [ $c->stash->{dist} ] );
108}
109
110
111sub distrib_view :PathPrefix :Chained :CaptureArgs(3) {
112    my ( $self, $c, $distribution, $release, $arch ) = @_;
113    $c->stash->{dist}{distribution} = $distribution;
114    $c->stash->{dist}{release} = $release;
115    $c->stash->{dist}{arch} = $arch;
116    $c->stash->{distrib} = $c->stash->{dist};
117}
118
119sub distrib :Chained('distrib_view') PathPart('') {
120    my ( $self, $c ) = @_;
121    $c->forward('list', [ $c->stash->{dist} ]);
122    # TODO store properly results
123    # No call from json here
124}
125
126sub media :Chained('distrib_view') PathPart('media') {
127    my ( $self, $c ) = @_;
128    $c->forward('struct', [ $c->stash->{dist} ]);
129}
130
131sub rpms :XMLRPC {
132    my ( $self, $c, $distribution, $release, $arch ) = @_;
133
134    if (ref $distribution) {
135        ($distribution, $release, $arch) = (
136            $distribution->{distribution},
137            $distribution->{release},
138            $distribution->{arch},
139        );
140    }
141   
142    @{$c->stash->{rpm}} = map {
143            { 
144              pkgid => $_->pkgid,
145              filename => $_->filename,
146            }
147        }
148        $c->model('Base')
149        ->resultset('Distribution')->search({ name => $distribution })
150        ->search_related('Release', { version => $release })
151        ->search_related('Arch',    { arch => $arch })
152        ->search_related('Medias')
153        ->search_related('MediasPaths')
154        ->search_related('Paths')
155        ->search_related('Rpmfiles', {
156            pkgid => {
157                IN => $c->model('Base')->resultset('Rpms')
158                ->search({ issrc => 'false' })->get_column('pkgid') ->as_query }
159        } )->all;
160
161    $c->stash->{xmlrpc} = $c->stash->{rpm};
162}
163
164sub srpms :XMLRPC {
165    my ( $self, $c, $distribution, $release, $arch ) = @_;
166
167    if (ref $distribution) {
168        ($distribution, $release, $arch) = (
169            $distribution->{distribution},
170            $distribution->{release},
171            $distribution->{arch},
172        );
173    }
174
175    @{$c->stash->{rpm}} = map {
176            { 
177              pkgid => $_->pkgid,
178              filename => $_->filename,
179            }
180        }
181        $c->model('Base')
182        ->resultset('Distribution')->search({ name => $distribution })
183        ->search_related('Release', { version => $release })
184        ->search_related('Arch',    { arch => $arch })
185        ->search_related('Medias')
186        ->search_related('MediasPaths')
187        ->search_related('Paths')
188        ->search_related('Rpmfiles', {
189            pkgid => {
190                IN => $c->model('Base')->resultset('Rpms')
191                ->search({ issrc => 'true' })->get_column('pkgid') ->as_query }
192        } )->all;
193
194    $c->stash->{xmlrpc} = $c->stash->{rpm};
195}
196
197sub list_rpms :Chained('distrib_view') PathPart('rpms') {
198    my ( $self, $c ) = @_;
199    $c->forward('rpms', $c->stash->{dist});
200}
201
202sub list_srpms :Chained('distrib_view') PathPart('srpms') {
203    my ( $self, $c ) = @_;
204    $c->forward('srpms', $c->stash->{dist});
205}
206
207sub srpm_by_name :Chained('distrib_view') PathPart('srpms/by-name') Args(1) {
208}
209sub rpm_by_name :Chained('distrib_view') PathPart('rpms/by-name') Args(1) {
210}
211sub rpm_by_pkid :Chained('distrib_view') PathPart('by-pkgid') Args(1) {
212}
213
214sub media_rpms : XMLRPC {
215    my ( $self, $c, $distribution, $release, $arch, $media ) = @_;
216   
217    if (ref $distribution) {
218        ($distribution, $release, $arch, $media) = (
219            $distribution->{distribution},
220            $distribution->{release},
221            $distribution->{arch},
222            $release,
223        );
224    }
225   
226    @{$c->stash->{rpm}} = map {
227            { 
228              pkgid => $_->pkgid,
229              filename => $_->filename,
230            }
231        }
232        $c->model('Base')
233        ->resultset('Distribution')->search({ name => $distribution })
234        ->search_related('Release', { version => $release })
235        ->search_related('Arch',    { arch => $arch })
236        ->search_related('Medias', { label => $media })
237        ->search_related('MediasPaths')
238        ->search_related('Paths')
239        ->search_related('Rpmfiles')->all;
240
241    $c->stash->{xmlrpc} = $c->stash->{rpm};
242}
243
244sub _media_list_rpms :Chained('distrib_view') PathPart('media') CaptureArgs(1) {
245    my ( $self, $c, $media ) = @_;
246    $c->stash->{media} = $media;
247}
248
249sub media_list_rpms :Chained('_media_list_rpms') PathPart('') {
250    my ( $self, $c ) = @_;
251    $c->forward('media_rpms', [ $c->stash->{dist}, $c->stash->{media} ]);
252}
253
254sub media_rpm_byname :Chained('_media_list_rpms') PathPart('rpms/by-name') {
255    my ( $self, $c ) = @_;
256}
257sub media_srpm_byname :Chained('_media_list_rpms') PathPart('srpms/by-name') {
258    my ( $self, $c ) = @_;
259}
260sub media_rpm_bypkgid :Chained('_media_list_rpms') PathPart('by-pkgid') {
261    my ( $self, $c, $pkgid ) = @_;
262    $c->forward('/rpms/queryformat', [ $pkgid, '%{name}' ]);
263}
264
265=head1 AUTHOR
266
267Olivier Thauvin
268
269=head1 LICENSE
270
271This library is free software. You can redistribute it and/or modify
272it under the same terms as Perl itself.
273
274=cut
275
276__PACKAGE__->meta->make_immutable;
277
2781;
Note: See TracBrowser for help on using the repository browser.