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.
- package/doc/en/CHANGELOG.md +24 -24
- package/doc/id/CHANGELOG.md +9 -9
- package/lib/bootstrap.ts +1 -1
- package/package.json +3 -3
- package/scripts/release.js +91 -25
- package/src/modules/Auth/auth.routes.ts +74 -74
- package/src/modules/Auth/auth.service.ts +6 -6
- package/src/modules/Rbac/rbac.routes.ts +42 -42
- package/src/modules/Rbac/rbac.service.ts +6 -6
- package/storage/logs/.2146fe39e5d991f68e775757f2d7c9c13a44e765-audit.json +15 -0
- package/storage/logs/lapeeh-2026-04-06.log +2 -0
- package/tsconfig.json +1 -0
- package/dist/lib/bootstrap.d.ts +0 -3
- package/dist/lib/bootstrap.d.ts.map +0 -1
- package/dist/lib/bootstrap.js +0 -184
- package/dist/lib/core/realtime.d.ts +0 -3
- package/dist/lib/core/realtime.d.ts.map +0 -1
- package/dist/lib/core/realtime.js +0 -36
- package/dist/lib/core/redis.d.ts +0 -9
- package/dist/lib/core/redis.d.ts.map +0 -1
- package/dist/lib/core/redis.js +0 -133
- package/dist/lib/core/serializer.d.ts +0 -43
- package/dist/lib/core/serializer.d.ts.map +0 -1
- package/dist/lib/core/serializer.js +0 -66
- package/dist/lib/core/server.d.ts +0 -2
- package/dist/lib/core/server.d.ts.map +0 -1
- package/dist/lib/core/server.js +0 -60
- package/dist/lib/core/store.d.ts +0 -55
- package/dist/lib/core/store.d.ts.map +0 -1
- package/dist/lib/core/store.js +0 -66
- package/dist/lib/middleware/auth.d.ts +0 -4
- package/dist/lib/middleware/auth.d.ts.map +0 -1
- package/dist/lib/middleware/auth.js +0 -55
- package/dist/lib/middleware/error.d.ts +0 -3
- package/dist/lib/middleware/error.d.ts.map +0 -1
- package/dist/lib/middleware/error.js +0 -41
- package/dist/lib/middleware/multipart.d.ts +0 -4
- package/dist/lib/middleware/multipart.d.ts.map +0 -1
- package/dist/lib/middleware/multipart.js +0 -17
- package/dist/lib/middleware/rateLimit.d.ts +0 -2
- package/dist/lib/middleware/rateLimit.d.ts.map +0 -1
- package/dist/lib/middleware/rateLimit.js +0 -19
- package/dist/lib/middleware/requestLogger.d.ts +0 -3
- package/dist/lib/middleware/requestLogger.d.ts.map +0 -1
- package/dist/lib/middleware/requestLogger.js +0 -22
- package/dist/lib/middleware/visitor.d.ts +0 -3
- package/dist/lib/middleware/visitor.d.ts.map +0 -1
- package/dist/lib/middleware/visitor.js +0 -144
- package/dist/lib/utils/logger.d.ts +0 -11
- package/dist/lib/utils/logger.d.ts.map +0 -1
- package/dist/lib/utils/logger.js +0 -81
- package/dist/lib/utils/pagination.d.ts +0 -19
- package/dist/lib/utils/pagination.d.ts.map +0 -1
- package/dist/lib/utils/pagination.js +0 -34
- package/dist/lib/utils/response.d.ts +0 -11
- package/dist/lib/utils/response.d.ts.map +0 -1
- package/dist/lib/utils/response.js +0 -57
- package/dist/lib/utils/validator.d.ts +0 -38
- package/dist/lib/utils/validator.d.ts.map +0 -1
- package/dist/lib/utils/validator.js +0 -340
- package/dist/src/config/app.d.ts +0 -10
- package/dist/src/config/app.d.ts.map +0 -1
- package/dist/src/config/app.js +0 -12
- package/dist/src/config/cors.d.ts +0 -6
- package/dist/src/config/cors.d.ts.map +0 -1
- package/dist/src/config/cors.js +0 -8
- package/dist/src/modules/Auth/auth.controller.d.ts +0 -11
- package/dist/src/modules/Auth/auth.controller.d.ts.map +0 -1
- package/dist/src/modules/Auth/auth.controller.js +0 -427
- package/dist/src/modules/Rbac/rbac.controller.d.ts +0 -16
- package/dist/src/modules/Rbac/rbac.controller.d.ts.map +0 -1
- package/dist/src/modules/Rbac/rbac.controller.js +0 -438
- package/dist/src/routes/auth.d.ts +0 -2
- package/dist/src/routes/auth.d.ts.map +0 -1
- package/dist/src/routes/auth.js +0 -45
- package/dist/src/routes/index.d.ts +0 -2
- package/dist/src/routes/index.d.ts.map +0 -1
- package/dist/src/routes/index.js +0 -9
- package/dist/src/routes/rbac.d.ts +0 -2
- package/dist/src/routes/rbac.d.ts.map +0 -1
- package/dist/src/routes/rbac.js +0 -23
- package/storage/logs/.f995bb45779ab7e42622de305683c278c0ee3481-audit.json +0 -15
- package/storage/logs/lapeeh-2026-01-01.log +0 -201
package/doc/en/CHANGELOG.md
CHANGED
|
@@ -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.
|
package/doc/id/CHANGELOG.md
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
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.
|
|
102
|
+
"multer": "^2.1.1",
|
|
103
103
|
"pg": "8.16.3",
|
|
104
104
|
"slugify": "1.6.6",
|
|
105
105
|
"socket.io": "4.8.3",
|
package/scripts/release.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
509
|
-
|
|
510
|
-
console.log(
|
|
511
|
-
}
|
|
512
|
-
console.log('
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
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
|
+
}
|
package/tsconfig.json
CHANGED
package/dist/lib/bootstrap.d.ts
DELETED
|
@@ -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"}
|