lapeeh 1.0.9 → 1.0.11

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 (83) hide show
  1. package/doc/en/CHANGELOG.md +24 -24
  2. package/doc/id/CHANGELOG.md +9 -9
  3. package/lib/bootstrap.ts +1 -1
  4. package/package.json +3 -3
  5. package/scripts/release.js +91 -25
  6. package/src/modules/Auth/auth.routes.ts +74 -74
  7. package/src/modules/Auth/auth.service.ts +6 -6
  8. package/src/modules/Rbac/rbac.routes.ts +42 -42
  9. package/src/modules/Rbac/rbac.service.ts +6 -6
  10. package/storage/logs/.2146fe39e5d991f68e775757f2d7c9c13a44e765-audit.json +15 -0
  11. package/storage/logs/lapeeh-2026-04-06.log +2 -0
  12. package/tsconfig.json +1 -0
  13. package/dist/lib/bootstrap.d.ts +0 -3
  14. package/dist/lib/bootstrap.d.ts.map +0 -1
  15. package/dist/lib/bootstrap.js +0 -184
  16. package/dist/lib/core/realtime.d.ts +0 -3
  17. package/dist/lib/core/realtime.d.ts.map +0 -1
  18. package/dist/lib/core/realtime.js +0 -36
  19. package/dist/lib/core/redis.d.ts +0 -9
  20. package/dist/lib/core/redis.d.ts.map +0 -1
  21. package/dist/lib/core/redis.js +0 -133
  22. package/dist/lib/core/serializer.d.ts +0 -43
  23. package/dist/lib/core/serializer.d.ts.map +0 -1
  24. package/dist/lib/core/serializer.js +0 -66
  25. package/dist/lib/core/server.d.ts +0 -2
  26. package/dist/lib/core/server.d.ts.map +0 -1
  27. package/dist/lib/core/server.js +0 -60
  28. package/dist/lib/core/store.d.ts +0 -55
  29. package/dist/lib/core/store.d.ts.map +0 -1
  30. package/dist/lib/core/store.js +0 -66
  31. package/dist/lib/middleware/auth.d.ts +0 -4
  32. package/dist/lib/middleware/auth.d.ts.map +0 -1
  33. package/dist/lib/middleware/auth.js +0 -55
  34. package/dist/lib/middleware/error.d.ts +0 -3
  35. package/dist/lib/middleware/error.d.ts.map +0 -1
  36. package/dist/lib/middleware/error.js +0 -41
  37. package/dist/lib/middleware/multipart.d.ts +0 -4
  38. package/dist/lib/middleware/multipart.d.ts.map +0 -1
  39. package/dist/lib/middleware/multipart.js +0 -17
  40. package/dist/lib/middleware/rateLimit.d.ts +0 -2
  41. package/dist/lib/middleware/rateLimit.d.ts.map +0 -1
  42. package/dist/lib/middleware/rateLimit.js +0 -19
  43. package/dist/lib/middleware/requestLogger.d.ts +0 -3
  44. package/dist/lib/middleware/requestLogger.d.ts.map +0 -1
  45. package/dist/lib/middleware/requestLogger.js +0 -22
  46. package/dist/lib/middleware/visitor.d.ts +0 -3
  47. package/dist/lib/middleware/visitor.d.ts.map +0 -1
  48. package/dist/lib/middleware/visitor.js +0 -144
  49. package/dist/lib/utils/logger.d.ts +0 -11
  50. package/dist/lib/utils/logger.d.ts.map +0 -1
  51. package/dist/lib/utils/logger.js +0 -81
  52. package/dist/lib/utils/pagination.d.ts +0 -19
  53. package/dist/lib/utils/pagination.d.ts.map +0 -1
  54. package/dist/lib/utils/pagination.js +0 -34
  55. package/dist/lib/utils/response.d.ts +0 -11
  56. package/dist/lib/utils/response.d.ts.map +0 -1
  57. package/dist/lib/utils/response.js +0 -57
  58. package/dist/lib/utils/validator.d.ts +0 -38
  59. package/dist/lib/utils/validator.d.ts.map +0 -1
  60. package/dist/lib/utils/validator.js +0 -340
  61. package/dist/src/config/app.d.ts +0 -10
  62. package/dist/src/config/app.d.ts.map +0 -1
  63. package/dist/src/config/app.js +0 -12
  64. package/dist/src/config/cors.d.ts +0 -6
  65. package/dist/src/config/cors.d.ts.map +0 -1
  66. package/dist/src/config/cors.js +0 -8
  67. package/dist/src/modules/Auth/auth.controller.d.ts +0 -11
  68. package/dist/src/modules/Auth/auth.controller.d.ts.map +0 -1
  69. package/dist/src/modules/Auth/auth.controller.js +0 -427
  70. package/dist/src/modules/Rbac/rbac.controller.d.ts +0 -16
  71. package/dist/src/modules/Rbac/rbac.controller.d.ts.map +0 -1
  72. package/dist/src/modules/Rbac/rbac.controller.js +0 -438
  73. package/dist/src/routes/auth.d.ts +0 -2
  74. package/dist/src/routes/auth.d.ts.map +0 -1
  75. package/dist/src/routes/auth.js +0 -45
  76. package/dist/src/routes/index.d.ts +0 -2
  77. package/dist/src/routes/index.d.ts.map +0 -1
  78. package/dist/src/routes/index.js +0 -9
  79. package/dist/src/routes/rbac.d.ts +0 -2
  80. package/dist/src/routes/rbac.d.ts.map +0 -1
  81. package/dist/src/routes/rbac.js +0 -23
  82. package/storage/logs/.f995bb45779ab7e42622de305683c278c0ee3481-audit.json +0 -15
  83. package/storage/logs/lapeeh-2026-01-01.log +0 -201
