@sundaysf/cli-v2 0.0.3 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +178 -178
  2. package/dist/README.md +178 -178
  3. package/dist/bin/generators/class.js.map +1 -1
  4. package/dist/bin/generators/postman.js.map +1 -1
  5. package/dist/bin/index.js.map +1 -1
  6. package/dist/templates/backend/.claude/agents/knex-table-implementer.md +113 -0
  7. package/dist/templates/backend/.env.example +13 -13
  8. package/dist/templates/backend/.prettierignore +2 -2
  9. package/dist/templates/backend/Dockerfile +14 -14
  10. package/dist/templates/backend/README.md +18 -18
  11. package/dist/templates/backend/src/app.ts +34 -34
  12. package/dist/templates/backend/src/common/utils/environment.resolver.ts +3 -3
  13. package/dist/templates/backend/src/common/utils/version.resolver.ts +4 -4
  14. package/dist/templates/backend/src/controllers/health/health.controller.ts +23 -23
  15. package/dist/templates/backend/src/routes/health/health.router.ts +16 -16
  16. package/dist/templates/backend/src/routes/index.ts +57 -57
  17. package/dist/templates/backend/src/server.ts +16 -16
  18. package/dist/templates/backend/src/types.d.ts +10 -10
  19. package/dist/templates/backend-db-sql/.env.example +13 -13
  20. package/dist/templates/backend-db-sql/.prettierignore +2 -2
  21. package/dist/templates/backend-db-sql/Dockerfile +17 -17
  22. package/dist/templates/backend-db-sql/README.md +34 -34
  23. package/dist/templates/backend-db-sql/db/knexfile.ts +34 -33
  24. package/dist/templates/backend-db-sql/db/migrations/001_create_sundays_package_version.ts +12 -12
  25. package/dist/templates/backend-db-sql/db/seeds/001_sundays_package_version_seed.ts +10 -10
  26. package/dist/templates/backend-db-sql/db/src/KnexConnection.ts +74 -74
  27. package/dist/templates/backend-db-sql/db/src/d.types.ts +18 -18
  28. package/dist/templates/backend-db-sql/db/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  29. package/dist/templates/backend-db-sql/db/src/index.ts +9 -9
  30. package/dist/templates/backend-db-sql/db/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  31. package/dist/templates/backend-db-sql/db/tsconfig.json +16 -16
  32. package/dist/templates/backend-db-sql/src/app.ts +34 -34
  33. package/dist/templates/backend-db-sql/src/common/utils/environment.resolver.ts +3 -3
  34. package/dist/templates/backend-db-sql/src/common/utils/version.resolver.ts +4 -4
  35. package/dist/templates/backend-db-sql/src/controllers/health/health.controller.ts +23 -23
  36. package/dist/templates/backend-db-sql/src/routes/health/health.router.ts +16 -16
  37. package/dist/templates/backend-db-sql/src/routes/index.ts +57 -57
  38. package/dist/templates/backend-db-sql/src/server.ts +18 -18
  39. package/dist/templates/backend-db-sql/src/types.d.ts +10 -10
  40. package/dist/templates/db-sql/.claude/agents/sundays-backend-builder.md +70 -0
  41. package/dist/templates/db-sql/knexfile.ts +33 -33
  42. package/dist/templates/db-sql/migrations/001_create_sundays_package_version.ts +12 -12
  43. package/dist/templates/db-sql/seeds/001_sundays_package_version_seed.ts +10 -10
  44. package/dist/templates/db-sql/src/KnexConnection.ts +74 -74
  45. package/dist/templates/db-sql/src/d.types.ts +18 -18
  46. package/dist/templates/db-sql/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  47. package/dist/templates/db-sql/src/index.ts +9 -9
  48. package/dist/templates/db-sql/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  49. package/dist/templates/db-sql/tsconfig.json +16 -16
  50. package/dist/templates/module/.claude/agents/knex-table-implementer.md +113 -0
  51. package/dist/templates/module/.claude/agents/sundays-backend-builder.md +70 -0
  52. package/dist/templates/module/.claude/settings.local.json +10 -0
  53. package/dist/templates/module/CLAUDE.md +158 -158
  54. package/dist/templates/module/tsconfig.json +19 -19
  55. package/package.json +1 -1
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: knex-table-implementer
3
+ description: Use this agent when you need to create new database table implementations in the Knex project, including migrations, DAOs, interfaces, and exports. This agent should be triggered when: 1) A new database table needs to be added to the system, 2) You need to implement the complete data access layer for a new entity, 3) You want to ensure consistency with the existing project structure and patterns. Examples: <example>Context: User needs to add a new 'product' table to the database. user: "I need to add a product table with id, name, price, and categoryId fields" assistant: "I'll use the knex-table-implementer agent to create the complete implementation for the product table including migration, DAO, interfaces, and exports" <commentary>Since the user needs a new table implementation in the Knex project, use the Task tool to launch the knex-table-implementer agent.</commentary></example> <example>Context: User wants to add a user management system. user: "Create a users table with authentication fields" assistant: "Let me use the knex-table-implementer agent to create the full users table implementation following the project patterns" <commentary>The user is requesting a new table implementation, so the knex-table-implementer agent should be used via the Task tool.</commentary></example>
4
+ model: sonnet
5
+ color: red
6
+ ---
7
+
8
+ You are an expert Knex.js database architect specializing in implementing consistent, production-ready database table structures following established project patterns.
9
+
10
+ **Your Core Responsibilities:**
11
+
12
+ You will create complete table implementations in the Knex project by:
13
+ 1. Creating database migrations using the project's migration patterns
14
+ 2. Implementing DAO classes following the established DAO pattern
15
+ 3. Defining TypeScript interfaces for the entities
16
+ 4. Ensuring all exports are properly added to index.ts
17
+
18
+ **Implementation Workflow:**
19
+
20
+ 1. **Migration Creation**:
21
+ - Inform the user to run `npm run migrate:create` to generate the migration file
22
+ - Write the migration with all database properties in camelCase
23
+ - Include proper up() and down() methods
24
+ - Follow the existing migration patterns in the project
25
+
26
+ 2. **DAO Implementation**:
27
+ - Create the DAO file at `src/dao/{entityName}/{entityName}.dao.ts`
28
+ - Extend from IBaseDAO interface
29
+ - Implement standard CRUD operations (getById, getAll with pagination, create, update, delete)
30
+ - Use KnexManager.getInstance() for database connections
31
+ - For related entities, use PostgreSQL's to_jsonb() function for joins
32
+ - Follow the exact pattern from existing DAOs like SundaysPackageVersionDAO
33
+
34
+ 3. **Interface Definition**:
35
+ - Create the interface file at `src/interfaces/{entityName}/{entityName}.interfaces.ts`
36
+ - Define the main entity interface with all properties
37
+ - Include any related entity interfaces if needed
38
+ - Ensure TypeScript types are properly defined
39
+
40
+ 4. **Export Configuration**:
41
+ - Add the new DAO export to src/index.ts
42
+ - Add the new interface export to src/index.ts
43
+ - Maintain alphabetical ordering in exports when possible
44
+
45
+ **Critical Standards You Must Follow**:
46
+
47
+ - **Naming Conventions**:
48
+ - Database columns: camelCase (e.g., createdAt, userId)
49
+ - Table names: snake_case or lowercase
50
+ - Class names: PascalCase with DAO suffix
51
+ - Interface names: Start with 'I' prefix
52
+
53
+ - **DAO Pattern Requirements**:
54
+ - Always implement IBaseDAO<T> interface
55
+ - Include pagination using IDataPaginator
56
+ - Use async/await for all database operations
57
+ - Return null for not found scenarios
58
+ - Use leftJoin with to_jsonb() for related entities
59
+
60
+ - **Code Structure**:
61
+ - One DAO class per file
62
+ - One interface file per entity
63
+ - Keep related logic together
64
+ - Use the singleton KnexManager for connections
65
+
66
+ **Example Patterns to Follow**:
67
+
68
+ For DAO methods with joins:
69
+ ```typescript
70
+ async getById(id: number): Promise<IEntity | null> {
71
+ const result = await this._knex("entity as e")
72
+ .leftJoin("related as r", "e.relatedId", "r.id")
73
+ .select("e.*", this._knex.raw("to_jsonb(r.*) as related"))
74
+ .where("e.id", id)
75
+ .first();
76
+ return result || null;
77
+ }
78
+ ```
79
+
80
+ For paginated results:
81
+ ```typescript
82
+ async getAll(limit: number, offset: number): Promise<IDataPaginator<IEntity>> {
83
+ const query = this._knex("entity");
84
+ const total = await query.clone().count("* as count").first();
85
+ const data = await query.clone().limit(limit).offset(offset).orderBy("id", "desc");
86
+ return {
87
+ data,
88
+ total: parseInt(total?.count as string) || 0,
89
+ limit,
90
+ offset
91
+ };
92
+ }
93
+ ```
94
+
95
+ **Quality Checks**:
96
+
97
+ Before completing any implementation, verify:
98
+ 1. Migration file uses camelCase for all properties
99
+ 2. DAO follows the exact structure of existing DAOs
100
+ 3. Interface properly types all entity properties
101
+ 4. All new exports are added to src/index.ts
102
+ 5. File paths follow the convention exactly
103
+ 6. No unnecessary files are created
104
+ 7. Code is consistent with existing patterns
105
+
106
+ **Important Reminders**:
107
+ - Only edit existing files when possible
108
+ - Never create documentation files unless explicitly requested
109
+ - Follow the CLAUDE.md instructions precisely
110
+ - Maintain consistency with the existing codebase structure
111
+ - Always use the established patterns from sundays-package-version as reference
112
+
113
+ When you receive a request, first analyze the entity structure needed, then systematically create each component following the established patterns. If any clarification is needed about field types or relationships, ask before proceeding.
@@ -1,13 +1,13 @@
1
- # Server
2
- PORT=3098
3
- ENVIRONMENT=local
4
-
5
- # CORS (comma-separated origins with protocol)
6
- CORS_ALLOWED_ORIGINS=http://localhost:3098
7
-
8
- # Database (uncomment if using db-sql module)
9
- # SQL_HOST=localhost
10
- # SQL_PORT=5432
11
- # SQL_USER=postgres
12
- # SQL_PASSWORD=
13
- # SQL_DB_NAME=mydb
1
+ # Server
2
+ PORT=3098
3
+ ENVIRONMENT=local
4
+
5
+ # CORS (comma-separated origins with protocol)
6
+ CORS_ALLOWED_ORIGINS=http://localhost:3098
7
+
8
+ # Database (uncomment if using db-sql module)
9
+ # SQL_HOST=localhost
10
+ # SQL_PORT=5432
11
+ # SQL_USER=postgres
12
+ # SQL_PASSWORD=
13
+ # SQL_DB_NAME=mydb
@@ -1,3 +1,3 @@
1
- node_modules/
2
- dist/
1
+ node_modules/
2
+ dist/
3
3
  package-lock.json
