Files
immich-folio/app/api/admin/albums/[albumId]/assets/route.ts

67 lines
1.8 KiB
TypeScript
Raw Normal View History

/**
* Admin API: Get assets of a specific album for the hero image picker.
*/
import { NextRequest, NextResponse } from 'next/server';
import { isAdminAuthenticated, isAdminEnabled } from '@/lib/admin/auth';
import { getConfig } from '@/lib/config';
interface ImmichAlbumDetail {
assets: Array<{
id: string;
type: string;
originalFileName: string;
thumbhash: string | null;
fileCreatedAt: string;
isFavorite: boolean;
}>;
}
export async function GET(
_request: NextRequest,
{ params }: { params: Promise<{ albumId: string }> },
) {
if (!isAdminEnabled()) {
return NextResponse.json({ error: 'Admin not enabled' }, { status: 403 });
}
if (!(await isAdminAuthenticated())) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });
}
const config = getConfig();
if (config.needsSetup) {
return NextResponse.json({ error: 'Immich not configured' }, { status: 503 });
}
const { albumId } = await params;
try {
const res = await fetch(`${config.immich.apiUrl}/albums/${albumId}`, {
headers: {
'x-api-key': config.immich.apiKey,
Accept: 'application/json',
},
});
if (!res.ok) {
return NextResponse.json({ error: `Immich API returned ${res.status}` }, { status: 502 });
}
const album = (await res.json()) as ImmichAlbumDetail;
const assets = album.assets
.filter((a) => a.type === 'IMAGE')
.map((a) => ({
id: a.id,
originalFileName: a.originalFileName,
fileCreatedAt: a.fileCreatedAt,
isFavorite: a.isFavorite,
}));
return NextResponse.json({ assets, nextPage: null });
} catch (err) {
console.error('Failed to fetch album assets:', err);
return NextResponse.json({ error: 'Failed to fetch album assets' }, { status: 500 });
}
}