lapeh 1.0.1 → 1.0.3
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.
- package/.env.example +16 -16
- package/bin/index.js +105 -105
- package/framework.md +105 -0
- package/nodemon.json +6 -0
- package/package.json +73 -70
- package/prisma/base.prisma +8 -8
- package/prisma/migrations/20251225163737_init/migration.sql +236 -236
- package/prisma/migrations/migration_lock.toml +3 -3
- package/prisma/schema.prisma +0 -7
- package/prisma.config.ts +15 -15
- package/readme.md +126 -120
- package/scripts/generate-jwt-secret.js +38 -38
- package/scripts/init-project.js +71 -0
- package/scripts/make-model.js +42 -42
- package/scripts/make-module.js +158 -158
- package/src/controllers/rbacController.ts +353 -353
- package/src/middleware/auth.ts +56 -56
- package/src/middleware/error.ts +7 -7
- package/src/middleware/visitor.ts +180 -180
- package/src/models/schema.prisma +159 -159
- package/src/routes/rbac.ts +55 -55
- package/src/schema/auth-schema.ts +62 -62
- package/src/utils/pagination.ts +56 -56
package/scripts/make-module.js
CHANGED
|
@@ -1,158 +1,158 @@
|
|
|
1
|
-
const fs = require('fs');
|
|
2
|
-
const path = require('path');
|
|
3
|
-
|
|
4
|
-
const moduleName = process.argv[2];
|
|
5
|
-
|
|
6
|
-
if (!moduleName) {
|
|
7
|
-
console.error('❌ Please specify the module name.');
|
|
8
|
-
console.error(' Usage: npm run make:module <name>');
|
|
9
|
-
console.error(' Example: npm run make:module product');
|
|
10
|
-
process.exit(1);
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
// Convert "product" -> "Product" (PascalCase) for Class names
|
|
14
|
-
const PascalCaseName = moduleName.charAt(0).toUpperCase() + moduleName.slice(1);
|
|
15
|
-
// Convert "product" -> "product" (camelCase) for variables/files
|
|
16
|
-
const camelCaseName = moduleName.toLowerCase();
|
|
17
|
-
|
|
18
|
-
const srcDir = path.join(__dirname, '..', 'src');
|
|
19
|
-
|
|
20
|
-
// 1. Create Controller
|
|
21
|
-
const controllerContent = `import { Request, Response } from 'express';
|
|
22
|
-
import { ${PascalCaseName}Service } from '../services/${camelCaseName}Service';
|
|
23
|
-
import { successResponse, errorResponse } from '../utils/response';
|
|
24
|
-
|
|
25
|
-
export const ${PascalCaseName}Controller = {
|
|
26
|
-
async getAll(req: Request, res: Response) {
|
|
27
|
-
try {
|
|
28
|
-
const data = await ${PascalCaseName}Service.getAll();
|
|
29
|
-
return successResponse(res, data, '${PascalCaseName}s retrieved successfully');
|
|
30
|
-
} catch (error) {
|
|
31
|
-
return errorResponse(res, error as Error);
|
|
32
|
-
}
|
|
33
|
-
},
|
|
34
|
-
|
|
35
|
-
async getById(req: Request, res: Response) {
|
|
36
|
-
try {
|
|
37
|
-
const { id } = req.params;
|
|
38
|
-
const data = await ${PascalCaseName}Service.getById(id);
|
|
39
|
-
if (!data) return errorResponse(res, new Error('${PascalCaseName} not found'), 404);
|
|
40
|
-
return successResponse(res, data, '${PascalCaseName} retrieved successfully');
|
|
41
|
-
} catch (error) {
|
|
42
|
-
return errorResponse(res, error as Error);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
async create(req: Request, res: Response) {
|
|
47
|
-
try {
|
|
48
|
-
const data = await ${PascalCaseName}Service.create(req.body);
|
|
49
|
-
return successResponse(res, data, '${PascalCaseName} created successfully', 201);
|
|
50
|
-
} catch (error) {
|
|
51
|
-
return errorResponse(res, error as Error);
|
|
52
|
-
}
|
|
53
|
-
},
|
|
54
|
-
|
|
55
|
-
async update(req: Request, res: Response) {
|
|
56
|
-
try {
|
|
57
|
-
const { id } = req.params;
|
|
58
|
-
const data = await ${PascalCaseName}Service.update(id, req.body);
|
|
59
|
-
return successResponse(res, data, '${PascalCaseName} updated successfully');
|
|
60
|
-
} catch (error) {
|
|
61
|
-
return errorResponse(res, error as Error);
|
|
62
|
-
}
|
|
63
|
-
},
|
|
64
|
-
|
|
65
|
-
async delete(req: Request, res: Response) {
|
|
66
|
-
try {
|
|
67
|
-
const { id } = req.params;
|
|
68
|
-
await ${PascalCaseName}Service.delete(id);
|
|
69
|
-
return successResponse(res, null, '${PascalCaseName} deleted successfully');
|
|
70
|
-
} catch (error) {
|
|
71
|
-
return errorResponse(res, error as Error);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
};
|
|
75
|
-
`;
|
|
76
|
-
|
|
77
|
-
// 2. Create Service
|
|
78
|
-
const serviceContent = `// import prisma from '../prisma'; // Uncomment this line if you use Prisma
|
|
79
|
-
|
|
80
|
-
export const ${PascalCaseName}Service = {
|
|
81
|
-
async getAll() {
|
|
82
|
-
// return prisma.${camelCaseName}.findMany();
|
|
83
|
-
return [{ id: 1, name: 'Sample ${PascalCaseName}' }]; // Placeholder
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
async getById(id: string) {
|
|
87
|
-
// return prisma.${camelCaseName}.findUnique({ where: { id } });
|
|
88
|
-
return { id, name: 'Sample ${PascalCaseName}' }; // Placeholder
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
async create(data: any) {
|
|
92
|
-
// return prisma.${camelCaseName}.create({ data });
|
|
93
|
-
return { id: Date.now(), ...data }; // Placeholder
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
async update(id: string, data: any) {
|
|
97
|
-
// return prisma.${camelCaseName}.update({ where: { id }, data });
|
|
98
|
-
return { id, ...data }; // Placeholder
|
|
99
|
-
},
|
|
100
|
-
|
|
101
|
-
async delete(id: string) {
|
|
102
|
-
// return prisma.${camelCaseName}.delete({ where: { id } });
|
|
103
|
-
return true; // Placeholder
|
|
104
|
-
}
|
|
105
|
-
};
|
|
106
|
-
`;
|
|
107
|
-
|
|
108
|
-
// 3. Create Route
|
|
109
|
-
const routeContent = `import { Router } from 'express';
|
|
110
|
-
import { ${PascalCaseName}Controller } from '../controllers/${camelCaseName}Controller';
|
|
111
|
-
import { authenticateToken } from '../middleware/auth';
|
|
112
|
-
|
|
113
|
-
const router = Router();
|
|
114
|
-
|
|
115
|
-
router.get('/', authenticateToken, ${PascalCaseName}Controller.getAll);
|
|
116
|
-
router.get('/:id', authenticateToken, ${PascalCaseName}Controller.getById);
|
|
117
|
-
router.post('/', authenticateToken, ${PascalCaseName}Controller.create);
|
|
118
|
-
router.put('/:id', authenticateToken, ${PascalCaseName}Controller.update);
|
|
119
|
-
router.delete('/:id', authenticateToken, ${PascalCaseName}Controller.delete);
|
|
120
|
-
|
|
121
|
-
export default router;
|
|
122
|
-
`;
|
|
123
|
-
|
|
124
|
-
const paths = {
|
|
125
|
-
controller: path.join(srcDir, 'controllers', `${camelCaseName}Controller.ts`),
|
|
126
|
-
service: path.join(srcDir, 'services', `${camelCaseName}Service.ts`),
|
|
127
|
-
route: path.join(srcDir, 'routes', `${camelCaseName}.ts`),
|
|
128
|
-
};
|
|
129
|
-
|
|
130
|
-
// Helper to create directory if not exists
|
|
131
|
-
function ensureDir(filePath) {
|
|
132
|
-
const dirname = path.dirname(filePath);
|
|
133
|
-
if (!fs.existsSync(dirname)) {
|
|
134
|
-
fs.mkdirSync(dirname, { recursive: true });
|
|
135
|
-
}
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
try {
|
|
139
|
-
ensureDir(paths.controller);
|
|
140
|
-
fs.writeFileSync(paths.controller, controllerContent);
|
|
141
|
-
console.log(`✅ Created Controller: src/controllers/${camelCaseName}Controller.ts`);
|
|
142
|
-
|
|
143
|
-
ensureDir(paths.service);
|
|
144
|
-
fs.writeFileSync(paths.service, serviceContent);
|
|
145
|
-
console.log(`✅ Created Service: src/services/${camelCaseName}Service.ts`);
|
|
146
|
-
|
|
147
|
-
ensureDir(paths.route);
|
|
148
|
-
fs.writeFileSync(paths.route, routeContent);
|
|
149
|
-
console.log(`✅ Created Route: src/routes/${camelCaseName}.ts`);
|
|
150
|
-
|
|
151
|
-
console.log('\n⚠️ Don\'t forget to register the new route in src/index.ts or src/server.ts!');
|
|
152
|
-
console.log(` import ${camelCaseName}Routes from './routes/${camelCaseName}';`);
|
|
153
|
-
console.log(` app.use('/${camelCaseName}s', ${camelCaseName}Routes);`);
|
|
154
|
-
|
|
155
|
-
} catch (error) {
|
|
156
|
-
console.error('❌ Error creating module:', error);
|
|
157
|
-
process.exit(1);
|
|
158
|
-
}
|
|
1
|
+
const fs = require('fs');
|
|
2
|
+
const path = require('path');
|
|
3
|
+
|
|
4
|
+
const moduleName = process.argv[2];
|
|
5
|
+
|
|
6
|
+
if (!moduleName) {
|
|
7
|
+
console.error('❌ Please specify the module name.');
|
|
8
|
+
console.error(' Usage: npm run make:module <name>');
|
|
9
|
+
console.error(' Example: npm run make:module product');
|
|
10
|
+
process.exit(1);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Convert "product" -> "Product" (PascalCase) for Class names
|
|
14
|
+
const PascalCaseName = moduleName.charAt(0).toUpperCase() + moduleName.slice(1);
|
|
15
|
+
// Convert "product" -> "product" (camelCase) for variables/files
|
|
16
|
+
const camelCaseName = moduleName.toLowerCase();
|
|
17
|
+
|
|
18
|
+
const srcDir = path.join(__dirname, '..', 'src');
|
|
19
|
+
|
|
20
|
+
// 1. Create Controller
|
|
21
|
+
const controllerContent = `import { Request, Response } from 'express';
|
|
22
|
+
import { ${PascalCaseName}Service } from '../services/${camelCaseName}Service';
|
|
23
|
+
import { successResponse, errorResponse } from '../utils/response';
|
|
24
|
+
|
|
25
|
+
export const ${PascalCaseName}Controller = {
|
|
26
|
+
async getAll(req: Request, res: Response) {
|
|
27
|
+
try {
|
|
28
|
+
const data = await ${PascalCaseName}Service.getAll();
|
|
29
|
+
return successResponse(res, data, '${PascalCaseName}s retrieved successfully');
|
|
30
|
+
} catch (error) {
|
|
31
|
+
return errorResponse(res, error as Error);
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
|
|
35
|
+
async getById(req: Request, res: Response) {
|
|
36
|
+
try {
|
|
37
|
+
const { id } = req.params;
|
|
38
|
+
const data = await ${PascalCaseName}Service.getById(id);
|
|
39
|
+
if (!data) return errorResponse(res, new Error('${PascalCaseName} not found'), 404);
|
|
40
|
+
return successResponse(res, data, '${PascalCaseName} retrieved successfully');
|
|
41
|
+
} catch (error) {
|
|
42
|
+
return errorResponse(res, error as Error);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
async create(req: Request, res: Response) {
|
|
47
|
+
try {
|
|
48
|
+
const data = await ${PascalCaseName}Service.create(req.body);
|
|
49
|
+
return successResponse(res, data, '${PascalCaseName} created successfully', 201);
|
|
50
|
+
} catch (error) {
|
|
51
|
+
return errorResponse(res, error as Error);
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
|
|
55
|
+
async update(req: Request, res: Response) {
|
|
56
|
+
try {
|
|
57
|
+
const { id } = req.params;
|
|
58
|
+
const data = await ${PascalCaseName}Service.update(id, req.body);
|
|
59
|
+
return successResponse(res, data, '${PascalCaseName} updated successfully');
|
|
60
|
+
} catch (error) {
|
|
61
|
+
return errorResponse(res, error as Error);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
|
|
65
|
+
async delete(req: Request, res: Response) {
|
|
66
|
+
try {
|
|
67
|
+
const { id } = req.params;
|
|
68
|
+
await ${PascalCaseName}Service.delete(id);
|
|
69
|
+
return successResponse(res, null, '${PascalCaseName} deleted successfully');
|
|
70
|
+
} catch (error) {
|
|
71
|
+
return errorResponse(res, error as Error);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
};
|
|
75
|
+
`;
|
|
76
|
+
|
|
77
|
+
// 2. Create Service
|
|
78
|
+
const serviceContent = `// import prisma from '../prisma'; // Uncomment this line if you use Prisma
|
|
79
|
+
|
|
80
|
+
export const ${PascalCaseName}Service = {
|
|
81
|
+
async getAll() {
|
|
82
|
+
// return prisma.${camelCaseName}.findMany();
|
|
83
|
+
return [{ id: 1, name: 'Sample ${PascalCaseName}' }]; // Placeholder
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
async getById(id: string) {
|
|
87
|
+
// return prisma.${camelCaseName}.findUnique({ where: { id } });
|
|
88
|
+
return { id, name: 'Sample ${PascalCaseName}' }; // Placeholder
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
async create(data: any) {
|
|
92
|
+
// return prisma.${camelCaseName}.create({ data });
|
|
93
|
+
return { id: Date.now(), ...data }; // Placeholder
|
|
94
|
+
},
|
|
95
|
+
|
|
96
|
+
async update(id: string, data: any) {
|
|
97
|
+
// return prisma.${camelCaseName}.update({ where: { id }, data });
|
|
98
|
+
return { id, ...data }; // Placeholder
|
|
99
|
+
},
|
|
100
|
+
|
|
101
|
+
async delete(id: string) {
|
|
102
|
+
// return prisma.${camelCaseName}.delete({ where: { id } });
|
|
103
|
+
return true; // Placeholder
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
`;
|
|
107
|
+
|
|
108
|
+
// 3. Create Route
|
|
109
|
+
const routeContent = `import { Router } from 'express';
|
|
110
|
+
import { ${PascalCaseName}Controller } from '../controllers/${camelCaseName}Controller';
|
|
111
|
+
import { authenticateToken } from '../middleware/auth';
|
|
112
|
+
|
|
113
|
+
const router = Router();
|
|
114
|
+
|
|
115
|
+
router.get('/', authenticateToken, ${PascalCaseName}Controller.getAll);
|
|
116
|
+
router.get('/:id', authenticateToken, ${PascalCaseName}Controller.getById);
|
|
117
|
+
router.post('/', authenticateToken, ${PascalCaseName}Controller.create);
|
|
118
|
+
router.put('/:id', authenticateToken, ${PascalCaseName}Controller.update);
|
|
119
|
+
router.delete('/:id', authenticateToken, ${PascalCaseName}Controller.delete);
|
|
120
|
+
|
|
121
|
+
export default router;
|
|
122
|
+
`;
|
|
123
|
+
|
|
124
|
+
const paths = {
|
|
125
|
+
controller: path.join(srcDir, 'controllers', `${camelCaseName}Controller.ts`),
|
|
126
|
+
service: path.join(srcDir, 'services', `${camelCaseName}Service.ts`),
|
|
127
|
+
route: path.join(srcDir, 'routes', `${camelCaseName}.ts`),
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
// Helper to create directory if not exists
|
|
131
|
+
function ensureDir(filePath) {
|
|
132
|
+
const dirname = path.dirname(filePath);
|
|
133
|
+
if (!fs.existsSync(dirname)) {
|
|
134
|
+
fs.mkdirSync(dirname, { recursive: true });
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
try {
|
|
139
|
+
ensureDir(paths.controller);
|
|
140
|
+
fs.writeFileSync(paths.controller, controllerContent);
|
|
141
|
+
console.log(`✅ Created Controller: src/controllers/${camelCaseName}Controller.ts`);
|
|
142
|
+
|
|
143
|
+
ensureDir(paths.service);
|
|
144
|
+
fs.writeFileSync(paths.service, serviceContent);
|
|
145
|
+
console.log(`✅ Created Service: src/services/${camelCaseName}Service.ts`);
|
|
146
|
+
|
|
147
|
+
ensureDir(paths.route);
|
|
148
|
+
fs.writeFileSync(paths.route, routeContent);
|
|
149
|
+
console.log(`✅ Created Route: src/routes/${camelCaseName}.ts`);
|
|
150
|
+
|
|
151
|
+
console.log('\n⚠️ Don\'t forget to register the new route in src/index.ts or src/server.ts!');
|
|
152
|
+
console.log(` import ${camelCaseName}Routes from './routes/${camelCaseName}';`);
|
|
153
|
+
console.log(` app.use('/${camelCaseName}s', ${camelCaseName}Routes);`);
|
|
154
|
+
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('❌ Error creating module:', error);
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|