Project Structure
This framework uses a thoughtfully organized structure that balances clarity and flexibility, drawing some inspiration from NestJS while emphasizing a file-based approach to reduce complexity for developers.
Overview
The project structure follows these key principles:
- File-based approach for most cases, reducing the need to worry about complex folder hierarchies
- Module-based organization for clear separation of concerns
- Consistent naming conventions for special files (.middlewares.ts, .auth-configs.ts, etc.)
- Prisma integration for database operations with clear schema organization
Root Structure
/
├── prisma/
| └── schema/
│ └── schema.prisma # Prisma schema folder
├── src/ # Application source code
│ ├── modules/ # Feature modules
│ └── utils/ # Shared utilities
| └── prisma.ts # Prisma Instance
├── uploads/ # File storage
├── .env.development # Env for development (Optional Or .env)
├── .env.production # Env for production (Or .env)
This approach keeps each model definition separate, making them easier to manage and maintain.
Pay attention to the structure, because Arkos uses file-based in some instances so it is important to aware of this.
Source Directory
The /src
directory contains the application logic organized into modules:
root/src/
├── modules/
│ ├── auth/ # Authentication module
│ │ ├── dtos/ # Class Validator Dtos
│ │ ├── schemas/ # Zod schemas
│ │ └── utils/ # Auth utilities
│ └── model-name/ # Prisma Model module
│ ├── model-name.auth-configs.ts
│ ├── model-name.middlewares.ts
│ ├── model-name.prisma-query-options.ts
│ ├── model-name.service.ts
│ ├── model-name.router.ts
│ ├── model-name.controller.ts
│ ├── schemas/
│ ├── dtos/
| └── utils/ # some model utils
├── utils/
│ └── prisma.ts # Prisma Instance
├── app.ts
Under the src/modules
folder you can create model-name-in-kebab folders in order to customize and harness Arkos built-in features.
Special File Types
The framework uses consistent naming conventions for special-purpose files:
Middleware Files (*.middlewares.ts)
Contain request processing logic that executes before or after arkos built-in controllers.
// src/modules/user/user.middlewares.ts
import { ArkosRequest, ArkosResponse, ArkosNextFunction } from "arkos";
export const beforeCreateOne = catchAsync(
async (req: ArkosRequest, res: ArkosResponse, next: ArkosNextFunction) => {
// Validation logic
next();
}
);
Authentication Configuration (*.auth-configs.ts)
Define authentication strategies and requirements for generated api endpoints.
// src/modules/post/post.auth-configs.ts
import { AuthConfigs } from "arkos/auth";
const postAuthConfigs: AuthConfigs = {
authenticationControl: {
view: false, // Public endpoint
},
accessControl: {
create: ["author", "admin"],
update: ["author", "admin"],
delete: ["admin"],
},
};
export default postAuthConfigs;
Prisma Query Options (*.prisma-query-options.ts)
Configure reusable Prisma query parameters.
// src/modules/user/user.prisma-query-options.ts
import { Prisma } from "@prisma/client";
import { PrismaQueryOptions } from "arkos/prisma";
const userPrismaQueryOptions: PrismaQueryOptions<Prisma.UserDelegate> = {
findOne: {
include: {
profile: true,
orders: {
take: 5,
orderBy: { createdAt: "desc" },
},
},
},
};
export default userPrismaQueryOptions;
Data Transfer Objects (dtos/*.dto.ts)
Define data validation using class-validator for input processing.
// src/modules/post/dtos/create-post.dto.ts
export default class CreatePostDto {
// Your fields here
}
Schemas (schemas/*.schema.ts)
Define validation rules using Zod for request data.
// src/modules/post/schemas/create-post.schema.ts
import { z } from "zod";
const CreatePostSchema = z.object({
// Your fields here
});
export default CreatePostSchema;
Uploads Directory
The /uploads
directory stores application uploaded files:
/uploads/
├── documents/ # Document files (PDF, DOC, etc.)
├── images/ # Image files
├── videos/ # Video files
└── Other files
Environment Configuration
The project uses separate environment files for different deployment scenarios:
/.env.development # Development environment variables
/.env.production # Production environment variables
/.env.staging # Staging environment variables
/.env
/.env.local
Other common .env patterns will be added soon. you can even open an issue for a specific one or may become a contributor on Github.
Best Practices
- Module Organization: Create new modules for distinct prisma model
- File Naming: Follow the established naming conventions for special files
- DTOs vs Schemas: Both approach are supported choose according to your application requirements.
- Middleware Usage: Route-specific middleware to intercept request on generated api routes should be defined in model-name.middlewares.ts files
- Utility Functions: Shared helpers should go in the /utils directory, module-specific helpers in the module's utils folder