// app/actions/reports.ts
'use server'
import { auth } from '@/auth'
import { prisma } from '@/lib/prisma'
import { revalidatePath } from 'next/cache'
export async function getCampaignMetrics(campaignId: string) {
const session = await auth()
if (!session?.user || session.user.role !== 'ADMIN') {
throw new Error('Neautorizat')
}
const metrics = await prisma.campaignMetric.findMany({
where: { campaignId },
orderBy: { date: 'desc' },
take: 30,
})
revalidatePath(`/dashboard/campaigns/${campaignId}`)
return metrics
}Acum trei luni am terminat refacerea dashboard-ului intern pentru o agenție locală de marketing cu 15 angajați și peste 40 de clienți activi. Aveau nevoie de raportare automată, management de campanii și integrări cu Meta și Google Ads într-un singur loc. Am mers pe stack-ul clasic Next.js (App Router), Prisma și NextAuth — vă povestesc ce a funcționat bine și unde ne-am furat-o.
De ce am ales stack-ul ăsta?
Sincer, clienții voiau totul gata ieri, iar echipa mea stătea deja bine pe TypeScript. Am zis că Server Actions din Next.js ne vor scuti de o tonă de boilerplate pentru API-uri REST. Prisma ne-a dat type-safety instant pe baza de date PostgreSQL, iar NextAuth părea soluția mură-n gură pentru login cu Google Workspaces.
La început, viteza a fost nesimțită. În două săptămâni aveam deja un prototype funcțional, cu autentificare, roluri de Admin/Manager/Client și primele tabele populate.
Unde s-a rupt filmul: 3 probleme reale
Dacă la proiecte mici App Router e o plăcere, la un dashboard complex unde ai date dinamice și mii de request-uri externe, dai de zid.
- Caching-ul agresiv din Next.js: Ne-am trezit că server-ul servea date vechi de campanie pentru că am uitat un
revalidatePathsau unnoStore()într-un Server Component. Am pierdut 3 zile depanând un bug unde raportul lunar afișa cifre din iulie în mijlocul lui august. - Prisma pe serverless: La un moment dat am avut probleme mari cu "too many connections" în Postgres când aveam mai mulți useri simultan pe rapoarte grele. Am fost nevoiți să băgăm Supabase Connection Pooler ca să nu crăpe baza de date. Un query complex cu 4 JOIN-uri pe rapoarte mari dura și 1.2 secunde până am optimizat manual indecșii.
- NextAuth v5 (Auth.js) beta: Documentația e încă un șvaițer. Middleware-ul de verificare al rolurilor ne-a dat de furcă la session refresh — trebuia să forțăm update de sesiune manual când schimbam permisiunile unui user din panoul de admin.
Cifre reale și concluzia
După 3 luni și vreo 220 de commits, sistemul e în producție și oamenii chiar îl folosesc zi de zi. Timpul de generare a rapoartelor lunare a scăzut de la 4 ore per client la sub 5 secunde. Am economisit cam 30% din timpul pe care echipa îl pierdea cu copy-paste de date din Meta Ads Manager în Google Sheets.
Merge brici pentru 95% din cazuri, dar dacă ar fi să o iau de la capăt, probabil aș folosi Drizzle ORM în loc de Prisma pentru query-uri mai transparente și o amprentă mai mică pe serverless.
Voi ce stack folosiți acum pentru dashboard-uri interne? Ați rămas pe Prisma sau ați migrat spre Drizzle?