Feat: Criação do histórico, tabela no banco e geração nativa do Planejamento Mind Lab
This commit is contained in:
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user