@@ -1,24 +1,24 @@
1
- # Changelog
2
-
3
- All notable changes to this project will be documented in this file.
4
-
5
- ## [1.0.6] - 2026-01-01
6
-
7
- ### 🚀 Features & Improvements
8
-
9
- - **Testing**: Added `npx lapeeh tes` command which runs Jest and JSON Server concurrently with an isolated database (`database.test.json`).
10
- - **Module Refactor**: Restructured default modules (`Auth` & `Rbac`) to follow the `make:module` standard (Controller, Service, Route in one folder).
11
- - **Cleanup**: Removed old route files in `src/routes/` and moved them into their respective modules.
12
- - **CLI**: Updated help message for `test` command.
13
-
14
- ## [1.0.5] - 2026-01-01
15
-
16
- ### 🚀 Features & Improvements
17
-
18
- - **Standardization**: lapeeh framework standardization.
19
- - **CLI**: Fixes for `make:module` and `init` commands.
20
- - **Documentation**: Cleanup of confusing old version references.
21
-
22
- ## [1.0.0] - 2026-01-01
23
-
24
- - First Public Release.
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [1.0.6] - 2026-01-01
6
+
7
+ ### 🚀 Features & Improvements
8
+
9
+ - **Testing**: Added `npx lapeeh tes` command which runs Jest and JSON Server concurrently with an isolated database (`database.test.json`).
10
+ - **Module Refactor**: Restructured default modules (`Auth` & `Rbac`) to follow the `make:module` standard (Controller, Service, Route in one folder).
11
+ - **Cleanup**: Removed old route files in `src/routes/` and moved them into their respective modules.
12
+ - **CLI**: Updated help message for `test` command.
13
+
14
+ ## [1.0.5] - 2026-01-01
15
+
16
+ ### 🚀 Features & Improvements
17
+
18
+ - **Standardization**: lapeeh framework standardization.
19
+ - **CLI**: Fixes for `make:module` and `init` commands.
20
+ - **Documentation**: Cleanup of confusing old version references.
21
+
22
+ ## [1.0.0] - 2026-01-01
23
+
24
+ - First Public Release.
@@ -2,15 +2,15 @@
2
2
 