@@ -1,14 +1,14 @@
1
- FROM node:22-alpine AS builder
2
- WORKDIR /var/api
3
- COPY package*.json ./
4
- RUN npm ci
5
- COPY . .
6
- RUN npm run build
7
-
8
- FROM node:22-alpine
9
- WORKDIR /var/api
10
- COPY package*.json ./
11
- RUN npm ci --omit=dev
12
- COPY --from=builder /var/api/dist ./dist
13
- EXPOSE 3098
14
- CMD ["node", "dist/server.js"]
1
+ FROM node:22-alpine AS builder
2
+ WORKDIR /var/api
3
+ COPY package*.json ./
4
+ RUN npm ci
5
+ COPY . .
6
+ RUN npm run build
7
+
8
+ FROM node:22-alpine
9
+ WORKDIR /var/api
10
+ COPY package*.json ./
11
+ RUN npm ci --omit=dev
12
+ COPY --from=builder /var/api/dist ./dist
13
+ EXPOSE 3098
14
+ CMD ["node", "dist/server.js"]
@@ -1,18 +1,18 @@
1
- # Sundays Framework Project
2
-
3
- This directory contains the starter backend generated by the CLI.
4
-
5
- ## Quick start
6
-
7
- 1. Install dependencies:
8
- ```
9
- npm install
10
- ```
11
- 2. Copy `.env.example` to `.env` and set your environment variables.
12
- 3. Start the development server:
13
- ```
14
- npm run start:dev
15
- ```
16
-
17
- The server will run on the port specified in your `.env` file.
18
-
1
+ # Sundays Framework Project
2
+
3
+ This directory contains the starter backend generated by the CLI.
4
+
5
+ ## Quick start
6
+
7
+ 1. Install dependencies:
8
+ ```
9
+ npm install
10
+ ```
11
+ 2. Copy `.env.example` to `.env` and set your environment variables.
12
+ 3. Start the development server:
13
+ ```
14
+ npm run start:dev
15
+ ```
16
+
17
+ The server will run on the port specified in your `.env` file.
18
+
@@ -1,35 +1,35 @@
1
- import dotenv from 'dotenv';
2
- import express, { type Express } from 'express';
3
- import logger from 'morgan';
4
- import cors from 'cors';
5
- import { IndexRouter } from './routes/index';
6
- import { errorMiddleware } from './middlewares/error/error.middleware';
7
- import { getAllowedOrigins } from './common/config/origins/origins.config';
8
- dotenv.config();
9
-
10
- const app: Express = express();
11
-
12
- app.use(
13
- logger('tiny', {
14
- skip: (req, _res) => {
15
- return req.originalUrl.startsWith('/api/health');
16
- },
17
- })
18
- );
19
-
20
- app.use(
21
- cors({
22
- origin: getAllowedOrigins(),
23
- credentials: true,
24
- allowedHeaders: ['Content-Type', 'Authorization'],
25
- })
26
- );
27
-
28
- app.use(express.urlencoded({ extended: true }));
29
- app.use(express.json());
30
-
31
- app.use('/api', new IndexRouter().router);
32
-
33
- app.use(errorMiddleware);
34
-
1
+ import dotenv from 'dotenv';
2
+ import express, { type Express } from 'express';
3
+ import logger from 'morgan';
4
+ import cors from 'cors';
5
+ import { IndexRouter } from './routes/index';
6
+ import { errorMiddleware } from './middlewares/error/error.middleware';
7
+ import { getAllowedOrigins } from './common/config/origins/origins.config';
8
+ dotenv.config();
9
+
10
+ const app: Express = express();
11
+
12
+ app.use(
13
+ logger('tiny', {
14
+ skip: (req, _res) => {
15
+ return req.originalUrl.startsWith('/api/health');
16
+ },
17
+ })
18
+ );
19
+
20
+ app.use(
21
+ cors({
22
+ origin: getAllowedOrigins(),
23
+ credentials: true,
24
+ allowedHeaders: ['Content-Type', 'Authorization'],
25
+ })
26
+ );
27
+
28
+ app.use(express.urlencoded({ extended: true }));
29
+ app.use(express.json());
30
+
31
+ app.use('/api', new IndexRouter().router);
32
+
33
+ app.use(errorMiddleware);
34
+
35
35
  export default app;
