@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,15 @@
1
+ import { IdentityRolePermissionRepository, systemPermissionJson, customPermissionJson } from "./role-permission.repository.js";
2
+ import { IdentityRolePermissionService } from "./role-permission.service.js";
3
+ export function createIdentityRolePermissionProvider(database, permissions) {
4
+ const repository = new IdentityRolePermissionRepository(database);
5
+ const service = new IdentityRolePermissionService(permissions, repository);
6
+ return Object.freeze({
7
+ verify: repository.verifySchema.bind(repository),
8
+ permissionIds: repository.permissionIds.bind(repository),
9
+ systemPermissionJson,
10
+ customPermissionJson,
11
+ validate: service.validate.bind(service),
12
+ replace: service.replace.bind(service),
13
+ replaceSystem: service.replaceSystem.bind(service)
14
+ });
15
+ }
@@ -0,0 +1,12 @@
1
+ import { type Kysely, type RawBuilder, type Transaction } from "kysely";
2
+ import type { IdentitySchema } from "../identity.types.js";
3
+ export declare class IdentityRolePermissionRepository {
4
+ private readonly db;
5
+ constructor(db: Kysely<IdentitySchema>);
6
+ verifySchema(): Promise<void>;
7
+ permissionIds(db: Kysely<IdentitySchema>, roleId: string, custom: boolean): Promise<string[]>;
8
+ replaceCustom(trx: Transaction<IdentitySchema>, roleId: string, ids: string[]): Promise<void>;
9
+ replaceSystem(trx: Transaction<IdentitySchema>, roleId: string, ids: string[]): Promise<void>;
10
+ }
11
+ export declare const systemPermissionJson: (roleId: RawBuilder<unknown>) => RawBuilder<unknown>;
12
+ export declare const customPermissionJson: (roleId: RawBuilder<unknown>) => RawBuilder<unknown>;
@@ -0,0 +1,51 @@
1
+ import { sql } from "kysely";
2
+ export class IdentityRolePermissionRepository {
3
+ db;
4
+ constructor(db) {
5
+ this.db = db;
6
+ }
7
+ async verifySchema() {
8
+ await this.db
9
+ .selectFrom("identity_role_permissions")
10
+ .select("permission_id")
11
+ .limit(1)
12
+ .execute();
13
+ await this.db
14
+ .selectFrom("identity_custom_role_permissions")
15
+ .select("permission_id")
16
+ .limit(1)
17
+ .execute();
18
+ }
19
+ async permissionIds(db, roleId, custom) {
20
+ const table = custom
21
+ ? "identity_custom_role_permissions"
22
+ : "identity_role_permissions";
23
+ const rows = await db
24
+ .selectFrom(table)
25
+ .select("permission_id")
26
+ .where("role_id", "=", roleId)
27
+ .execute();
28
+ return rows.map((row) => row.permission_id);
29
+ }
30
+ async replaceCustom(trx, roleId, ids) {
31
+ await trx
32
+ .deleteFrom("identity_custom_role_permissions")
33
+ .where("role_id", "=", roleId)
34
+ .execute();
35
+ for (const permission of new Set(ids))
36
+ await trx
37
+ .insertInto("identity_custom_role_permissions")
38
+ .values({ role_id: roleId, permission_id: permission })
39
+ .execute();
40
+ }
41
+ async replaceSystem(trx, roleId, ids) {
42
+ await trx.deleteFrom("identity_role_permissions").where("role_id", "=", roleId).execute();
43
+ for (const permission of new Set(ids))
44
+ await trx
45
+ .insertInto("identity_role_permissions")
46
+ .values({ role_id: roleId, permission_id: permission })
47
+ .execute();
48
+ }
49
+ }
50
+ export const systemPermissionJson = (roleId) => sql `(select json_group_array(permission_id) from identity_role_permissions p where p.role_id=${roleId})`;
51
+ export const customPermissionJson = (roleId) => sql `(select json_group_array(permission_id) from identity_custom_role_permissions p where p.role_id=${roleId})`;
@@ -0,0 +1 @@
1
+ export declare const rolePermissionRoutes: readonly [];
@@ -0,0 +1,2 @@
1
+ // Role permission changes use the role resource endpoint.
2
+ export const rolePermissionRoutes = [];
@@ -0,0 +1,2 @@
1
+ import { z } from "zod";
2
+ export declare const permissionIdsSchema: z.ZodArray<z.ZodString>;
@@ -0,0 +1,3 @@
1
+ import { z } from "zod";
2
+ import { resourceIdSchema } from "../support/identity.schema.js";
3
+ export const permissionIdsSchema = z.array(resourceIdSchema).max(100);
@@ -0,0 +1,3 @@
1
+ import type { Transaction } from "kysely";
2
+ import type { IdentitySchema } from "../identity.types.js";
3
+ export declare function seedRolePermissions(trx: Transaction<IdentitySchema>): Promise<void>;
@@ -0,0 +1,10 @@
1
+ import { defaultPermissions } from "../permission/index.js";
2
+ export async function seedRolePermissions(trx) {
3
+ for (const portal of ["user", "admin", "super-admin"])
4
+ for (const permission of defaultPermissions(portal))
5
+ await trx
6
+ .insertInto("identity_role_permissions")
7
+ .values({ role_id: portal, permission_id: permission })
8
+ .onConflict((c) => c.columns(["role_id", "permission_id"]).doNothing())
9
+ .execute();
10
+ }
@@ -0,0 +1,13 @@
1
+ import type { Transaction } from "kysely";
2
+ import type { IdentitySchema } from "../identity.types.js";
3
+ import type { IdentityPermissionProvider } from "../permission/index.js";
4
+ import { IdentityRolePermissionRepository } from "./role-permission.repository.js";
5
+ export declare class IdentityRolePermissionService {
6
+ private readonly permissions;
7
+ private readonly repository;
8
+ constructor(permissions: IdentityPermissionProvider, repository: IdentityRolePermissionRepository);
9
+ validate(trx: Transaction<IdentitySchema>, ids: string[], appId: string): Promise<void>;
10
+ replace(trx: Transaction<IdentitySchema>, roleId: string, ids: string[]): Promise<void>;
11
+ replaceSystem(trx: Transaction<IdentitySchema>, roleId: string, appId: string, ids: string[]): Promise<void>;
12
+ private validateKnown;
13
+ }
@@ -0,0 +1,35 @@
1
+ import { IdentityError } from "../support/identity.error.js";
2
+ export class IdentityRolePermissionService {
3
+ permissions;
4
+ repository;
5
+ constructor(permissions, repository) {
6
+ this.permissions = permissions;
7
+ this.repository = repository;
8
+ }
9
+ async validate(trx, ids, appId) {
10
+ await this.permissions.validateDeclared(trx, appId, "user", ids);
11
+ if (!ids.includes("desk.user"))
12
+ throw new IdentityError(422, "Keep the user desk permission.");
13
+ if (ids.some((id) => id === "identity.manage" || (id.startsWith("desk.") && id !== "desk.user")))
14
+ throw new IdentityError(403, "Custom user roles cannot grant administration access.");
15
+ await this.validateKnown(trx, ids);
16
+ }
17
+ async replace(trx, roleId, ids) {
18
+ await this.repository.replaceCustom(trx, roleId, ids);
19
+ }
20
+ async replaceSystem(trx, roleId, appId, ids) {
21
+ const portal = roleId;
22
+ if (!ids.includes(`desk.${portal}`) || !ids.includes("identity.password"))
23
+ throw new IdentityError(409, "Keep required portal and password permissions.");
24
+ if (portal !== "user" && !ids.includes("identity.manage"))
25
+ throw new IdentityError(409, "Keep administration permission on administrator roles.");
26
+ await this.permissions.validateDeclared(trx, appId, portal, ids);
27
+ await this.validateKnown(trx, ids);
28
+ if (portal === "user" && ids.some((id) => id.startsWith("identity.manage")))
29
+ throw new IdentityError(403, "User roles cannot receive administration permissions.");
30
+ await this.repository.replaceSystem(trx, portal, ids);
31
+ }
32
+ async validateKnown(trx, ids) {
33
+ await this.permissions.validateKnown(trx, ids);
34
+ }
35
+ }
@@ -0,0 +1,12 @@
1
+ export interface IdentityRolePermissionTables {
2
+ identity_role_permissions: {
3
+ role_id: string;
4
+ permission_id: string;
5
+ };
6
+ identity_custom_role_permissions: {
7
+ role_id: string;
8
+ permission_id: string;
9
+ };
10
+ }
11
+ export type IdentityRolePermissionRow = IdentityRolePermissionTables["identity_role_permissions"];
12
+ export type IdentityCustomRolePermissionRow = IdentityRolePermissionTables["identity_custom_role_permissions"];
@@ -0,0 +1,6 @@
1
+ export { createIdentitySessionProvider } from "./session.provider.js";
2
+ export { sessionResource, sessionResourceRoute, sessionRoutes, portalRoutes } from "./session.routes.js";
3
+ export { loginSchema } from "./session.schema.js";
4
+ export type { IdentitySessionRow } from "./session.types.js";
5
+ export { IdentitySessionAuthenticationController } from "./session.authentication.controller.js";
6
+ export { IdentitySessionController } from "./session.controller.js";
@@ -0,0 +1,5 @@
1
+ export { createIdentitySessionProvider } from "./session.provider.js";
2
+ export { sessionResource, sessionResourceRoute, sessionRoutes, portalRoutes } from "./session.routes.js";
3
+ export { loginSchema } from "./session.schema.js";
4
+ export { IdentitySessionAuthenticationController } from "./session.authentication.controller.js";
5
+ export { IdentitySessionController } from "./session.controller.js";
@@ -0,0 +1,30 @@
1
+ import type { IdentityConfig, Portal, Principal } from "../identity.types.js";
2
+ import type { IdentityUserProvider } from "../user/index.js";
3
+ export declare class IdentitySessionAuthenticationController {
4
+ private readonly identity;
5
+ private readonly config;
6
+ constructor(identity: IdentityUserProvider["identity"], config: IdentityConfig);
7
+ login(portal: Portal, raw: unknown, address: string, previous?: string): Promise<{
8
+ token: string;
9
+ sessionSeconds: number;
10
+ principal: {
11
+ user: {
12
+ id: string;
13
+ email: string;
14
+ name: string;
15
+ };
16
+ tenant: {
17
+ id: string;
18
+ name: string;
19
+ };
20
+ permissions: string[];
21
+ appId: string;
22
+ portal: Portal;
23
+ };
24
+ }>;
25
+ authenticate(portal: Portal, token?: string): Promise<Principal>;
26
+ current(principal: Principal, portal: Portal): Principal;
27
+ logout(portal: Portal, token?: string): Promise<void>;
28
+ changePassword(principal: Principal, raw: unknown): Promise<void>;
29
+ requireDesk(principal: Principal, portal: Portal): void;
30
+ }
@@ -0,0 +1,37 @@
1
+ import { IdentityError } from "../support/identity.error.js";
2
+ import { loginSchema } from "./session.schema.js";
3
+ import { passwordSchema } from "../user/index.js";
4
+ export class IdentitySessionAuthenticationController {
5
+ identity;
6
+ config;
7
+ constructor(identity, config) {
8
+ this.identity = identity;
9
+ this.config = config;
10
+ }
11
+ login(portal, raw, address, previous) {
12
+ const input = loginSchema
13
+ .refine((value) => this.config.mode !== "multi-tenant" || Boolean(value.tenantId), {
14
+ path: ["tenantId"],
15
+ message: "Enter an organization ID."
16
+ })
17
+ .parse(raw);
18
+ return this.identity.login(portal, input, address, previous);
19
+ }
20
+ authenticate(portal, token) {
21
+ return this.identity.authenticate(portal, token);
22
+ }
23
+ current(principal, portal) {
24
+ this.identity.requirePermission(principal, `desk.${portal}`);
25
+ return principal;
26
+ }
27
+ logout(portal, token) {
28
+ return this.identity.logout(portal, token);
29
+ }
30
+ changePassword(principal, raw) {
31
+ return this.identity.changePassword(principal, passwordSchema.parse(raw));
32
+ }
33
+ requireDesk(principal, portal) {
34
+ if (!principal.permissions.includes(`desk.${portal}`))
35
+ throw new IdentityError(403, "Access denied.");
36
+ }
37
+ }
@@ -0,0 +1,18 @@
1
+ import type { Principal } from "../identity.types.js";
2
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
3
+ import type { createIdentitySessionProvider } from "./session.provider.js";
4
+ export declare class IdentitySessionController {
5
+ private readonly service;
6
+ constructor(service: ReturnType<typeof createIdentitySessionProvider>);
7
+ index(actor: Principal, query: IdentityListQuery): Promise<{
8
+ data: Record<string, unknown>[];
9
+ meta: {
10
+ page: number;
11
+ perPage: number;
12
+ total: number;
13
+ lastPage: number;
14
+ };
15
+ }>;
16
+ show(actor: Principal, id: string): Promise<Record<string, unknown> | undefined>;
17
+ destroy(actor: Principal, id: string): Promise<void>;
18
+ }
@@ -0,0 +1,15 @@
1
+ export class IdentitySessionController {
2
+ service;
3
+ constructor(service) {
4
+ this.service = service;
5
+ }
6
+ index(actor, query) {
7
+ return this.service.list(actor, query);
8
+ }
9
+ show(actor, id) {
10
+ return this.service.show(actor, id);
11
+ }
12
+ destroy(actor, id) {
13
+ return this.service.remove(actor, id);
14
+ }
15
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,34 @@
1
+ import type { Kysely } from "kysely";
2
+ import type { IdentityMutation, IdentitySchema } from "../identity.types.js";
3
+ export declare function createIdentitySessionProvider(database: Kysely<IdentitySchema>, mutate: IdentityMutation): Readonly<{
4
+ verify: () => Promise<void>;
5
+ list: (actor: import("../identity.types.js").Principal, query: import("../index.js").IdentityListQuery) => Promise<{
6
+ data: Record<string, unknown>[];
7
+ meta: {
8
+ page: number;
9
+ perPage: number;
10
+ total: number;
11
+ lastPage: number;
12
+ };
13
+ }>;
14
+ show: (actor: import("../identity.types.js").Principal, id: string) => Promise<Record<string, unknown> | undefined>;
15
+ remove: (actor: import("../identity.types.js").Principal, id: string) => Promise<void>;
16
+ revokeTenant: (trx: import("kysely").Transaction<IdentitySchema>, tenantId: string) => Promise<void>;
17
+ revokeApp: (trx: import("kysely").Transaction<IdentitySchema>, appId: string) => Promise<void>;
18
+ revokeOne: (trx: import("kysely").Transaction<IdentitySchema>, appId: string, tokenHash: string) => Promise<void>;
19
+ revokeUser: (trx: import("kysely").Transaction<IdentitySchema>, userId: string) => Promise<void>;
20
+ revokeMembership: (trx: import("kysely").Transaction<IdentitySchema>, appId: string, userId: string, tenantId: string, portal: import("../identity.types.js").Portal) => Promise<void>;
21
+ revokeRoleMembers: (trx: import("kysely").Transaction<IdentitySchema>, appId: string, tenantId: string, userIds: string[]) => Promise<void>;
22
+ active: (tokenHash: string, appId: string, portal: import("../identity.types.js").Portal, now: string) => Promise<{
23
+ app_id: string;
24
+ expires_at: string;
25
+ portal: import("../identity.types.js").Portal;
26
+ tenant_id: string;
27
+ token_hash: string;
28
+ user_id: string;
29
+ } | undefined>;
30
+ create: (session: IdentitySchema["identity_sessions"], previous: string | undefined, eligible: (trx: import("kysely").Transaction<IdentitySchema>) => Promise<boolean>) => Promise<boolean>;
31
+ revoke: (tokenHash: string, appId: string, portal: import("../identity.types.js").Portal) => Promise<void>;
32
+ throttle: (key: string) => Promise<number>;
33
+ clearThrottle: (key: string) => Promise<void>;
34
+ }>;
@@ -0,0 +1,23 @@
1
+ import { IdentitySessionRepository } from "./session.repository.js";
2
+ import { IdentitySessionService } from "./session.service.js";
3
+ export function createIdentitySessionProvider(database, mutate) {
4
+ const repository = new IdentitySessionRepository(database);
5
+ const service = new IdentitySessionService(repository, mutate);
6
+ return Object.freeze({
7
+ verify: repository.verifySchema.bind(repository),
8
+ list: service.list.bind(service),
9
+ show: service.show.bind(service),
10
+ remove: service.remove.bind(service),
11
+ revokeTenant: repository.revokeTenant.bind(repository),
12
+ revokeApp: repository.revokeApp.bind(repository),
13
+ revokeOne: repository.revokeOne.bind(repository),
14
+ revokeUser: repository.revokeUser.bind(repository),
15
+ revokeMembership: repository.revokeMembership.bind(repository),
16
+ revokeRoleMembers: repository.revokeRoleMembers.bind(repository),
17
+ active: repository.active.bind(repository),
18
+ create: repository.create.bind(repository),
19
+ revoke: repository.revoke.bind(repository),
20
+ throttle: repository.throttle.bind(repository),
21
+ clearThrottle: repository.clearThrottle.bind(repository)
22
+ });
23
+ }
@@ -0,0 +1,36 @@
1
+ import { type Kysely, type Transaction } from "kysely";
2
+ import type { IdentitySchema, Portal, Principal } from "../identity.types.js";
3
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
4
+ export declare class IdentitySessionRepository {
5
+ private readonly db;
6
+ constructor(db: Kysely<IdentitySchema>);
7
+ verifySchema(): Promise<void>;
8
+ active(tokenHash: string, appId: string, portal: Portal, now: string): Promise<{
9
+ app_id: string;
10
+ expires_at: string;
11
+ portal: Portal;
12
+ tenant_id: string;
13
+ token_hash: string;
14
+ user_id: string;
15
+ } | undefined>;
16
+ create(session: IdentitySchema["identity_sessions"], previous: string | undefined, eligible: (trx: Transaction<IdentitySchema>) => Promise<boolean>): Promise<boolean>;
17
+ revoke(tokenHash: string, appId: string, portal: Portal): Promise<void>;
18
+ throttle(key: string): Promise<number>;
19
+ clearThrottle(key: string): Promise<void>;
20
+ list(actor: Principal, query: IdentityListQuery): Promise<{
21
+ data: Record<string, unknown>[];
22
+ meta: {
23
+ page: number;
24
+ perPage: number;
25
+ total: number;
26
+ lastPage: number;
27
+ };
28
+ }>;
29
+ show(actor: Principal, id: string): Promise<Record<string, unknown> | undefined>;
30
+ revokeTenant(trx: Transaction<IdentitySchema>, tenantId: string): Promise<void>;
31
+ revokeApp(trx: Transaction<IdentitySchema>, appId: string): Promise<void>;
32
+ revokeOne(trx: Transaction<IdentitySchema>, appId: string, tokenHash: string): Promise<void>;
33
+ revokeUser(trx: Transaction<IdentitySchema>, userId: string): Promise<void>;
34
+ revokeMembership(trx: Transaction<IdentitySchema>, appId: string, userId: string, tenantId: string, portal: Portal): Promise<void>;
35
+ revokeRoleMembers(trx: Transaction<IdentitySchema>, appId: string, tenantId: string, userIds: string[]): Promise<void>;
36
+ }
@@ -0,0 +1,128 @@
1
+ import { sql } from "kysely";
2
+ import { checkIdentityRequest } from "../support/identity.request-context.js";
3
+ import { listRows, showRow } from "../support/pagination.js";
4
+ function sessionListSource(actor) {
5
+ const global = actor.portal === "super-admin";
6
+ return sql `select token_hash as id,user_id as userId,tenant_id as tenantId,portal,expires_at as expiresAt from identity_sessions
7
+ where app_id=${actor.appId} and expires_at>${new Date().toISOString()}
8
+ ${global ? sql `` : sql `and tenant_id=${actor.tenant.id}`}
9
+ ${actor.portal === "user" ? sql `and user_id=${actor.user.id}` : sql ``}`;
10
+ }
11
+ export class IdentitySessionRepository {
12
+ db;
13
+ constructor(db) {
14
+ this.db = db;
15
+ }
16
+ async verifySchema() {
17
+ await this.db.selectFrom("identity_sessions").select("token_hash").limit(1).execute();
18
+ await this.db.selectFrom("identity_throttles").select("key").limit(1).execute();
19
+ }
20
+ active(tokenHash, appId, portal, now) {
21
+ return this.db
22
+ .selectFrom("identity_sessions")
23
+ .selectAll()
24
+ .where("token_hash", "=", tokenHash)
25
+ .where("app_id", "=", appId)
26
+ .where("portal", "=", portal)
27
+ .where("expires_at", ">", now)
28
+ .executeTakeFirst();
29
+ }
30
+ async create(session, previous, eligible) {
31
+ return this.db.transaction().execute(async (trx) => {
32
+ checkIdentityRequest();
33
+ if (!(await eligible(trx)))
34
+ return false;
35
+ await trx
36
+ .deleteFrom("identity_sessions")
37
+ .where("expires_at", "<=", new Date().toISOString())
38
+ .execute();
39
+ if (previous)
40
+ await trx
41
+ .deleteFrom("identity_sessions")
42
+ .where("token_hash", "=", previous)
43
+ .where("app_id", "=", session.app_id)
44
+ .where("portal", "=", session.portal)
45
+ .execute();
46
+ await trx.insertInto("identity_sessions").values(session).execute();
47
+ checkIdentityRequest();
48
+ return true;
49
+ });
50
+ }
51
+ async revoke(tokenHash, appId, portal) {
52
+ checkIdentityRequest();
53
+ await this.db
54
+ .deleteFrom("identity_sessions")
55
+ .where("token_hash", "=", tokenHash)
56
+ .where("app_id", "=", appId)
57
+ .where("portal", "=", portal)
58
+ .execute();
59
+ }
60
+ async throttle(key) {
61
+ const now = new Date();
62
+ return this.db.transaction().execute(async (trx) => {
63
+ await trx
64
+ .deleteFrom("identity_throttles")
65
+ .where("expires_at", "<=", now.toISOString())
66
+ .execute();
67
+ await trx
68
+ .insertInto("identity_throttles")
69
+ .values({
70
+ key,
71
+ attempts: 1,
72
+ expires_at: new Date(now.getTime() + 15 * 60 * 1000).toISOString()
73
+ })
74
+ .onConflict((c) => c.column("key").doUpdateSet({ attempts: sql `attempts + 1` }))
75
+ .execute();
76
+ const row = await trx
77
+ .selectFrom("identity_throttles")
78
+ .select("attempts")
79
+ .where("key", "=", key)
80
+ .executeTakeFirstOrThrow();
81
+ return Number(row.attempts);
82
+ });
83
+ }
84
+ async clearThrottle(key) {
85
+ await this.db.deleteFrom("identity_throttles").where("key", "=", key).execute();
86
+ }
87
+ list(actor, query) {
88
+ return listRows(this.db, sessionListSource(actor), ["id"], query, (row) => row);
89
+ }
90
+ show(actor, id) {
91
+ return showRow(this.db, sessionListSource(actor), id, (row) => row);
92
+ }
93
+ async revokeTenant(trx, tenantId) {
94
+ await trx.deleteFrom("identity_sessions").where("tenant_id", "=", tenantId).execute();
95
+ }
96
+ async revokeApp(trx, appId) {
97
+ await trx.deleteFrom("identity_sessions").where("app_id", "=", appId).execute();
98
+ }
99
+ async revokeOne(trx, appId, tokenHash) {
100
+ await trx
101
+ .deleteFrom("identity_sessions")
102
+ .where("token_hash", "=", tokenHash)
103
+ .where("app_id", "=", appId)
104
+ .execute();
105
+ }
106
+ async revokeUser(trx, userId) {
107
+ await trx.deleteFrom("identity_sessions").where("user_id", "=", userId).execute();
108
+ }
109
+ async revokeMembership(trx, appId, userId, tenantId, portal) {
110
+ await trx
111
+ .deleteFrom("identity_sessions")
112
+ .where("app_id", "=", appId)
113
+ .where("user_id", "=", userId)
114
+ .where("tenant_id", "=", tenantId)
115
+ .where("portal", "=", portal)
116
+ .execute();
117
+ }
118
+ async revokeRoleMembers(trx, appId, tenantId, userIds) {
119
+ if (userIds.length === 0)
120
+ return;
121
+ await trx
122
+ .deleteFrom("identity_sessions")
123
+ .where("app_id", "=", appId)
124
+ .where("tenant_id", "=", tenantId)
125
+ .where("user_id", "in", userIds)
126
+ .execute();
127
+ }
128
+ }
@@ -0,0 +1,27 @@
1
+ import type { Portal } from "../identity.types.js";
2
+ export declare const sessionResource: "sessions";
3
+ export declare const sessionResourceRoute: (controller: import("./session.controller.js").IdentitySessionController) => {
4
+ resource: "sessions";
5
+ controller: import("./session.controller.js").IdentitySessionController;
6
+ };
7
+ export declare const sessionRoutes: readonly [{
8
+ readonly method: "POST";
9
+ readonly path: "sessions";
10
+ readonly action: "login";
11
+ }, {
12
+ readonly method: "GET";
13
+ readonly path: "sessions/current";
14
+ readonly action: "session";
15
+ }, {
16
+ readonly method: "DELETE";
17
+ readonly path: "sessions/current";
18
+ readonly action: "logout";
19
+ }, {
20
+ readonly method: "PATCH";
21
+ readonly path: "password";
22
+ readonly action: "password";
23
+ }];
24
+ export declare const portalRoutes: Record<Portal, {
25
+ login: string;
26
+ desk: string;
27
+ }>;
@@ -0,0 +1,13 @@
1
+ export const sessionResource = "sessions";
2
+ export const sessionResourceRoute = (controller) => ({ resource: sessionResource, controller });
3
+ export const sessionRoutes = [
4
+ { method: "POST", path: "sessions", action: "login" },
5
+ { method: "GET", path: "sessions/current", action: "session" },
6
+ { method: "DELETE", path: "sessions/current", action: "logout" },
7
+ { method: "PATCH", path: "password", action: "password" }
8
+ ];
9
+ export const portalRoutes = {
10
+ user: { login: "/login", desk: "/desk" },
11
+ admin: { login: "/admin/login", desk: "/admin/desk" },
12
+ "super-admin": { login: "/sa/login", desk: "/sa/desk" }
13
+ };
@@ -0,0 +1,6 @@
1
+ import { z } from "zod";
2
+ export declare const loginSchema: z.ZodObject<{
3
+ email: z.ZodPipe<z.ZodEmail, z.ZodTransform<string, string>>;
4
+ password: z.ZodString;
5
+ tenantId: z.ZodOptional<z.ZodString>;
6
+ }, z.core.$strict>;
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ import { identityKeySchema } from "../support/identity.schema.js";
3
+ export const loginSchema = z
4
+ .object({
5
+ email: z
6
+ .email()
7
+ .max(254)
8
+ .transform((value) => value.trim().toLowerCase()),
9
+ password: z.string().min(1).max(256),
10
+ tenantId: identityKeySchema.optional()
11
+ })
12
+ .strict();
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,20 @@
1
+ import type { IdentityMutation, Principal } from "../identity.types.js";
2
+ import type { IdentityListQuery } from "../support/pagination.schema.js";
3
+ import { IdentitySessionRepository } from "./session.repository.js";
4
+ export declare class IdentitySessionService {
5
+ private readonly repository;
6
+ private readonly mutate;
7
+ constructor(repository: IdentitySessionRepository, mutate: IdentityMutation);
8
+ list(actor: Principal, query: IdentityListQuery): Promise<{
9
+ data: Record<string, unknown>[];
10
+ meta: {
11
+ page: number;
12
+ perPage: number;
13
+ total: number;
14
+ lastPage: number;
15
+ };
16
+ }>;
17
+ show(actor: Principal, id: string): Promise<Record<string, unknown> | undefined>;
18
+ remove(actor: Principal, id: string): Promise<void>;
19
+ private allow;
20
+ }