3
3
  File ini mencatat semua perubahan, pembaruan, dan perbaikan yang dilakukan pada framework lapeeh, diurutkan berdasarkan tanggal.
4
4
 
5
- ## [1.0.6] - 2026-01-01
6
-
7
- ### 🚀 Fitur & Perbaikan
8
-
9
- - **Testing**: Menambahkan perintah `npx lapeeh tes` yang menjalankan Jest dan JSON Server secara bersamaan dengan database terisolasi (`database.test.json`).
10
- - **Refactor Modul**: Restrukturisasi modul bawaan (`Auth` & `Rbac`) mengikuti standar `make:module` (Controller, Service, Route dalam satu folder).
11
- - **Cleanup**: Menghapus file route lama di `src/routes/` dan memindahkannya ke dalam modul masing-masing.
12
- - **CLI**: Update help message untuk perintah `test`.
13
-
5
+ ## [1.0.6] - 2026-01-01
6
+
7
+ ### 🚀 Fitur & Perbaikan
8
+
9
+ - **Testing**: Menambahkan perintah `npx lapeeh tes` yang menjalankan Jest dan JSON Server secara bersamaan dengan database terisolasi (`database.test.json`).
10
+ - **Refactor Modul**: Restrukturisasi modul bawaan (`Auth` & `Rbac`) mengikuti standar `make:module` (Controller, Service, Route dalam satu folder).
11
+ - **Cleanup**: Menghapus file route lama di `src/routes/` dan memindahkannya ke dalam modul masing-masing.
12
+ - **CLI**: Update help message untuk perintah `test`.
13
+
14
14
  ## [1.0.5] - 2026-01-01
15
15
 
16
16
  ### 🚀 Fitur & Perbaikan
package/lib/bootstrap.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import dotenv from "dotenv";
2
2
  dotenv.config();
3
3
 
4
- import moduleAlias from "module-alias";
4
+ import moduleAlias = require("module-alias");
5
5
  import express, { Request, Response, NextFunction } from "express";
6
6
  import cors from "cors";
7
7
  import helmet from "helmet";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lapeeh",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "lapeeh Framework (Standardized by lapeeh)",
