Name

PGXN::Site::Controller - The PGXN::Site request controller

Synopsis

use PGXN::Site::Controller;
use Router::Resource;

my $controller = PGXN::Site::Controller->new(url => 'https://api.pgxn.org');
my $router = router {
    resource '/' => sub {
        GET { $controller->home(@_) };
    };
};

Description

This class defines controller actions for PGXN::Site requests. It's designed to be called from within Router::Resource HTTP methods.

Interface

Constructor

new

my $controller = PGXN::Site::Controller->new(url => $private_api_url);

Constructs and returns a new controller. The parameters are the same as those supported by WWW::PGXN, which will be used to fetch the data needed to serve pages.

Accessors

api

my $api = $controller->api;

Returns a WWW::PGXN object used to access the PGXN API.

api_url

my $api_url = $controller->api_url;

Returns the URL used to link to the API in the UI. If private_api_url is not passed to new(), this URL is also used for communicating with the API via the WWW::PGXN object returned by api.

base_url

my $base_url = $controller->base_url;

Returns the base URL for the site. Used for links that must be absolute.

errors_to

my $errors_to = $controller->errors_to;

Returns the email address to which error messages will be sent.

errors_from

my $errors_from = $controller->errors_from;

Returns the email address from which error messages will be sent to errors_to.

feedback_to

my $feedback_to = $controller->feedback_to;

Returns the email address listed in the UI for sending feedback.

Actions

home

PGXN::Site::Controller->home($env);

Displays the HTML for the home page.

feedback

PGXN::Site::Controller->feedback($env);

Displays the HTML for the feedback page.

art

PGXN::Site::Controller->art($env);

Displays the HTML for the identity page.

about

PGXN::Site::Controller->about($env);

Displays the HTML for the about page.

donors

PGXN::Site::Controller->donors($env);

Displays the HTML for the donors page.

recent

PGXN::Site::Controller->recent($env);

Displays the HTML for the recent releases page.

mirroring

PGXN::Site::Controller->mirroring($env);

Displays the HTML for the mirroring page.

spec

PGXN::Site::Controller->spec($env, $format);

Displays the HTML or plain text for the PGXN Meta Spec.

faq

PGXN::Site::Controller->faq($env);

Displays the HTML for the FAQ page.

distribution

PGXN::Site::Controller->distribution($env);

Displays the HTML for the distribution page.

document

PGXN::Site::Controller->document($env);

Displays the HTML for the document page.

user

PGXN::Site::Controller->user($env);

Displays the HTML for the user page.

users

PGXN::Site::Controller->users($env);

Displays the HTML for the users search page.

tags

PGXN::Site::Controller->tags($env);

Displays the HTML for the tags page, including search form and tag cloud.

tag

PGXN::Site::Controller->tag($env);

Displays the HTML for the tag page.

extension

PGXN::Site::Controller->extension($env);

Displays the HTML for the extension page.

PGXN::Site::Controller->search($env);

Displays the HTML for the search page.

server_error

Handles subrequests from Plack::Middleware::ErrorDocument when a 500 is returned. Best way to set it up is to add these three middlewares to the production configuration file:

"middleware": [
    ["ErrorDocument", 500, "/error", "subrequest", 1],
    ["HTTPExceptions"],
    ["StackTrace", "no_print_errors", 1]
],

Methods

render

$controller->render('/home', $req, @template_args);

Renders the response to the request using PGXN::Site::Templates.

redirect

$controller->render('/home', $req);

Redirect the request to a new page.

missing

$controller->missing($env, $data);

Handles 404 and 405 errors from Router::Resource.

success
forbidden
notfound

Author

David E. Wheeler <david@justatheory.com>

Copyright and License

Copyright (c) 2010-2024 David E. Wheeler.

This module is free software; you can redistribute it and/or modify it under the PostgreSQL License.

Permission to use, copy, modify, and distribute this software and its documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies.

In no event shall David E. Wheeler be liable to any party for direct, indirect, special, incidental, or consequential damages, including lost profits, arising out of the use of this software and its documentation, even if David E. Wheeler has been advised of the possibility of such damage.

David E. Wheeler specifically disclaims any warranties, including, but not limited to, the implied warranties of merchantability and fitness for a particular purpose. The software provided hereunder is on an "as is" basis, and David E. Wheeler has no obligations to provide maintenance, support, updates, enhancements, or modifications.