Mojolicious-Plugin-Fondation-Menu
view release on metacpan or search on metacpan
lib/Mojolicious/Plugin/Fondation/Menu/Controller/Menu.pm view on Meta::CPAN
sub create ($self) {
$self = $self->openapi->valid_input or return;
$self->render_later;
my $json = $self->req->json;
$self->model('menu')->create($json)->on_done(sub {
my $menu = shift;
my $data = $menu->TO_JSON;
$self->res->headers->location($self->url_for('read_menu', id => $data->{id}));
$self->render(status => 201, openapi => $data);
$self->menu_cache_invalidate if $self->has_helper('menu_cache_invalidate');
})->on_fail(sub ($err) { $self->problem(status => 500, detail => "$err") })->retain;
}
sub read ($self) {
$self = $self->openapi->valid_input or return;
$self->render_later;
my $id = $self->param('id');
$self->model('menu')->find($id)->on_done(sub {
my $menu = shift;
if ($menu) {
lib/Mojolicious/Plugin/Fondation/Menu/Controller/Menu.pm view on Meta::CPAN
my $menu = shift;
unless ($menu) {
$self->render(status => 404, openapi =>
{ errors => [{ message => 'Not found', path => '/' }] });
return;
}
$menu->update($json)->on_done(sub {
my $updated = shift;
my $data = $updated->TO_JSON;
$self->render(openapi => $data);
$self->menu_cache_invalidate if $self->has_helper('menu_cache_invalidate');
})->on_fail(sub ($err) { $self->problem(status => 500, detail => "$err") })->retain;
})->on_fail(sub ($err) { $self->problem(status => 500, detail => "$err") })->retain;
}
sub delete ($self) {
$self = $self->openapi->valid_input or return;
$self->render_later;
my $id = $self->param('id');
$self->model('menu')->find($id)->on_done(sub {
my $menu = shift;
unless ($menu) {
$self->render(status => 404, openapi =>
{ errors => [{ message => 'Not found', path => '/' }] });
return;
}
$menu->delete->on_done(sub {
$self->render(status => 204, openapi => {});
$self->menu_cache_invalidate if $self->has_helper('menu_cache_invalidate');
})->on_fail(sub ($err) { $self->problem(status => 500, detail => "$err") })->retain;
})->on_fail(sub ($err) { $self->problem(status => 500, detail => "$err") })->retain;
}
1;
__END__
=pod
lib/Mojolicious/Plugin/Fondation/Menu/Helpers.pm view on Meta::CPAN
# ââ _menus_cache ââââââââââââââââââââââââââââââââââââââââââââââââââ
# Returns the server-side cache hashref (lazy, shared across users)
my $_menus_cache;
my $_menus_loaded = 0;
my $_get_cache = sub {
return $_menus_cache if $_menus_loaded;
return undef;
};
my $_invalidate_cache = sub {
$_menus_loaded = 0;
undef $_menus_cache;
};
my $_ensure_cache;
# ââ breadcrumb âââââââââââââââââââââââââââââââââââââââââââââââââââââ
$app->helper(breadcrumb => sub ($c) {
$_ensure_cache->($c);
my $menus = $_get_cache->();
lib/Mojolicious/Plugin/Fondation/Menu/Helpers.pm view on Meta::CPAN
# ââ render_menu_breadcrumb ââââââââââââââââââââââââââââââââââââââââââ
$app->helper(render_menu_breadcrumb => sub ($c) {
my $trail = $c->breadcrumb;
return '' unless @$trail;
return $c->render_to_string(
template => 'menu/breadcrumb',
trail => $trail,
);
});
# ââ menu_cache_invalidate âââââââââââââââââââââââââââââââââââââââââââ
# Called by CRUD operations to clear the cache.
$app->helper(menu_cache_invalidate => sub { $_invalidate_cache->() });
# ââ _ensure_cache âââââââââââââââââââââââââââââââââââââââââââââââââââ
# Lazy-init cache on first access (non-blocking, no hook needed).
$_ensure_cache = sub ($c) {
return if $_menus_loaded;
_build_menus_cache($c, \$_menus_cache, \$_menus_loaded);
};
}
# ââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
( run in 0.468 second using v1.01-cache-2.11-cpan-ad19def0cd9 )