begin before request, commit after, unless there was a 5xx error, in
which case rollback
set charset => 'UTF-8';
set serializer => 'JSON';
set charset => 'UTF-8';
set serializer => 'JSON';
+hook before_request => sub {
+ get_database->txn_begin;
+};
+
+hook after_request => sub {
+ my $dbh = get_database;
+
+ if (response->status =~ /^5/) {
+ $dbh->txn_rollback;
+ }
+ else {
+ $dbh->txn_commit;
+ }
+};
+
# get the URI for the list of shopping lists
get '/' => sub {
return { lists => uri_for('/list') };
# get the URI for the list of shopping lists
get '/' => sub {
return { lists => uri_for('/list') };
# get the list of shopping lists
get '/list' => sub {
my $dbh = get_database;
# get the list of shopping lists
get '/list' => sub {
my $dbh = get_database;
my %r = ( lists_version => get_lists_version($dbh), lists => [] );
for my $list (
my %r = ( lists_version => get_lists_version($dbh), lists => [] );
for my $list (
{ uri => uri_for( "/list/" . $list->id ), name => $list->name };
}
{ uri => uri_for( "/list/" . $list->id ), name => $list->name };
}
}
my $dbh = get_database;
}
my $dbh = get_database;
my $list = $dbh->resultset('ShoppingList')->create({
name => $name});
$list->discard_changes;
my $lists_ver = increment_lists_version($dbh);
my $list = $dbh->resultset('ShoppingList')->create({
name => $name});
$list->discard_changes;
my $lists_ver = increment_lists_version($dbh);
return {
uri => uri_for( '/list/' . $list->id ),
version => $list->version,
return {
uri => uri_for( '/list/' . $list->id ),
version => $list->version,
warn $dbh;
my %r = ( items => [] );
warn $dbh;
my %r = ( items => [] );
$r{lists_version} = get_lists_version($dbh);
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
$r{lists_version} = get_lists_version($dbh);
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
return exception 404, "No list with that ID found";
}
return exception 404, "No list with that ID found";
}
my $done = JSON->boolean( $req->{done} // 0 );
my $dbh = get_database;
my $done = JSON->boolean( $req->{done} // 0 );
my $dbh = get_database;
my %r = (
lists_version => get_lists_version($dbh),
my %r = (
lists_version => get_lists_version($dbh),
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
exception 404, "No such list";
}
exception 404, "No such list";
}
$r{version} = $item->version;
$r{list_version} = $list->version;
$r{version} = $item->version;
$r{list_version} = $list->version;
or return invalid_input('bad version');
my $dbh = get_database;
or return invalid_input('bad version');
my $dbh = get_database;
my %r = (
lists_version => get_lists_version($dbh),
my %r = (
lists_version => get_lists_version($dbh),
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
my $list = $dbh->resultset('ShoppingList')->find($list_id);
unless ($list) {
return exception 404, "No such list";
}
my $item = $dbh->resultset('ShoppingListItem')->find({shopping_list => $list->id, id => $item_id});
unless ($item) {
return exception 404, "No such list";
}
my $item = $dbh->resultset('ShoppingListItem')->find({shopping_list => $list->id, id => $item_id});
unless ($item) {
return exception 404, "No such item";
}
return exception 404, "No such item";
}
or defined($done) and $done != $item->done )
{
unless ($version == $item->version) {
or defined($done) and $done != $item->done )
{
unless ($version == $item->version) {
return exception 409,
sprintf( 'Outdated version (current is %d)', $item->version );
}
return exception 409,
sprintf( 'Outdated version (current is %d)', $item->version );
}
$r{version} = $item->version;
$r{list_version} = $list->version;
$r{version} = $item->version;
$r{list_version} = $list->version;