| import { readFile, writeFile, readdir, rm, mkdir } from 'node:fs/promises'; |
| import { join } from 'node:path'; |
| import { randomBytes } from 'node:crypto'; |
|
|
| const STORE_FILE = join(process.cwd(), 'data', 'deployed-projects.json'); |
|
|
| const deployedProjects = new Map(); |
|
|
| async function ensureDataDir() { |
| const dataDir = join(process.cwd(), 'data'); |
| try { |
| await mkdir(dataDir, { recursive: true }); |
| } catch {} |
| } |
|
|
| async function loadStore() { |
| try { |
| await ensureDataDir(); |
| const data = await readFile(STORE_FILE, 'utf-8'); |
| const parsed = JSON.parse(data); |
| deployedProjects.clear(); |
| for (const [id, project] of Object.entries(parsed)) { |
| deployedProjects.set(id, project); |
| } |
| } catch { |
| deployedProjects.clear(); |
| } |
| } |
|
|
| async function saveStore() { |
| try { |
| await ensureDataDir(); |
| const data = JSON.stringify(Object.fromEntries(deployedProjects), null, 2); |
| await writeFile(STORE_FILE, data, 'utf-8'); |
| } catch (error) { |
| console.error('Failed to save projects store:', error.message); |
| } |
| } |
|
|
| function generateId() { |
| return randomBytes(8).toString('hex'); |
| } |
|
|
| export async function initStore() { |
| await loadStore(); |
| } |
|
|
| export function createProject(data) { |
| const id = generateId(); |
| const project = { |
| id, |
| name: data.name || id, |
| language: data.language || 'unknown', |
| createdAt: new Date().toISOString(), |
| updatedAt: new Date().toISOString(), |
| files: data.files || {}, |
| config: data.config || {}, |
| metadata: data.metadata || {} |
| }; |
| deployedProjects.set(id, project); |
| saveStore(); |
| return project; |
| } |
|
|
| export function getProject(id) { |
| return deployedProjects.get(id) || null; |
| } |
|
|
| export function getAllProjects() { |
| return Array.from(deployedProjects.values()); |
| } |
|
|
| export function updateProject(id, data) { |
| const project = deployedProjects.get(id); |
| if (!project) return null; |
| |
| const updated = { |
| ...project, |
| ...data, |
| updatedAt: new Date().toISOString() |
| }; |
| deployedProjects.set(id, updated); |
| saveStore(); |
| return updated; |
| } |
|
|
| export function deleteProject(id) { |
| const deleted = deployedProjects.delete(id); |
| if (deleted) { |
| saveStore(); |
| } |
| return deleted; |
| } |
|
|
| export async function deleteProjectFiles(id) { |
| const project = deployedProjects.get(id); |
| if (!project) return false; |
| |
| const projectPath = join(process.cwd(), 'projects', id); |
| try { |
| await rm(projectPath, { recursive: true, force: true }); |
| return true; |
| } catch { |
| return false; |
| } |
| } |
|
|
| export { generateId, deployedProjects }; |
|
|