| Foorum documentation | Contained in the Foorum distribution. |
Fayland Lam <fayland at gmail.com>
| Foorum documentation | Contained in the Foorum distribution. |
package Foorum::Model::Object; use strict; use warnings; our $VERSION = '1.001000'; use parent 'Catalyst::Model'; sub get_object_from_url { my ( $self, $c, $path ) = @_; my ( $object_id, $object_type, $forum_code ); # 1. poll, eg: /forum/ForumName/poll/2 if ( $path =~ /\/forum\/(\w+)\/poll\/(\d+)/ ) { $forum_code = $1; $object_id = $2; # poll_id $object_type = 'poll'; } # 1, topic, eg: /forum/ForumName/topic/3 if ( $path =~ /\/forum\/(\w+)\/topic\/(\d+)/ ) { $forum_code = $1; $object_id = $2; $object_type = 'topic'; } # 2. user profile, eg: /u/fayland or /u/1 elsif ( $path =~ /\/u\/(\w+)/ ) { my $user_sig = $1; if ( $user_sig =~ /^\d+$/ ) { $object_id = $user_sig; } else { my $user = $c->model('DBIC::User')->get( { username => $user_sig } ); return unless ($user); $object_id = $user->{user_id}; } $object_type = 'user_profile'; } return ( $object_id, $object_type, $forum_code ); } sub get_url_from_object { my ( $self, $c, $info ) = @_; my $object_type = $info->{object_type}; my $object_id = $info->{object_id}; my $forum_id = $info->{forum_id}; if ( 'poll' eq $object_type ) { return "/forum/$forum_id/poll/$object_id"; } elsif ( 'topic' eq $object_type ) { return "/forum/$forum_id/topic/$object_id"; } elsif ( 'user_profile' eq $object_type ) { return "/u/$object_id"; } } sub get_object_by_type_id { my ( $self, $c, $info ) = @_; my $object_type = $info->{object_type}; my $object_id = $info->{object_id}; return unless ( $object_type and $object_id ); if ( 'topic' eq $object_type ) { my $object = $c->model('DBIC::Topic')->get($object_id); return unless ($object); return { object_type => 'topic', object_id => $object_id, title => $object->{title}, author => $c->model('DBIC::User') ->get( { user_id => $object->{author_id} } ), url => '/forum/' . $object->{forum_id} . "/$object_id", last_update => $object->{last_update_date}, forum_id => $object->{forum_id}, }; } elsif ( 'poll' eq $object_type ) { my $object = $c->model('DBIC::Poll')->find( { poll_id => $object_id, } ); return unless ($object); return { object_type => 'poll', object_id => $object_id, title => $object->title, author => $c->model('DBIC::User') ->get( { user_id => $object->author_id } ), url => '/forum/' . $object->forum_id . "/poll/$object_id", last_update => '-', forum_id => $object->forum_id, }; } } 1; __END__