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

Last change on this file since 110 was 107, checked in by peter, 9 years ago

Added a /tags resource that provides a drilldown inteface to the tags and bookmarks. URI pattern is /tags/{tag1}/{tag2}/{tag3...}

File size: 4.0 KB
RevLine 
[81]1package BookmarksApp;
2
[101]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
[81]34use strict;
35use warnings;
36
37use parent qw{Plack::Component};
[99]38use Plack::Util::Accessor qw{config _app _controller};
[81]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
[92]50    my $config = $self->config;
[81]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
[107]84        resource '/tags' => sub {
85            GET {
86                my ($env, $params) = @_;
87                return $self->_controller->tag_tree;
88            };
89        };
90        resource '/tags/*' => sub {
91            GET {
92                my ($env, $params) = @_;
93                my $tag_path = (@{ $params->{splat} })[0];
94                return $self->_controller->tag_tree([ split m{/}, $tag_path ]);
95            };
96        };
97
[81]98        resource '/{id}' => sub {
99            GET {
100                my ($env, $params) = @_;
101                return $self->_controller->view($params->{id});
102            };
103            POST {
104                my ($env, $params) = @_;
105                return $self->_controller->update_and_redirect($params->{id});
106            };
107        };
108
109        resource '/{id}/{field}' => sub {
110            GET {
111                my ($env, $params) = @_;
112                return $self->_controller->view_field($params->{id}, $params->{field});
113            };
114        };
[107]115
[81]116    };
117
118    $self->_app(
119        builder {
[92]120            enable_if { $_[0]->{REMOTE_ADDR} eq $config->{proxy_ip} } 'ReverseProxy'
121                if $config->{proxy_ip};
[81]122            enable_if { $_[0]->{REQUEST_METHOD} ne 'GET' } 'Auth::Digest', (
123                realm           => 'Bookmarks',
124                secret          => $config->{digest_key},
125                password_hashed => 1,
126                authenticator   => sub { $config->{digest_password} }
[92]127            ) if $config->{auth};
[81]128            sub { $router->dispatch(shift); };
129        }
130    );
[98]131    $self->_controller(
132        Bookmarks::Controller->new({
133            dbname  => $self->config->{dbname},
134        })
135    );
[81]136}
137
138sub call {
139    my $self = shift;
140    my $env = shift;
141
142    # initialize the controller based on this request
[98]143    $self->_controller->request(Plack::Request->new($env));
[81]144
145    # dispatch to the app
146    $self->_app->($env);
147}
148
149# module return
1501;
[101]151
152=head1 AUTHOR
153
154Peter Eichman <peichman@cpan.org>
155
156=cut
Note: See TracBrowser for help on using the repository browser.