Spaces:
Runtime error
Runtime error
| import { NextResponse } from 'next/server' | |
| import { existsSync } from 'node:fs' | |
| import { APP_VERSION } from '@/lib/version' | |
| const GITHUB_RELEASES_URL = | |
| 'https://api.github.com/repos/builderz-labs/mission-control/releases/latest' | |
| /** Simple semver compare: returns 1 if a > b, -1 if a < b, 0 if equal. */ | |
| function compareSemver(a: string, b: string): number { | |
| const pa = a.replace(/^v/, '').split('.').map(Number) | |
| const pb = b.replace(/^v/, '').split('.').map(Number) | |
| for (let i = 0; i < Math.max(pa.length, pb.length); i++) { | |
| const na = pa[i] ?? 0 | |
| const nb = pb[i] ?? 0 | |
| if (na > nb) return 1 | |
| if (na < nb) return -1 | |
| } | |
| return 0 | |
| } | |
| export async function GET() { | |
| try { | |
| const res = await fetch(GITHUB_RELEASES_URL, { | |
| headers: { Accept: 'application/vnd.github+json' }, | |
| next: { revalidate: 3600 }, // ISR cache for 1 hour | |
| }) | |
| if (!res.ok) { | |
| return NextResponse.json( | |
| { updateAvailable: false, currentVersion: APP_VERSION }, | |
| { headers: { 'Cache-Control': 'public, max-age=3600' } } | |
| ) | |
| } | |
| const release = await res.json() | |
| const latestVersion = (release.tag_name ?? '').replace(/^v/, '') | |
| const updateAvailable = compareSemver(latestVersion, APP_VERSION) > 0 | |
| const deploymentMode = existsSync('/.dockerenv') ? 'docker' : 'bare-metal' | |
| return NextResponse.json( | |
| { | |
| updateAvailable, | |
| currentVersion: APP_VERSION, | |
| latestVersion, | |
| releaseUrl: release.html_url ?? '', | |
| releaseNotes: release.body ?? '', | |
| deploymentMode, | |
| }, | |
| { headers: { 'Cache-Control': 'public, max-age=3600' } } | |
| ) | |
| } catch { | |
| // Network error — fail gracefully | |
| return NextResponse.json( | |
| { updateAvailable: false, currentVersion: APP_VERSION }, | |
| { headers: { 'Cache-Control': 'public, max-age=600' } } | |
| ) | |
| } | |
| } | |