fix: double config path, stale service worker, empty op-name log

- main.go: DOCKER_PATH=/config + /config.json (was /config/config.json)
- vite.config.ts: skipWaiting+clientsClaim forces new SW immediately;
  navigateFallback: null prevents SW from serving stale index.html;
  globPatterns excludes HTML so navigation always hits the network
- server.go: gqlOpName handles shorthand { field } syntax

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-10 14:16:44 +02:00
parent 8354f5d64c
commit 542762e441
3 changed files with 34 additions and 10 deletions

View File

@@ -39,8 +39,14 @@ func main() {
} }
func configPath() string { func configPath() string {
// CONFIG_DIR points directly to the config directory (preferred).
if p := os.Getenv("CONFIG_DIR"); p != "" {
return p + "/config.json"
}
// DOCKER_PATH is also set to the config directory in docker-compose
// (the container mounts the config dir at /config, so DOCKER_PATH=/config).
if p := os.Getenv("DOCKER_PATH"); p != "" { if p := os.Getenv("DOCKER_PATH"); p != "" {
return p + "/config/config.json" return p + "/config.json"
} }
return "config.json" return "config.json"
} }

View File

@@ -253,13 +253,18 @@ func writeGQLError(w http.ResponseWriter, msg string) {
func gqlOpName(query string) string { func gqlOpName(query string) string {
q := strings.TrimSpace(query) q := strings.TrimSpace(query)
if strings.HasPrefix(q, "mutation") { switch {
return "mutation " + firstWord(q[len("mutation"):]) case strings.HasPrefix(q, "mutation"):
return "mutation " + firstWord(strings.TrimSpace(q[len("mutation"):]))
case strings.HasPrefix(q, "query"):
return "query " + firstWord(strings.TrimSpace(q[len("query"):]))
case strings.HasPrefix(q, "{"):
// Shorthand query: extract first field name from { field ... }
inner := strings.TrimSpace(q[1:])
return "query {" + firstWord(inner) + "...}"
default:
return firstWord(q)
} }
if strings.HasPrefix(q, "query") {
return "query " + firstWord(q[len("query"):])
}
return firstWord(q)
} }
func firstWord(s string) string { func firstWord(s string) string {

View File

@@ -8,6 +8,9 @@ export default defineConfig({
vue(), vue(),
VitePWA({ VitePWA({
registerType: 'autoUpdate', registerType: 'autoUpdate',
// Inject a cache-busting version based on build time so stale service
// workers are replaced immediately when a new image is deployed.
injectRegister: 'auto',
manifest: { manifest: {
name: 'Archivum', name: 'Archivum',
short_name: 'Archivum', short_name: 'Archivum',
@@ -15,16 +18,26 @@ export default defineConfig({
theme_color: '#0f172a', theme_color: '#0f172a',
background_color: '#0f172a', background_color: '#0f172a',
display: 'standalone', display: 'standalone',
// Icons are optional; add real PNG files to public/icons/ to enable PWA install.
icons: [], icons: [],
}, },
workbox: { workbox: {
globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'], // Force the new service worker to activate immediately
// instead of waiting for all tabs to close.
skipWaiting: true,
clientsClaim: true,
// Only cache these explicit file types — do NOT cache HTML so the
// SPA shell is always fetched fresh (prevents stale SW loops).
globPatterns: ['**/*.{js,css,woff2,png,svg,ico}'],
// Navigation requests (HTML) always go to the network.
navigateFallback: null,
runtimeCaching: [ runtimeCaching: [
{ {
urlPattern: /\/graphql$/, urlPattern: /\/graphql$/,
handler: 'NetworkFirst', handler: 'NetworkFirst',
options: { cacheName: 'api-cache' }, options: {
cacheName: 'api-cache',
networkTimeoutSeconds: 5,
},
}, },
], ],
}, },