Restructure Web App into server/ + web/ (GsmNode parity)

Reorganize the Web App to match the GsmNode project layout: a Go
backend-for-frontend in server/ that embeds the built SPA and reverse-proxies
/api/* to the API Server, with the Vue 3 + Vite frontend moved into web/.

- Move all frontend files into web/ (history preserved via renames)
- Point vite build output at ../server/dist for Go embedding
- Add server/ Go BFF (main.go, go.mod, .env.example, Run-WebApp.ps1)
- Drop Docker/nginx deploy (Dockerfile, docker-compose.yml, nginx.conf.template,
  .dockerignore) in favor of the BFF, matching GsmNode
- Update .claude/launch.json to run the dev server from web/
- Rewrite README.md for the new layout

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
tajniak81
2026-07-13 11:34:02 +02:00
co-authored by Claude Opus 4.8
parent ba3f227361
commit 75a2ccc226
47 changed files with 230 additions and 161 deletions
+37
View File
@@ -0,0 +1,37 @@
import { createRouter, createWebHistory } from "vue-router";
import Dashboard from "./views/Dashboard.vue";
import CarDetail from "./views/CarDetail.vue";
import Login from "./views/Login.vue";
import Settings from "./views/Settings.vue";
import AdminUsers from "./views/AdminUsers.vue";
import { isAuthenticated, isAdmin } from "./auth";
const routes = [
{ path: "/login", name: "login", component: Login, meta: { public: true } },
{ path: "/", name: "dashboard", component: Dashboard },
{ path: "/cars/:id", name: "car", component: CarDetail, props: true },
{ path: "/settings", name: "settings", component: Settings },
{ path: "/admin", name: "admin", component: AdminUsers, meta: { admin: true } },
];
const router = createRouter({
history: createWebHistory(),
routes,
});
// Guard: protected routes require a token; visiting /login while authed bounces home.
router.beforeEach((to) => {
if (!to.meta.public && !isAuthenticated.value) {
return { name: "login", query: { redirect: to.fullPath } };
}
if (to.name === "login" && isAuthenticated.value) {
return { name: "dashboard" };
}
// Admin-only routes: bounce non-admins to the dashboard. (Server enforces the
// real gate; this just avoids showing a page that would 403 on every call.)
if (to.meta.admin && !isAdmin.value) {
return { name: "dashboard" };
}
});
export default router;