[Catalyst] RFC: Catalyst::Controller::REST::DBIC

Jonathan Rockway jon at jrock.us
Sun May 4 14:18:21 BST 2008


* On Sat, May 03 2008, luke saunders wrote:
>   __PACKAGE__->config
>     ( action => { setup => { PathPart => 'cd', Chained =>
> '/api/rest/rest_base' } },
>       class => 'RestTestDB::CD',
>       create_requires => ['artist', 'title', 'year' ],
>       update_allows => ['title', 'year']
>       );
>
> And this gets you the following endpoints to fire requests at:
>     /api/rest/cd/create
>     /api/rest/cd/id/[cdid]/update
>     /api/rest/cd/id/[cdid]/delete
>     /api/rest/cd/id/[cdid]/add_to_rel/[relation]
>     /api/rest/cd/id/[cdid]/remove_from_rel/[relation]

This is RPC, not REST.  Not that there's anything wrong with that.

It sounds like what you want to write is a Controller that proxies class
methods to a URI.  For example, you write a class like this:

  package Foo;
  
  sub create { my ($class, $username, $password) = @_; ... }
  sub delete { my $self = shift; $self->delete }
  sub foo    { my ($self, $quux, $value_for_42) = @_; ... }

  sub fetch_existing { my ($class, $id) = @_ }

  ...
  1;

Then you write a controller like this:

  package MyApp::Controller::Foo;
  use base 'The::Thing::You're::Writing';

  __PACKAGE__->config(
        class           => 'Foo',
        fetch_existing  => 'fetch_existing',
        new_instance    => 'create',
        methods         => {
          create => ['username', 'password'],
          delete => [],
          foo    => ['quux', '42'],
        },
  );          
  1;

Then you have actions like:

  /foo//create/<username>/<password>
  /foo/<id>
  /foo/<id>/foo/<quux>/<value for 42>
  /foo/<id>/delete

In your configuration, an option would be available to REST-ify certain
parts of the RPC interface:

  rest => {
    create => 'create',
    get    => 'fetch_existing',
    delete => 'delete',
    update => 'update',
  }

Then you would have the /foo and /foo/<id> REST endpoints do the same
thing as the RPC calls.

Anyway, making this specific to DBIx::Class sounds like a waste of time.

Regards,
Jonathan Rockway

-- 
print just => another => perl => hacker => if $,=$"



More information about the Catalyst mailing list