Start proper dispatch chaining for objects with and without identifiers
[catagits/Catalyst-Controller-DBIC-API.git] / lib / Catalyst / Controller / DBIC / API / REST.pm
CommitLineData
d2739840 1package Catalyst::Controller::DBIC::API::REST;
2
3#ABSTRACT: Provides a REST interface to DBIx::Class
4use Moose;
5BEGIN { extends 'Catalyst::Controller::DBIC::API'; }
6
7__PACKAGE__->config(
8 'default' => 'application/json',
9 'stash_key' => 'response',
10 'map' => {
11 'application/x-www-form-urlencoded' => 'JSON',
12 'application/json' => 'JSON',
13 });
14
15=head1 DESCRIPTION
16
17Provides a REST style API interface to the functionality described in L<Catalyst::Controller::DBIC::API>.
18
19By default provides the following endpoints:
20
21 $base (accepts PUT and GET)
22 $base/[identifier] (accepts POST and DELETE)
23
24Where $base is the URI described by L</setup>, the chain root of the controller, and the request type will determine the L<Catalyst::Controller::DBIC::API> method to forward.
25
26=method_protected setup
27
28Chained: override
29PathPart: override
30CaptureArgs: 0
31
32As described in L<Catalyst::Controller::DBIC::API/setup>, this action is the chain root of the controller but has no pathpart or chain parent defined by default, so these must be defined in order for the controller to function. The neatest way is normally to define these using the controller's config.
33
34 __PACKAGE__->config
35 ( action => { setup => { PathPart => 'track', Chained => '/api/rest/rest_base' } },
36 ...
37 );
38
39=method_protected base
40
41Chained: L</setup>
42PathPart: none
43CaptureArgs: 0
44
45Forwards to list level methods described in L<Catalyst::Controller::DBIC::API> as follows:
46
47DELETE: forwards to L<Catalyst::Controller::DBIC::API/object> then L<Catalyst::Controller::DBIC::API/delete>
48POST/PUT: forwards to L<Catalyst::Controller::DBIC::API/object> then L<Catalyst::Controller::DBIC::API/update_or_create>
49GET: forwards to L<Catalyst::Controller::DBIC::API/list>
50
51=cut
52
8cf0b66a 53sub no_id : Chained('object_no_id') PathPart('') ActionClass('REST') :CaptureArgs(0) {}
d2739840 54
8cf0b66a 55sub no_id_PUT
56{
d2739840 57 my ( $self, $c ) = @_;
d2739840 58 $c->forward('update_or_create');
59}
60
8cf0b66a 61sub no_id_POST
62{
d2739840 63 my ( $self, $c ) = @_;
d2739840 64 $c->forward('update_or_create');
65}
66
8cf0b66a 67sub no_id_DELETE
68{
d2739840 69 my ( $self, $c ) = @_;
d2739840 70 $c->forward('delete');
71}
72
8cf0b66a 73sub no_id_GET
74{
d2739840 75 my ( $self, $c ) = @_;
d2739840 76 $c->forward('list');
77}
78
8cf0b66a 79sub with_id :Chained('object_with_id') :PathPart('') :ActionClass('REST') :CaptureArgs(0) {}
80
81sub with_id_PUT
82{
83 my ( $self, $c ) = @_;
84 $c->forward('update_or_create');
85}
86
87sub with_id_POST
88{
89 my ( $self, $c ) = @_;
90 $c->forward('update_or_create');
91}
92
93sub with_id_DELETE
94{
95 my ( $self, $c ) = @_;
96 $c->forward('delete');
97}
98
99sub with_id_GET
100{
101 my ( $self, $c ) = @_;
102 $c->forward('item');
103}
104
d2739840 1051;