5
5
  "engines": {
6
6
  "node": ">=18.0.0",
@@ -91,7 +91,7 @@
91
91
  "cors": "2.8.5",
92
92
  "dotenv": "17.2.3",
93
93
  "express": "5.2.1",
94
- "express-rate-limit": "8.2.1",
94
+ "express-rate-limit": "^8.3.2",
95
95
  "fast-json-stringify": "^6.1.1",
96
96
  "helmet": "8.1.0",
97
97
  "ioredis": "5.8.2",
@@ -99,7 +99,7 @@
99
99
  "json-server": "^1.0.0-beta.3",
100
100
  "jsonwebtoken": "9.0.3",
101
101
  "module-alias": "^2.2.3",
102
- "multer": "2.0.2",
102
+ "multer": "^2.1.1",
103
103
  "pg": "8.16.3",
104
104
  "slugify": "1.6.6",
105
105
  "socket.io": "4.8.3",
@@ -8,7 +8,41 @@ const rl = readline.createInterface({
8
8
  output: process.stdout
9
9
  });
10
10
 
11
- const question = (query) => new Promise((resolve) => rl.question(query, resolve));
11
+ const question = (query) => new Promise((resolve) => rl.question(query, resolve));
12
+
13
+ function getCommandOutput(command, options = {}) {
14
+ try {
15
+ return execSync(command, {
16
+ stdio: 'pipe',
17
+ encoding: 'utf8',
18
+ ...options
19
+ }).trim();
20
+ } catch (error) {
21
+ const stdout = error.stdout ? error.stdout.toString() : '';
22
+ const stderr = error.stderr ? error.stderr.toString() : '';
23
+ const combined = `${stdout}\n${stderr}`.trim();
24
+ error.combinedOutput = combined;
25
+ throw error;
26
+ }
27
+ }
28
+
29
+ function isOtpError(output) {
30
+ const text = (output || '').toLowerCase();
31
+ return text.includes('one-time pass') ||
32
+ text.includes('otp') ||
33
+ text.includes('eotp');
34
+ }
35
+
36
+ function isPermissionError(output) {
37
+ const text = (output || '').toLowerCase();
38
+ return text.includes('e404') ||
39
+ text.includes('404 not found') ||
40
+ text.includes('e403') ||
41
+ text.includes('permission') ||
42
+ text.includes('not authorized') ||
43
+ text.includes('not in this registry') ||
44
+ text.includes('cannot publish over the previously published versions');
45
+ }
12
46
 
13
47
  // Paths
14
48
  const rootDir = path.resolve(__dirname, '..');
@@ -71,13 +105,21 @@ function getGitChanges() {
71
105
  }
72
106
 
73
107
  // Helper to get npm version
74
- function getNpmVersion() {
75
- try {
76
- return execSync('npm view lapeeh version', { stdio: 'pipe' }).toString().trim();
77
- } catch (e) {
78
- return null;
79
- }
80
- }
108
+ function getNpmVersion() {
109
+ try {
110
+ return getCommandOutput('npm view lapeeh version');
111
+ } catch (e) {
112
+ return null;
113
+ }
114
+ }
115
+
116
+ function getNpmUser() {
117
+ try {
118
+ return getCommandOutput('npm whoami');
119
+ } catch (e) {
120
+ return null;
121
+ }
122
+ }
81
123
 
82
124
  // Helper to increment patch version
83
125
  function incrementPatch(version) {
@@ -503,23 +545,47 @@ Thank you for being part of the lapeeh Framework journey!
503
545
  }
504
546
 
505
547
  // 5. Question: NPM
506
- const publishNpm = await question('\n4. Apa ingin publish ke NPM? (y/n): ');
507
- if (publishNpm.toLowerCase() === 'y') {
508
- try {
509
- execSync('npm publish', { stdio: 'inherit' });
510
- console.log('✅ NPM publish complete');
511
- } catch (error) {
512
- console.log('\n⚠️ NPM Publish failed. This might be due to 2FA.');
513
- const otp = await question('🔐 Masukkan kode OTP (Authenticator App) Anda: ');
514
- if (otp && otp.trim() !== '') {
515
- execSync(`npm publish --otp=${otp.trim()}`, { stdio: 'inherit' });
516
- console.log(' NPM publish complete');
517
- } else {
518
- console.log('❌ NPM publish aborted.');
519
- throw error;
520
- }
521
- }
522
- } else {
548
+ const publishNpm = await question('\n4. Apa ingin publish ke NPM? (y/n): ');
549
+ if (publishNpm.toLowerCase() === 'y') {
550
+ const npmUser = getNpmUser();
551
+ if (npmUser) {
552
+ console.log(`👤 NPM login terdeteksi sebagai: ${npmUser}`);
553
+ } else {
554
+ console.log('⚠️ Tidak bisa mendeteksi user NPM. Pastikan sudah login dengan `npm login`.');
555
+ }
556
+
557
+ try {
558
+ execSync('npm publish', { stdio: 'inherit' });
559
+ console.log('✅ NPM publish complete');
560
+ } catch (error) {
561
+ const details = error.combinedOutput || error.message || '';
562
+
563
+ if (isOtpError(details)) {
564
+ console.log('\n⚠️ NPM Publish gagal karena membutuhkan OTP 2FA.');
565
+ const otp = await question('🔐 Masukkan kode OTP (Authenticator App) Anda: ');
566
+ if (otp && otp.trim() !== '') {
567
+ execSync(`npm publish --otp=${otp.trim()}`, { stdio: 'inherit' });
568
+ console.log('✅ NPM publish complete');
569
+ } else {
570
+ console.log('❌ NPM publish dibatalkan karena OTP kosong.');
571
+ throw error;
572
+ }
573
+ } else if (isPermissionError(details)) {
574
+ console.log('\n❌ NPM Publish gagal karena akun ini tidak punya akses publish ke paket `lapeeh`, atau versinya sudah bermasalah di registry.');
575
+ if (npmUser) {
576
+ console.log(`ℹ️ User aktif: ${npmUser}`);
577
+ }
578
+ console.log('ℹ️ Cek dengan: `npm whoami`, `npm owner ls lapeeh`, atau gunakan package name/scope yang memang Anda miliki.');
579
+ throw error;
580
+ } else {
581
+ console.log('\n❌ NPM Publish gagal karena alasan lain, bukan OTP.');
582
+ if (details) {
583
+ console.log(details);
584
+ }
585
+ throw error;
586
+ }
587
+ }
588
+ } else {
523
589
  console.log('⏭️ Skipping NPM publish.');
524
590
  }
525
591
 
@@ -1,74 +1,74 @@
1
- import { Router } from "express";
2
- import rateLimit from "express-rate-limit";
3
- // eslint-disable-next-line @typescript-eslint/no-var-requires
4
- const multer = require("multer");
5
- import path from "path";
6
- import fs from "fs";
7
- import {
8
- register,
9
- login,
10
- me,
11
- logout,
12
- refreshToken,
13
- updatePassword,
14
- updateProfile,
15
- updateAvatar,
16
- } from "./auth.controller";
17
- import { requireAuth } from "lapeeh/middleware/auth";
18
-
19
- const authLimiter = rateLimit({
20
- windowMs: 15 * 60 * 1000,
21
- max: 50,
22
- standardHeaders: true,
23
- legacyHeaders: false,
24
- });
25
-
26
- const avatarUploadDir = process.env.AVATAR_UPLOAD_DIR || "uploads/avatars";
27
- if (!fs.existsSync(avatarUploadDir)) {
28
- fs.mkdirSync(avatarUploadDir, { recursive: true });
29
- }
30
-
31
- const storage = (multer as any).diskStorage({
32
- destination(
33
- _req: any,
34
- _file: any,
35
- cb: (error: Error | null, destination: string) => void
36
- ) {
37
- cb(null, avatarUploadDir);
38
- },
39
- filename(
40
- _req: any,
41
- file: any,
42
- cb: (error: Error | null, filename: string) => void
43
- ) {
44
- const ext = path.extname(file.originalname);
45
- const base = path.basename(file.originalname, ext);
46
- const unique = Date.now() + "-" + Math.round(Math.random() * 1e9);
47
- cb(null, base + "-" + unique + ext);
48
- },
49
- });
50
-
51
- const uploadAvatar = multer({ storage });
52
-
53
- export const authRouter = Router();
54
-
55
- authRouter.post("/register", authLimiter, register);
56
-
57
- authRouter.post("/login", authLimiter, login);
58
-
59
- authRouter.get("/me", requireAuth, me);
60
-
61
- authRouter.post("/logout", requireAuth, logout);
62
-
63
- authRouter.post("/refresh", authLimiter, refreshToken);
64
-
65
- authRouter.put("/password", requireAuth, updatePassword);
66
-
67
- authRouter.put("/profile", requireAuth, updateProfile);
68
-
69
- authRouter.post(
70
- "/avatar",
71
- requireAuth,
72
- uploadAvatar.single("avatar"),
73
- updateAvatar
74
- );
1
+ import { Router } from "express";
2
+ import rateLimit from "express-rate-limit";
3
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
4
+ const multer = require("multer");
5
+ import path from "path";
6
+ import fs from "fs";
7
+ import {
8
+ register,
9
+ login,
10
+ me,
11
+ logout,
12
+ refreshToken,
13
+ updatePassword,
14
+ updateProfile,
15
+ updateAvatar,
16
+ } from "./auth.controller";
17
+ import { requireAuth } from "lapeeh/middleware/auth";
18
+
19
+ const authLimiter = rateLimit({
20
+ windowMs: 15 * 60 * 1000,
21
+ max: 50,
22
+ standardHeaders: true,
23
+ legacyHeaders: false,
24
+ });
25
+
26
+ const avatarUploadDir = process.env.AVATAR_UPLOAD_DIR || "uploads/avatars";
27
+ if (!fs.existsSync(avatarUploadDir)) {
28
+ fs.mkdirSync(avatarUploadDir, { recursive: true });
29
+ }
30
+
31
+ const storage = (multer as any).diskStorage({
32
+ destination(
33
+ _req: any,
34
+ _file: any,
35
+ cb: (error: Error | null, destination: string) => void
36
+ ) {
37
+ cb(null, avatarUploadDir);
38
+ },
39
+ filename(
40
+ _req: any,
41
+ file: any,
42
+ cb: (error: Error | null, filename: string) => void
43
+ ) {
44
+ const ext = path.extname(file.originalname);
45
+ const base = path.basename(file.originalname, ext);
46
+ const unique = Date.now() + "-" + Math.round(Math.random() * 1e9);
47
+ cb(null, base + "-" + unique + ext);
48
+ },
49
+ });
50
+
51
+ const uploadAvatar = multer({ storage });
52
+
53
+ export const authRouter = Router();
54
+
55
+ authRouter.post("/register", authLimiter, register);
56
+
57
+ authRouter.post("/login", authLimiter, login);
58
+
59
+ authRouter.get("/me", requireAuth, me);
60
+
61
+ authRouter.post("/logout", requireAuth, logout);
62
+
63
+ authRouter.post("/refresh", authLimiter, refreshToken);
64
+
65
+ authRouter.put("/password", requireAuth, updatePassword);
66
+
67
+ authRouter.put("/profile", requireAuth, updateProfile);
68
+
69
+ authRouter.post(
70
+ "/avatar",
71
+ requireAuth,
72
+ uploadAvatar.single("avatar"),
73
+ updateAvatar
74
+ );
@@ -1,6 +1,6 @@
1
-
2
- // Placeholder for Auth Service
3
- // You can move business logic from controller to here in the future
4
- export class AuthService {
5
- // TODO: Implement service methods
6
- }
1
+
2
+ // Placeholder for Auth Service
3
+ // You can move business logic from controller to here in the future
4
+ export class AuthService {
5
+ // TODO: Implement service methods
6
+ }
@@ -1,42 +1,42 @@
1
- import { Router } from "express";
2
- import { requireAdmin, requireAuth } from "lapeeh/middleware/auth";
3
- import {
4
- createRole,
5
- listRoles,
6
- updateRole,
7
- deleteRole,
8
- createPermission,
9
- listPermissions,
10
- updatePermission,
11
- deletePermission,
12
- assignRoleToUser,
13
- removeRoleFromUser,
14
- assignPermissionToRole,
15
- removePermissionFromRole,
16
- assignPermissionToUser,
17
- removePermissionFromUser,
18
- } from "./rbac.controller";
19
-
20
- export const rbacRouter = Router();
21
-
22
- rbacRouter.use(requireAuth);
23
- rbacRouter.use(requireAdmin);
24
-
25
- rbacRouter.post("/roles", createRole);
26
- rbacRouter.get("/roles", listRoles);
27
- rbacRouter.put("/roles/:id", updateRole);
28
- rbacRouter.delete("/roles/:id", deleteRole);
29
-
30
- rbacRouter.post("/permissions", createPermission);
31
- rbacRouter.get("/permissions", listPermissions);
32
- rbacRouter.put("/permissions/:id", updatePermission);
33
- rbacRouter.delete("/permissions/:id", deletePermission);
34
-
35
- rbacRouter.post("/users/assign-role", assignRoleToUser);
36
- rbacRouter.post("/users/remove-role", removeRoleFromUser);
37
-
38
- rbacRouter.post("/roles/assign-permission", assignPermissionToRole);
39
- rbacRouter.post("/roles/remove-permission", removePermissionFromRole);
40
-
41
- rbacRouter.post("/users/assign-permission", assignPermissionToUser);
42
- rbacRouter.post("/users/remove-permission", removePermissionFromUser);
1
+ import { Router } from "express";
2
+ import { requireAdmin, requireAuth } from "lapeeh/middleware/auth";
3
+ import {
4
+ createRole,
5
+ listRoles,
6
+ updateRole,
7
+ deleteRole,
8
+ createPermission,
9
+ listPermissions,
10
+ updatePermission,
11
+ deletePermission,
12
+ assignRoleToUser,
13
+ removeRoleFromUser,
14
+ assignPermissionToRole,
15
+ removePermissionFromRole,
16
+ assignPermissionToUser,
17
+ removePermissionFromUser,
18
+ } from "./rbac.controller";
19
+
20
+ export const rbacRouter = Router();
21
+
22
+ rbacRouter.use(requireAuth);
23
+ rbacRouter.use(requireAdmin);
24
+
25
+ rbacRouter.post("/roles", createRole);
26
+ rbacRouter.get("/roles", listRoles);
27
+ rbacRouter.put("/roles/:id", updateRole);
28
+ rbacRouter.delete("/roles/:id", deleteRole);
29
+
30
+ rbacRouter.post("/permissions", createPermission);
31
+ rbacRouter.get("/permissions", listPermissions);
32
+ rbacRouter.put("/permissions/:id", updatePermission);
33
+ rbacRouter.delete("/permissions/:id", deletePermission);
34
+
35
+ rbacRouter.post("/users/assign-role", assignRoleToUser);
36
+ rbacRouter.post("/users/remove-role", removeRoleFromUser);
37
+
38
+ rbacRouter.post("/roles/assign-permission", assignPermissionToRole);
39
+ rbacRouter.post("/roles/remove-permission", removePermissionFromRole);
40
+
41
+ rbacRouter.post("/users/assign-permission", assignPermissionToUser);
42
+ rbacRouter.post("/users/remove-permission", removePermissionFromUser);
@@ -1,6 +1,6 @@
1
-
2
- // Placeholder for Rbac Service
3
- // You can move business logic from controller to here in the future
4
- export class RbacService {
5
- // TODO: Implement service methods
6
- }
1
+
2
+ // Placeholder for Rbac Service
3
+ // You can move business logic from controller to here in the future
4
+ export class RbacService {
5
+ // TODO: Implement service methods
6
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "keep": {
3
+ "days": true,
4
+ "amount": 3
5
+ },
6
+ "auditLog": "E:\\PROJECT ROBY\\ANY\\2026\\LAPEH\\lapeeh\\storage\\logs\\.2146fe39e5d991f68e775757f2d7c9c13a44e765-audit.json",
7
+ "files": [
8
+ {
9
+ "date": 1775412059304,
10
+ "name": "E:\\PROJECT ROBY\\ANY\\2026\\LAPEH\\lapeeh\\storage\\logs\\lapeeh-2026-04-06.log",
11
+ "hash": "f9ce7786a28283ba5f0d85849f97da6343842ae00a42327cbde9a79f5ef7493a"
12
+ }
13
+ ],
14
+ "hashType": "sha256"
15
+ }
@@ -0,0 +1,2 @@
1
+ [2026-04-06 01:01:21] INFO: GET / 200 - 17ms - ::ffff:127.0.0.1
2
+ [2026-04-06 01:01:21] WARN: GET /favicon.ico 404 - 14ms - ::ffff:127.0.0.1
package/tsconfig.json CHANGED
@@ -2,6 +2,7 @@
2
2
  "compilerOptions": {
3
3
  "target": "ES2020",
4
4
  "module": "CommonJS",
5
+ "baseUrl": ".",
5
6
  "outDir": "dist",
6
7
  "rootDir": ".",
7
8
  "declaration": true,
@@ -1,3 +0,0 @@
1
- export declare function createApp(): Promise<import("express-serve-static-core").Express>;
2
- export declare function bootstrap(): Promise<void>;
3
- //# sourceMappingURL=bootstrap.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"bootstrap.d.ts","sourceRoot":"","sources":["../../lib/bootstrap.ts"],"names":[],"mappings":"AAkBA,wBAAsB,SAAS,yDAiI9B;AAED,wBAAsB,SAAS,kBAuD9B"}