Criando novo módulo Estúdio de Poesia e renomeando botões

This commit is contained in:
2026-06-05 13:50:39 +00:00
parent 0456617717
commit 7fa88481b7
3 changed files with 410 additions and 4 deletions
+133
View File
@@ -1145,6 +1145,128 @@ app.delete('/api/brincar-ativo/:id', requireAuth, async (req, res) => {
}
});
// ============================================================
// ROTAS DO ESTÚDIO DE POESIA
// ============================================================
app.post('/api/poesias/generate', requireAuth, async (req, res) => {
const { faixaEtaria, estrofes, tema } = req.body;
if (!faixaEtaria || !estrofes || !tema) {
return res.status(400).json({ error: 'Faixa etária, quantidade de estrofes e tema são obrigatórios.' });
}
try {
let poesiaText = '';
const systemInstruction = `Você é um poeta pedagógico infantil especializado em criar poesias ritmadas, sonoras e adequadas para o desenvolvimento infantil no Brasil.
REGRAS RÍGIDAS:
- Escreva a poesia para a faixa etária: ${faixaEtaria}
- A poesia DEVE ter EXATAMENTE ${estrofes} estrofes.
- O tema da poesia é: "${tema}"
- Use rimas claras e vocabulário apropriado para a idade.
- Sua resposta deve conter APENAS a poesia formatada em Markdown, sem NENHUM comentário adicional, explicação, ou blocos de pensamento.
- Responda EXCLUSIVAMENTE em Português do Brasil.`;
// Utilizando o Gemini diretamente
if (process.env.GOOGLE_AI_API_KEY) {
console.log('[Poesia] Usando API direta do Google Gemini...');
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 }] }],
generationConfig: { temperature: 0.7, maxOutputTokens: 2000 }
})
});
if (!response.ok) {
const errText = await response.text();
throw new Error(`Erro na API oficial do Gemini: ${errText}`);
}
const resData = await response.json();
poesiaText = resData.candidates?.[0]?.content?.parts?.[0]?.text || '';
// Remover qualquer tag <think> residual (embora a instrução já previna)
poesiaText = poesiaText.replace(/<think>[\s\S]*?(?:<\/think>|$)/g, '').trim();
} else {
throw new Error('Chave GOOGLE_AI_API_KEY não configurada no servidor.');
}
if (!poesiaText) {
throw new Error('Nenhuma poesia gerada.');
}
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
const dbRes = await dbPool.query(
`INSERT INTO escola.poesias (usuario_id, faixa_etaria, estrofes, tema, poesia)
VALUES ($1, $2, $3, $4, $5) RETURNING id, created_at`,
[usuarioId, faixaEtaria, parseInt(estrofes), tema, poesiaText]
);
res.json({
success: true,
id: dbRes.rows[0].id,
poesia: poesiaText,
createdAt: dbRes.rows[0].created_at
});
} catch (err) {
console.error('Erro na geração de poesia:', err);
res.status(500).json({ error: 'Erro ao gerar poesia: ' + err.message });
}
});
app.get('/api/poesias/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, estrofes, tema, created_at FROM escola.poesias WHERE usuario_id = $1 ORDER BY created_at DESC`,
[usuarioId]
);
res.json(dbRes.rows);
} catch (err) {
console.error('Erro ao listar poesias:', err);
res.status(500).json({ error: 'Erro ao listar histórico de poesias.' });
}
});
app.get('/api/poesias/:id', requireAuth, async (req, res) => {
const { id } = req.params;
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
try {
const dbRes = await dbPool.query(
`SELECT * FROM escola.poesias WHERE id = $1 AND usuario_id = $2`,
[id, usuarioId]
);
if (dbRes.rows.length === 0) {
return res.status(404).json({ error: 'Poesia não encontrada.' });
}
res.json(dbRes.rows[0]);
} catch (err) {
console.error('Erro ao buscar poesia:', err);
res.status(500).json({ error: 'Erro ao buscar poesia.' });
}
});
app.delete('/api/poesias/:id', requireAuth, async (req, res) => {
const { id } = req.params;
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
try {
const dbRes = await dbPool.query(
`DELETE FROM escola.poesias WHERE id = $1 AND usuario_id = $2`,
[id, usuarioId]
);
if (dbRes.rowCount === 0) {
return res.status(404).json({ error: 'Poesia não encontrada ou não pertence ao usuário.' });
}
res.json({ success: true, message: 'Poesia deletada com sucesso.' });
} catch (err) {
console.error('Erro ao deletar poesia:', err);
res.status(500).json({ error: 'Erro ao deletar poesia.' });
}
});
// Rota GET para obter configurações do agente
app.get('/api/agent-config', requireAuth, (req, res) => {
@@ -1345,6 +1467,17 @@ async function initDatabase() {
atividade TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
-- Poesias (Estúdio de Poesia)
CREATE TABLE IF NOT EXISTS escola.poesias (
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,
estrofes INTEGER NOT NULL,
tema TEXT NOT NULL,
poesia TEXT NOT NULL,
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
);
`);
// Garantir que a coluna character_description_english exista na tabela projetos_comics