+}
+
+sub cancel {
+ my ($order) = @_;
+ $db{$$} //= DBIx::Simple->connect($ENV{OOF_DSN} // 'dbi:Pg:');
+ $order = $db{$$}->select(orders => '*', {id => $order})->hash;
+ my $products = decode_json $order->{products};
+ $db{$$}->begin_work;
+ try {
+ for my $prod (@$products) {
+ my $stock = $db{$$}->select(products => 'stock', {product => $prod->{product}})->list;
+ $db{$$}->update(products => {stock => $stock + $prod->{quantity}}, {product => $prod->{product}});
+ }
+ $db{$$}->delete(orders => {id => $order->{id}});
+ $db{$$}->commit;
+ } catch {
+ $db{$$}->rollback;
+ die $_
+ }
+}
+
+sub details_list_element {
+ my ($data, $li) = @_;
+ $li->find('a')->attr(href => "/$data");
+ my $thumb = $data =~ s/fullpics/thumbs/r;
+ $thumb = $data unless -f $thumb;
+ $li->find('img')->attr(src => "/$thumb");
+}
+
+sub details_app {
+ my ($env) = @_;
+ $db{$$} //= DBIx::Simple->connect($ENV{OOF_DSN} // 'dbi:Pg:');
+ my $tree = $details->clone;
+ my ($id) = $env->{PATH_INFO} =~ m,^/(\d+),;
+ my $title = $db{$$}->select(products => 'title', {product => $id})->list;
+ my @pics = <static/fullpics/$id-*>;
+ my $slug = make_slug $title;
+ $tree->find('title')->replace_content("Pictures of $title | ledparts4you");
+ $tree->find('h2')->replace_content($title);
+ $tree->look_down(rel => 'canonical')->attr(href => "/details/$id/$slug");
+ $tree->fid('pictures')->find('li')->iter3(\@pics, \&details_list_element);