]> git.ktnx.net Git - lsl.git/commitdiff
manage transactions via hooks
authorDamyan Ivanov <dmn@debian.org>
Fri, 4 Mar 2022 20:24:27 +0000 (20:24 +0000)
committerDamyan Ivanov <dmn@debian.org>
Fri, 4 Mar 2022 20:24:27 +0000 (20:24 +0000)
begin before request, commit after, unless there was a 5xx error, in
which case rollback

lib/App/LazyShoppingList/API/v1.pm

index 3e3565b9d1a9a8dfa45a96de10467e7c90d82abc..6a34491a00f4535202c834adf93c236c75957c92 100644 (file)
@@ -15,6 +15,21 @@ use experimental 'signatures';
 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') };
@@ -23,7 +38,6 @@ get '/' => sub {
 # get the list of shopping lists
 get '/list' => sub {
     my $dbh = get_database;
-    $dbh->txn_begin;
 
     my %r = ( lists_version => get_lists_version($dbh), lists => [] );
     for my $list (
@@ -36,7 +50,6 @@ get '/list' => sub {
             { uri => uri_for( "/list/" . $list->id ), name => $list->name };
     }
 
-    $dbh->txn_commit;
     return \%r;
 };
 
@@ -50,15 +63,12 @@ post '/list' => sub {
     }
 
     my $dbh = get_database;
-    $dbh->txn_begin;
     my $list = $dbh->resultset('ShoppingList')->create({
             name => $name});
     $list->discard_changes;
 
     my  $lists_ver = increment_lists_version($dbh);
 
-    $dbh->txn_commit;
-
     return {
         uri           => uri_for( '/list/' . $list->id ),
         version       => $list->version,
@@ -75,14 +85,12 @@ get '/list/:list_id' => sub {
 
     warn $dbh;
     my %r = ( items => [] );
-    $dbh->txn_begin;
 
     $r{lists_version} = get_lists_version($dbh);
 
     my $list = $dbh->resultset('ShoppingList')->find($list_id);
 
     unless ($list) {
-        $dbh->txn_commit;
         return exception 404, "No list with that ID found";
     }
 
@@ -102,8 +110,6 @@ get '/list/:list_id' => sub {
             };
     }
 
-    $dbh->txn_commit;
-
     return \%r;
 };
 
@@ -119,7 +125,6 @@ post '/list/:id' => sub {
     my $done  = JSON->boolean( $req->{done} // 0 );
 
     my $dbh = get_database;
-    $dbh->txn_begin;
 
     my %r = (
         lists_version => get_lists_version($dbh),
@@ -128,7 +133,6 @@ post '/list/:id' => sub {
     my $list = $dbh->resultset('ShoppingList')->find($list_id);
 
     unless ($list) {
-        $dbh->txn_commit;
         exception 404, "No such list";
     }
 
@@ -146,8 +150,6 @@ post '/list/:id' => sub {
     $r{version} = $item->version;
     $r{list_version} = $list->version;
 
-    $dbh->txn_commit;
-
     return \%r;
 };
 
@@ -171,7 +173,6 @@ put '/list/:list_id/:item_id' => sub {
         or return invalid_input('bad version');
 
     my $dbh = get_database;
-    $dbh->txn_begin;
 
     my %r = (
         lists_version => get_lists_version($dbh),
@@ -179,13 +180,11 @@ put '/list/:list_id/:item_id' => sub {
 
     my $list = $dbh->resultset('ShoppingList')->find($list_id);
     unless ($list) {
-        $dbh->txn_commit;
         return exception 404, "No such list";
     }
 
     my $item = $dbh->resultset('ShoppingListItem')->find({shopping_list => $list->id, id => $item_id});
     unless ($item) {
-        $dbh->txn_commit;
         return exception 404, "No such item";
     }
 
@@ -194,7 +193,6 @@ put '/list/:list_id/:item_id' => sub {
         or defined($done) and $done != $item->done )
     {
         unless ($version == $item->version) {
-            $dbh->txn_commit;
             return exception 409,
                 sprintf( 'Outdated version (current is %d)', $item->version );
         }
@@ -212,7 +210,6 @@ put '/list/:list_id/:item_id' => sub {
     $r{version} = $item->version;
     $r{list_version} = $list->version;
 
-    $dbh->txn_commit;
 
     return \%r;
 };