67 lines
1.8 KiB
TypeScript
67 lines
1.8 KiB
TypeScript
|
|
/**
|
||
|
|
* 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 });
|
||
|
|
}
|
||
|
|
}
|