feat: adiciona recurso de salvar/carregar/excluir projetos na Fábrica de Quadrinhos
This commit is contained in:
@@ -561,6 +561,136 @@ app.post('/api/comics/generate-video', requireAuth, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
// --- ROTAS DE PROJETOS DE HQ (SALVAR, LISTAR, CARREGAR, EXCLUIR) ---
|
||||
|
||||
// 1. Listar projetos
|
||||
app.get('/api/comics/projects', requireAuth, async (req, res) => {
|
||||
const usuarioId = req.userId || '00000000-0000-0000-0000-000000000000';
|
||||
try {
|
||||
const result = await dbPool.query(
|
||||
'SELECT id, titulo, tema, cenario, proporcao, character_description_global, created_at, updated_at FROM escola.projetos_comics WHERE usuario_id = $1 ORDER BY updated_at DESC;',
|
||||
[usuarioId]
|
||||
);
|
||||
res.json(result.rows);
|
||||
} catch (error) {
|
||||
console.error('Erro ao listar projetos de quadrinhos:', error);
|
||||
res.status(500).json({ error: 'Erro ao listar projetos de quadrinhos.' });
|
||||
}
|
||||
});
|
||||
|
||||
// 2. Carregar projeto específico
|
||||
app.get('/api/comics/projects/:id', requireAuth, async (req, res) => {
|
||||
const usuarioId = req.userId || '00000000-0000-0000-0000-000000000000';
|
||||
const { id } = req.params;
|
||||
try {
|
||||
const projectRes = await dbPool.query(
|
||||
'SELECT * FROM escola.projetos_comics WHERE id = $1 AND usuario_id = $2;',
|
||||
[id, usuarioId]
|
||||
);
|
||||
if (projectRes.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Projeto não encontrado.' });
|
||||
}
|
||||
|
||||
const panelsRes = await dbPool.query(
|
||||
'SELECT id, panel_number, image_url, image_prompt, dialogue FROM escola.comics_panels WHERE projeto_id = $1 ORDER BY panel_number ASC;',
|
||||
[id]
|
||||
);
|
||||
|
||||
res.json({
|
||||
project: projectRes.rows[0],
|
||||
panels: panelsRes.rows
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Erro ao obter projeto de quadrinhos:', error);
|
||||
res.status(500).json({ error: 'Erro ao obter projeto de quadrinhos.' });
|
||||
}
|
||||
});
|
||||
|
||||
// 3. Salvar / Atualizar projeto
|
||||
app.post('/api/comics/projects', requireAuth, async (req, res) => {
|
||||
const usuarioId = req.userId || '00000000-0000-0000-0000-000000000000';
|
||||
const { id, titulo, tema, cenario, proporcao, character_description_global, panels } = req.body;
|
||||
|
||||
if (!titulo) {
|
||||
return res.status(400).json({ error: 'O título do projeto é obrigatório.' });
|
||||
}
|
||||
|
||||
const client = await dbPool.connect();
|
||||
try {
|
||||
await client.query('BEGIN');
|
||||
|
||||
let projetoId = id;
|
||||
if (projetoId) {
|
||||
// Verificar propriedade
|
||||
const check = await client.query(
|
||||
'SELECT id FROM escola.projetos_comics WHERE id = $1 AND usuario_id = $2;',
|
||||
[projetoId, usuarioId]
|
||||
);
|
||||
if (check.rows.length === 0) {
|
||||
throw new Error('Projeto não encontrado para edição.');
|
||||
}
|
||||
|
||||
// Atualizar metadados
|
||||
await client.query(
|
||||
`UPDATE escola.projetos_comics
|
||||
SET titulo = $1, tema = $2, cenario = $3, proporcao = $4, character_description_global = $5, updated_at = NOW()
|
||||
WHERE id = $6;`,
|
||||
[titulo, tema, cenario, proporcao, character_description_global, projetoId]
|
||||
);
|
||||
} else {
|
||||
// Criar novo projeto
|
||||
const insertProj = await client.query(
|
||||
`INSERT INTO escola.projetos_comics (usuario_id, titulo, tema, cenario, proporcao, character_description_global)
|
||||
VALUES ($1, $2, $3, $4, $5, $6)
|
||||
RETURNING id;`,
|
||||
[usuarioId, titulo, tema, cenario, proporcao, character_description_global]
|
||||
);
|
||||
projetoId = insertProj.rows[0].id;
|
||||
}
|
||||
|
||||
// Atualizar painéis: remover antigos se existiam e salvar novos
|
||||
await client.query('DELETE FROM escola.comics_panels WHERE projeto_id = $1;', [projetoId]);
|
||||
|
||||
if (panels && Array.isArray(panels)) {
|
||||
for (const p of panels) {
|
||||
await client.query(
|
||||
`INSERT INTO escola.comics_panels (projeto_id, panel_number, image_url, image_prompt, dialogue)
|
||||
VALUES ($1, $2, $3, $4, $5);`,
|
||||
[projetoId, p.panel_number, p.image_url, p.image_prompt, p.dialogue]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
await client.query('COMMIT');
|
||||
res.json({ success: true, id: projetoId, message: 'Projeto salvo com sucesso!' });
|
||||
} catch (error) {
|
||||
await client.query('ROLLBACK');
|
||||
console.error('Erro ao salvar projeto de quadrinhos:', error);
|
||||
res.status(500).json({ error: 'Erro ao salvar projeto: ' + error.message });
|
||||
} finally {
|
||||
client.release();
|
||||
}
|
||||
});
|
||||
|
||||
// 4. Excluir projeto
|
||||
app.delete('/api/comics/projects/:id', requireAuth, async (req, res) => {
|
||||
const usuarioId = req.userId || '00000000-0000-0000-0000-000000000000';
|
||||
const { id } = req.params;
|
||||
try {
|
||||
const result = await dbPool.query(
|
||||
'DELETE FROM escola.projetos_comics WHERE id = $1 AND usuario_id = $2 RETURNING id;',
|
||||
[id, usuarioId]
|
||||
);
|
||||
if (result.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Projeto não encontrado ou sem permissão para exclusão.' });
|
||||
}
|
||||
res.json({ success: true, message: 'Projeto excluído com sucesso!' });
|
||||
} catch (error) {
|
||||
console.error('Erro ao excluir projeto de quadrinhos:', error);
|
||||
res.status(500).json({ error: 'Erro ao excluir projeto de quadrinhos.' });
|
||||
}
|
||||
});
|
||||
|
||||
// Rota GET para obter configurações do agente
|
||||
app.get('/api/agent-config', requireAuth, (req, res) => {
|
||||
const config = readAgentConfig();
|
||||
|
||||
Reference in New Issue
Block a user