package MyApp::Controller::Swin; use Mojo::Base 'Mojolicious::Controller'; use Mojo::JSON qw(decode_json); sub index { my $c = shift; my $categories = $c->parse_swin_data('swin.json'); return $c->render(text => 'Error: Could not load bookmark data.', status => 500) unless $categories; # This now passes the login status to the template $c->stash( categories => $categories, is_logged_in => $c->is_logged_in ); $c->render('swin'); } sub edit { my $c = shift; return $c->redirect_to('/login') unless $c->is_logged_in; return $c->redirect_to('/noperm') unless $c->is_admin; my $categories = $c->parse_swin_data('swin.json'); return $c->render(text => 'Error: Could not load bookmark data.', status => 500) unless $categories; $c->stash(categories => $categories); $c->render('swin/edit'); } sub save { my $c = shift; return $c->redirect_to('/login') unless $c->is_logged_in; return $c->redirect_to('/noperm') unless $c->is_admin; my $json_text = $c->param('swin_data'); return $c->render_error('No data provided', 400) unless defined $json_text && length $json_text; my $categories; eval { $categories = decode_json($json_text); }; if ($@) { $c->app->log->error("Invalid JSON from client: $@"); return $c->render_error("Invalid JSON format: $@", 400); } if ($c->save_swin_data($categories)) { $c->redirect_to('/swin'); } else { $c->render_error('Failed to save data', 500); } } 1;