# Content object class package Catalyst::Controller::SimpleCAS::Content; use Moose; use Email::MIME; use Image::Size; has 'Store', is => 'ro', required => 1, isa => 'Object'; has 'checksum', is => 'ro', required => 1, isa => 'Str'; has 'filename', is => 'ro', isa => 'Maybe[Str]', default => undef; sub BUILD { my $self = shift; die "Content does not exist" unless ($self->Store->content_exists($self->checksum)); } has 'MIME' => ( is => 'ro', lazy => 1, default => sub { my $self = shift; my $attrs = { content_type => $self->mimetype, encoding => 'base64' }; $attrs = { %$attrs, filename => $self->filename, name => $self->filename } if ($self->filename); return Email::MIME->create( attributes => scalar $attrs, body => scalar $self->content ); } ); has 'mimetype' => ( is => 'ro', lazy => 1, default => sub { my $self = shift; return $self->Store->content_mimetype($self->checksum); } ); has 'image_size' => ( is => 'ro', lazy => 1, default => sub { my $self = shift; my ($width,$height) = $self->Store->image_size($self->checksum); return [$width,$height]; } ); has 'size' => ( is => 'ro', lazy => 1, default => sub { my $self = shift; return $self->Store->content_size($self->checksum); } ); # TODO: abstract this properly and put it in the right place has 'fetch_url_path', is => 'ro', isa => 'Str', default => '/simplecas/fetch_content/'; has 'src_url', is => 'ro', lazy => 1, default => sub { my $self = shift; my $url = $self->fetch_url_path . $self->checksum; $url .= '/' . $self->filename if ($self->filename); return $url; }; has 'file_ext', is => 'ro', lazy => 1, default => sub { my $self = shift; return undef unless ($self->filename); my @parts = split(/\./,$self->filename); return undef unless (scalar @parts > 1); return lc(pop @parts); }; has 'filelink_css_class', is => 'ro', lazy => 1, default => sub { my $self = shift; my @css_class = ('filelink'); push @css_class, $self->file_ext if ($self->file_ext); return join(' ',@css_class); }; has 'filelink', is => 'ro', lazy => 1, default => sub { my $self = shift; my $name = $self->filename || $self->checksum; return '' . $name . ''; }; has 'img_size', is => 'ro', lazy => 1, default => sub { my $self = shift; my $content_type = $self->mimetype or return undef; my ($mime_type,$mime_subtype) = split(/\//,$content_type); return undef unless ($mime_type eq 'image'); my ($width,$height) = imgsize($self->Store->checksum_to_path($self->checksum)) or return undef; #return ($width,$height); return { height => $height, width => $width }; }; has 'imglink', is => 'ro', lazy => 1, default => sub { my $self = shift; return undef unless ($self->img_size); return ''; }; sub fh { my $self = shift; return $self->Store->fetch_content_fh($self->checksum); } sub content { my $self = shift; return $self->Store->fetch_content($self->checksum); } 1; __END__ =head1 NAME Catalyst::Controller::SimpleCAS::Content - Content object class for SimpleCAS =head1 SYNOPSIS use Catalyst::Controller::SimpleCAS; ... =head1 DESCRIPTION This object class is used to represent an individual content entity within a SimpleCAS Store. This is used internally and is not meant to be called/used directly. =head1 ATTRIBUTES =head2 Store =head2 checksum =head2 filename =head2 MIME =head2 mimetype =head2 image_size =head2 size =head2 fetch_url_path =head2 src_url =head2 file_ext =head2 filelink_css_class =head2 filelink =head2 img_size =head2 imglink =head1 METHODS =head2 content =head2 fh =head1 SEE ALSO =over =item * L =back =head1 AUTHOR Henry Van Styn =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2014 by IntelliTree Solutions llc. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut