Use the verbDomain pattern for all core functions.
- Format:
verbDomain - Verb: CRUD or meaningful operation (
create,update,remove,get,list, …) - Domain: singular entity name (
Vehicle,User,Maintenance, …)
Rules:
- Contains pure business logic — no framework or routing code except db layer.
- Avoid reserved keywords (
delete→remove). - Handle database operations.
Example:
export const createVehicle = async (
input: z.infer<typeof vehiclesInsertSchema>,
) => {
console.table(input);
await db.insert(vehiclesTable).values(input);
return {
ok: true,
};
};Each domain defines its own Drizzle schema and repository, while relations live in a shared file.
Rules:
src/db/schemas/<entity>.ts: defines table structure.src/schemas/relations.ts: defines inter-entity relationships.
Example files (for vehicles):
src/
db/
schema/
vehicles.ts # drizzle schema for Vehicle
schemas/
relations.ts # global Drizzle relations
core/
vehicles/
service.ts
All validation schemas live in src/validations.
Rules:
- Validation per domain, matching naming (e.g.,
vehicles.ts). - Use Zod.
- Validators are user by routers.
Example:
src/
core/
vehicle/
validations.ts # zod schemas for create/update vehicle
Routers expose domain-level endpoints connected to core logic.
-
Router Name: Plural +
Router(vehiclesRouter) -
Functions: Verb only (
create,get, etc.) -
Business Logic: No business logic — only delegate to the core layer.
-
Allowed Verbs (CRUD Operations):
create: Maps to Create.get: Maps to Read (single entity).list: Maps to Read (multiple entities).update: Maps to Update.remove: Maps to Delete (due to JavaScript reserved keyword).
| Layer | Pattern | Example | Responsibility |
|---|---|---|---|
| Schema | vehicles.ts |
vehicles table |
Table structure |
| Relations | relations.ts |
vehiclesRelations |
Entity relationships |
| Validation | vehicles.ts |
createVehicleSchema |
Input validation |
| Core | verbDomain |
createVehicle, listVehicles |
Business logic |
| Router | pluralDomainRouter |
vehiclesRouter |
API interface |
src/
├── db/
│ └── schemas/
│ ├─── vehicles.ts # drizzle schema
│ └─── relations.ts # global relations
│
├── core/
│ └── vehicles/
│ ├── validations.ts # validations
│ └── service.ts # business logic (createVehicle, etc.)
│
└── http/
└── routers/
└── vehicles.ts # exposes vehiclesRouter
(Optional: tests/vehicles/ for unit tests.)