@devxcrew/platform 0.1.2 → 0.1.6

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 (280) hide show
  1. package/README.md +7 -1
  2. package/dist/index.d.ts +6 -4
  3. package/dist/index.js +4 -2
  4. package/dist/modules/identity/audit/audit.controller.d.ts +17 -0
  5. package/dist/modules/identity/audit/audit.controller.js +12 -0
  6. package/dist/modules/identity/audit/audit.migration.d.ts +1 -0
  7. package/dist/modules/identity/audit/audit.migration.js +1 -0
  8. package/dist/modules/identity/audit/audit.provider.d.ts +24 -0
  9. package/dist/modules/identity/audit/audit.provider.js +14 -0
  10. package/dist/modules/identity/audit/audit.repository.d.ts +26 -0
  11. package/dist/modules/identity/audit/audit.repository.js +46 -0
  12. package/dist/modules/identity/audit/audit.routes.d.ts +5 -0
  13. package/dist/modules/identity/audit/audit.routes.js +2 -0
  14. package/dist/modules/identity/audit/audit.schema.d.ts +1 -0
  15. package/dist/modules/identity/audit/audit.schema.js +1 -0
  16. package/dist/modules/identity/audit/audit.seed.d.ts +1 -0
  17. package/dist/modules/identity/audit/audit.seed.js +1 -0
  18. package/dist/modules/identity/audit/audit.service.d.ts +23 -0
  19. package/dist/modules/identity/audit/audit.service.js +46 -0
  20. package/dist/modules/identity/audit/audit.types.d.ts +12 -0
  21. package/dist/modules/identity/audit/audit.types.js +1 -0
  22. package/dist/modules/identity/audit/index.d.ts +4 -0
  23. package/dist/modules/identity/audit/index.js +3 -0
  24. package/dist/modules/identity/{identity.administration-service.d.ts → composition/identity.composition.d.ts} +59 -27
  25. package/dist/modules/identity/composition/identity.composition.js +171 -0
  26. package/dist/modules/identity/composition/identity.seed.d.ts +3 -0
  27. package/dist/modules/identity/composition/identity.seed.js +16 -0
  28. package/dist/modules/identity/identity.controller.d.ts +8 -6
  29. package/dist/modules/identity/identity.controller.js +90 -70
  30. package/dist/modules/identity/identity.migration.d.ts +1 -2
  31. package/dist/modules/identity/identity.migration.js +1 -79
  32. package/dist/modules/identity/identity.provider.d.ts +39 -13
  33. package/dist/modules/identity/identity.provider.js +19 -73
  34. package/dist/modules/identity/identity.public-schemas.d.ts +9 -3
  35. package/dist/modules/identity/identity.public-schemas.js +9 -3
  36. package/dist/modules/identity/identity.repository.d.ts +1 -40
  37. package/dist/modules/identity/identity.repository.js +1 -196
  38. package/dist/modules/identity/identity.routes.d.ts +2 -5
  39. package/dist/modules/identity/identity.routes.js +3 -11
  40. package/dist/modules/identity/identity.schema.d.ts +1 -27
  41. package/dist/modules/identity/identity.schema.js +1 -34
  42. package/dist/modules/identity/identity.seed.d.ts +1 -3
  43. package/dist/modules/identity/identity.seed.js +1 -81
  44. package/dist/modules/identity/identity.service.d.ts +1 -32
  45. package/dist/modules/identity/identity.service.js +1 -83
  46. package/dist/modules/identity/identity.types.d.ts +13 -106
  47. package/dist/modules/identity/index.d.ts +18 -11
  48. package/dist/modules/identity/index.js +14 -8
  49. package/dist/modules/identity/{identity.administration-migration.js → legacy/identity.administration-migration.js} +3 -11
  50. package/dist/modules/identity/legacy/identity.migration.d.ts +2 -0
  51. package/dist/modules/identity/legacy/identity.migration.js +72 -0
  52. package/dist/modules/identity/organization/index.d.ts +6 -0
  53. package/dist/modules/identity/organization/index.js +5 -0
  54. package/dist/modules/identity/organization/organization.controller.d.ts +35 -0
  55. package/dist/modules/identity/organization/organization.controller.js +18 -0
  56. package/dist/modules/identity/organization/organization.migration.d.ts +1 -0
  57. package/dist/modules/identity/organization/organization.migration.js +1 -0
  58. package/dist/modules/identity/organization/organization.provider.d.ts +46 -0
  59. package/dist/modules/identity/organization/organization.provider.js +33 -0
  60. package/dist/modules/identity/organization/organization.repository.d.ts +58 -0
  61. package/dist/modules/identity/organization/organization.repository.js +101 -0
  62. package/dist/modules/identity/organization/organization.routes.d.ts +5 -0
  63. package/dist/modules/identity/organization/organization.routes.js +2 -0
  64. package/dist/modules/identity/organization/organization.schema.d.ts +11 -0
  65. package/dist/modules/identity/organization/organization.schema.js +18 -0
  66. package/dist/modules/identity/organization/organization.seed.d.ts +3 -0
  67. package/dist/modules/identity/organization/organization.seed.js +11 -0
  68. package/dist/modules/identity/organization/organization.service.d.ts +39 -0
  69. package/dist/modules/identity/organization/organization.service.js +55 -0
  70. package/dist/modules/identity/organization/organization.types.d.ts +19 -0
  71. package/dist/modules/identity/organization/organization.types.js +1 -0
  72. package/dist/modules/identity/permission/index.d.ts +9 -0
  73. package/dist/modules/identity/permission/index.js +6 -0
  74. package/dist/modules/identity/permission/permission.controller.d.ts +21 -0
  75. package/dist/modules/identity/permission/permission.controller.js +12 -0
  76. package/dist/modules/identity/{identity.permission-declarations-migration.js → permission/permission.declarations.migration.js} +9 -4
  77. package/dist/modules/identity/{identity.permission-labels-migration.js → permission/permission.labels.migration.js} +5 -2
  78. package/dist/modules/identity/permission/permission.migration.d.ts +2 -0
  79. package/dist/modules/identity/permission/permission.migration.js +2 -0
  80. package/dist/modules/identity/permission/permission.provider.d.ts +19 -0
  81. package/dist/modules/identity/permission/permission.provider.js +14 -0
  82. package/dist/modules/identity/permission/permission.repository.d.ts +51 -0
  83. package/dist/modules/identity/permission/permission.repository.js +84 -0
  84. package/dist/modules/identity/permission/permission.routes.d.ts +5 -0
  85. package/dist/modules/identity/permission/permission.routes.js +2 -0
  86. package/dist/modules/identity/permission/permission.schema.d.ts +14 -0
  87. package/dist/modules/identity/permission/permission.schema.js +29 -0
  88. package/dist/modules/identity/permission/permission.seed.d.ts +4 -0
  89. package/dist/modules/identity/permission/permission.seed.js +17 -0
  90. package/dist/modules/identity/permission/permission.service.d.ts +31 -0
  91. package/dist/modules/identity/permission/permission.service.js +77 -0
  92. package/dist/modules/identity/permission/permission.types.d.ts +15 -0
  93. package/dist/modules/identity/permission/permission.types.js +1 -0
  94. package/dist/modules/identity/role/index.d.ts +10 -0
  95. package/dist/modules/identity/role/index.js +6 -0
  96. package/dist/modules/identity/role/role.controller.d.ts +42 -0
  97. package/dist/modules/identity/role/role.controller.js +25 -0
  98. package/dist/modules/identity/{identity.roles-migration.js → role/role.migration.js} +5 -18
  99. package/dist/modules/identity/role/role.provider.d.ts +14 -0
  100. package/dist/modules/identity/role/role.provider.js +30 -0
  101. package/dist/modules/identity/role/role.repository.d.ts +38 -0
  102. package/dist/modules/identity/role/role.repository.js +46 -0
  103. package/dist/modules/identity/role/role.routes.d.ts +5 -0
  104. package/dist/modules/identity/role/role.routes.js +2 -0
  105. package/dist/modules/identity/role/role.schema.d.ts +16 -0
  106. package/dist/modules/identity/role/role.schema.js +27 -0
  107. package/dist/modules/identity/role/role.seed.d.ts +3 -0
  108. package/dist/modules/identity/role/role.seed.js +8 -0
  109. package/dist/modules/identity/role/role.service.d.ts +69 -0
  110. package/dist/modules/identity/role/role.service.js +192 -0
  111. package/dist/modules/identity/role/role.types.d.ts +17 -0
  112. package/dist/modules/identity/role/role.types.js +1 -0
  113. package/dist/modules/identity/role-permission/index.d.ts +6 -0
  114. package/dist/modules/identity/role-permission/index.js +4 -0
  115. package/dist/modules/identity/role-permission/role-permission.controller.d.ts +1 -0
  116. package/dist/modules/identity/role-permission/role-permission.controller.js +1 -0
  117. package/dist/modules/identity/role-permission/role-permission.migration.d.ts +1 -0
  118. package/dist/modules/identity/role-permission/role-permission.migration.js +1 -0
  119. package/dist/modules/identity/role-permission/role-permission.provider.d.ts +14 -0
  120. package/dist/modules/identity/role-permission/role-permission.provider.js +15 -0
  121. package/dist/modules/identity/role-permission/role-permission.repository.d.ts +12 -0
  122. package/dist/modules/identity/role-permission/role-permission.repository.js +51 -0
  123. package/dist/modules/identity/role-permission/role-permission.routes.d.ts +1 -0
  124. package/dist/modules/identity/role-permission/role-permission.routes.js +2 -0
  125. package/dist/modules/identity/role-permission/role-permission.schema.d.ts +2 -0
  126. package/dist/modules/identity/role-permission/role-permission.schema.js +3 -0
  127. package/dist/modules/identity/role-permission/role-permission.seed.d.ts +3 -0
  128. package/dist/modules/identity/role-permission/role-permission.seed.js +10 -0
  129. package/dist/modules/identity/role-permission/role-permission.service.d.ts +13 -0
  130. package/dist/modules/identity/role-permission/role-permission.service.js +35 -0
  131. package/dist/modules/identity/role-permission/role-permission.types.d.ts +12 -0
  132. package/dist/modules/identity/role-permission/role-permission.types.js +1 -0
  133. package/dist/modules/identity/session/index.d.ts +6 -0
  134. package/dist/modules/identity/session/index.js +5 -0
  135. package/dist/modules/identity/session/session.authentication.controller.d.ts +30 -0
  136. package/dist/modules/identity/session/session.authentication.controller.js +37 -0
  137. package/dist/modules/identity/session/session.controller.d.ts +18 -0
  138. package/dist/modules/identity/session/session.controller.js +15 -0
  139. package/dist/modules/identity/session/session.migration.d.ts +1 -0
  140. package/dist/modules/identity/session/session.migration.js +1 -0
  141. package/dist/modules/identity/session/session.provider.d.ts +34 -0
  142. package/dist/modules/identity/session/session.provider.js +23 -0
  143. package/dist/modules/identity/session/session.repository.d.ts +36 -0
  144. package/dist/modules/identity/session/session.repository.js +128 -0
  145. package/dist/modules/identity/session/session.routes.d.ts +27 -0
  146. package/dist/modules/identity/session/session.routes.js +13 -0
  147. package/dist/modules/identity/session/session.schema.d.ts +6 -0
  148. package/dist/modules/identity/session/session.schema.js +12 -0
  149. package/dist/modules/identity/session/session.seed.d.ts +1 -0
  150. package/dist/modules/identity/session/session.seed.js +1 -0
  151. package/dist/modules/identity/session/session.service.d.ts +20 -0
  152. package/dist/modules/identity/session/session.service.js +27 -0
  153. package/dist/modules/identity/session/session.types.d.ts +17 -0
  154. package/dist/modules/identity/session/session.types.js +1 -0
  155. package/dist/modules/identity/settings/index.d.ts +5 -0
  156. package/dist/modules/identity/settings/index.js +4 -0
  157. package/dist/modules/identity/settings/settings.controller.d.ts +35 -0
  158. package/dist/modules/identity/settings/settings.controller.js +18 -0
  159. package/dist/modules/identity/settings/settings.migration.d.ts +1 -0
  160. package/dist/modules/identity/settings/settings.migration.js +1 -0
  161. package/dist/modules/identity/settings/settings.provider.d.ts +35 -0
  162. package/dist/modules/identity/settings/settings.provider.js +14 -0
  163. package/dist/modules/identity/settings/settings.repository.d.ts +49 -0
  164. package/dist/modules/identity/settings/settings.repository.js +75 -0
  165. package/dist/modules/identity/settings/settings.routes.d.ts +1 -0
  166. package/dist/modules/identity/settings/settings.routes.js +7 -0
  167. package/dist/modules/identity/settings/settings.schema.d.ts +15 -0
  168. package/dist/modules/identity/settings/settings.schema.js +27 -0
  169. package/dist/modules/identity/settings/settings.seed.d.ts +1 -0
  170. package/dist/modules/identity/settings/settings.seed.js +1 -0
  171. package/dist/modules/identity/settings/settings.service.d.ts +40 -0
  172. package/dist/modules/identity/settings/settings.service.js +101 -0
  173. package/dist/modules/identity/settings/settings.types.d.ts +20 -0
  174. package/dist/modules/identity/settings/settings.types.js +1 -0
  175. package/dist/modules/identity/support/identity.schema.d.ts +8 -0
  176. package/dist/modules/identity/support/identity.schema.js +10 -0
  177. package/dist/modules/identity/support/pagination.d.ts +13 -0
  178. package/dist/modules/identity/support/pagination.js +27 -0
  179. package/dist/modules/identity/support/pagination.schema.d.ts +43 -0
  180. package/dist/modules/identity/support/pagination.schema.js +15 -0
  181. package/dist/modules/identity/support/resource-controller.d.ts +14 -0
  182. package/dist/modules/identity/support/resource-controller.js +1 -0
  183. package/dist/modules/identity/user/index.d.ts +13 -0
  184. package/dist/modules/identity/user/index.js +11 -0
  185. package/dist/modules/identity/user/user.administration.service.d.ts +59 -0
  186. package/dist/modules/identity/user/user.administration.service.js +159 -0
  187. package/dist/modules/identity/user/user.controller.d.ts +44 -0
  188. package/dist/modules/identity/user/user.controller.js +21 -0
  189. package/dist/modules/identity/user/user.lifecycle.controller.d.ts +58 -0
  190. package/dist/modules/identity/user/user.lifecycle.controller.js +27 -0
  191. package/dist/modules/identity/{identity.lifecycle-schema.js → user/user.lifecycle.schema.js} +5 -5
  192. package/dist/modules/identity/{identity.lifecycle-service.d.ts → user/user.lifecycle.service.d.ts} +8 -4
  193. package/dist/modules/identity/{identity.lifecycle-service.js → user/user.lifecycle.service.js} +66 -118
  194. package/dist/modules/identity/user/user.migration.d.ts +1 -0
  195. package/dist/modules/identity/user/user.migration.js +1 -0
  196. package/dist/modules/identity/{identity.password.js → user/user.password.js} +1 -1
  197. package/dist/modules/identity/user/user.provider.d.ts +80 -0
  198. package/dist/modules/identity/user/user.provider.js +22 -0
  199. package/dist/modules/identity/user/user.repository.d.ts +64 -0
  200. package/dist/modules/identity/user/user.repository.js +129 -0
  201. package/dist/modules/identity/user/user.routes.d.ts +12 -0
  202. package/dist/modules/identity/user/user.routes.js +9 -0
  203. package/dist/modules/identity/user/user.schema.d.ts +34 -0
  204. package/dist/modules/identity/user/user.schema.js +46 -0
  205. package/dist/modules/identity/user/user.seed.d.ts +14 -0
  206. package/dist/modules/identity/user/user.seed.js +47 -0
  207. package/dist/modules/identity/user/user.service.d.ts +33 -0
  208. package/dist/modules/identity/user/user.service.js +76 -0
  209. package/dist/modules/identity/user/user.types.d.ts +27 -0
  210. package/dist/modules/identity/user/user.types.js +1 -0
  211. package/dist/modules/identity/user-role/index.d.ts +8 -0
  212. package/dist/modules/identity/user-role/index.js +6 -0
  213. package/dist/modules/identity/user-role/user-role.controller.d.ts +42 -0
  214. package/dist/modules/identity/user-role/user-role.controller.js +21 -0
  215. package/dist/modules/identity/user-role/user-role.migration.d.ts +1 -0
  216. package/dist/modules/identity/user-role/user-role.migration.js +1 -0
  217. package/dist/modules/identity/user-role/user-role.policy.d.ts +3 -0
  218. package/dist/modules/identity/user-role/user-role.policy.js +25 -0
  219. package/dist/modules/identity/user-role/user-role.provider.d.ts +18 -0
  220. package/dist/modules/identity/user-role/user-role.provider.js +23 -0
  221. package/dist/modules/identity/user-role/user-role.repository.d.ts +34 -0
  222. package/dist/modules/identity/user-role/user-role.repository.js +87 -0
  223. package/dist/modules/identity/user-role/user-role.routes.d.ts +5 -0
  224. package/dist/modules/identity/user-role/user-role.routes.js +2 -0
  225. package/dist/modules/identity/user-role/user-role.schema.d.ts +14 -0
  226. package/dist/modules/identity/user-role/user-role.schema.js +25 -0
  227. package/dist/modules/identity/user-role/user-role.seed.d.ts +7 -0
  228. package/dist/modules/identity/user-role/user-role.seed.js +11 -0
  229. package/dist/modules/identity/user-role/user-role.service.d.ts +60 -0
  230. package/dist/modules/identity/user-role/user-role.service.js +216 -0
  231. package/dist/modules/identity/user-role/user-role.types.d.ts +12 -0
  232. package/dist/modules/identity/user-role/user-role.types.js +1 -0
  233. package/dist/modules/tenant/index.d.ts +6 -0
  234. package/dist/modules/tenant/index.js +5 -0
  235. package/dist/modules/tenant/tenant.command.d.ts +3 -0
  236. package/dist/modules/tenant/tenant.command.js +43 -0
  237. package/dist/modules/tenant/tenant.controller.d.ts +4 -0
  238. package/dist/modules/tenant/tenant.controller.js +12 -0
  239. package/dist/modules/tenant/tenant.migration.d.ts +5 -0
  240. package/dist/modules/tenant/tenant.migration.js +46 -0
  241. package/dist/modules/tenant/tenant.provider.d.ts +3 -0
  242. package/dist/modules/tenant/tenant.provider.js +44 -0
  243. package/dist/modules/tenant/tenant.readiness.d.ts +6 -0
  244. package/dist/modules/tenant/tenant.readiness.js +45 -0
  245. package/dist/modules/tenant/tenant.repository.d.ts +15 -0
  246. package/dist/modules/tenant/tenant.repository.js +23 -0
  247. package/dist/modules/tenant/tenant.routes.d.ts +4 -0
  248. package/dist/modules/tenant/tenant.routes.js +7 -0
  249. package/dist/modules/tenant/tenant.schema.d.ts +20 -0
  250. package/dist/modules/tenant/tenant.schema.js +31 -0
  251. package/dist/modules/tenant/tenant.seed.d.ts +8 -0
  252. package/dist/modules/tenant/tenant.seed.js +40 -0
  253. package/dist/modules/tenant/tenant.service.d.ts +16 -0
  254. package/dist/modules/tenant/tenant.service.js +72 -0
  255. package/dist/modules/tenant/tenant.types.d.ts +39 -0
  256. package/dist/modules/tenant/tenant.types.js +1 -0
  257. package/package.json +9 -5
  258. package/dist/modules/identity/identity.administration-repository.d.ts +0 -19
  259. package/dist/modules/identity/identity.administration-repository.js +0 -102
  260. package/dist/modules/identity/identity.administration-schema.d.ts +0 -113
  261. package/dist/modules/identity/identity.administration-schema.js +0 -121
  262. package/dist/modules/identity/identity.administration-service.js +0 -517
  263. package/dist/modules/identity/identity.membership-policy.d.ts +0 -3
  264. package/dist/modules/identity/identity.membership-policy.js +0 -27
  265. package/dist/modules/identity/identity.permission-declarations.d.ts +0 -23
  266. package/dist/modules/identity/identity.permission-declarations.js +0 -57
  267. package/dist/modules/identity/identity.presentation-service.d.ts +0 -23
  268. package/dist/modules/identity/identity.presentation-service.js +0 -51
  269. package/dist/modules/identity/identity.roles-service.d.ts +0 -49
  270. package/dist/modules/identity/identity.roles-service.js +0 -327
  271. /package/dist/modules/identity/{identity.administration-migration.d.ts → legacy/identity.administration-migration.d.ts} +0 -0
  272. /package/dist/modules/identity/{identity.permission-declarations-migration.d.ts → permission/permission.declarations.migration.d.ts} +0 -0
  273. /package/dist/modules/identity/{identity.permission-labels-migration.d.ts → permission/permission.labels.migration.d.ts} +0 -0
  274. /package/dist/modules/identity/{identity.roles-migration.d.ts → role/role.migration.d.ts} +0 -0
  275. /package/dist/modules/identity/{identity.error.d.ts → support/identity.error.d.ts} +0 -0
  276. /package/dist/modules/identity/{identity.error.js → support/identity.error.js} +0 -0
  277. /package/dist/modules/identity/{identity.request-context.d.ts → support/identity.request-context.d.ts} +0 -0
  278. /package/dist/modules/identity/{identity.request-context.js → support/identity.request-context.js} +0 -0
  279. /package/dist/modules/identity/{identity.lifecycle-schema.d.ts → user/user.lifecycle.schema.d.ts} +0 -0
  280. /package/dist/modules/identity/{identity.password.d.ts → user/user.password.d.ts} +0 -0
