Automated RESTful DB's

55
Mike F - mrf Friday, 25 July 14

description

Automated RESTful Database access using Perl. Note this has largely been replaced by the newly release WebAPI::DBIC

Transcript of Automated RESTful DB's

  • Mike F - mrf Friday, 25 July 14
  • Automated RESTful DB Mike F - mrf Friday, 25 July 14
  • Mike F - mrf Friday, 25 July 14
  • Friday, 25 July 14
  • REST Friday, 25 July 14
  • REST Client-Server Friday, 25 July 14
  • REST Client-Server Stateless Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • Friday, 25 July 14
  • PSGI Friday, 25 July 14
  • PSGI Layer Communication Specication Friday, 25 July 14
  • PSGI Layer Communication Specication Implemented as Plack Friday, 25 July 14
  • PSGI Layer Communication Specication Implemented as Plack Plack::Middleware::* Friday, 25 July 14
  • PSGI Layer Communication Specication Implemented as Plack Plack::Middleware::* Layers separate functions Friday, 25 July 14
  • use Plack::Builder; use MyApp; builder { enable qw/Debug Session Auth::Basic/; MyApp->as_psgi($args); } Friday, 25 July 14
  • use Plack::Builder; use Plack::App::Rest; builder { enable qw/Debug Session Auth::Basic/; Plack::App::Rest->init( persistence_mapper => DBIC, persistence_arg => [ db_connection_args => $dsn ] ); } Friday, 25 July 14
  • sub init { my $class = shift; my $self = $class->new(@_); return $self->init_rest_resource; } sub init_rest_resource { my ($self) = @_; my $resource_initialiser = Plack::Util::load_class( $self->persistence_mapper, 'Plack::App::REST' ); $resource_initialiser->new( @{$self->persistence_args}, )->to_psgi_app; } Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • Friday, 25 July 14
  • Uniform Interface Friday, 25 July 14
  • Uniform Interface Identication Friday, 25 July 14
  • Uniform Interface Identication Manipulation Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • Friday, 25 July 14
  • Web::Simple Friday, 25 July 14
  • Web::Simple Small and Lightweight Friday, 25 July 14
  • Web::Simple Small and Lightweight Supports PSGI Friday, 25 July 14
  • Web::Simple Small and Lightweight Supports PSGI Cares about Identication Friday, 25 July 14
  • sub dispatch_request { my ($self) = @_; map { my $resource = $_; ( "GET + /".$resource."/ + ?*" => sub { my ($self, $params) = @_; Web::Machine->new( resource => 'Plack::App::REST::DBIC::GET::Resource', resource_args => [ db_schema => $self->db_schema, db_table => $resource, db_params => $params, ], ); }, ); } $self->db_schema->sources; } Friday, 25 July 14
  • sub dispatch_request { my ($self) = @_; map { my $resource = $_; ( "GET + /".$resource."/ + ?*" => sub { my ($self, $params) = @_; Web::Machine->new( resource => 'Plack::App::REST::DBIC::GET::Resource', resource_args => [ db_schema => $self->db_schema, db_table => $resource, db_params => $params, ], ); }, ); } $self->db_schema->sources; } Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • Web::Machine Based on Erlang and Pythons WebMachines Automatic Handling of Status Understands HTTP ow Friday, 25 July 14
  • Friday, 25 July 14
  • sub content_types_provided { [ {'application/json' => 'to_json'}, ]; } sub to_json { my $self = shift; return 404 unless $response; # A status code was returned return $response if ref $response eq 'SCALAR'; return JSON::to_json($response), } Friday, 25 July 14
  • sub get_data { my ($self) = @_; my $params = $self->db_params; my $page = delete $params->{page} // 1; my $rows = delete $params->{page_size} // 10; my $resultset = $self->db_schema->resultset($self->db_table); for my $param (keys %$params){ return 400 unless $resultset->result_source->has_column($param); } my $results = $resultset->search( $params, {page => $page, rows => $rows} ); return $self->serialise_results( $results, $params, $results->pager, $rows ); } Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • use Moo::Role; use URI; sub serialise_results { my ($self, $results, $params, $pager, $rows) = @_; my @results; while (my $result = $results->next){ push @results, $self->serialise_row($result); } return unless @results; my $href = URI->new( $self->request->base.$results->result_source->source_name."/" ); $href->query_form(%$params) if keys %$params; $href->query_form( page => $pager->current_page, page_size => $rows, $href->query_form ); return { total_results => $pager->total_entries, page => $pager->current_page, page_size => $pager->entries_on_this_page, href => $href->as_string, data => @results, } } Friday, 25 July 14
  • sub serialise_row { my ($self, $result) = @_; my $href = URI->new( $self->request->base.$result->result_source->source_name."/" ); $href->query_form( map { $_ => $result->$_ } $result->primary_columns ); return { type => $result->result_source->source_name, href => $href->as_string, data => {$result->get_columns}, }; } Friday, 25 July 14
  • Uniform Interface Identication Manipulation Informative Hypermedia driven Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • REST Client-Server Stateless Cacheable Layered Uniform Interface Friday, 25 July 14
  • Problems No routing in Web::Machine What is a Resource? An Row or a Resultset POST to non existent resource Business logic Friday, 25 July 14
  • TODO Routing in Web::Machine Resource on the y creation Allow business override/callbacks Methods for Hypermedia control between related resources. Friday, 25 July 14
  • Friday, 25 July 14
  • Questions? Friday, 25 July 14