Spaces:
Running
on
CPU Upgrade
Running
on
CPU Upgrade
| 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 }); | |
| } | |
| } | |