67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { requireAdminAuth } from '@/lib/admin/session';
|
|
import { logger } from '@/lib/logger';
|
|
import {
|
|
loadState,
|
|
checkOnce,
|
|
effectiveEndpoint,
|
|
disabledByEnv,
|
|
DEFAULT_VERSION_ENDPOINT,
|
|
} from '@/lib/version-check';
|
|
|
|
/**
|
|
* GET /api/admin/version
|
|
* Returns the cached update status, last check times, and effective config.
|
|
*/
|
|
export async function GET(request: NextRequest) {
|
|
try {
|
|
const auth = await requireAdminAuth(request);
|
|
if ('error' in auth) return auth.error;
|
|
|
|
const state = await loadState();
|
|
return NextResponse.json(
|
|
{
|
|
current: process.env.NEXT_PUBLIC_APP_VERSION || '0.0.0',
|
|
build: process.env.NEXT_PUBLIC_GIT_COMMIT || 'unknown',
|
|
endpoint: effectiveEndpoint(state),
|
|
defaultEndpoint: DEFAULT_VERSION_ENDPOINT,
|
|
disabledByEnv: disabledByEnv(),
|
|
lastCheckedAt: state.lastCheckedAt,
|
|
lastSuccessAt: state.lastSuccessAt,
|
|
nextScheduledAt: state.nextScheduledAt,
|
|
status: state.status,
|
|
},
|
|
{ headers: { 'Cache-Control': 'no-store' } },
|
|
);
|
|
} catch (err) {
|
|
logger.error('version admin GET error', {
|
|
error: err instanceof Error ? err.message : 'unknown',
|
|
});
|
|
return NextResponse.json({ error: 'failed' }, { status: 500 });
|
|
}
|
|
}
|
|
|
|
/**
|
|
* POST /api/admin/version
|
|
* { action: 'check-now' } - force a fresh upstream fetch.
|
|
*/
|
|
export async function POST(req: NextRequest) {
|
|
try {
|
|
const auth = await requireAdminAuth(req);
|
|
if ('error' in auth) return auth.error;
|
|
|
|
const body = (await req.json().catch(() => null)) as { action?: string } | null;
|
|
if (!body || body.action !== 'check-now') {
|
|
return NextResponse.json({ error: 'unknown action' }, { status: 400 });
|
|
}
|
|
|
|
const result = await checkOnce({ reason: 'admin-trigger' });
|
|
return NextResponse.json(result);
|
|
} catch (err) {
|
|
logger.error('version admin POST error', {
|
|
error: err instanceof Error ? err.message : 'unknown',
|
|
});
|
|
return NextResponse.json({ error: 'failed' }, { status: 500 });
|
|
}
|
|
}
|