multimodalart's picture
Upload 103 files
4400ddc verified
import { NextResponse } from 'next/server';
import fs from 'fs';
import path from 'path';
import { getDatasetsRoot } from '@/server/settings';
const sanitizeSegment = (value: string): string => {
if (!value || typeof value !== 'string') {
return '';
}
return value
.toLowerCase()
.replace(/[^a-z0-9]+/g, '_')
.replace(/^_+|_+$/g, '');
};
const ensureDirectory = (dirPath: string) => {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
}
};
const resolveDatasetName = (rootPath: string, desiredName: string, namespace?: string | null) => {
const baseName = sanitizeSegment(desiredName) || 'dataset';
const namespaceSuffix = sanitizeSegment(namespace || '');
const datasetExists = (candidate: string) => fs.existsSync(path.join(rootPath, candidate));
if (!datasetExists(baseName)) {
return { name: baseName, path: path.join(rootPath, baseName) };
}
if (namespaceSuffix) {
let candidate = sanitizeSegment(`${baseName}_${namespaceSuffix}`) || `${baseName}_${namespaceSuffix}`;
let attempts = 0;
while (datasetExists(candidate)) {
attempts += 1;
if (attempts > 50) {
throw new Error('Unable to allocate unique dataset name');
}
candidate = sanitizeSegment(`${candidate}_${namespaceSuffix}`) || `${candidate}_${namespaceSuffix}`;
}
return { name: candidate, path: path.join(rootPath, candidate) };
}
let counter = 2;
while (counter < 1000) {
const candidate = sanitizeSegment(`${baseName}_${counter}`) || `${baseName}_${counter}`;
if (!datasetExists(candidate)) {
return { name: candidate, path: path.join(rootPath, candidate) };
}
counter += 1;
}
throw new Error('Unable to allocate unique dataset name');
};
export async function POST(request: Request) {
try {
const body = await request.json();
const { name, namespace } = body ?? {};
if (!name || typeof name !== 'string') {
throw new Error('Dataset name is required');
}
const datasetsPath = await getDatasetsRoot();
const { name: resolvedName, path: datasetPath } = resolveDatasetName(
datasetsPath,
name,
typeof namespace === 'string' ? namespace : null,
);
ensureDirectory(datasetPath);
return NextResponse.json({
success: true,
name: resolvedName,
path: datasetPath,
});
} catch (error: any) {
console.error('Dataset create error:', error);
return NextResponse.json({ error: error?.message || 'Failed to create dataset' }, { status: 500 });
}
}