aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Controller/Photo.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/App/Controller/Photo.pm')
-rw-r--r--perllib/FixMyStreet/App/Controller/Photo.pm103
1 files changed, 103 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Photo.pm b/perllib/FixMyStreet/App/Controller/Photo.pm
new file mode 100644
index 000000000..17862aa0a
--- /dev/null
+++ b/perllib/FixMyStreet/App/Controller/Photo.pm
@@ -0,0 +1,103 @@
+package FixMyStreet::App::Controller::Photo;
+use Moose;
+use namespace::autoclean;
+
+BEGIN {extends 'Catalyst::Controller'; }
+
+use DateTime::Format::HTTP;
+
+=head1 NAME
+
+FixMyStreet::App::Controller::Photo - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Catalyst Controller.
+
+=head1 METHODS
+
+=cut
+
+
+=head2 index
+
+Display a photo
+
+=cut
+
+sub index :Path :Args(0) {
+ my ( $self, $c ) = @_;
+
+ my $id = $c->req->param('id');
+ my $comment = $c->req->param('c');
+ $c->detach( 'no_photo' ) unless $id || $comment;
+
+ my @photo;
+ if ( $comment ) {
+ @photo = $c->model('DB::Comment')->search( {
+ id => $comment,
+ state => 'confirmed',
+ photo => { '!=', undef },
+ } );
+ } else {
+ # GoogleBot-Image is doing this for some reason?
+ if ( $id =~ m{ ^(\d+) \D .* $ }x ) {
+ return $c->res->redirect( $c->uri_with( { id => $1 } ), 301 );
+ }
+
+ $c->detach( 'no_photo' ) if $id =~ /\D/;
+ @photo = $c->cobrand->problems->search( {
+ id => $id,
+ state => [ 'confirmed', 'fixed', 'partial' ],
+ photo => { '!=', undef },
+ } );
+ }
+
+ $c->detach( 'no_photo' ) unless @photo;
+
+ my $photo = $photo[0]->photo;
+ if ( $c->req->param('tn' ) ) {
+ $photo = _resize( $photo, 'x100' );
+ } elsif ( $c->cobrand->default_photo_resize ) {
+ $photo = _resize( $photo, $c->cobrand->default_photo_resize );
+ }
+
+ my $dt = DateTime->now();
+ $dt->set_year( $dt->year + 1 );
+
+ $c->res->content_type( 'image/jpeg' );
+ $c->res->header( 'expires', DateTime::Format::HTTP->format_datetime( $dt ) );
+ $c->res->body( $photo );
+}
+
+sub no_photo : Private {
+ my ( $self, $c ) = @_;
+ $c->detach( '/page_error_404_not_found', [ 'No photo' ] );
+}
+
+sub _resize {
+ my ($photo, $size) = @_;
+ use Image::Magick;
+ my $image = Image::Magick->new;
+ $image->BlobToImage($photo);
+ my $err = $image->Scale(geometry => "$size>");
+ throw Error::Simple("resize failed: $err") if "$err";
+ my @blobs = $image->ImageToBlob();
+ undef $image;
+ return $blobs[0];
+}
+
+=head1 AUTHOR
+
+Struan Donald
+
+=head1 LICENSE
+
+This library is free software. You can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+__PACKAGE__->meta->make_immutable;
+
+1;