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
/