const fs = require('fs'); const path = require('path'); const serverFile = path.join(__dirname, 'server.js'); let serverCode = fs.readFileSync(serverFile, 'utf8'); // Add tables to initDb const tablesSql = ` -- Turmas CREATE TABLE IF NOT EXISTS escola.turmas ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), usuario_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', nome VARCHAR(255) NOT NULL, sala VARCHAR(255), periodo VARCHAR(100), prof_titular VARCHAR(255), prof_aux1 VARCHAR(255), prof_aux2 VARCHAR(255), cuidadora VARCHAR(255), created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); -- Alunos CREATE TABLE IF NOT EXISTS escola.alunos ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), usuario_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000', turma_id UUID REFERENCES escola.turmas(id) ON DELETE CASCADE, nome VARCHAR(255) NOT NULL, apelido VARCHAR(255), data_nasc DATE, especial BOOLEAN DEFAULT false, especial_detalhes TEXT, pais TEXT, autorizados TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() ); `; if (!serverCode.includes('CREATE TABLE IF NOT EXISTS escola.turmas')) { serverCode = serverCode.replace( "CREATE TABLE IF NOT EXISTS escola.estudio_musicas", tablesSql + "\n CREATE TABLE IF NOT EXISTS escola.estudio_musicas" ); } // Add APIs before app.listen const apiRoutes = ` // ============================================================ // CRUD TURMAS E ALUNOS (MINHA TURMA) // ============================================================ app.get('/api/turmas', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; try { const dbRes = await dbPool.query("SELECT * FROM escola.turmas WHERE usuario_id = $1 ORDER BY created_at ASC;", [usuarioId]); res.json(dbRes.rows); } catch (err) { res.status(500).json({ error: err.message }); } }); app.post('/api/turmas', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { nome, sala, periodo, profTitular, profAux1, profAux2, cuidadora } = req.body; if (!nome) return res.status(400).json({ error: 'Nome é obrigatório' }); try { const dbRes = await dbPool.query( "INSERT INTO escola.turmas (usuario_id, nome, sala, periodo, prof_titular, prof_aux1, prof_aux2, cuidadora) VALUES ($1, $2, $3, $4, $5, $6, $7, $8) RETURNING *;", [usuarioId, nome, sala, periodo, profTitular, profAux1, profAux2, cuidadora] ); res.status(201).json(dbRes.rows[0]); } catch (err) { res.status(500).json({ error: err.message }); } }); app.put('/api/turmas/:id', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { id } = req.params; const { nome, sala, periodo, profTitular, profAux1, profAux2, cuidadora } = req.body; if (!nome) return res.status(400).json({ error: 'Nome é obrigatório' }); try { const dbRes = await dbPool.query( "UPDATE escola.turmas SET nome = $1, sala = $2, periodo = $3, prof_titular = $4, prof_aux1 = $5, prof_aux2 = $6, cuidadora = $7 WHERE id = $8 AND usuario_id = $9 RETURNING *;", [nome, sala, periodo, profTitular, profAux1, profAux2, cuidadora, id, usuarioId] ); res.json(dbRes.rows[0]); } catch (err) { res.status(500).json({ error: err.message }); } }); app.delete('/api/turmas/:id', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { id } = req.params; try { await dbPool.query("DELETE FROM escola.turmas WHERE id = $1 AND usuario_id = $2;", [id, usuarioId]); res.json({ success: true }); } catch (err) { res.status(500).json({ error: err.message }); } }); app.get('/api/alunos', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { turma_id } = req.query; try { let query = "SELECT * FROM escola.alunos WHERE usuario_id = $1"; let params = [usuarioId]; if (turma_id) { query += " AND turma_id = $2"; params.push(turma_id); } query += " ORDER BY nome ASC;"; const dbRes = await dbPool.query(query, params); res.json(dbRes.rows); } catch (err) { res.status(500).json({ error: err.message }); } }); app.post('/api/alunos', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { turma_id, nome, apelido, data_nasc, especial, especial_detalhes, pais, autorizados } = req.body; if (!nome || !turma_id) return res.status(400).json({ error: 'Nome e Turma são obrigatórios' }); let nascDate = data_nasc ? data_nasc : null; try { const dbRes = await dbPool.query( "INSERT INTO escola.alunos (usuario_id, turma_id, nome, apelido, data_nasc, especial, especial_detalhes, pais, autorizados) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) RETURNING *;", [usuarioId, turma_id, nome, apelido, nascDate, especial, especial_detalhes, pais, autorizados] ); res.status(201).json(dbRes.rows[0]); } catch (err) { res.status(500).json({ error: err.message }); } }); app.put('/api/alunos/:id', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { id } = req.params; const { turma_id, nome, apelido, data_nasc, especial, especial_detalhes, pais, autorizados } = req.body; if (!nome || !turma_id) return res.status(400).json({ error: 'Nome e Turma são obrigatórios' }); let nascDate = data_nasc ? data_nasc : null; try { const dbRes = await dbPool.query( "UPDATE escola.alunos SET turma_id = $1, nome = $2, apelido = $3, data_nasc = $4, especial = $5, especial_detalhes = $6, pais = $7, autorizados = $8 WHERE id = $9 AND usuario_id = $10 RETURNING *;", [turma_id, nome, apelido, nascDate, especial, especial_detalhes, pais, autorizados, id, usuarioId] ); res.json(dbRes.rows[0]); } catch (err) { res.status(500).json({ error: err.message }); } }); app.delete('/api/alunos/:id', requireAuth, async (req, res) => { const usuarioId = req.cookies.usuario_id || req.headers['user-id'] || '00000000-0000-0000-0000-000000000000'; const { id } = req.params; try { await dbPool.query("DELETE FROM escola.alunos WHERE id = $1 AND usuario_id = $2;", [id, usuarioId]); res.json({ success: true }); } catch (err) { res.status(500).json({ error: err.message }); } });\n\n`; if (!serverCode.includes('app.get(\'/api/turmas\'')) { serverCode = serverCode.replace("app.listen(PORT", apiRoutes + "app.listen(PORT"); } fs.writeFileSync(serverFile, serverCode); // ========================================== // Update index.html // ========================================== const indexFile = path.join(__dirname, 'public', 'index.html'); let indexCode = fs.readFileSync(indexFile, 'utf8'); const newTurmaConfigHtml = `