home / skills / hoangnguyen0403 / agent-skills-standard / data-access-layer
This skill enforces a secure, centralized data access layer with DTOs, server-only imports, and auth checks co-located in access functions.
npx playbooks add skill hoangnguyen0403/agent-skills-standard --skill data-access-layerReview the files below or copy the command above to add this skill to your agents.
---
name: Next.js Data Access Layer
description: Secure, reusable data access patterns with DTOs and Taint checks.
metadata:
labels: [nextjs, dal, architecture, security]
triggers:
files: ['**/lib/data.ts', '**/services/*.ts', '**/dal/**']
keywords: [DAL, Data Access Layer, server-only, DTO]
---
# Data Access Layer (DAL)
## **Priority: P1 (HIGH)**
Centralize all data access (Database & External APIs) to ensure consistent security, authorization, and caching.
## Principles
1. **Server-Only**: Must include `import 'server-only'` to prevent Client bundling.
2. **Auth Co-location**: Auth checks (`session.role`) must be **inside** the DAL function.
3. **DTO Transformation**: Return plain objects (DTOs), never raw ORM instances.
4. **No Internal Fetch**: Call DAL functions directly. Do not `fetch('localhost/api')`.
## Implementation
| Approach | When to use | Reference |
| :-------------------- | :----------------------------------------------- | :---------------------------------- |
| **API Gateway (BFF)** | Enterprise apps with separated Backend (NestJS). | [Pattern A](references/patterns.md) |
| **Direct DB** | Fullstack apps or Admin Panels. | [Pattern B](references/patterns.md) |
## Limitations
- **Client Components**: Cannot import DAL files. Must use Server Actions or Route Handlers as bridges.
This skill defines a secure, reusable Data Access Layer (DAL) pattern for Next.js applications using TypeScript. It enforces server-only execution, colocated authorization, DTO returns, and prevents unsafe internal HTTP calls. The result is consistent security, clearer boundaries, and safer data flows across your app.
DAL modules are implemented as server-only functions (import 'server-only') that encapsulate all database and external API access. Each DAL function performs authorization checks inside the function, transforms results into plain DTOs, and returns those DTOs rather than ORM instances. Server Actions or Route Handlers bridge Client components to the DAL; Client components never import DAL files directly.
Can Client components import DAL files?
No. Client components must use Server Actions or Route Handlers to access DAL functions because DAL files are server-only.
Why return DTOs instead of ORM instances?
DTOs remove runtime methods and metadata, reduce accidental data exposure, and make serialization predictable across server boundaries.