Restart repository history from target event

This commit is contained in:
2026-07-18 16:54:26 +01:00
commit e08aa0a667
71 changed files with 15963 additions and 0 deletions
+52
View File
@@ -0,0 +1,52 @@
import { NextResponse } from 'next/server';
import fs from 'fs-extra';
import path from 'path';
import { getOutputDir } from '@/lib/utils/paths';
import { copyDirRecursive } from '@/lib/utils/file-ops';
import { CopyResponse } from '@/types';
export async function POST(request: Request) {
try {
const { albumPath } = await request.json();
if (!albumPath || !(await fs.pathExists(albumPath))) {
return NextResponse.json({ error: 'Invalid album path' }, { status: 400 });
}
const outputDir = getOutputDir();
if (!outputDir) {
return NextResponse.json({ error: 'OUTPUT_DIR not configured in .env.local' }, { status: 400 });
}
// Ensure output directory exists
await fs.ensureDir(outputDir);
const albumName = path.basename(albumPath);
const destPath = path.join(outputDir, albumName);
// Check if destination already exists
if (await fs.pathExists(destPath)) {
return NextResponse.json({ error: 'Album already exists in output directory' }, { status: 409 });
}
try {
await fs.copy(albumPath, destPath);
} catch (error) {
const err = error as NodeJS.ErrnoException;
if (err.code === 'EINVAL') {
console.warn('fs-extra copy failed with EINVAL, attempting fallback to stream-based copy', error);
// Fallback to custom stream-based copy to avoid copyfile syscall
await copyDirRecursive(albumPath, destPath);
} else {
throw error;
}
}
const response: CopyResponse = { success: true, destPath };
return NextResponse.json(response);
} catch (error) {
console.error('Error copying album:', error);
return NextResponse.json({ error: 'Failed to copy album' }, { status: 500 });
}
}