source: bookmarks/trunk/lib/BookmarksApp.pm @ 104

Last change on this file since 104 was 101, checked in by peter, 9 years ago

added some perldoc to BookmarksApp

File size: 3.5 KB
Line 
1package BookmarksApp;
2
3=head1 NAME
4
5BookmarksApp
6
7=head1 SYNOPSIS
8
9    use BookmarksApp;
10    use Digest::MD5 qw{md5_hex};
11
12    my $username = '...';
13    my $password = '...';
14    my $app = BookmarksApp->new({
15        config => {
16            dbname => 'bookmarks.db',
17
18            # set these if you want non-GET requests to require authentication
19            auth            => 1,
20            digest_key      => 'secret',
21            digest_password => md5_hex("$username:Bookmarks:$password"),
22           
23            # set this if the app is running behind a proxy server
24            proxy_ip  => '...',
25        },
26    });
27
28    # returns the coderef appropriate for use in an app.psgi,
29    # or for passing the Plack::Runner, etc.
30    $app->to_app;
31
32=cut
33
34use strict;
35use warnings;
36
37use parent qw{Plack::Component};
38use Plack::Util::Accessor qw{config _app _controller};
39
40use YAML;
41use Plack::Builder;
42use Plack::Request;
43use Router::Resource;
44
45use Bookmarks::Controller;
46
47sub prepare_app {
48    my $self = shift;
49
50    my $config = $self->config;
51
52    my $router = router {
53        resource '/' => sub {
54            GET {
55                # check for a uri param, and if there is one present,
56                # see if a bookmark for that URI already exists; if so
57                # redirect to that bookmark, and if not, show the form
58                # to create a new bookmark
59                if (defined $self->_controller->request->param('uri')) {
60                    return $self->_controller->find_or_new;
61                }
62
63                # otherwise return a list
64                return $self->_controller->list;
65            };
66            POST {
67                # create the bookmark and redirect to the new bookmark's edit form
68                return $self->_controller->create_and_redirect;
69            };
70        };
71
72        resource '/list' => sub {
73            GET {
74                return $self->_controller->list;
75            };
76        };
77
78        resource '/feed' => sub {
79            GET {
80                return $self->_controller->feed;
81            };
82        };
83
84        resource '/{id}' => sub {
85            GET {
86                my ($env, $params) = @_;
87                return $self->_controller->view($params->{id});
88            };
89            POST {
90                my ($env, $params) = @_;
91                return $self->_controller->update_and_redirect($params->{id});
92            };
93        };
94
95        resource '/{id}/{field}' => sub {
96            GET {
97                my ($env, $params) = @_;
98                return $self->_controller->view_field($params->{id}, $params->{field});
99            };
100        };
101    };
102
103    $self->_app(
104        builder {
105            enable_if { $_[0]->{REMOTE_ADDR} eq $config->{proxy_ip} } 'ReverseProxy'
106                if $config->{proxy_ip};
107            enable_if { $_[0]->{REQUEST_METHOD} ne 'GET' } 'Auth::Digest', (
108                realm           => 'Bookmarks',
109                secret          => $config->{digest_key},
110                password_hashed => 1,
111                authenticator   => sub { $config->{digest_password} }
112            ) if $config->{auth};
113            sub { $router->dispatch(shift); };
114        }
115    );
116    $self->_controller(
117        Bookmarks::Controller->new({
118            dbname  => $self->config->{dbname},
119        })
120    );
121}
122
123sub call {
124    my $self = shift;
125    my $env = shift;
126
127    # initialize the controller based on this request
128    $self->_controller->request(Plack::Request->new($env));
129
130    # dispatch to the app
131    $self->_app->($env);
132}
133
134# module return
1351;
136
137=head1 AUTHOR
138
139Peter Eichman <peichman@cpan.org>
140
141=cut
Note: See TracBrowser for help on using the repository browser.