@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.
Files changed (59) hide show
  1. package/bun.lock +160 -0
  2. package/dist/auth.util.d.ts +23 -0
  3. package/dist/auth.util.js +175 -0
  4. package/dist/auth.util.js.map +1 -0
  5. package/dist/context.util.d.ts +7 -0
  6. package/dist/context.util.js +11 -0
  7. package/dist/context.util.js.map +1 -0
  8. package/dist/controller.util.d.ts +118 -0
  9. package/dist/controller.util.js +144 -0
  10. package/dist/controller.util.js.map +1 -0
  11. package/dist/conversion.util.d.ts +8 -0
  12. package/dist/conversion.util.js +52 -0
  13. package/dist/conversion.util.js.map +1 -0
  14. package/dist/db.util.d.ts +80 -0
  15. package/dist/db.util.js +166 -0
  16. package/dist/db.util.js.map +1 -0
  17. package/dist/index.d.ts +13 -0
  18. package/dist/index.js +14 -0
  19. package/dist/index.js.map +1 -0
  20. package/dist/logger.util.d.ts +30 -0
  21. package/dist/logger.util.js +117 -0
  22. package/dist/logger.util.js.map +1 -0
  23. package/dist/mail.util.d.ts +21 -0
  24. package/dist/mail.util.js +53 -0
  25. package/dist/mail.util.js.map +1 -0
  26. package/dist/middleware.util.d.ts +263 -0
  27. package/dist/middleware.util.js +233 -0
  28. package/dist/middleware.util.js.map +1 -0
  29. package/dist/model.util.d.ts +204 -0
  30. package/dist/model.util.js +1495 -0
  31. package/dist/model.util.js.map +1 -0
  32. package/dist/permission.util.d.ts +38 -0
  33. package/dist/permission.util.js +91 -0
  34. package/dist/permission.util.js.map +1 -0
  35. package/dist/route.util.d.ts +1 -0
  36. package/dist/route.util.js +12 -0
  37. package/dist/route.util.js.map +1 -0
  38. package/dist/storage.util.d.ts +56 -0
  39. package/dist/storage.util.js +82 -0
  40. package/dist/storage.util.js.map +1 -0
  41. package/dist/validation.util.d.ts +7 -0
  42. package/dist/validation.util.js +237 -0
  43. package/dist/validation.util.js.map +1 -0
  44. package/package.json +34 -0
  45. package/src/auth.util.ts +242 -0
  46. package/src/context.util.ts +17 -0
  47. package/src/controller.util.ts +237 -0
  48. package/src/conversion.util.ts +65 -0
  49. package/src/db.util.ts +405 -0
  50. package/src/index.ts +13 -0
  51. package/src/logger.util.ts +170 -0
  52. package/src/mail.util.ts +86 -0
  53. package/src/middleware.util.ts +289 -0
  54. package/src/model.util.ts +2211 -0
  55. package/src/permission.util.ts +136 -0
  56. package/src/route.util.ts +12 -0
  57. package/src/storage.util.ts +102 -0
  58. package/src/validation.util.ts +338 -0
  59. 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":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAA;AAC3B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAI3B,yCAAyC;AACzC,6BAA6B;AAC7B,yCAAyC;AACzC,MAAM,kBAAkB,GAAK,EAAE,CAAA;AAC/B,MAAM,eAAe,GAAQ,OAAO,CAAC,GAAG,CAAC,UAAU,KAAO,MAAM,CAAA;AAChE,mEAAmE;AACnE,yEAAyE;AAIzE,MAAM,CAAC,MAAM,IAAI,GAAG;IAElB,yCAAyC;IACzC,4CAA4C;IAC5C,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,MAAc,EAAE,GAAY,EAAE,aAAsB,IAAI;QAC9E,MAAM,KAAK,GAAK,MAAM,CAAC,WAAW,CAAC,kBAAkB,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACtE,MAAM,IAAI,GAAM,MAAM,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;QAC5C,MAAM,KAAK,GAAK,eAAe,CAAC,GAAG,CAAC,CAAA;QAEpC,IAAI,WAAW,GAAa,EAAE,CAAA;QAC9B,IAAI,eAAe,IAAI,UAAU,EAAE,CAAC;YAClC,WAAW,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;QAChD,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC;YAClD,OAAO,EAAS,MAAM;YACtB,KAAK,EAAW,IAAI;YACpB,KAAK,EAAW,KAAK;YACrB,WAAW,EAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;YAC3C,UAAU,EAAM,IAAI,IAAI,EAAE;SAC3B,CAAC,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEpB,OAAO;YACL,KAAK,EAAO,GAAG,GAAG,CAAC,EAAE,IAAI,KAAK,EAAE;YAChC,OAAO,EAAK,GAAG,CAAC,EAAE;SACnB,CAAA;IACH,CAAC;IAID,yCAAyC;IACzC,4CAA4C;IAC5C,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,EAAU;QAChC,OAAO,EAAE,CAAC,KAAK,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAA;IAChE,CAAC;IAID,yCAAyC;IACzC,+BAA+B;IAC/B,yCAAyC;IACzC,KAAK,CAAC,iBAAiB,CAAC,KAAa,EAAE,GAAa;QAClD,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,IAAI,CAAA;QAErC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,GAAK,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAA;QAC9C,MAAM,KAAK,GAAgB,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAC1D,MAAM,EAAE,GAAmB,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEvD,MAAM,QAAQ,GAAG,cAAc,OAAO,EAAE,CAAA;QAExC,oBAAoB;QACpB,6CAA6C;QAE7C,kBAAkB;QAClB,yCAAyC;QAEzC,+CAA+C;QAE/C,qBAAqB;QACrB,MAAM;QACN,IAAI;QAEJ,MAAM,WAAW,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;QAE/E,IAAI,CAAC,WAAW;YAAE,OAAO,IAAI,CAAA;QAC7B,IAAI,WAAW,CAAC,KAAK,KAAK,KAAK;YAAE,OAAO,IAAI,CAAA;QAE5C,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,CAAA;QAC5D,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QAEvB,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,YAAY,EAAE,IAAI,IAAI,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;QAEjH,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAA;QAEvE,oBAAoB;QACpB,uBAAuB;QACvB,gBAAgB;QAChB,sBAAsB;QACtB,uBAAuB;QACvB,8BAA8B;QAC9B,2CAA2C;QAC3C,gDAAgD;QAChD,SAAS;QACT,MAAM;QACN,IAAI;QAEJ,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC,UAAU,EAAE,CAAA;IAC1E,CAAC;IAID,yCAAyC;IACzC,kCAAkC;IAClC,yCAAyC;IACzC,KAAK,CAAC,mBAAmB,CAAC,MAAc;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,QAAQ,EAAE,CAAA;QACpE,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAEpE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,WAAW,EAAE,CAAA;QAElC,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,MAAM,CAAC;YACzC,OAAO,EAAO,MAAM;YACpB,KAAK,EAAS,IAAI;YAClB,UAAU,EAAI,IAAI,IAAI,EAAE;SACzB,CAAC,CAAA;QAEF,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,EAAE,CAAA;QAEhF,MAAM,GAAG,CAAC,MAAM,EAAE,CAAA;QAElB,OAAO;YACL,KAAK,EAAM,KAAK;YAChB,OAAO,EAAI,MAAM,CAAC,EAAE;SACrB,CAAA;IACH,CAAC;IAID,yCAAyC;IACzC,kCAAkC;IAClC,yCAAyC;IACzC,KAAK,CAAC,mBAAmB,CAAC,MAAc,EAAE,KAAa;QACrD,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAE5E,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,CAAC;aAC9C,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC;aACxB,SAAS,CAAC,SAAS,CAAC;aACpB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;aACrB,KAAK,EAAE,CAAC;QAEX,IAAI,CAAC,MAAM;YAAE,OAAO,KAAK,CAAA;QAEzB,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW;YAAE,OAAO,KAAK,CAAC;QAE/C,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,SAAS,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAExE,IAAI,WAAW,GAAG,EAAE;YAAE,OAAO,KAAK,CAAC;QAEnC,OAAO,IAAI,CAAC;IACd,CAAC;IAID,yCAAyC;IACzC,8BAA8B;IAC9B,yCAAyC;IACzC,KAAK,CAAC,gBAAgB,CAAC,MAAc,EAAE,cAAuB;QAC5D,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,cAAc,EAAC,YAAY,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,CAAC,CAAA;QAEvL,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACpB,GAAG,CAAC;YACJ,SAAS,EAAI,CAAC,CAAC,UAAU,KAAO,IAAI;YACpC,UAAU,EAAG,CAAC,CAAC,EAAE,KAAe,cAAc;SAC/C,CAAC,CAAC,CAAA;IACL,CAAC;IAID,yCAAyC;IACzC,sCAAsC;IACtC,yCAAyC;IACzC,yBAAyB,EAAE,yBAAyB;IACpD,+BAA+B,EAAE,+BAA+B;CACjE,CAAA;AAID,SAAS,eAAe,CAAC,GAAY;IACnC,MAAM,EAAE,GAAM,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,IAAM,EAAE,CAAA;IACnD,MAAM,GAAG,GAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAU,EAAE,CAAA;IAEnD,OAAO,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AACnE,CAAC;AAGD,SAAS,YAAY,CAAC,GAAY;IAChC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,SAAS,CAAC,CAAA;AACjH,CAAC;AAGD,KAAK,UAAU,kBAAkB,CAAC,MAAc;IAC9C,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhF,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAA;IAEnC,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAErF,OAAO,KAAK,CAAC,IAAI,CACf,IAAI,GAAG,CACL,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAC3B,CACF,CAAA;AACH,CAAC;AAGD,KAAK,UAAU,yBAAyB,CAAC,MAAc;IACrD,MAAM,WAAW,GAAG,MAAM,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAEpD,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAEpF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAEjC,MAAM,EAAE,CAAC,oBAAoB,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;QAC5D,WAAW,EAAK,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC;QAC3C,UAAU,EAAM,IAAI,IAAI,EAAE;KAC3B,CAAC,CAAA;IAEF,oBAAoB;IACpB,uBAAuB;IACvB,wDAAwD;IACxD,MAAM;IACN,IAAI;AACN,CAAC;AAGD,KAAK,UAAU,+BAA+B,CAAC,MAAc;IAC3D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,YAAY,CAAC,CAAC,KAAK,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAEhF,kCAAkC;IAClC,8DAA8D;IAC9D,IAAI;AACN,CAAC"}
@@ -0,0 +1,7 @@
1
+ export type AppContext = {
2
+ user_id?: number;
3
+ };
4
+ export declare const context: {
5
+ run<T>(ctx: AppContext, fn: () => T): T;
6
+ get<K extends keyof AppContext>(key: K): AppContext[K];
7
+ };
@@ -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
+ }>;