Service Layer Adoption — Completed 2026-05-07
Overview
All API routes and Next.js API routes now delegate data access to service classes. The migration is complete. This document is kept for historical reference.
Pattern
Services (apps/api/src/services/, apps/dashboard/src/services/, apps/manage/src/services/):
- Import
dbdirectly:import { db } from "../db"(API) orimport { db } from "@/lib/db"(Next.js apps) - Export plain async functions containing all Prisma queries and business logic
Routes / handlers:
- Import service functions only — no
import { db } - Responsible for: auth checks, request/response mapping,
writeAuditLog, queue enqueue calls
Exception: apps/api/src/routers/auth.ts and apps/api/src/routers/tenant/credits.ts retain import { db } because @leadmetrics/billing external functions (getOrCreateCreditBalance, createTopupOrder, applyTopupPayment) require db passed as a parameter. Those signatures cannot be changed.
Coverage
Fastify API (apps/api/src/routers/) — 88 routers, all clean
Service files under apps/api/src/services/:
| Service File | Used By |
|---|---|
auth.service.ts | auth.ts |
blog.service.ts | blog.ts, dm/blog.ts |
landing-page.service.ts | landing-pages.ts, dm/landing-pages.ts |
social.service.ts | social.ts, dm/social.ts |
strategy.service.ts | dm/strategy.ts, tenant/main.ts |
channels.service.ts | channels.ts, channel-connect.ts, blog.ts |
channel-connect.service.ts | channel-connect.ts |
connected-channel.service.ts | channels.ts, channel-connect.ts, blog.ts |
campaign.service.ts | campaigns.ts |
campaigns.service.ts | campaigns.ts |
lead.service.ts | leads.ts |
baseline-sync.service.ts | baseline.ts |
billing.service.ts | admin/billing.ts |
admin-billing.service.ts | admin/billing.ts |
zoho-books-sync.ts | admin/tenants.ts |
tenants.service.ts | admin/tenants.ts |
admin-tenants.service.ts | admin/tenants.ts |
activities.service.ts | dm/activities.ts |
contacts.service.ts | dm/contacts.ts |
keywords.service.ts | dm/keywords.ts |
search-terms.service.ts | dm/search-terms.ts |
content-briefs.service.ts | dm/content-briefs.ts |
context.service.ts | dm/context.ts |
costs.service.ts | dm/costs.ts |
credits.service.ts | dm/credits.ts |
newsletters.service.ts | dm/newsletters.ts, newsletters.ts |
action-items.service.ts | dm/action-items.ts, admin/action-items.ts, tenant/action-items.ts |
important-days.service.ts | dm/important-days.ts, admin/important-days.ts, tenant/important-days.ts |
channel-action-items.service.ts | dm/channel-action-items.ts, tenant/channel-action-items.ts |
pipeline.service.ts | dm/pipeline.ts |
reports.service.ts | dm/reports.ts |
agents.service.ts | dm/agents.ts, admin/agents.ts |
ai-visibility.service.ts | dm/ai-visibility.ts, ai-visibility.ts |
ai-chat.service.ts | ai-chat.ts |
calendar.service.ts | dm/calendar.ts |
dm-media.service.ts | dm/media.ts |
root-media.service.ts | media.ts, media-library.ts |
dm-campaigns.service.ts | dm/campaigns.ts |
dm-tenant.service.ts | dm/tenant.ts |
dm-users.service.ts | dm/users.ts |
users.service.ts | admin/users.ts, admin/agents.ts |
templates.service.ts | admin/templates.ts |
notifications.service.ts | admin/notifications.ts |
push.service.ts | admin/push.ts |
audit.service.ts | admin/audit.ts |
tenant-billing.service.ts | tenant/billing.ts |
goals.service.ts | admin/goals.ts, tenant/goals.ts |
admin-content.service.ts | admin/content.ts |
deliverable-settings.service.ts | admin/deliverable-settings.ts |
design-defaults.service.ts | admin/design-defaults.ts |
backlink-directories.service.ts | admin/backlink-directories.ts |
tenant-data.service.ts | admin/tenant-data.ts |
tenant-deletions.service.ts | admin/tenant-deletions.ts |
channel-health.service.ts | channel-health.ts |
insights.service.ts | insights.ts |
website-insights.service.ts | website-insights.ts |
website-issues.service.ts | website-issues.ts |
brand.service.ts | brand-assets.ts, brand-voice.ts |
competitors.service.ts | competitors.ts |
knowledge.service.ts | knowledge.ts |
help.service.ts | help.ts |
docs.service.ts | docs.ts |
mobile.service.ts | mobile.ts |
pgcallbacks.service.ts | pgcallbacks.ts |
rag-config.service.ts | rag-config.ts |
source-maps.service.ts | source-maps.ts |
tenant-backlinks.service.ts | tenant-backlinks.ts |
Dashboard Next.js (apps/dashboard/src/app/api/) — 26 routes, all clean
Service files under apps/dashboard/src/services/:
activities.service.ts— activities/*, calendar/calendar.service.ts— calendar/leads.service.ts— leads/*backlinks.service.ts— backlinks/*notifications.service.ts— notifications/*stats.service.ts— dashboard/statsagent-progress.service.ts— internal/agent-progressreports.service.ts— reports/generatesearch.service.ts— search/socket-token.service.ts— socket-token/media.service.ts— tenant/media/*
Manage Next.js (apps/manage/src/app/api/) — 2 routes, all clean
Service files under apps/manage/src/services/:
billing.service.ts— admin/billing/*
DM Next.js (apps/dm/src/app/api/) — Clean (delegates to Fastify API)
Known Quirks
auth.tsandtenant/credits.tsimportdbonly to satisfy@leadmetrics/billingfunction signatures — this is intentional and not a violation.tenants.service.tswas previously unused; it is now wired intoadmin/tenants.tsalongsideadmin-tenants.service.ts.