diff --git a/clube67/newwhats.local/backend/src/modules/stickers/sticker.routes.ts b/clube67/newwhats.local/backend/src/modules/stickers/sticker.routes.ts index 84521da..eac62b3 100644 --- a/clube67/newwhats.local/backend/src/modules/stickers/sticker.routes.ts +++ b/clube67/newwhats.local/backend/src/modules/stickers/sticker.routes.ts @@ -14,75 +14,85 @@ export function buildStickerRoutes(): Router { // ── LIST (com listVersion para cache invalidation) ──────────────────────── router.get('/', async (req: Request, res: Response) => { - const tenantId = req.tenantId! + try { + const tenantId = req.tenantId! - const stickers = await prisma.sticker.findMany({ - where: { tenantId }, - orderBy: [{ isFavorite: 'desc' }, { lastSeenAt: 'desc' }], - select: { - id: true, - sha256: true, - wasabiPath: true, - isAnimated: true, - isFavorite: true, - useCount: true, - lastSeenAt: true, - }, - }) + const stickers = await prisma.sticker.findMany({ + where: { tenantId }, + orderBy: [{ isFavorite: 'desc' }, { lastSeenAt: 'desc' }], + select: { + id: true, + sha256: true, + wasabiPath: true, + isAnimated: true, + isFavorite: true, + useCount: true, + lastSeenAt: true, + }, + }) - // listVersion muda apenas quando o conjunto de stickers muda - // (novo sha256 chega ou estado de favorito muda) - const versionSource = stickers.length === 0 - ? 'empty' - : `${stickers.length}:${stickers[0]!.sha256}:${stickers[0]!.lastSeenAt.getTime()}:${stickers.filter(s => s.isFavorite).length}` - const listVersion = createHash('md5').update(versionSource).digest('hex').slice(0, 8) + const versionSource = stickers.length === 0 + ? 'empty' + : `${stickers.length}:${stickers[0]!.sha256}:${stickers[0]!.lastSeenAt.getTime()}:${stickers.filter(s => s.isFavorite).length}` + const listVersion = createHash('md5').update(versionSource).digest('hex').slice(0, 8) - res.json({ listVersion, stickers }) + res.json({ listVersion, stickers }) + } catch (err) { + res.status(500).json({ error: 'Erro ao listar stickers' }) + } }) // ── RECENT (últimos 30) ─────────────────────────────────────────────────── router.get('/recent', async (req: Request, res: Response) => { - const tenantId = req.tenantId! + try { + const tenantId = req.tenantId! - const stickers = await prisma.sticker.findMany({ - where: { tenantId }, - orderBy: { lastSeenAt: 'desc' }, - take: 30, - select: { - id: true, - sha256: true, - wasabiPath: true, - isAnimated: true, - isFavorite: true, - }, - }) + const stickers = await prisma.sticker.findMany({ + where: { tenantId }, + orderBy: { lastSeenAt: 'desc' }, + take: 30, + select: { + id: true, + sha256: true, + wasabiPath: true, + isAnimated: true, + isFavorite: true, + }, + }) - res.json({ stickers }) + res.json({ stickers }) + } catch (err) { + res.status(500).json({ error: 'Erro ao listar stickers recentes' }) + } }) // ── TOGGLE FAVORITE ─────────────────────────────────────────────────────── router.patch('/:id/favorite', async (req: Request, res: Response) => { - const tenantId = req.tenantId! - const idParam = req.params['id'] - const id = Array.isArray(idParam) ? idParam[0]! : idParam + try { + const tenantId = req.tenantId! + const idParam = req.params['id'] + const id = Array.isArray(idParam) ? idParam[0]! : idParam - const sticker = await prisma.sticker.findFirst({ - where: { id, tenantId }, - select: { id: true, isFavorite: true }, - }) + const sticker = await prisma.sticker.findFirst({ + where: { id, tenantId }, + select: { id: true, isFavorite: true }, + }) - if (!sticker) { - res.status(404).json({ error: 'Sticker não encontrado' }) - return + if (!sticker) { + res.status(404).json({ error: 'Sticker não encontrado' }) + return + } + + const updated = await prisma.sticker.update({ + where: { id: sticker.id }, + data: { isFavorite: !sticker.isFavorite }, + select: { id: true, isFavorite: true }, + }) + + res.json(updated) + } catch (err) { + res.status(500).json({ error: 'Erro ao atualizar favorito' }) } - - const updated = await prisma.sticker.update({ - where: { id: sticker.id }, - data: { isFavorite: !sticker.isFavorite }, - select: { id: true, isFavorite: true }, - }) - - res.json(updated) }) return router diff --git a/clube67/newwhats.local/backend/src/server.ts b/clube67/newwhats.local/backend/src/server.ts index 4020f43..ab7a214 100644 --- a/clube67/newwhats.local/backend/src/server.ts +++ b/clube67/newwhats.local/backend/src/server.ts @@ -91,8 +91,10 @@ async function bootstrap() { app.use('/api/scheduled', authMiddleware, buildScheduledRoutes(scheduler)) app.use('/api/stickers', authMiddleware, buildStickerRoutes()) - // Proxy genérico para arquivos no Wasabi — usado pelo frontend para exibir stickers e mídias - app.get('/api/storage/view/*', authMiddleware, async (req, res) => { + // Proxy genérico para arquivos no Wasabi — sem authMiddleware porque /