Evolução do Design Canvas 2.0: biblioteca de assets no Supabase e controle de rotação/opacidade
This commit is contained in:
@@ -1607,6 +1607,62 @@ app.delete('/api/cartazes/:id', requireAuth, async (req, res) => {
|
||||
}
|
||||
});
|
||||
|
||||
app.put('/api/cartazes/:id', requireAuth, async (req, res) => {
|
||||
const { id } = req.params;
|
||||
const usuarioId = req.user?.id || '00000000-0000-0000-0000-000000000000';
|
||||
const { titulo, tema, corFundo, corTexto, layout, conteudo, imagemUrl } = req.body;
|
||||
try {
|
||||
const dbRes = await dbPool.query(
|
||||
`UPDATE escola.cartazes
|
||||
SET titulo = COALESCE($1, titulo),
|
||||
tema = COALESCE($2, tema),
|
||||
cor_fundo = COALESCE($3, cor_fundo),
|
||||
cor_texto = COALESCE($4, cor_texto),
|
||||
layout = COALESCE($5, layout),
|
||||
conteudo = COALESCE($6, conteudo),
|
||||
imagem_url = COALESCE($7, imagem_url)
|
||||
WHERE id = $8 AND usuario_id = $9 RETURNING *`,
|
||||
[titulo, tema, corFundo, corTexto, layout, conteudo, imagemUrl, id, usuarioId]
|
||||
);
|
||||
if (dbRes.rows.length === 0) {
|
||||
return res.status(404).json({ error: 'Cartaz não encontrado ou não pertence ao usuário.' });
|
||||
}
|
||||
res.json(dbRes.rows[0]);
|
||||
} catch (err) {
|
||||
console.error('Erro ao atualizar cartaz:', err);
|
||||
res.status(500).json({ error: 'Erro ao atualizar cartaz.' });
|
||||
}
|
||||
});
|
||||
|
||||
app.get('/api/biblioteca-assets', requireAuth, async (req, res) => {
|
||||
const { busca, tipo } = req.query;
|
||||
try {
|
||||
let query = `SELECT id, tipo, nome, url, tags FROM escola.biblioteca_assets WHERE 1=1`;
|
||||
const params = [];
|
||||
let paramIdx = 1;
|
||||
|
||||
if (tipo) {
|
||||
query += ` AND tipo = $${paramIdx}`;
|
||||
params.push(tipo);
|
||||
paramIdx++;
|
||||
}
|
||||
|
||||
if (busca) {
|
||||
query += ` AND (nome ILIKE $${paramIdx} OR $${paramIdx} = ANY(tags))`;
|
||||
params.push(`%${busca}%`);
|
||||
paramIdx++;
|
||||
}
|
||||
|
||||
query += ` ORDER BY tipo, nome ASC`;
|
||||
|
||||
const dbRes = await dbPool.query(query, params);
|
||||
res.json(dbRes.rows);
|
||||
} catch (err) {
|
||||
console.error('Erro ao buscar assets da biblioteca:', err);
|
||||
res.status(500).json({ error: 'Erro ao carregar assets da biblioteca.' });
|
||||
}
|
||||
});
|
||||
|
||||
// ============================================================
|
||||
// ROTAS DO MUSICANDO IDEIAS
|
||||
// ============================================================
|
||||
@@ -2173,8 +2229,52 @@ async function initDatabase() {
|
||||
dados BYTEA NOT NULL,
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
|
||||
-- Biblioteca de Assets (Stickers, Ícones, Post-its, etc.)
|
||||
CREATE TABLE IF NOT EXISTS escola.biblioteca_assets (
|
||||
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
||||
tipo VARCHAR(50) NOT NULL, -- 'sticker', 'postit', 'icone', 'forma'
|
||||
nome VARCHAR(100) NOT NULL,
|
||||
url TEXT NOT NULL,
|
||||
tags TEXT[], -- array de tags para busca
|
||||
created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW()
|
||||
);
|
||||
`);
|
||||
|
||||
const checkAssets = await dbPool.query("SELECT COUNT(*) FROM escola.biblioteca_assets;");
|
||||
if (parseInt(checkAssets.rows[0].count) === 0) {
|
||||
console.log('[Database Init] Inserindo assets padrão na biblioteca (Design Canvas 2.0)...');
|
||||
await dbPool.query(`
|
||||
INSERT INTO escola.biblioteca_assets (tipo, nome, url, tags) VALUES
|
||||
('postit', 'Post-it Amarelo', '#feff9c', ARRAY['post-it', 'amarelo', 'anotacao']),
|
||||
('postit', 'Post-it Azul', '#7afcff', ARRAY['post-it', 'azul', 'anotacao']),
|
||||
('postit', 'Post-it Rosa', '#ff7eb9', ARRAY['post-it', 'rosa', 'anotacao']),
|
||||
('postit', 'Post-it Verde', '#98ff98', ARRAY['post-it', 'verde', 'anotacao']),
|
||||
('postit', 'Post-it Laranja', '#ffb7b2', ARRAY['post-it', 'laranja', 'anotacao']),
|
||||
|
||||
('sticker', 'Escola', 'https://openmoji.org/data/color/svg/1F3EB.svg', ARRAY['escola', 'colegio', 'aula']),
|
||||
('sticker', 'Lápis', 'https://openmoji.org/data/color/svg/270F.svg', ARRAY['lapis', 'escrever', 'desenhar']),
|
||||
('sticker', 'Caderno', 'https://openmoji.org/data/color/svg/1F4DD.svg', ARRAY['caderno', 'anotacao', 'estudo']),
|
||||
('sticker', 'Paleta de Arte', 'https://openmoji.org/data/color/svg/1F3A8.svg', ARRAY['arte', 'paleta', 'pintura', 'desenho']),
|
||||
('sticker', 'Quebra-cabeça', 'https://openmoji.org/data/color/svg/1F9E9.svg', ARRAY['jogo', 'quebra-cabeca', 'brinquedo']),
|
||||
('sticker', 'Ursinho', 'https://openmoji.org/data/color/svg/1F9F8.svg', ARRAY['brinquedo', 'ursinho', 'fofo']),
|
||||
('sticker', 'Foguete', 'https://openmoji.org/data/color/svg/1F680.svg', ARRAY['foguete', 'espaco', 'voar']),
|
||||
('sticker', 'Notas Musicais', 'https://openmoji.org/data/color/svg/1F3B6.svg', ARRAY['musica', 'som', 'notas']),
|
||||
('sticker', 'Gatinho', 'https://openmoji.org/data/color/svg/1F431.svg', ARRAY['animal', 'gato', 'gatinho', 'fofo']),
|
||||
('sticker', 'Cachorrinho', 'https://openmoji.org/data/color/svg/1F436.svg', ARRAY['animal', 'cao', 'cachorro', 'fofo']),
|
||||
('sticker', 'Maçã', 'https://openmoji.org/data/color/svg/1F34E.svg', ARRAY['fruta', 'maca', 'comida']),
|
||||
('sticker', 'Balão', 'https://openmoji.org/data/color/svg/1F388.svg', ARRAY['festa', 'balao', 'bexiga']),
|
||||
('sticker', 'Estrela Brilhante', 'https://openmoji.org/data/color/svg/1F31F.svg', ARRAY['estrela', 'brilho', 'premio']),
|
||||
('sticker', 'Coração', 'https://openmoji.org/data/color/svg/1F496.svg', ARRAY['amor', 'coracao', 'carinho']),
|
||||
('sticker', 'Balão de Fala', 'https://openmoji.org/data/color/svg/1F4AC.svg', ARRAY['fala', 'dialogo', 'comunicacao']),
|
||||
|
||||
('forma', 'Retângulo', 'rect', ARRAY['forma', 'retangulo', 'quadrado', 'fundo']),
|
||||
('forma', 'Círculo', 'circle', ARRAY['forma', 'circulo', 'bola', 'redondo']),
|
||||
('forma', 'Elipse', 'ellipse', ARRAY['forma', 'elipse', 'oval']),
|
||||
('forma', 'Linha Horizontal', 'line', ARRAY['forma', 'linha', 'divisoria']);
|
||||
`);
|
||||
}
|
||||
|
||||
// Garantir que a coluna character_description_english exista na tabela projetos_comics
|
||||
await dbPool.query(`ALTER TABLE escola.projetos_comics ADD COLUMN IF NOT EXISTS character_description_english TEXT;`);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user