Feat: Criação do histórico, tabela no banco e geração nativa do Planejamento Mind Lab

This commit is contained in:
2026-06-05 18:51:05 +00:00
parent d74bb5e287
commit 5ea9c24ea0
4 changed files with 272 additions and 20 deletions
+93
View File
@@ -1453,6 +1453,86 @@ app.delete('/api/historias/:id', requireAuth, async (req, res) => {
} catch (err) { res.status(500).json({ error: 'Erro ao deletar.' }); }
});
// ============================================================
// ROTAS DO MIND LAB
// ============================================================
app.post('/api/mindlab/generate', requireAuth, async (req, res) => {
const { faixa_etaria, jogo, metodo, foco, duracao, tema } = req.body;
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
if (!faixa_etaria || !jogo || !metodo || !foco) {
return res.status(400).json({ error: 'Os campos obrigatórios do planejamento não foram preenchidos.' });
}
try {
const systemInstruction = `Você é um especialista na metodologia educacional Mente Inovadora (Mind Lab).
Crie um planejamento de aula detalhado em Markdown com os seguintes parâmetros:
- Faixa Etária: ${faixa_etaria}
- Jogo de Raciocínio: ${jogo}
- Método Metacognitivo Foco: ${metodo}
- Foco de Transferência (Socioemocional): ${foco}
- Duração: ${duracao}
- Tema Contextual: ${tema || 'Nenhum especifico'}
Por favor, estruture a aula obrigatoriamente com:
1. **Abertura (Contextualização):** Como introduzir o método e o tema.
2. **O Jogo (Aplicação):** Orientações para a mediação durante a partida.
3. **Reflexão (Mediação Transcendental):** Perguntas provocativas para fazer as crianças refletirem.
4. **Transferência:** Como conectar o que aprenderam no jogo e o método escolhido com situações reais da vida deles.`;
let planejamentoText = '';
if (process.env.GOOGLE_AI_API_KEY) {
const geminiUrl = `https://generativelanguage.googleapis.com/v1beta/models/${process.env.GOOGLE_AI_MODEL || 'gemini-2.5-flash'}:generateContent?key=${process.env.GOOGLE_AI_API_KEY}`;
const response = await fetch(geminiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ contents: [{ parts: [{ text: systemInstruction }] }] })
});
if (!response.ok) throw new Error('Erro na API Gemini');
const data = await response.json();
planejamentoText = data.candidates?.[0]?.content?.parts?.[0]?.text || '';
}
planejamentoText = planejamentoText.replace(/<think>[\s\S]*?<\/think>/gi, '').trim();
if (!planejamentoText) throw new Error('Falha ao gerar o planejamento.');
const dbRes = await dbPool.query(
`INSERT INTO escola.mindlab (usuario_id, faixa_etaria, jogo, metodo, foco, tema, planejamento) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id`,
[usuarioId, faixa_etaria, jogo, metodo, foco, tema, planejamentoText]
);
res.json({ id: dbRes.rows[0].id, planejamento: planejamentoText });
} catch (err) {
console.error('Erro Mind Lab:', err);
res.status(500).json({ error: 'Erro ao gerar planejamento Mind Lab: ' + err.message });
}
});
app.get('/api/mindlab/list', requireAuth, async (req, res) => {
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
try {
const dbRes = await dbPool.query(`SELECT id, faixa_etaria, jogo, metodo, foco, created_at FROM escola.mindlab WHERE usuario_id = $1 ORDER BY created_at DESC`, [usuarioId]);
res.json(dbRes.rows);
} catch (err) { res.status(500).json({ error: 'Erro ao listar histórico do Mind Lab.' }); }
});
app.get('/api/mindlab/:id', requireAuth, async (req, res) => {
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
try {
const dbRes = await dbPool.query(`SELECT * FROM escola.mindlab WHERE id = $1 AND usuario_id = $2`, [req.params.id, usuarioId]);
if (dbRes.rows.length === 0) return res.status(404).json({ error: 'Não encontrada.' });
res.json(dbRes.rows[0]);
} catch (err) { res.status(500).json({ error: 'Erro ao buscar.' }); }
});
app.delete('/api/mindlab/:id', requireAuth, async (req, res) => {
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
try {
const dbRes = await dbPool.query(`DELETE FROM escola.mindlab WHERE id = $1 AND usuario_id = $2`, [req.params.id, usuarioId]);
res.json({ success: true });
} catch (err) { res.status(500).json({ error: 'Erro ao deletar.' }); }
});
// Rota GET para obter configurações do agente
app.get('/api/agent-config', requireAuth, (req, res) => {
@@ -1677,6 +1757,19 @@ async function initDatabase() {
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Planejamento Mind Lab
CREATE TABLE IF NOT EXISTS escola.mindlab (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
usuario_id UUID NOT NULL DEFAULT '00000000-0000-0000-0000-000000000000',
faixa_etaria VARCHAR(100) NOT NULL,
jogo VARCHAR(100) NOT NULL,
metodo VARCHAR(100) NOT NULL,
foco VARCHAR(100) NOT NULL,
tema TEXT,
planejamento TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Histórias (Inventando Histórias)
CREATE TABLE IF NOT EXISTS escola.historias (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),