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 1.017 second using v1.01-cache-2.11-cpan-ad19def0cd9 )