@kava/kava-api-core 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.
- package/bun.lock +160 -0
- package/dist/auth.util.d.ts +23 -0
- package/dist/auth.util.js +175 -0
- package/dist/auth.util.js.map +1 -0
- package/dist/context.util.d.ts +7 -0
- package/dist/context.util.js +11 -0
- package/dist/context.util.js.map +1 -0
- package/dist/controller.util.d.ts +118 -0
- package/dist/controller.util.js +144 -0
- package/dist/controller.util.js.map +1 -0
- package/dist/conversion.util.d.ts +8 -0
- package/dist/conversion.util.js +52 -0
- package/dist/conversion.util.js.map +1 -0
- package/dist/db.util.d.ts +80 -0
- package/dist/db.util.js +166 -0
- package/dist/db.util.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/logger.util.d.ts +30 -0
- package/dist/logger.util.js +117 -0
- package/dist/logger.util.js.map +1 -0
- package/dist/mail.util.d.ts +21 -0
- package/dist/mail.util.js +53 -0
- package/dist/mail.util.js.map +1 -0
- package/dist/middleware.util.d.ts +263 -0
- package/dist/middleware.util.js +233 -0
- package/dist/middleware.util.js.map +1 -0
- package/dist/model.util.d.ts +204 -0
- package/dist/model.util.js +1495 -0
- package/dist/model.util.js.map +1 -0
- package/dist/permission.util.d.ts +38 -0
- package/dist/permission.util.js +91 -0
- package/dist/permission.util.js.map +1 -0
- package/dist/route.util.d.ts +1 -0
- package/dist/route.util.js +12 -0
- package/dist/route.util.js.map +1 -0
- package/dist/storage.util.d.ts +56 -0
- package/dist/storage.util.js +82 -0
- package/dist/storage.util.js.map +1 -0
- package/dist/validation.util.d.ts +7 -0
- package/dist/validation.util.js +237 -0
- package/dist/validation.util.js.map +1 -0
- package/package.json +34 -0
- package/src/auth.util.ts +242 -0
- package/src/context.util.ts +17 -0
- package/src/controller.util.ts +237 -0
- package/src/conversion.util.ts +65 -0
- package/src/db.util.ts +405 -0
- package/src/index.ts +13 -0
- package/src/logger.util.ts +170 -0
- package/src/mail.util.ts +86 -0
- package/src/middleware.util.ts +289 -0
- package/src/model.util.ts +2211 -0
- package/src/permission.util.ts +136 -0
- package/src/route.util.ts +12 -0
- package/src/storage.util.ts +102 -0
- package/src/validation.util.ts +338 -0
- package/tsconfig.json +23 -0
package/bun.lock
ADDED
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"workspaces": {
|
|
4
|
+
"": {
|
|
5
|
+
"name": "@aluna/aluna-api-core",
|
|
6
|
+
"dependencies": {
|
|
7
|
+
"bcrypt": "^6.0.0",
|
|
8
|
+
"dotenv": "^17.2.2",
|
|
9
|
+
"elysia": "latest",
|
|
10
|
+
"knex": "^3.1.0",
|
|
11
|
+
"nodemailer": "^7.0.9",
|
|
12
|
+
"pg": "^8.16.3",
|
|
13
|
+
"validator": "^13.15.15",
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/bcrypt": "^6.0.0",
|
|
17
|
+
"@types/node": "^26.0.0",
|
|
18
|
+
"@types/nodemailer": "^7.0.2",
|
|
19
|
+
"@types/validator": "^13.15.3",
|
|
20
|
+
"bun-types": "latest",
|
|
21
|
+
"typescript": "^6.0.3",
|
|
22
|
+
},
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
"packages": {
|
|
26
|
+
"@borewit/text-codec": ["@borewit/text-codec@0.2.2", "", {}, "sha512-DDaRehssg1aNrH4+2hnj1B7vnUGEjU6OIlyRdkMd0aUdIUvKXrJfXsy8LVtXAy7DRvYVluWbMspsRhz2lcW0mQ=="],
|
|
27
|
+
|
|
28
|
+
"@sinclair/typebox": ["@sinclair/typebox@0.34.49", "", {}, "sha512-brySQQs7Jtn0joV8Xh9ZV/hZb9Ozb0pmazDIASBkYKCjXrXU3mpcFahmK/z4YDhGkQvP9mWJbVyahdtU5wQA+A=="],
|
|
29
|
+
|
|
30
|
+
"@tokenizer/inflate": ["@tokenizer/inflate@0.4.1", "", { "dependencies": { "debug": "^4.4.3", "token-types": "^6.1.1" } }, "sha512-2mAv+8pkG6GIZiF1kNg1jAjh27IDxEPKwdGul3snfztFerfPGI1LjDezZp3i7BElXompqEtPmoPx6c2wgtWsOA=="],
|
|
31
|
+
|
|
32
|
+
"@tokenizer/token": ["@tokenizer/token@0.3.0", "", {}, "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A=="],
|
|
33
|
+
|
|
34
|
+
"@types/bcrypt": ["@types/bcrypt@6.0.0", "", { "dependencies": { "@types/node": "*" } }, "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ=="],
|
|
35
|
+
|
|
36
|
+
"@types/node": ["@types/node@26.0.0", "", { "dependencies": { "undici-types": "~8.3.0" } }, "sha512-vf2YFi1iY9lHGwNJMs01biZFbKJkrZR1T6/MlzjhJLPdntOHLhTrDSnSVcdtvjihi4VQNlrFRIxLsDBlQpAipA=="],
|
|
37
|
+
|
|
38
|
+
"@types/nodemailer": ["@types/nodemailer@7.0.12", "", { "dependencies": { "@types/node": "*" } }, "sha512-80vKwiIsVSyFA1rRovH59jNPLBOuc6dRZIHEu40gXTkBkZnQv8vog1xSGEb9j5q/tdMAs5ivvDR2pLTU0hGHXA=="],
|
|
39
|
+
|
|
40
|
+
"@types/validator": ["@types/validator@13.15.10", "", {}, "sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA=="],
|
|
41
|
+
|
|
42
|
+
"bcrypt": ["bcrypt@6.0.0", "", { "dependencies": { "node-addon-api": "^8.3.0", "node-gyp-build": "^4.8.4" } }, "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg=="],
|
|
43
|
+
|
|
44
|
+
"bun-types": ["bun-types@1.3.14", "", { "dependencies": { "@types/node": "*" } }, "sha512-4N0ig0fEomHt5R0KCFWjovxow98rIoRwKolrYdCcknNwMekCXRnWEUvgu5soYV8QXtVsrUD8B95MBOZGPvr6KQ=="],
|
|
45
|
+
|
|
46
|
+
"colorette": ["colorette@2.0.19", "", {}, "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ=="],
|
|
47
|
+
|
|
48
|
+
"commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="],
|
|
49
|
+
|
|
50
|
+
"cookie": ["cookie@1.1.1", "", {}, "sha512-ei8Aos7ja0weRpFzJnEA9UHJ/7XQmqglbRwnf2ATjcB9Wq874VKH9kfjjirM6UhU2/E5fFYadylyhFldcqSidQ=="],
|
|
51
|
+
|
|
52
|
+
"debug": ["debug@4.3.4", "", { "dependencies": { "ms": "2.1.2" } }, "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="],
|
|
53
|
+
|
|
54
|
+
"dotenv": ["dotenv@17.4.2", "", {}, "sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw=="],
|
|
55
|
+
|
|
56
|
+
"elysia": ["elysia@1.4.29", "", { "dependencies": { "cookie": "^1.1.1", "exact-mirror": "^0.2.7", "fast-decode-uri-component": "^1.0.1", "memoirist": "^0.4.0" }, "peerDependencies": { "@sinclair/typebox": ">= 0.34.0 < 1", "@types/bun": ">= 1.2.0", "file-type": ">= 20.0.0", "openapi-types": ">= 12.0.0", "typescript": ">= 5.0.0" }, "optionalPeers": ["@types/bun", "typescript"] }, "sha512-GwMRGGwSdjfPt+w3LA0fqTuYJtS8uVRJicvoar98/HrO5qdFKDc9CwjIb6Kja+v39lkY+58hr2JvdR9jQzlUuA=="],
|
|
57
|
+
|
|
58
|
+
"es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="],
|
|
59
|
+
|
|
60
|
+
"escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="],
|
|
61
|
+
|
|
62
|
+
"esm": ["esm@3.2.25", "", {}, "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA=="],
|
|
63
|
+
|
|
64
|
+
"exact-mirror": ["exact-mirror@0.2.7", "", { "peerDependencies": { "@sinclair/typebox": "^0.34.15" }, "optionalPeers": ["@sinclair/typebox"] }, "sha512-+MeEmDcLA4o/vjK2zujgk+1VTxPR4hdp23qLqkWfStbECtAq9gmsvQa3LW6z/0GXZyHJobrCnmy1cdeE7BjsYg=="],
|
|
65
|
+
|
|
66
|
+
"fast-decode-uri-component": ["fast-decode-uri-component@1.0.1", "", {}, "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg=="],
|
|
67
|
+
|
|
68
|
+
"file-type": ["file-type@22.0.1", "", { "dependencies": { "@tokenizer/inflate": "^0.4.1", "strtok3": "^10.3.5", "token-types": "^6.1.2", "uint8array-extras": "^1.5.0" } }, "sha512-ww5Mhre0EE+jmBvOXTmXAbEMuZE7uX4a3+oRCQFNj8w++g3ev913N6tXQz0XTXbueQ5TWQfm6BdaViEHHn8bhA=="],
|
|
69
|
+
|
|
70
|
+
"function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="],
|
|
71
|
+
|
|
72
|
+
"get-package-type": ["get-package-type@0.1.0", "", {}, "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q=="],
|
|
73
|
+
|
|
74
|
+
"getopts": ["getopts@2.3.0", "", {}, "sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA=="],
|
|
75
|
+
|
|
76
|
+
"hasown": ["hasown@2.0.4", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A=="],
|
|
77
|
+
|
|
78
|
+
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
|
79
|
+
|
|
80
|
+
"interpret": ["interpret@2.2.0", "", {}, "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw=="],
|
|
81
|
+
|
|
82
|
+
"is-core-module": ["is-core-module@2.16.2", "", { "dependencies": { "hasown": "^2.0.3" } }, "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA=="],
|
|
83
|
+
|
|
84
|
+
"knex": ["knex@3.2.10", "", { "dependencies": { "colorette": "2.0.19", "commander": "^10.0.0", "debug": "4.3.4", "escalade": "^3.1.1", "esm": "^3.2.25", "get-package-type": "^0.1.0", "getopts": "2.3.0", "interpret": "^2.2.0", "lodash": "^4.18.1", "pg-connection-string": "2.6.2", "rechoir": "^0.8.0", "resolve-from": "^5.0.0", "tarn": "^3.0.2", "tildify": "2.0.0" }, "peerDependencies": { "pg-query-stream": "^4.14.0" }, "optionalPeers": ["pg-query-stream"], "bin": { "knex": "bin/cli.js" } }, "sha512-oypTHfrc9i72iyxaUQBKHOxhcr0xM65MPf6FpN02nimsftXwzXprIkLjfXdubvhbu4PMWLp023q8o8CYvHSuZw=="],
|
|
85
|
+
|
|
86
|
+
"lodash": ["lodash@4.18.1", "", {}, "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="],
|
|
87
|
+
|
|
88
|
+
"memoirist": ["memoirist@0.4.0", "", {}, "sha512-zxTgA0mSYELa66DimuNQDvyLq36AwDlTuVRbnQtB+VuTcKWm5Qc4z3WkSpgsFWHNhexqkIooqpv4hdcqrX5Nmg=="],
|
|
89
|
+
|
|
90
|
+
"ms": ["ms@2.1.2", "", {}, "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="],
|
|
91
|
+
|
|
92
|
+
"node-addon-api": ["node-addon-api@8.8.0", "", {}, "sha512-c5Ko1fZJIJmzhFIkhRN76WTq+fC6tWnGy9CXA0fA+XygsWZmEwG8vmbkNqxMyoaa0Tin4djul49NzdVcJJcjeA=="],
|
|
93
|
+
|
|
94
|
+
"node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
|
|
95
|
+
|
|
96
|
+
"nodemailer": ["nodemailer@7.0.13", "", {}, "sha512-PNDFSJdP+KFgdsG3ZzMXCgquO7I6McjY2vlqILjtJd0hy8wEvtugS9xKRF2NWlPNGxvLCXlTNIae4serI7dinw=="],
|
|
97
|
+
|
|
98
|
+
"openapi-types": ["openapi-types@12.1.3", "", {}, "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw=="],
|
|
99
|
+
|
|
100
|
+
"path-parse": ["path-parse@1.0.7", "", {}, "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="],
|
|
101
|
+
|
|
102
|
+
"pg": ["pg@8.22.0", "", { "dependencies": { "pg-connection-string": "^2.14.0", "pg-pool": "^3.14.0", "pg-protocol": "^1.15.0", "pg-types": "2.2.0", "pgpass": "1.0.5" }, "optionalDependencies": { "pg-cloudflare": "^1.4.0" }, "peerDependencies": { "pg-native": ">=3.0.1" }, "optionalPeers": ["pg-native"] }, "sha512-8wih1vVIBMxoUM2oB4soJsD9tDnDpLv4OXBJ+EJzFsvycD+lfyIreC2gGHq78f8jbLLt+bvlPTFdFZfJkOuzAA=="],
|
|
103
|
+
|
|
104
|
+
"pg-cloudflare": ["pg-cloudflare@1.4.0", "", {}, "sha512-Vo7z/6rrQYxpNRylp4Tlob2elzbh+N/MOQbxFVWCxS7oEx6jF53GTJFxK2WWpKuBRkmiin4Mt+xofFDjx09R0A=="],
|
|
105
|
+
|
|
106
|
+
"pg-connection-string": ["pg-connection-string@2.6.2", "", {}, "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="],
|
|
107
|
+
|
|
108
|
+
"pg-int8": ["pg-int8@1.0.1", "", {}, "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw=="],
|
|
109
|
+
|
|
110
|
+
"pg-pool": ["pg-pool@3.14.0", "", { "peerDependencies": { "pg": ">=8.0" } }, "sha512-gKtPkFdQPU3DksooVLi9LsjZxrsBUZIpa+7aVx+LV5pNh0KzP4Zleud2po+ConrxbuXGBJ6Hfer6hdgpIBpBaw=="],
|
|
111
|
+
|
|
112
|
+
"pg-protocol": ["pg-protocol@1.15.0", "", {}, "sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ=="],
|
|
113
|
+
|
|
114
|
+
"pg-types": ["pg-types@2.2.0", "", { "dependencies": { "pg-int8": "1.0.1", "postgres-array": "~2.0.0", "postgres-bytea": "~1.0.0", "postgres-date": "~1.0.4", "postgres-interval": "^1.1.0" } }, "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA=="],
|
|
115
|
+
|
|
116
|
+
"pgpass": ["pgpass@1.0.5", "", { "dependencies": { "split2": "^4.1.0" } }, "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug=="],
|
|
117
|
+
|
|
118
|
+
"postgres-array": ["postgres-array@2.0.0", "", {}, "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA=="],
|
|
119
|
+
|
|
120
|
+
"postgres-bytea": ["postgres-bytea@1.0.1", "", {}, "sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ=="],
|
|
121
|
+
|
|
122
|
+
"postgres-date": ["postgres-date@1.0.7", "", {}, "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q=="],
|
|
123
|
+
|
|
124
|
+
"postgres-interval": ["postgres-interval@1.2.0", "", { "dependencies": { "xtend": "^4.0.0" } }, "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ=="],
|
|
125
|
+
|
|
126
|
+
"rechoir": ["rechoir@0.8.0", "", { "dependencies": { "resolve": "^1.20.0" } }, "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ=="],
|
|
127
|
+
|
|
128
|
+
"resolve": ["resolve@1.22.12", "", { "dependencies": { "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" } }, "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA=="],
|
|
129
|
+
|
|
130
|
+
"resolve-from": ["resolve-from@5.0.0", "", {}, "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw=="],
|
|
131
|
+
|
|
132
|
+
"split2": ["split2@4.2.0", "", {}, "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg=="],
|
|
133
|
+
|
|
134
|
+
"strtok3": ["strtok3@10.3.5", "", { "dependencies": { "@tokenizer/token": "^0.3.0" } }, "sha512-ki4hZQfh5rX0QDLLkOCj+h+CVNkqmp/CMf8v8kZpkNVK6jGQooMytqzLZYUVYIZcFZ6yDB70EfD8POcFXiF5oA=="],
|
|
135
|
+
|
|
136
|
+
"supports-preserve-symlinks-flag": ["supports-preserve-symlinks-flag@1.0.0", "", {}, "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w=="],
|
|
137
|
+
|
|
138
|
+
"tarn": ["tarn@3.0.2", "", {}, "sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ=="],
|
|
139
|
+
|
|
140
|
+
"tildify": ["tildify@2.0.0", "", {}, "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw=="],
|
|
141
|
+
|
|
142
|
+
"token-types": ["token-types@6.1.2", "", { "dependencies": { "@borewit/text-codec": "^0.2.1", "@tokenizer/token": "^0.3.0", "ieee754": "^1.2.1" } }, "sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww=="],
|
|
143
|
+
|
|
144
|
+
"typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
|
|
145
|
+
|
|
146
|
+
"uint8array-extras": ["uint8array-extras@1.5.0", "", {}, "sha512-rvKSBiC5zqCCiDZ9kAOszZcDvdAHwwIKJG33Ykj43OKcWsnmcBRL09YTU4nOeHZ8Y2a7l1MgTd08SBe9A8Qj6A=="],
|
|
147
|
+
|
|
148
|
+
"undici-types": ["undici-types@8.3.0", "", {}, "sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ=="],
|
|
149
|
+
|
|
150
|
+
"validator": ["validator@13.15.35", "", {}, "sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw=="],
|
|
151
|
+
|
|
152
|
+
"xtend": ["xtend@4.0.2", "", {}, "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ=="],
|
|
153
|
+
|
|
154
|
+
"@tokenizer/inflate/debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
|
|
155
|
+
|
|
156
|
+
"pg/pg-connection-string": ["pg-connection-string@2.14.0", "", {}, "sha512-XwWDGcLRGCXAR8F/AM5bG7Q+A3Wm2s6QeEjlOKZLlH3UYcguiqCWKyWXVag5TLTIjR7oOJUY8kcADaZgWPyLeg=="],
|
|
157
|
+
|
|
158
|
+
"@tokenizer/inflate/debug/ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
|
159
|
+
}
|
|
160
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const auth: {
|
|
2
|
+
createAccessToken(userId: number, req: Request, permission?: boolean): Promise<{
|
|
3
|
+
token: string;
|
|
4
|
+
tokenId: any;
|
|
5
|
+
}>;
|
|
6
|
+
revokeAccessToken(id: number): Promise<number>;
|
|
7
|
+
verifyAccessToken(token: string, req?: Request): Promise<{
|
|
8
|
+
user: any;
|
|
9
|
+
token: any;
|
|
10
|
+
permissions: any;
|
|
11
|
+
} | null>;
|
|
12
|
+
createUserMailToken(userId: number): Promise<{
|
|
13
|
+
token: string;
|
|
14
|
+
tokenId: any;
|
|
15
|
+
}>;
|
|
16
|
+
verifyUserMailToken(userId: number, token: string): Promise<boolean>;
|
|
17
|
+
listUserSessions(userId: number, currentTokenId?: number): Promise<any[]>;
|
|
18
|
+
revalidateUserPermissions: typeof revalidateUserPermissions;
|
|
19
|
+
revalidateUserPermissionsByRole: typeof revalidateUserPermissionsByRole;
|
|
20
|
+
};
|
|
21
|
+
declare function revalidateUserPermissions(userId: number): Promise<void>;
|
|
22
|
+
declare function revalidateUserPermissionsByRole(roleId: number): Promise<void>;
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import crypto from 'crypto';
|
|
2
|
+
import bcrypt from "bcrypt";
|
|
3
|
+
import { db } from '@utils';
|
|
4
|
+
// =====================================>
|
|
5
|
+
// ## Auth: User Access Token
|
|
6
|
+
// =====================================>
|
|
7
|
+
const TOKEN_PLAIN_LENGTH = 20;
|
|
8
|
+
const AUTH_PERMISSION = process.env.AUTH_CACHE === "true";
|
|
9
|
+
// const AUTH_CACHE = process.env.AUTH_CACHE === "true"
|
|
10
|
+
// const AUTH_CACHE_TTL = Number(process.env.AUTH_CACHE_TTL || 600)
|
|
11
|
+
export const auth = {
|
|
12
|
+
// =====================================>
|
|
13
|
+
// ## Auth: create access token with user id
|
|
14
|
+
// =====================================>
|
|
15
|
+
async createAccessToken(userId, req, permission = true) {
|
|
16
|
+
const plain = crypto.randomBytes(TOKEN_PLAIN_LENGTH).toString("hex");
|
|
17
|
+
const hash = await bcrypt.hash(plain, 10);
|
|
18
|
+
const agent = generateAgentId(req);
|
|
19
|
+
let permissions = [];
|
|
20
|
+
if (AUTH_PERMISSION && permission) {
|
|
21
|
+
permissions = await getUserPermissions(userId);
|
|
22
|
+
}
|
|
23
|
+
const [row] = await db("user_access_tokens").insert({
|
|
24
|
+
user_id: userId,
|
|
25
|
+
token: hash,
|
|
26
|
+
agent: agent,
|
|
27
|
+
permissions: JSON.stringify(permissions),
|
|
28
|
+
created_at: new Date(),
|
|
29
|
+
}).returning(["id"]);
|
|
30
|
+
return {
|
|
31
|
+
token: `${row.id}|${plain}`,
|
|
32
|
+
tokenId: row.id,
|
|
33
|
+
};
|
|
34
|
+
},
|
|
35
|
+
// =====================================>
|
|
36
|
+
// ## Auth: delete access token with user id
|
|
37
|
+
// =====================================>
|
|
38
|
+
async revokeAccessToken(id) {
|
|
39
|
+
return db.table('user_access_tokens').where("id", id).delete();
|
|
40
|
+
},
|
|
41
|
+
// =====================================>
|
|
42
|
+
// ## Auth: verify access token
|
|
43
|
+
// =====================================>
|
|
44
|
+
async verifyAccessToken(token, req) {
|
|
45
|
+
if (!token.includes("|"))
|
|
46
|
+
return null;
|
|
47
|
+
const [tokenId, plain] = token.split("|", 2);
|
|
48
|
+
const agent = req ? generateAgentId(req) : "";
|
|
49
|
+
const ip = req ? getRequestIp(req) : "";
|
|
50
|
+
const cacheKey = `auth:token:${tokenId}`;
|
|
51
|
+
// if (AUTH_CACHE) {
|
|
52
|
+
// const cached = await redis.get(cacheKey)
|
|
53
|
+
// if (cached) {
|
|
54
|
+
// const session = JSON.parse(cached)
|
|
55
|
+
// if (session.agent !== agent) return null
|
|
56
|
+
// return session
|
|
57
|
+
// }
|
|
58
|
+
// }
|
|
59
|
+
const tokenRecord = await db("user_access_tokens").where("id", tokenId).first();
|
|
60
|
+
if (!tokenRecord)
|
|
61
|
+
return null;
|
|
62
|
+
if (tokenRecord.agent !== agent)
|
|
63
|
+
return null;
|
|
64
|
+
const valid = await bcrypt.compare(plain, tokenRecord.token);
|
|
65
|
+
if (!valid)
|
|
66
|
+
return null;
|
|
67
|
+
await db("user_access_tokens").where("id", tokenRecord.id).update({ last_used_at: new Date(), last_used_ip: ip });
|
|
68
|
+
const user = await db("users").where("id", tokenRecord.user_id).first();
|
|
69
|
+
// if (AUTH_CACHE) {
|
|
70
|
+
// await redis.setex(
|
|
71
|
+
// cacheKey,
|
|
72
|
+
// AUTH_CACHE_TTL,
|
|
73
|
+
// JSON.stringify({
|
|
74
|
+
// user : user,
|
|
75
|
+
// agent : tokenRecord.agent,
|
|
76
|
+
// permissions : tokenRecord.permission,
|
|
77
|
+
// })
|
|
78
|
+
// )
|
|
79
|
+
// }
|
|
80
|
+
return { user, token: tokenRecord, permissions: tokenRecord.permission };
|
|
81
|
+
},
|
|
82
|
+
// =====================================>
|
|
83
|
+
// ## Auth: create user mail token
|
|
84
|
+
// =====================================>
|
|
85
|
+
async createUserMailToken(userId) {
|
|
86
|
+
const token = Math.floor(100000 + Math.random() * 900000).toString();
|
|
87
|
+
const hash = crypto.createHash('sha256').update(token).digest('hex');
|
|
88
|
+
const trx = await db.transaction();
|
|
89
|
+
await trx.table('user_mail_tokens').insert({
|
|
90
|
+
user_id: userId,
|
|
91
|
+
token: hash,
|
|
92
|
+
created_at: new Date(),
|
|
93
|
+
});
|
|
94
|
+
const record = await trx.table('user_mail_tokens').orderBy('id', 'desc').first();
|
|
95
|
+
await trx.commit();
|
|
96
|
+
return {
|
|
97
|
+
token: token,
|
|
98
|
+
tokenId: record.id
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
// =====================================>
|
|
102
|
+
// ## Auth: Verify user mail token
|
|
103
|
+
// =====================================>
|
|
104
|
+
async verifyUserMailToken(userId, token) {
|
|
105
|
+
const hashedToken = crypto.createHash("sha256").update(token).digest("hex");
|
|
106
|
+
const record = await db.table("user_mail_tokens")
|
|
107
|
+
.where("user_id", userId)
|
|
108
|
+
.whereNull("used_at")
|
|
109
|
+
.orderBy("id", "desc")
|
|
110
|
+
.first();
|
|
111
|
+
if (!record)
|
|
112
|
+
return false;
|
|
113
|
+
if (record.token !== hashedToken)
|
|
114
|
+
return false;
|
|
115
|
+
const createdAt = new Date(record.created_at);
|
|
116
|
+
const now = new Date();
|
|
117
|
+
const diffMinutes = (now.getTime() - createdAt.getTime()) / (1000 * 60);
|
|
118
|
+
if (diffMinutes > 10)
|
|
119
|
+
return false;
|
|
120
|
+
return true;
|
|
121
|
+
},
|
|
122
|
+
// =====================================>
|
|
123
|
+
// ## Auth: list user sessions
|
|
124
|
+
// =====================================>
|
|
125
|
+
async listUserSessions(userId, currentTokenId) {
|
|
126
|
+
const rows = await db("user_access_tokens").select(["id", "agent", "created_at", "last_used_at", "last_used_ip", "expired_at"]).where("user_id", userId).orderBy("last_used_at", "desc");
|
|
127
|
+
return rows.map(r => ({
|
|
128
|
+
...r,
|
|
129
|
+
is_active: r.revoked_at === null,
|
|
130
|
+
is_current: r.id === currentTokenId,
|
|
131
|
+
}));
|
|
132
|
+
},
|
|
133
|
+
// =====================================>
|
|
134
|
+
// ## Auth: revalidate user permission
|
|
135
|
+
// =====================================>
|
|
136
|
+
revalidateUserPermissions: revalidateUserPermissions,
|
|
137
|
+
revalidateUserPermissionsByRole: revalidateUserPermissionsByRole,
|
|
138
|
+
};
|
|
139
|
+
function generateAgentId(req) {
|
|
140
|
+
const ua = req.headers.get("user-agent") ?? "";
|
|
141
|
+
const acc = req.headers.get("accept") ?? "";
|
|
142
|
+
return crypto.createHash("sha256").update(ua + acc).digest("hex");
|
|
143
|
+
}
|
|
144
|
+
function getRequestIp(req) {
|
|
145
|
+
return (req.headers.get("x-forwarded-for")?.split(",")[0]?.trim() || req.headers.get("x-real-ip") || "unknown");
|
|
146
|
+
}
|
|
147
|
+
async function getUserPermissions(userId) {
|
|
148
|
+
const roleIds = await db("user_roles").where("user_id", userId).pluck("role_id");
|
|
149
|
+
if (roleIds.length === 0)
|
|
150
|
+
return [];
|
|
151
|
+
const rows = await db("permissions").whereIn("role_id", roleIds).pluck("permissions");
|
|
152
|
+
return Array.from(new Set(rows.flatMap(p => p ?? [])));
|
|
153
|
+
}
|
|
154
|
+
async function revalidateUserPermissions(userId) {
|
|
155
|
+
const permissions = await getUserPermissions(userId);
|
|
156
|
+
const tokenIds = await db("user_access_tokens").where("user_id", userId).pluck("id");
|
|
157
|
+
if (tokenIds.length === 0)
|
|
158
|
+
return;
|
|
159
|
+
await db("user_access_tokens").whereIn("id", tokenIds).update({
|
|
160
|
+
permissions: JSON.stringify(permissions),
|
|
161
|
+
updated_at: new Date(),
|
|
162
|
+
});
|
|
163
|
+
// if (AUTH_CACHE) {
|
|
164
|
+
// await Promise.all(
|
|
165
|
+
// tokenIds.map(id => redis.del(`auth:token:${id}`))
|
|
166
|
+
// )
|
|
167
|
+
// }
|
|
168
|
+
}
|
|
169
|
+
async function revalidateUserPermissionsByRole(roleId) {
|
|
170
|
+
const userIds = await db("user_roles").where("role_id", roleId).pluck("user_id");
|
|
171
|
+
// for (const userId of userIds) {
|
|
172
|
+
// await queue.add("auth:revalidate-permission", { userId })
|
|
173
|
+
// }
|
|
174
|
+
}
|
|
175
|
+
//# sourceMappingURL=auth.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.util.js","sourceRoot":"","sources":["../src/auth.util.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from 'node:async_hooks';
|
|
2
|
+
const storage = new AsyncLocalStorage();
|
|
3
|
+
export const context = {
|
|
4
|
+
run(ctx, fn) {
|
|
5
|
+
return storage.run(ctx, fn);
|
|
6
|
+
},
|
|
7
|
+
get(key) {
|
|
8
|
+
return storage.getStore()?.[key];
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
//# sourceMappingURL=context.util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.util.js","sourceRoot":"","sources":["../src/context.util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAMpD,MAAM,OAAO,GAAG,IAAI,iBAAiB,EAAc,CAAA;AAEnD,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,GAAG,CAAI,GAAe,EAAE,EAAW;QACjC,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAA;IAC7B,CAAC;IAED,GAAG,CAA6B,GAAM;QACpC,OAAO,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAG,CAAC,CAAA;IAClC,CAAC;CACF,CAAA"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import "elysia";
|
|
2
|
+
import { Elysia, Context } from "elysia";
|
|
3
|
+
import { KeyPermission, ValidationRules, ValidationRule } from "@utils";
|
|
4
|
+
declare module "elysia" {
|
|
5
|
+
interface ControllerContext extends Context {
|
|
6
|
+
getQuery: {
|
|
7
|
+
paginate: number;
|
|
8
|
+
page: number;
|
|
9
|
+
sort: string[];
|
|
10
|
+
filter: Record<string, string>;
|
|
11
|
+
search: string;
|
|
12
|
+
searchable: string[];
|
|
13
|
+
selectable: string[];
|
|
14
|
+
selectableOption: string[];
|
|
15
|
+
expand: string[];
|
|
16
|
+
};
|
|
17
|
+
responseData: (data: any[], totalRow?: number, message?: string, columns?: string[], access?: string[]) => {
|
|
18
|
+
status: number;
|
|
19
|
+
body: any;
|
|
20
|
+
};
|
|
21
|
+
validation: <T extends object>(rules: Partial<Record<keyof T | string, ValidationRule[] | string>>) => any;
|
|
22
|
+
responseError: (error: any, section?: string, message?: string, debug?: boolean) => any;
|
|
23
|
+
responseErrorValidation: (errors: Record<string, string[]>) => any;
|
|
24
|
+
responseSaved: (data: any, message?: string) => any;
|
|
25
|
+
responseSuccess: (data: any, message?: string) => any;
|
|
26
|
+
responseForbidden: (message?: string) => any;
|
|
27
|
+
uploadFile: (file: File, folder?: string) => Promise<string>;
|
|
28
|
+
deleteFile: (filePath: string) => void;
|
|
29
|
+
user?: any;
|
|
30
|
+
permissions?: KeyPermission[];
|
|
31
|
+
payload: Record<string, any>;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export type ValidationRulesFor<T> = Partial<Record<keyof T | string, ValidationRule[] | string>>;
|
|
35
|
+
export declare const controller: (app: Elysia) => Elysia<"", {
|
|
36
|
+
decorator: {};
|
|
37
|
+
store: {};
|
|
38
|
+
derive: {};
|
|
39
|
+
resolve: {};
|
|
40
|
+
}, {
|
|
41
|
+
typebox: {};
|
|
42
|
+
error: {};
|
|
43
|
+
}, {
|
|
44
|
+
schema: {};
|
|
45
|
+
standaloneSchema: {};
|
|
46
|
+
macro: {};
|
|
47
|
+
macroFn: {};
|
|
48
|
+
parser: {};
|
|
49
|
+
response: {};
|
|
50
|
+
}, {}, {
|
|
51
|
+
derive: {};
|
|
52
|
+
resolve: {};
|
|
53
|
+
schema: {};
|
|
54
|
+
standaloneSchema: {};
|
|
55
|
+
response: {};
|
|
56
|
+
}, {
|
|
57
|
+
derive: {
|
|
58
|
+
readonly getQuery: {
|
|
59
|
+
readonly page: number;
|
|
60
|
+
readonly paginate: number;
|
|
61
|
+
readonly search: string;
|
|
62
|
+
readonly sort: any;
|
|
63
|
+
readonly filter: any;
|
|
64
|
+
readonly searchable: any;
|
|
65
|
+
readonly selectable: any;
|
|
66
|
+
readonly selectableOption: any;
|
|
67
|
+
readonly expand: any;
|
|
68
|
+
};
|
|
69
|
+
readonly validation: <T extends object>(rules: Partial<Record<keyof T | string, ValidationRules[] | string>>) => Promise<void>;
|
|
70
|
+
readonly responseErrorValidation: (errors: Record<string, string[]>) => never;
|
|
71
|
+
readonly responseError: (error: any, section?: string, message?: string, debug?: string | boolean) => never;
|
|
72
|
+
readonly responseForbidden: (message?: string) => never;
|
|
73
|
+
readonly responseData: (data: any[], totalRow?: number, message?: string) => never;
|
|
74
|
+
readonly responseSuccess: (data: any, message?: string, code?: 200 | 201) => never;
|
|
75
|
+
readonly responseSaved: (data: any, message?: string) => never;
|
|
76
|
+
readonly uploadFile: (file: File, folder?: string, options?: {
|
|
77
|
+
disk?: "public" | "private";
|
|
78
|
+
owner_id?: number;
|
|
79
|
+
permissions?: {
|
|
80
|
+
user_id?: number;
|
|
81
|
+
role_id?: number;
|
|
82
|
+
}[];
|
|
83
|
+
}) => Promise<string>;
|
|
84
|
+
readonly deleteFile: (filePath: string) => Promise<boolean>;
|
|
85
|
+
};
|
|
86
|
+
resolve: {};
|
|
87
|
+
schema: {};
|
|
88
|
+
standaloneSchema: {};
|
|
89
|
+
response: import("elysia").ExtractErrorFromHandle<{
|
|
90
|
+
readonly getQuery: {
|
|
91
|
+
readonly page: number;
|
|
92
|
+
readonly paginate: number;
|
|
93
|
+
readonly search: string;
|
|
94
|
+
readonly sort: any;
|
|
95
|
+
readonly filter: any;
|
|
96
|
+
readonly searchable: any;
|
|
97
|
+
readonly selectable: any;
|
|
98
|
+
readonly selectableOption: any;
|
|
99
|
+
readonly expand: any;
|
|
100
|
+
};
|
|
101
|
+
readonly validation: <T extends object>(rules: Partial<Record<keyof T | string, ValidationRules[] | string>>) => Promise<void>;
|
|
102
|
+
readonly responseErrorValidation: (errors: Record<string, string[]>) => never;
|
|
103
|
+
readonly responseError: (error: any, section?: string, message?: string, debug?: string | boolean) => never;
|
|
104
|
+
readonly responseForbidden: (message?: string) => never;
|
|
105
|
+
readonly responseData: (data: any[], totalRow?: number, message?: string) => never;
|
|
106
|
+
readonly responseSuccess: (data: any, message?: string, code?: 200 | 201) => never;
|
|
107
|
+
readonly responseSaved: (data: any, message?: string) => never;
|
|
108
|
+
readonly uploadFile: (file: File, folder?: string, options?: {
|
|
109
|
+
disk?: "public" | "private";
|
|
110
|
+
owner_id?: number;
|
|
111
|
+
permissions?: {
|
|
112
|
+
user_id?: number;
|
|
113
|
+
role_id?: number;
|
|
114
|
+
}[];
|
|
115
|
+
}) => Promise<string>;
|
|
116
|
+
readonly deleteFile: (filePath: string) => Promise<boolean>;
|
|
117
|
+
}>;
|
|
118
|
+
}>;
|