@@ -0,0 +1,42 @@
1
+ import type { Principal } from "../identity.types.js";
2
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
3
+ import type { IdentityRoleProvider } from "./role.provider.js";
4
+ export declare class IdentityRoleController {
5
+ private readonly service;
6
+ constructor(service: IdentityRoleProvider);
7
+ index(actor: Principal, query: IdentityListQuery): Promise<{
8
+ data: {
9
+ version: number;
10
+ active: boolean;
11
+ system: boolean;
12
+ permissionIds: string[];
13
+ }[];
14
+ meta: {
15
+ page: number;
16
+ perPage: number;
17
+ total: number;
18
+ lastPage: number;
19
+ };
20
+ }>;
21
+ show(actor: Principal, id: string): Promise<{
22
+ version: number;
23
+ active: boolean;
24
+ system: boolean;
25
+ permissionIds: string[];
26
+ } | undefined>;
27
+ store(actor: Principal, raw: unknown): Promise<{
28
+ id: `${string}-${string}-${string}-${string}-${string}`;
29
+ name: string;
30
+ tenantId: string;
31
+ portal: string;
32
+ system: boolean;
33
+ active: boolean;
34
+ version: number;
35
+ permissionIds: string[];
36
+ }>;
37
+ update(actor: Principal, id: string, raw: unknown): Promise<{
38
+ id: string;
39
+ permissionIds: string[];
40
+ version: number;
41
+ }>;
42
+ }
@@ -0,0 +1,25 @@
1
+ import { IdentityError } from "../support/identity.error.js";
2
+ export class IdentityRoleController {
3
+ service;
4
+ constructor(service) {
5
+ this.service = service;
6
+ }
7
+ index(actor, query) {
8
+ return this.service.list(actor, query);
9
+ }
10
+ show(actor, id) {
11
+ return this.service.show(actor, id);
12
+ }
13
+ store(actor, raw) {
14
+ return this.service.create(actor, raw);
15
+ }
16
+ async update(actor, id, raw) {
17
+ if (["user", "admin", "super-admin"].includes(id)) {
18
+ const row = await this.show(actor, id);
19
+ if (!row)
20
+ throw new IdentityError(404, "Resource not found.");
21
+ return this.service.updateSystemPermissions(actor, id, raw);
22
+ }
23
+ return this.service.update(actor, id, raw);
24
+ }
25
+ }
@@ -8,20 +8,13 @@ export const identityRolesMigration = {
8
8
  .addColumn("name", "text", (c) => c.notNull())
9
9
  .addColumn("active", "integer", (c) => c.notNull().defaultTo(1))
10
10
  .addColumn("version", "integer", (c) => c.notNull().defaultTo(0))
11
- .addUniqueConstraint("identity_custom_role_name", [
12
- "app_id",
13
- "tenant_id",
14
- "name",
15
- ])
11
+ .addUniqueConstraint("identity_custom_role_name", ["app_id", "tenant_id", "name"])
16
12
  .execute();
17
13
  await db.schema
18
14
  .createTable("identity_custom_role_permissions")
19
15
  .addColumn("role_id", "text", (c) => c.notNull().references("identity_custom_roles.id").onDelete("cascade"))
20
16
  .addColumn("permission_id", "text", (c) => c.notNull().references("identity_permissions.id"))
21
- .addPrimaryKeyConstraint("identity_custom_role_permission_pk", [
22
- "role_id",
23
- "permission_id",
24
- ])
17
+ .addPrimaryKeyConstraint("identity_custom_role_permission_pk", ["role_id", "permission_id"])
25
18
  .execute();
26
19
  await db.schema
27
20
  .alterTable("identity_memberships")
@@ -45,20 +38,14 @@ export const identityRolesMigration = {
45
38
  const restrictedMembership = await db
46
39
  .selectFrom("identity_memberships")
47
40
  .select("user_id")
48
- .where((eb) => eb.or([
49
- eb("custom_role_id", "is not", null),
50
- eb("active", "!=", 1),
51
- ]))
41
+ .where((eb) => eb.or([eb("custom_role_id", "is not", null), eb("active", "!=", 1)]))
52
42
  .limit(1)
53
43
  .executeTakeFirst();
54
44
  if (customRole || restrictedMembership)
55
45
  throw new Error("Role rollback would remove access restrictions. Restore a compatible database snapshot instead.");
56
46
  for (const column of ["custom_role_id", "active", "version"])
57
- await db.schema
58
- .alterTable("identity_memberships")
59
- .dropColumn(column)
60
- .execute();
47
+ await db.schema.alterTable("identity_memberships").dropColumn(column).execute();
61
48
  await db.schema.dropTable("identity_custom_role_permissions").execute();
62
49
  await db.schema.dropTable("identity_custom_roles").execute();
63
- },
50
+ }
64
51
  };