@@ -1,4 +1,4 @@
1
- export const getServiceEnvironment = (): string => {
2
- const serEnv: string = process.env.ENVIRONMENT || 'undefined';
3
- return serEnv.charAt(0).toUpperCase() + serEnv.slice(1);
1
+ export const getServiceEnvironment = (): string => {
2
+ const serEnv: string = process.env.ENVIRONMENT || 'undefined';
3
+ return serEnv.charAt(0).toUpperCase() + serEnv.slice(1);
4
4
  };
@@ -1,5 +1,5 @@
1
- const pjson = require('../../../package.json');
2
-
3
- export const getServiceVersion = (): string => {
4
- return pjson['version'];
1
+ const pjson = require('../../../package.json');
2
+
3
+ export const getServiceVersion = (): string => {
4
+ return pjson['version'];
5
5
  };
@@ -1,24 +1,24 @@
1
- import { NextFunction, Request, Response } from 'express';
2
- import { getServiceVersion } from '../../common/utils/version.resolver';
3
- import { getServiceEnvironment } from '../../common/utils/environment.resolver';
4
-
5
- export class HealthController {
6
- public async getHealthStatus(
7
- _req: Request,
8
- res: Response,
9
- next: NextFunction
10
- ): Promise<void> {
11
- try {
12
- const version: string = await getServiceVersion();
13
- const environment: string = await getServiceEnvironment();
14
- res.status(200).json({
15
- success: true,
16
- health: 'Up!',
17
- version,
18
- environment,
19
- });
20
- } catch (err: any) {
21
- next(err);
22
- }
23
- }
1
+ import { NextFunction, Request, Response } from 'express';
2
+ import { getServiceVersion } from '../../common/utils/version.resolver';
3
+ import { getServiceEnvironment } from '../../common/utils/environment.resolver';
4
+
5
+ export class HealthController {
6
+ public async getHealthStatus(
7
+ _req: Request,
8
+ res: Response,
9
+ next: NextFunction
10
+ ): Promise<void> {
11
+ try {
12
+ const version: string = await getServiceVersion();
13
+ const environment: string = await getServiceEnvironment();
14
+ res.status(200).json({
15
+ success: true,
16
+ health: 'Up!',
17
+ version,
18
+ environment,
19
+ });
20
+ } catch (err: any) {
21
+ next(err);
22
+ }
23
+ }
24
24
  }
@@ -1,17 +1,17 @@
1
- import { Router } from 'express';
2
- import { HealthController } from '../../controllers/health/health.controller';
3
-
4
- export class HealthRouter {
5
- public router: Router = Router();
6
- private readonly healthController: HealthController = new HealthController();
7
- constructor() {
8
- this.initRoutes();
9
- }
10
-
11
- private initRoutes(): void {
12
- this.router.get(
13
- '/',
14
- this.healthController.getHealthStatus.bind(this.healthController)
15
- );
16
- }
1
+ import { Router } from 'express';
2
+ import { HealthController } from '../../controllers/health/health.controller';
3
+
4
+ export class HealthRouter {
5
+ public router: Router = Router();
6
+ private readonly healthController: HealthController = new HealthController();
7
+ constructor() {
8
+ this.initRoutes();
9
+ }
10
+
11
+ private initRoutes(): void {
12
+ this.router.get(
13
+ '/',
14
+ this.healthController.getHealthStatus.bind(this.healthController)
15
+ );
16
+ }
17
17
  }
@@ -1,57 +1,57 @@
1
- import { Router } from 'express';
2
- import fs from 'fs';
3
- import path from 'path';
4
-
5
- export class IndexRouter {
6
- private _router: Router;
7
-
8
- constructor() {
9
- this._router = Router();
10
- this.loadRoutes();
11
- }
12
-
13
- private loadRoutes(): void {
14
- const routesPath = path.join(__dirname);
15
-
16
- const folders = fs.readdirSync(routesPath).filter(file =>
17
- fs.statSync(path.join(routesPath, file)).isDirectory()
18
- );
19
-
20
- folders.forEach(folder => {
21
- const baseName = `${folder}.router`;
22
- const tsPath = path.join(routesPath, folder, `${baseName}.ts`);
23
- const jsPath = path.join(routesPath, folder, `${baseName}.js`);
24
-
25
- let filePath = '';
26
- if (fs.existsSync(tsPath)) {
27
- filePath = tsPath;
28
- } else if (fs.existsSync(jsPath)) {
29
- filePath = jsPath;
30
- } else {
31
- console.warn(`[⚠] No route file found for: ${folder}`);
32
- return;
33
- }
34
-
35
- try {
36
- const routeModule = require(filePath);
37
- const RouterClass =
38
- routeModule.default || Object.values(routeModule).find((e) => typeof e === 'function');
39
-
40
- if (RouterClass) {
41
- const instance = new (RouterClass as any)();
42
- this._router.use(`/${folder}`, instance.router);
43
- console.log(`[✔] Route mounted: /${folder} → ${path.basename(filePath)}`);
44
- } else {
45
- console.warn(`[⚠] No class exported in: ${filePath}`);
46
- }
47
- } catch (err) {
48
- console.error(`[❌] Failed to load router at: ${filePath}`);
49
- console.error(err);
50
- }
51
- });
52
- }
53
-
54
- public get router(): Router {
55
- return this._router;
56
- }
57
- }
1
+ import { Router } from 'express';
2
+ import fs from 'fs';
3
+ import path from 'path';
4
+
5
+ export class IndexRouter {
6
+ private _router: Router;
7
+
8
+ constructor() {
9
+ this._router = Router();
10
+ this.loadRoutes();
11
+ }
12
+
13
+ private loadRoutes(): void {
14
+ const routesPath = path.join(__dirname);
15
+
16
+ const folders = fs.readdirSync(routesPath).filter(file =>
17
+ fs.statSync(path.join(routesPath, file)).isDirectory()
18
+ );
19
+
20
+ folders.forEach(folder => {
21
+ const baseName = `${folder}.router`;
22
+ const tsPath = path.join(routesPath, folder, `${baseName}.ts`);
23
+ const jsPath = path.join(routesPath, folder, `${baseName}.js`);
24
+
25
+ let filePath = '';
26
+ if (fs.existsSync(tsPath)) {
27
+ filePath = tsPath;
28
+ } else if (fs.existsSync(jsPath)) {
29
+ filePath = jsPath;
30
+ } else {
31
+ console.warn(`[⚠] No route file found for: ${folder}`);
32
+ return;
33
+ }
34
+
35
+ try {
36
+ const routeModule = require(filePath);
37
+ const RouterClass =
38
+ routeModule.default || Object.values(routeModule).find((e) => typeof e === 'function');
39
+
40
+ if (RouterClass) {
41
+ const instance = new (RouterClass as any)();
42
+ this._router.use(`/${folder}`, instance.router);
43
+ console.log(`[✔] Route mounted: /${folder} → ${path.basename(filePath)}`);
44
+ } else {
45
+ console.warn(`[⚠] No class exported in: ${filePath}`);
46
+ }
47
+ } catch (err) {
48
+ console.error(`[❌] Failed to load router at: ${filePath}`);
49
+ console.error(err);
50
+ }
51
+ });
52
+ }
53
+
54
+ public get router(): Router {
55
+ return this._router;
56
+ }
57
+ }
@@ -1,16 +1,16 @@
1
- import dotenv from 'dotenv';
2
- dotenv.config();
3
-
4
- const envPort: string = process.env.PORT || '3005';
5
-
6
- if (isNaN(parseInt(envPort))) {
7
- throw new Error('The port must to be a number');
8
- }
9
-
10
- const PORT: number = parseInt(envPort);
11
-
12
- (async () => { })().then(async () => {
13
- const { default: app } = await import('./app');
14
- app.listen(PORT, () => console.info(`Server up and running on port ${PORT}`));
15
- });
16
-
1
+ import dotenv from 'dotenv';
2
+ dotenv.config();
3
+
4
+ const envPort: string = process.env.PORT || '3005';
5
+
6
+ if (isNaN(parseInt(envPort))) {
7
+ throw new Error('The port must to be a number');
8
+ }
9
+
10
+ const PORT: number = parseInt(envPort);
11
+
12
+ (async () => { })().then(async () => {
13
+ const { default: app } = await import('./app');
14
+ app.listen(PORT, () => console.info(`Server up and running on port ${PORT}`));
15
+ });
16
+
@@ -1,10 +1,10 @@
1
- import { Request, Response, NextFunction } from 'express';
2
-
3
- export interface IBaseController {
4
- getAll(req: Request, res: Response, next: NextFunction): Promise<void>;
5
- getByUuid(req: Request, res: Response, next: NextFunction): Promise<void>;
6
- create(req: Request, res: Response, next: NextFunction): Promise<void>;
7
- update(req: Request, res: Response, next: NextFunction): Promise<void>;
8
- patch(req: Request, res: Response, next: NextFunction): Promise<void>;
9
- delete(req: Request, res: Response, next: NextFunction): Promise<void>;
10
- }
1
+ import { Request, Response, NextFunction } from 'express';
2
+
3
+ export interface IBaseController {
4
+ getAll(req: Request, res: Response, next: NextFunction): Promise<void>;
5
+ getByUuid(req: Request, res: Response, next: NextFunction): Promise<void>;
6
+ create(req: Request, res: Response, next: NextFunction): Promise<void>;
7
+ update(req: Request, res: Response, next: NextFunction): Promise<void>;
8
+ patch(req: Request, res: Response, next: NextFunction): Promise<void>;
9
+ delete(req: Request, res: Response, next: NextFunction): Promise<void>;
10
+ }
@@ -1,13 +1,13 @@
1
- # Server
2
- PORT=3098
3
- ENVIRONMENT=local
4
-
5
- # CORS (comma-separated origins with protocol)
6
- CORS_ALLOWED_ORIGINS=http://localhost:3098
7
-
8
- # Database
9
- SQL_HOST=localhost
10
- SQL_PORT=5432
11
- SQL_USER=postgres
12
- SQL_PASSWORD=
13
- SQL_DB_NAME=mydb
1
+ # Server
2
+ PORT=3098
3
+ ENVIRONMENT=local
4
+
5
+ # CORS (comma-separated origins with protocol)
6
+ CORS_ALLOWED_ORIGINS=http://localhost:3098
7
+
8
+ # Database
9
+ SQL_HOST=localhost
10
+ SQL_PORT=5432
11
+ SQL_USER=postgres
12
+ SQL_PASSWORD=
13
+ SQL_DB_NAME=mydb
@@ -1,3 +1,3 @@
1
- node_modules/
2
- dist/
1
+ node_modules/
2
+ dist/
3
3
  package-lock.json
@@ -1,17 +1,17 @@
1
- FROM node:22-alpine AS builder
2
- WORKDIR /var/api
3
- COPY package*.json ./
4
- RUN npm ci
5
- COPY . .
6
- RUN npm run build
7
- RUN npm run db:build
8
-
9
- FROM node:22-alpine
10
- WORKDIR /var/api
11
- COPY package*.json ./
12
- RUN npm ci --omit=dev
13
- COPY --from=builder /var/api/dist ./dist
14
- COPY --from=builder /var/api/db/dist ./db/dist
15
- COPY --from=builder /var/api/db/package.json ./db/package.json
16
- EXPOSE 3098
17
- CMD ["node", "dist/server.js"]
1
+ FROM node:22-alpine AS builder
2
+ WORKDIR /var/api
3
+ COPY package*.json ./
4
+ RUN npm ci
5
+ COPY . .
6
+ RUN npm run build
7
+ RUN npm run db:build
8
+
9
+ FROM node:22-alpine
10
+ WORKDIR /var/api
11
+ COPY package*.json ./
12
+ RUN npm ci --omit=dev
13
+ COPY --from=builder /var/api/dist ./dist
14
+ COPY --from=builder /var/api/db/dist ./db/dist
15
+ COPY --from=builder /var/api/db/package.json ./db/package.json
16
+ EXPOSE 3098
17
+ CMD ["node", "dist/server.js"]