Changeset 79 in bookmarks for trunk


Ignore:
Timestamp:
04/01/15 17:25:13 (10 years ago)
Author:
peter
Message:

issue #1: started to convert app.psgi into a Plack::Component-based module

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/app.psgi

    r70 r79  
    11#!/usr/bin/perl -w 
    22use strict; 
     3 
     4#TODO: allow individual options to be set via environment vars, too 
     5BookmarksApp->new({ config_file => $ENV{CONFIG_FILE} })->to_app; 
     6 
     7package BookmarksApp; 
     8 
     9use parent qw{Plack::Component}; 
     10use Plack::Util::Accessor qw{config_file config _app _controller}; 
    311 
    412use YAML; 
     
    917use Bookmarks::Controller; 
    1018 
    11 #TODO: allow individual options to be set via environment vars, too 
     19sub prepare_app { 
     20    my $self = shift; 
    1221 
    13 -e $ENV{CONFIG_FILE} or die "Config file $ENV{CONFIG_FILE} not found\n"; 
     22    -e $self->config_file or die "Config file " . $self->config_file . " not found\n"; 
    1423 
    15 my $config = YAML::LoadFile($ENV{CONFIG_FILE}); 
     24    my $config = YAML::LoadFile($self->config_file); 
     25    $self->config($config); 
    1626 
    17 sub get_controller { 
    18     my $env = shift; 
    19     my $req = Plack::Request->new($env); 
     27    my $router = router { 
     28        resource '/' => sub { 
     29            GET { 
     30                # check for a uri param, and if there is one present, 
     31                # see if a bookmark for that URI already exists; if so 
     32                # redirect to that bookmark, and if not, show the form 
     33                # to create a new bookmark 
     34                if (defined $self->_controller->request->param('uri')) { 
     35                    return $self->_controller->find_or_new; 
     36                } 
    2037 
    21     return Bookmarks::Controller->new({ 
    22         request => $req, 
    23         dbname  => $config->{dbname}, 
    24     }); 
    25 } 
     38                # otherwise return a list 
     39                return $self->_controller->list; 
     40            }; 
     41            POST { 
     42                # create the bookmark and redirect to the new bookmark's edit form 
     43                return $self->_controller->create_and_redirect; 
     44            }; 
     45        }; 
    2646 
    27 my $router = router { 
    28     resource '/' => sub { 
    29         GET { 
    30             my ($env) = @_; 
    31             my $controller = get_controller($env); 
     47        resource '/list' => sub { 
     48            GET { 
     49                return $self->_controller->list; 
     50            }; 
     51        }; 
    3252 
    33             # check for a uri param, and if there is one present, 
    34             # see if a bookmark for that URI already exists; if so 
    35             # redirect to that bookmark, and if not, show the form 
    36             # to create a new bookmark 
    37             if (defined $controller->request->param('uri')) { 
    38                 return $controller->find_or_new; 
    39             } 
     53        resource '/feed' => sub { 
     54            GET { 
     55                return $self->_controller->feed; 
     56            }; 
     57        }; 
    4058 
    41             # otherwise return a list 
    42             return $controller->list; 
     59        resource '/{id}' => sub { 
     60            GET { 
     61                my ($env, $params) = @_; 
     62                return $self->_controller->view($params->{id}); 
     63            }; 
     64            POST { 
     65                my ($env, $params) = @_; 
     66                return $self->_controller->update_and_redirect($params->{id}); 
     67            }; 
    4368        }; 
    44         POST { 
    45             my ($env) = @_; 
    46             my $controller = get_controller($env); 
    4769 
    48             # create the bookmark and redirect to the new bookmark's edit form 
    49             return $controller->create_and_redirect; 
     70        resource '/{id}/{field}' => sub { 
     71            GET { 
     72                my ($env, $params) = @_; 
     73                return $self->_controller->view_field($params->{id}, $params->{field}); 
     74            }; 
    5075        }; 
    5176    }; 
    5277 
    53     resource '/list' => sub { 
    54         GET { 
    55             my ($env) = @_; 
    56             my $controller = get_controller($env); 
     78    $self->_app( 
     79        builder { 
     80            enable_if { $_[0]->{REMOTE_ADDR} eq $config->{proxy_ip} } 'ReverseProxy'; 
     81            enable_if { $_[0]->{REQUEST_METHOD} ne 'GET' } 'Auth::Digest', ( 
     82                realm           => 'Bookmarks', 
     83                secret          => $config->{digest_key}, 
     84                password_hashed => 1, 
     85                authenticator   => sub { $config->{digest_password} } 
     86            ); 
     87            sub { $router->dispatch(shift); }; 
     88        } 
     89    ); 
     90} 
    5791 
    58             return $controller->list; 
    59         }; 
    60     }; 
     92sub call { 
     93    my $self = shift; 
     94    my $env = shift; 
    6195 
    62     resource '/feed' => sub { 
    63         GET { 
    64             my ($env) = @_; 
    65             my $controller = get_controller($env); 
     96    # initialize the controller based on this request 
     97    $self->_controller( 
     98        Bookmarks::Controller->new({ 
     99            request => Plack::Request->new($env), 
     100            dbname  => $self->config->{dbname}, 
     101        }) 
     102    ); 
    66103 
    67             return $controller->feed; 
    68         }; 
    69     }; 
    70  
    71     resource '/{id}' => sub { 
    72         GET { 
    73             my ($env, $params) = @_; 
    74             my $controller = get_controller($env); 
    75  
    76             return $controller->view($params->{id}); 
    77         }; 
    78         POST { 
    79             my ($env, $params) = @_; 
    80             my $controller = get_controller($env); 
    81  
    82             return $controller->update_and_redirect($params->{id}); 
    83         }; 
    84     }; 
    85  
    86     resource '/{id}/{field}' => sub { 
    87         GET { 
    88             my ($env, $params) = @_; 
    89             my $controller = get_controller($env); 
    90  
    91             return $controller->view_field($params->{id}, $params->{field}); 
    92         }; 
    93     }; 
    94 }; 
    95  
    96 builder { 
    97     enable_if { $_[0]->{REMOTE_ADDR} eq $config->{proxy_ip} } 'ReverseProxy'; 
    98     enable_if { $_[0]->{REQUEST_METHOD} ne 'GET' } 'Auth::Digest', ( 
    99         realm           => 'Bookmarks', 
    100         secret          => $config->{digest_key}, 
    101         password_hashed => 1, 
    102         authenticator   => sub { $config->{digest_password} } 
    103     ); 
    104     sub { $router->dispatch(shift); }; 
    105 }; 
     104    # dispatch to the app 
     105    $self->_app->($env); 
     106} 
Note: See TracChangeset for help on using the changeset viewer.