@@ -0,0 +1,14 @@
1
+ import type { Kysely, Transaction } from "kysely";
2
+ import type { IdentityMutation, IdentitySchema, Principal } from "../identity.types.js";
3
+ import type { IdentityPermissionProvider } from "../permission/index.js";
4
+ import { IdentityRolesService } from "./role.service.js";
5
+ import { activeCustomRole, customRoleInApp, customRoleIdsSource, customRoleNameSource } from "./role.repository.js";
6
+ export type IdentityRoleProvider = Pick<IdentityRolesService, "list" | "show" | "resolve" | "create" | "update" | "updateSystemPermissions"> & {
7
+ verify(): Promise<void>;
8
+ activeCustomRole: typeof activeCustomRole;
9
+ customRoleInApp: typeof customRoleInApp;
10
+ customRoleNameSource: typeof customRoleNameSource;
11
+ customRoleIdsSource: typeof customRoleIdsSource;
12
+ permissionIds(db: Kysely<IdentitySchema>, portal: "user" | "admin" | "super-admin", customRoleId: string | null, appId: string, tenantId: string): Promise<string[] | null>;
13
+ };
14
+ export declare function createIdentityRoleProvider(database: Kysely<IdentitySchema>, permissions: IdentityPermissionProvider, mutate: IdentityMutation, recordAudit: (trx: Transaction<IdentitySchema>, actor: Principal, tenantId: string, action: string, id: string) => Promise<void>, activeOrganization: (trx: Transaction<IdentitySchema>, id: string) => Promise<unknown>, revokeRoleSessions: (trx: Transaction<IdentitySchema>, appId: string, tenantId: string, roleId: string) => Promise<void>): IdentityRoleProvider;
@@ -0,0 +1,30 @@
1
+ import { createIdentityRolePermissionProvider } from "../role-permission/index.js";
2
+ import { IdentityRolesService } from "./role.service.js";
3
+ import { activeCustomRole, customRoleInApp, customRoleIdsSource, customRoleNameSource, verifyRoleSchema } from "./role.repository.js";
4
+ export function createIdentityRoleProvider(database, permissions, mutate, recordAudit, activeOrganization, revokeRoleSessions) {
5
+ const rolePermissions = createIdentityRolePermissionProvider(database, permissions);
6
+ const service = new IdentityRolesService(database, rolePermissions, mutate, recordAudit, activeOrganization, revokeRoleSessions);
7
+ return Object.freeze({
8
+ activeCustomRole,
9
+ customRoleInApp,
10
+ customRoleNameSource,
11
+ customRoleIdsSource,
12
+ async permissionIds(db, portal, customRoleId, appId, tenantId) {
13
+ if (!customRoleId)
14
+ return rolePermissions.permissionIds(db, portal, false);
15
+ if (portal !== "user" || !(await activeCustomRole(db, customRoleId, appId, tenantId)))
16
+ return null;
17
+ return rolePermissions.permissionIds(db, customRoleId, true);
18
+ },
19
+ async verify() {
20
+ await verifyRoleSchema(database);
21
+ await rolePermissions.verify();
22
+ },
23
+ list: service.list.bind(service),
24
+ show: service.show.bind(service),
25
+ resolve: service.resolve.bind(service),
26
+ create: service.create.bind(service),
27
+ update: service.update.bind(service),
28
+ updateSystemPermissions: service.updateSystemPermissions.bind(service)
29
+ });
30
+ }
@@ -0,0 +1,38 @@
1
+ import { type Kysely, type RawBuilder } from "kysely";
2
+ import type { IdentitySchema, Principal } from "../identity.types.js";
3
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
4
+ export declare function listRoles(db: Kysely<IdentitySchema>, actor: Principal, query: IdentityListQuery, permissionJson: {
5
+ system(id: RawBuilder<unknown>): RawBuilder<unknown>;
6
+ custom(id: RawBuilder<unknown>): RawBuilder<unknown>;
7
+ }): Promise<{
8
+ data: {
9
+ version: number;
10
+ active: boolean;
11
+ system: boolean;
12
+ permissionIds: string[];
13
+ }[];
14
+ meta: {
15
+ page: number;
16
+ perPage: number;
17
+ total: number;
18
+ lastPage: number;
19
+ };
20
+ }>;
21
+ export declare function showRole(db: Kysely<IdentitySchema>, actor: Principal, id: string, permissionJson: {
22
+ system(id: RawBuilder<unknown>): RawBuilder<unknown>;
23
+ custom(id: RawBuilder<unknown>): RawBuilder<unknown>;
24
+ }): Promise<{
25
+ version: number;
26
+ active: boolean;
27
+ system: boolean;
28
+ permissionIds: string[];
29
+ } | undefined>;
30
+ export declare function verifyRoleSchema(db: Kysely<IdentitySchema>): Promise<void>;
31
+ export declare function activeCustomRole(db: Kysely<IdentitySchema>, id: string, appId: string, tenantId: string): Promise<{
32
+ id: string;
33
+ } | undefined>;
34
+ export declare function customRoleInApp(db: Kysely<IdentitySchema>, id: string, appId: string): Promise<{
35
+ id: string;
36
+ } | undefined>;
37
+ export declare const customRoleNameSource: () => RawBuilder<unknown>;
38
+ export declare const customRoleIdsSource: (appId: string) => RawBuilder<unknown>;
@@ -0,0 +1,46 @@
1
+ import { sql } from "kysely";
2
+ import { listRows, showRow } from "../support/pagination.js";
3
+ const presentRole = (row) => ({
4
+ ...row,
5
+ version: Number(row.version),
6
+ active: Boolean(row.active),
7
+ system: Boolean(row.system),
8
+ permissionIds: JSON.parse(String(row.permissionIds))
9
+ });
10
+ export function listRoles(db, actor, query, permissionJson) {
11
+ return listRows(db, roleListSource(actor, permissionJson), ["id", "name"], query, presentRole);
12
+ }
13
+ export function showRole(db, actor, id, permissionJson) {
14
+ return showRow(db, roleListSource(actor, permissionJson), id, presentRole);
15
+ }
16
+ export async function verifyRoleSchema(db) {
17
+ await db.selectFrom("identity_roles").select(["id", "version"]).limit(1).execute();
18
+ await db
19
+ .selectFrom("identity_custom_roles")
20
+ .select(["app_id", "tenant_id", "version"])
21
+ .limit(1)
22
+ .execute();
23
+ }
24
+ export function activeCustomRole(db, id, appId, tenantId) {
25
+ return db
26
+ .selectFrom("identity_custom_roles")
27
+ .select("id")
28
+ .where("id", "=", id)
29
+ .where("app_id", "=", appId)
30
+ .where("tenant_id", "=", tenantId)
31
+ .where("active", "=", 1)
32
+ .executeTakeFirst();
33
+ }
34
+ export function customRoleInApp(db, id, appId) {
35
+ return db.selectFrom("identity_custom_roles").select("id")
36
+ .where("id", "=", id).where("app_id", "=", appId).executeTakeFirst();
37
+ }
38
+ export const customRoleNameSource = () => sql `select id,name,app_id from identity_custom_roles`;
39
+ export const customRoleIdsSource = (appId) => sql `select id from identity_custom_roles where app_id=${appId}`;
40
+ function roleListSource(actor, permissionJson) {
41
+ const global = actor.portal === "super-admin";
42
+ return sql `select r.id,r.id as name,r.id as portal,1 as system,null as tenantId,1 as active,r.version,${permissionJson.system(sql.ref("r.id"))} as permissionIds from identity_roles r
43
+ union all select c.id,c.name,'user' as portal,0 as system,c.tenant_id as tenantId,c.active,c.version,
44
+ ${permissionJson.custom(sql.ref("c.id"))} as permissionIds
45
+ from identity_custom_roles c where c.app_id=${actor.appId} ${global ? sql `` : sql `and c.tenant_id=${actor.tenant.id}`}`;
46
+ }
@@ -0,0 +1,5 @@
1
+ export declare const roleResource: "roles";
2
+ export declare const roleResourceRoute: (controller: import("./role.controller.js").IdentityRoleController) => {
3
+ resource: "roles";
4
+ controller: import("./role.controller.js").IdentityRoleController;
5
+ };
@@ -0,0 +1,2 @@
1
+ export const roleResource = "roles";
2
+ export const roleResourceRoute = (controller) => ({ resource: roleResource, controller });
@@ -0,0 +1,16 @@
1
+ import { z } from "zod";
2
+ export declare const roleUpdateSchema: z.ZodObject<{
3
+ permissionIds: z.ZodArray<z.ZodString>;
4
+ expectedVersion: z.ZodNumber;
5
+ }, z.core.$strict>;
6
+ export declare const customRoleCreateSchema: z.ZodObject<{
7
+ name: z.ZodString;
8
+ permissionIds: z.ZodArray<z.ZodString>;
9
+ tenantId: z.ZodOptional<z.ZodString>;
10
+ }, z.core.$strict>;
11
+ export declare const customRoleUpdateSchema: z.ZodObject<{
12
+ name: z.ZodOptional<z.ZodString>;
13
+ permissionIds: z.ZodOptional<z.ZodArray<z.ZodString>>;
14
+ active: z.ZodOptional<z.ZodBoolean>;
15
+ expectedVersion: z.ZodNumber;
16
+ }, z.core.$strict>;
@@ -0,0 +1,27 @@
1
+ import { z } from "zod";
2
+ import { identityKeySchema } from "../support/identity.schema.js";
3
+ import { permissionIdsSchema } from "../role-permission/role-permission.schema.js";
4
+ const name = z.string().trim().min(1).max(100);
5
+ const expectedVersion = z.number().int().min(0);
6
+ export const roleUpdateSchema = z
7
+ .object({
8
+ permissionIds: permissionIdsSchema,
9
+ expectedVersion
10
+ })
11
+ .strict();
12
+ export const customRoleCreateSchema = z
13
+ .object({
14
+ name,
15
+ permissionIds: permissionIdsSchema,
16
+ tenantId: identityKeySchema.optional()
17
+ })
18
+ .strict();
19
+ export const customRoleUpdateSchema = z
20
+ .object({
21
+ name: name.optional(),
22
+ permissionIds: permissionIdsSchema.optional(),
23
+ active: z.boolean().optional(),
24
+ expectedVersion
25
+ })
26
+ .strict()
27
+ .refine((input) => Object.keys(input).length > 1, "Provide a changed field.");
@@ -0,0 +1,3 @@
1
+ import type { Transaction } from "kysely";
2
+ import type { IdentitySchema } from "../identity.types.js";
3
+ export declare function seedRoles(trx: Transaction<IdentitySchema>): Promise<void>;
@@ -0,0 +1,8 @@
1
+ export async function seedRoles(trx) {
2
+ for (const portal of ["user", "admin", "super-admin"])
3
+ await trx
4
+ .insertInto("identity_roles")
5
+ .values({ id: portal })
6
+ .onConflict((c) => c.column("id").doNothing())
7
+ .execute();
8
+ }
@@ -0,0 +1,69 @@
1
+ import type { IdentityRolePermissionProvider } from "../role-permission/index.js";
2
+ import { type Kysely, type Transaction } from "kysely";
3
+ import type { IdentityMutation, IdentitySchema, Portal, Principal } from "../identity.types.js";
4
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
5
+ export declare class IdentityRolesService {
6
+ private readonly db;
7
+ private readonly rolePermissions;
8
+ private readonly mutate;
9
+ private readonly recordAudit;
10
+ private readonly activeOrganization;
11
+ private readonly revokeRoleSessions;
12
+ constructor(db: Kysely<IdentitySchema>, rolePermissions: IdentityRolePermissionProvider, mutate: IdentityMutation, recordAudit: (trx: Transaction<IdentitySchema>, actor: Principal, tenantId: string, action: string, id: string) => Promise<void>, activeOrganization: (trx: Transaction<IdentitySchema>, id: string) => Promise<unknown>, revokeRoleSessions: (trx: Transaction<IdentitySchema>, appId: string, tenantId: string, roleId: string) => Promise<void>);
13
+ list(actor: Principal, query: IdentityListQuery): Promise<{
14
+ data: {
15
+ version: number;
16
+ active: boolean;
17
+ system: boolean;
18
+ permissionIds: string[];
19
+ }[];
20
+ meta: {
21
+ page: number;
22
+ perPage: number;
23
+ total: number;
24
+ lastPage: number;
25
+ };
26
+ }>;
27
+ show(actor: Principal, id: string): Promise<{
28
+ version: number;
29
+ active: boolean;
30
+ system: boolean;
31
+ permissionIds: string[];
32
+ } | undefined>;
33
+ resolve(database: Kysely<IdentitySchema>, actor: Principal, roleId: string, tenantId: string): Promise<{
34
+ portal: Portal;
35
+ customRoleId: null;
36
+ } | {
37
+ portal: "user";
38
+ customRoleId: string;
39
+ }>;
40
+ create(actor: Principal, raw: unknown): Promise<{
41
+ id: `${string}-${string}-${string}-${string}-${string}`;
42
+ name: string;
43
+ tenantId: string;
44
+ portal: string;
45
+ system: boolean;
46
+ active: boolean;
47
+ version: number;
48
+ permissionIds: string[];
49
+ }>;
50
+ update(actor: Principal, id: string, raw: unknown): Promise<{
51
+ id: string;
52
+ name: string;
53
+ tenantId: string;
54
+ portal: string;
55
+ system: boolean;
56
+ active: boolean;
57
+ version: number;
58
+ permissionIds: string[];
59
+ }>;
60
+ updateSystemPermissions(actor: Principal, id: string, raw: unknown): Promise<{
61
+ id: string;
62
+ permissionIds: string[];
63
+ version: number;
64
+ }>;
65
+ private manage;
66
+ private scope;
67
+ private uniqueName;
68
+ private audit;
69
+ }
@@ -0,0 +1,192 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { sql } from "kysely";
3
+ import { IdentityError } from "../support/identity.error.js";
4
+ import { checkIdentityRequest } from "../support/identity.request-context.js";
5
+ import { customRoleCreateSchema, customRoleUpdateSchema, roleUpdateSchema } from "./role.schema.js";
6
+ import { listRoles, showRole } from "./role.repository.js";
7
+ export class IdentityRolesService {
8
+ db;
9
+ rolePermissions;
10
+ mutate;
11
+ recordAudit;
12
+ activeOrganization;
13
+ revokeRoleSessions;
14
+ constructor(db, rolePermissions, mutate, recordAudit, activeOrganization, revokeRoleSessions) {
15
+ this.db = db;
16
+ this.rolePermissions = rolePermissions;
17
+ this.mutate = mutate;
18
+ this.recordAudit = recordAudit;
19
+ this.activeOrganization = activeOrganization;
20
+ this.revokeRoleSessions = revokeRoleSessions;
21
+ }
22
+ list(actor, query) {
23
+ if (actor.portal === "user")
24
+ throw new IdentityError(403, "Access denied.");
25
+ return listRoles(this.db, actor, query, {
26
+ system: this.rolePermissions.systemPermissionJson,
27
+ custom: this.rolePermissions.customPermissionJson
28
+ });
29
+ }
30
+ show(actor, id) {
31
+ if (actor.portal === "user")
32
+ throw new IdentityError(403, "Access denied.");
33
+ return showRole(this.db, actor, id, {
34
+ system: this.rolePermissions.systemPermissionJson,
35
+ custom: this.rolePermissions.customPermissionJson
36
+ });
37
+ }
38
+ async resolve(database, actor, roleId, tenantId) {
39
+ if (["user", "admin", "super-admin"].includes(roleId)) {
40
+ if (actor.portal !== "super-admin" && roleId !== "user")
41
+ throw new IdentityError(403, "Only super administrators can assign privileged roles.");
42
+ return { portal: roleId, customRoleId: null };
43
+ }
44
+ const role = await database
45
+ .selectFrom("identity_custom_roles")
46
+ .select("id")
47
+ .where("id", "=", roleId)
48
+ .where("app_id", "=", actor.appId)
49
+ .where("tenant_id", "=", tenantId)
50
+ .where("active", "=", 1)
51
+ .executeTakeFirst();
52
+ if (!role)
53
+ throw new IdentityError(422, "Select an active role in this organization.");
54
+ return { portal: "user", customRoleId: role.id };
55
+ }
56
+ async create(actor, raw) {
57
+ this.manage(actor);
58
+ const input = customRoleCreateSchema.parse(raw);
59
+ const tenantId = input.tenantId ?? actor.tenant.id;
60
+ this.scope(actor, tenantId);
61
+ return this.db.transaction().execute(async (trx) => {
62
+ checkIdentityRequest();
63
+ const tenant = await this.activeOrganization(trx, tenantId);
64
+ if (!tenant)
65
+ throw new IdentityError(422, "Organization is inactive or unavailable.");
66
+ await this.rolePermissions.validate(trx, input.permissionIds, actor.appId);
67
+ await this.uniqueName(trx, actor.appId, tenantId, input.name);
68
+ const id = randomUUID();
69
+ await trx
70
+ .insertInto("identity_custom_roles")
71
+ .values({
72
+ id,
73
+ app_id: actor.appId,
74
+ tenant_id: tenantId,
75
+ name: input.name
76
+ })
77
+ .execute();
78
+ await this.rolePermissions.replace(trx, id, input.permissionIds);
79
+ await this.audit(trx, actor, tenantId, "identity.role.created", id);
80
+ checkIdentityRequest();
81
+ return {
82
+ id,
83
+ name: input.name,
84
+ tenantId,
85
+ portal: "user",
86
+ system: false,
87
+ active: true,
88
+ version: 0,
89
+ permissionIds: [...new Set(input.permissionIds)]
90
+ };
91
+ });
92
+ }
93
+ async update(actor, id, raw) {
94
+ this.manage(actor);
95
+ const input = customRoleUpdateSchema.parse(raw);
96
+ return this.db.transaction().execute(async (trx) => {
97
+ checkIdentityRequest();
98
+ const role = await trx
99
+ .selectFrom("identity_custom_roles")
100
+ .selectAll()
101
+ .where("id", "=", id)
102
+ .where("app_id", "=", actor.appId)
103
+ .executeTakeFirst();
104
+ if (!role || (actor.portal !== "super-admin" && role.tenant_id !== actor.tenant.id))
105
+ throw new IdentityError(404, "Role not found.");
106
+ if (Number(role.version) !== input.expectedVersion)
107
+ throw new IdentityError(409, "This record changed. Reload before saving.");
108
+ if (input.permissionIds)
109
+ await this.rolePermissions.validate(trx, input.permissionIds, actor.appId);
110
+ if (input.name)
111
+ await this.uniqueName(trx, actor.appId, role.tenant_id, input.name, id);
112
+ const updated = await trx
113
+ .updateTable("identity_custom_roles")
114
+ .set({
115
+ name: input.name ?? role.name,
116
+ active: input.active === undefined ? role.active : Number(input.active),
117
+ version: input.expectedVersion + 1
118
+ })
119
+ .where("id", "=", id)
120
+ .where("version", "=", input.expectedVersion)
121
+ .executeTakeFirst();
122
+ if (updated.numUpdatedRows !== 1n)
123
+ throw new IdentityError(409, "This record changed. Reload before saving.");
124
+ if (input.permissionIds)
125
+ await this.rolePermissions.replace(trx, id, input.permissionIds);
126
+ await this.revokeRoleSessions(trx, actor.appId, role.tenant_id, id);
127
+ await this.audit(trx, actor, role.tenant_id, "identity.role.changed", id);
128
+ const permissions = await this.rolePermissions.permissionIds(trx, id, true);
129
+ checkIdentityRequest();
130
+ return {
131
+ id,
132
+ name: input.name ?? role.name,
133
+ tenantId: role.tenant_id,
134
+ portal: "user",
135
+ system: false,
136
+ active: input.active ?? Boolean(role.active),
137
+ version: input.expectedVersion + 1,
138
+ permissionIds: permissions
139
+ };
140
+ });
141
+ }
142
+ async updateSystemPermissions(actor, id, raw) {
143
+ this.manage(actor);
144
+ if (actor.portal !== "super-admin")
145
+ throw new IdentityError(403, "Only super administrators can change this resource.");
146
+ const input = roleUpdateSchema.parse(raw);
147
+ return this.mutate(actor, "roles", id, async (trx) => {
148
+ const current = await trx
149
+ .selectFrom("identity_roles")
150
+ .select("version")
151
+ .where("id", "=", id)
152
+ .executeTakeFirst();
153
+ if (!current)
154
+ throw new IdentityError(404, "Role not found.");
155
+ if (Number(current.version) !== input.expectedVersion)
156
+ throw new IdentityError(409, "This record changed. Reload before saving.");
157
+ await this.rolePermissions.replaceSystem(trx, id, actor.appId, input.permissionIds);
158
+ await trx
159
+ .updateTable("identity_roles")
160
+ .set({ version: sql `version + 1` })
161
+ .where("id", "=", id)
162
+ .execute();
163
+ return {
164
+ id,
165
+ permissionIds: [...new Set(input.permissionIds)],
166
+ version: input.expectedVersion + 1
167
+ };
168
+ });
169
+ }
170
+ manage(actor) {
171
+ if (actor.portal === "user" || !actor.permissions.includes("identity.manage"))
172
+ throw new IdentityError(403, "Access denied.");
173
+ }
174
+ scope(actor, tenantId) {
175
+ if (actor.portal !== "super-admin" && tenantId !== actor.tenant.id)
176
+ throw new IdentityError(403, "Access denied.");
177
+ }
178
+ async uniqueName(trx, appId, tenantId, name, exceptId = "") {
179
+ if (await trx
180
+ .selectFrom("identity_custom_roles")
181
+ .select("id")
182
+ .where("app_id", "=", appId)
183
+ .where("tenant_id", "=", tenantId)
184
+ .where("name", "=", name)
185
+ .where("id", "!=", exceptId)
186
+ .executeTakeFirst())
187
+ throw new IdentityError(409, "A role with this name already exists.");
188
+ }
189
+ async audit(trx, actor, tenantId, action, resourceId) {
190
+ await this.recordAudit(trx, actor, tenantId, action, resourceId);
191
+ }
192
+ }
@@ -0,0 +1,17 @@
1
+ import type { Generated } from "kysely";
2
+ export interface IdentityRoleTables {
3
+ identity_roles: {
4
+ id: string;
5
+ version: Generated<number>;
6
+ };
7
+ identity_custom_roles: {
8
+ id: string;
9
+ app_id: string;
10
+ tenant_id: string;
11
+ name: string;
12
+ active: Generated<number>;
13
+ version: Generated<number>;
14
+ };
15
+ }
16
+ export type IdentityRoleRow = IdentityRoleTables["identity_roles"];
17
+ export type IdentityCustomRoleRow = IdentityRoleTables["identity_custom_roles"];
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export { createIdentityRolePermissionProvider } from "./role-permission.provider.js";
2
+ export type { IdentityRolePermissionProvider } from "./role-permission.provider.js";
3
+ export { seedRolePermissions } from "./role-permission.seed.js";
4
+ export { rolePermissionRoutes } from "./role-permission.routes.js";
5
+ export { permissionIdsSchema } from "./role-permission.schema.js";
6
+ export type { IdentityRolePermissionRow, IdentityCustomRolePermissionRow } from "./role-permission.types.js";
@@ -0,0 +1,4 @@
1
+ export { createIdentityRolePermissionProvider } from "./role-permission.provider.js";
2
+ export { seedRolePermissions } from "./role-permission.seed.js";
3
+ export { rolePermissionRoutes } from "./role-permission.routes.js";
4
+ export { permissionIdsSchema } from "./role-permission.schema.js";
@@ -0,0 +1,14 @@
1
+ import type { Kysely, Transaction } from "kysely";
2
+ import type { IdentitySchema } from "../identity.types.js";
3
+ import type { IdentityPermissionProvider } from "../permission/index.js";
4
+ import { systemPermissionJson, customPermissionJson } from "./role-permission.repository.js";
5
+ export interface IdentityRolePermissionProvider {
6
+ verify(): Promise<void>;
7
+ permissionIds(db: Kysely<IdentitySchema>, roleId: string, custom: boolean): Promise<string[]>;
8
+ systemPermissionJson: typeof systemPermissionJson;
9
+ customPermissionJson: typeof customPermissionJson;
10
+ validate(trx: Transaction<IdentitySchema>, ids: string[], appId: string): Promise<void>;
11
+ replace(trx: Transaction<IdentitySchema>, roleId: string, permissions: string[]): Promise<void>;
12
+ replaceSystem(trx: Transaction<IdentitySchema>, roleId: string, appId: string, permissions: string[]): Promise<void>;
13
+ }
14
+ export declare function createIdentityRolePermissionProvider(database: Kysely<IdentitySchema>, permissions: IdentityPermissionProvider): IdentityRolePermissionProvider;