/** * GET /api/mobile/app-version — current LogShip Mobile release manifest for the in-app updater. * * With a session: served from the server-side channel (data/mobile-releases/, see * server/utils/mobileReleases.ts) with an absolute, expiring download URL — Android's * DownloadManager sends no auth header, so the URL is the credential. * Without a session (old app builds during the transition): the legacy public manifest on * www.logyou.de/logship is proxied unchanged (relative apkUrl → resolved by the app against that * host). Disable with MOBILE_APP_LEGACY_FALLBACK=false once every device runs a build that * authenticates its update check. */ import { readManifest, manifestWithSignedUrl, enrichManifest, legacyFallbackEnabled, isServiceTokenRequest } from '../../utils/mobileReleases' const LEGACY_URL = 'https://www.logyou.de/logship/version.json' export default defineEventHandler(async (event) => { setHeader(event, 'Cache-Control', 'no-store') const token = await getTokenHelper(event) const authed = !!token || isServiceTokenRequest(event) if (authed) { const manifest = readManifest() if (manifest) { try { return manifestWithSignedUrl(enrichManifest(manifest)) } catch (err: any) { console.error('[app-version] cannot sign download url:', err?.message || err) setResponseStatus(event, 500) return { status: 500, message: err?.message || 'Download URL not available' } } } if (!legacyFallbackEnabled()) { setResponseStatus(event, 404) return { status: 404, message: 'No release published' } } // no local release yet → legacy channel below } else if (!legacyFallbackEnabled()) { setResponseStatus(event, 401) return { status: 401, message: 'Not authenticated' } } try { const response = await fetch(LEGACY_URL, { cache: 'no-store' } as any) if (!response.ok) throw new Error(`Failed to fetch version: ${response.status}`) return await response.json() } catch (error: any) { console.error('Error fetching app version:', error) throw createError({ statusCode: 500, message: error.message || 'Failed to fetch version info' }) } })