File size: 2,716 Bytes
05d91af
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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 };