@happyvertical/smrt-users 0.57.7 → 0.57.8

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.
@@ -3,12 +3,12 @@
3
3
  "sensitiveFieldsExcluded": true,
4
4
  "generatedAt": "1970-01-01T00:00:00.000Z",
5
5
  "packageName": "@happyvertical/smrt-users",
6
- "packageVersion": "0.57.7",
6
+ "packageVersion": "0.57.8",
7
7
  "sourceManifestPath": "dist/manifest.json",
8
8
  "agentDocPath": "AGENTS.md",
9
9
  "sourceHashes": {
10
- "manifest": "9f8acde50bcc4c9f3aa85ded9be621f6c79f03a465c66c7ab3d90ac7388289a8",
11
- "packageJson": "cdfce1ca3b3c4423159b65703a1b94e23398e12e57ad2ea071fd515791f168d3",
10
+ "manifest": "6c9cbd0e9c74b8343090b38a49a93f94540f8dac86209264a4a9a484e0f14d1f",
11
+ "packageJson": "ac6df029fa84df8047004537889d034b050ea8beb97c99fc16f0b78b88eebb2e",
12
12
  "agents": "c4ab6a1aae24c0fb687d4d02ef25dcb5e6942ad7e8318e9d0dd8d03d5750b788",
13
13
  "moduleDoc:agents/permissions.md": "02b2f03f0e057721369d9c693a624a6fdb3df4935401531a4373ff18229a64be",
14
14
  "moduleDoc:agents/oidc-provisioning.md": "b73f3fdaf61136720132a614c7e14237b7bd35f7bf5d43eabb29f565485803b9",
@@ -79,687 +79,6 @@
79
79
  "sti-inheritance"
80
80
  ],
81
81
  "objects": [
82
- {
83
- "name": "MemberClass",
84
- "qualifiedName": "@happyvertical/smrt-users:MemberClass",
85
- "displayLabelField": "name",
86
- "collection": "memberclasses",
87
- "description": "A tenant-configured legal class; it has no authority or entitlement effect.",
88
- "tableName": "member_classes",
89
- "packageName": "@happyvertical/smrt-users",
90
- "extends": "SmrtObject",
91
- "fields": [
92
- {
93
- "name": "tenantId",
94
- "type": "text",
95
- "required": true,
96
- "columnType": "UUID"
97
- },
98
- {
99
- "name": "key",
100
- "type": "text",
101
- "required": false,
102
- "columnType": "TEXT"
103
- },
104
- {
105
- "name": "name",
106
- "type": "text",
107
- "required": false,
108
- "columnType": "TEXT"
109
- },
110
- {
111
- "name": "description",
112
- "type": "text",
113
- "required": false,
114
- "columnType": "TEXT"
115
- },
116
- {
117
- "name": "policyMetadata",
118
- "type": "json",
119
- "required": false,
120
- "columnType": "JSON"
121
- }
122
- ],
123
- "relationships": [],
124
- "methods": [],
125
- "tenant": {
126
- "scoped": true,
127
- "mode": "required",
128
- "field": "tenantId"
129
- },
130
- "conflictColumns": [
131
- "tenant_id",
132
- "slug",
133
- "context"
134
- ],
135
- "surfaces": [],
136
- "relationshipFeatures": [
137
- "uuidColumns"
138
- ],
139
- "tags": [],
140
- "risks": []
141
- },
142
- {
143
- "name": "LegalMember",
144
- "qualifiedName": "@happyvertical/smrt-users:LegalMember",
145
- "collection": "legalmembers",
146
- "description": "The legal register entry, deliberately separate from RBAC Membership.",
147
- "tableName": "legal_members",
148
- "packageName": "@happyvertical/smrt-users",
149
- "extends": "SmrtObject",
150
- "fields": [
151
- {
152
- "name": "tenantId",
153
- "type": "text",
154
- "required": true,
155
- "columnType": "UUID"
156
- },
157
- {
158
- "name": "memberClassId",
159
- "type": "foreignKey",
160
- "required": false,
161
- "related": "MemberClass",
162
- "columnType": "UUID"
163
- },
164
- {
165
- "name": "kind",
166
- "type": "text",
167
- "required": false,
168
- "columnType": "TEXT"
169
- },
170
- {
171
- "name": "displayName",
172
- "type": "text",
173
- "required": false,
174
- "columnType": "TEXT"
175
- },
176
- {
177
- "name": "userId",
178
- "type": "foreignKey",
179
- "required": false,
180
- "related": "User",
181
- "columnType": "UUID"
182
- },
183
- {
184
- "name": "profileId",
185
- "type": "crossPackageRef",
186
- "required": false,
187
- "related": "@happyvertical/smrt-profiles:Profile",
188
- "columnType": "UUID"
189
- },
190
- {
191
- "name": "externalPartyRef",
192
- "type": "text",
193
- "required": false,
194
- "columnType": "TEXT"
195
- },
196
- {
197
- "name": "joinedOn",
198
- "type": "text",
199
- "required": false,
200
- "columnType": "TEXT"
201
- },
202
- {
203
- "name": "leftOn",
204
- "type": "text",
205
- "required": false,
206
- "columnType": "TEXT"
207
- },
208
- {
209
- "name": "status",
210
- "type": "text",
211
- "required": false,
212
- "columnType": "TEXT"
213
- }
214
- ],
215
- "relationships": [
216
- {
217
- "name": "memberClassId",
218
- "type": "foreignKey",
219
- "required": false,
220
- "related": "MemberClass",
221
- "columnType": "UUID"
222
- },
223
- {
224
- "name": "userId",
225
- "type": "foreignKey",
226
- "required": false,
227
- "related": "User",
228
- "columnType": "UUID"
229
- },
230
- {
231
- "name": "profileId",
232
- "type": "crossPackageRef",
233
- "required": false,
234
- "related": "@happyvertical/smrt-profiles:Profile",
235
- "columnType": "UUID"
236
- }
237
- ],
238
- "methods": [],
239
- "tenant": {
240
- "scoped": true,
241
- "mode": "required",
242
- "field": "tenantId"
243
- },
244
- "conflictColumns": [
245
- "tenant_id",
246
- "slug",
247
- "context"
248
- ],
249
- "surfaces": [],
250
- "relationshipFeatures": [
251
- "crossPackageRef",
252
- "foreignKey",
253
- "uuidColumns"
254
- ],
255
- "tags": [],
256
- "risks": []
257
- },
258
- {
259
- "name": "LegalMemberStatusHistory",
260
- "qualifiedName": "@happyvertical/smrt-users:LegalMemberStatusHistory",
261
- "collection": "legalmemberstatushistories",
262
- "description": "Append-only effective history; current status never erases it.",
263
- "tableName": "legal_member_status_history",
264
- "packageName": "@happyvertical/smrt-users",
265
- "extends": "SmrtObject",
266
- "fields": [
267
- {
268
- "name": "tenantId",
269
- "type": "text",
270
- "required": true,
271
- "columnType": "UUID"
272
- },
273
- {
274
- "name": "memberId",
275
- "type": "foreignKey",
276
- "required": false,
277
- "related": "LegalMember",
278
- "columnType": "UUID"
279
- },
280
- {
281
- "name": "status",
282
- "type": "text",
283
- "required": false,
284
- "columnType": "TEXT"
285
- },
286
- {
287
- "name": "effectiveOn",
288
- "type": "text",
289
- "required": false,
290
- "columnType": "TEXT"
291
- },
292
- {
293
- "name": "sequence",
294
- "type": "integer",
295
- "required": false,
296
- "columnType": "INTEGER"
297
- },
298
- {
299
- "name": "reason",
300
- "type": "text",
301
- "required": false,
302
- "columnType": "TEXT"
303
- },
304
- {
305
- "name": "actorRef",
306
- "type": "text",
307
- "required": false,
308
- "columnType": "TEXT"
309
- }
310
- ],
311
- "relationships": [
312
- {
313
- "name": "memberId",
314
- "type": "foreignKey",
315
- "required": false,
316
- "related": "LegalMember",
317
- "columnType": "UUID"
318
- }
319
- ],
320
- "methods": [
321
- "delete",
322
- "save"
323
- ],
324
- "methodSignatures": [
325
- {
326
- "name": "delete",
327
- "async": true,
328
- "returns": "Promise<void>"
329
- },
330
- {
331
- "name": "save",
332
- "async": true,
333
- "returns": "Promise<this>"
334
- }
335
- ],
336
- "tenant": {
337
- "scoped": true,
338
- "mode": "required",
339
- "field": "tenantId"
340
- },
341
- "conflictColumns": [
342
- "tenant_id",
343
- "slug",
344
- "context"
345
- ],
346
- "surfaces": [],
347
- "withheldSurfaces": [
348
- {
349
- "kind": "api",
350
- "operation": "save",
351
- "code": "lifecycle-method",
352
- "reason": "`save` is a framework lifecycle method, not a distinct operation",
353
- "objectName": "@happyvertical/smrt-users:LegalMemberStatusHistory"
354
- }
355
- ],
356
- "relationshipFeatures": [
357
- "foreignKey",
358
- "uuidColumns"
359
- ],
360
- "tags": [],
361
- "risks": []
362
- },
363
- {
364
- "name": "LegalMemberReference",
365
- "qualifiedName": "@happyvertical/smrt-users:LegalMemberReference",
366
- "collection": "legalmemberreferences",
367
- "description": "A link to authoritative share/dues/subscription/agreement/ledger evidence.",
368
- "tableName": "legal_member_references",
369
- "packageName": "@happyvertical/smrt-users",
370
- "extends": "SmrtObject",
371
- "fields": [
372
- {
373
- "name": "tenantId",
374
- "type": "text",
375
- "required": true,
376
- "columnType": "UUID"
377
- },
378
- {
379
- "name": "memberId",
380
- "type": "foreignKey",
381
- "required": false,
382
- "related": "LegalMember",
383
- "columnType": "UUID"
384
- },
385
- {
386
- "name": "kind",
387
- "type": "text",
388
- "required": false,
389
- "columnType": "TEXT"
390
- },
391
- {
392
- "name": "sourceType",
393
- "type": "text",
394
- "required": false,
395
- "columnType": "TEXT"
396
- },
397
- {
398
- "name": "sourceId",
399
- "type": "text",
400
- "required": false,
401
- "columnType": "TEXT"
402
- },
403
- {
404
- "name": "authoritative",
405
- "type": "boolean",
406
- "required": false,
407
- "columnType": "BOOLEAN"
408
- },
409
- {
410
- "name": "effectiveFrom",
411
- "type": "text",
412
- "required": false,
413
- "columnType": "TEXT"
414
- },
415
- {
416
- "name": "effectiveTo",
417
- "type": "text",
418
- "required": false,
419
- "columnType": "TEXT"
420
- },
421
- {
422
- "name": "revokesId",
423
- "type": "foreignKey",
424
- "required": false,
425
- "related": "LegalMemberReference",
426
- "columnType": "UUID"
427
- }
428
- ],
429
- "relationships": [
430
- {
431
- "name": "memberId",
432
- "type": "foreignKey",
433
- "required": false,
434
- "related": "LegalMember",
435
- "columnType": "UUID"
436
- },
437
- {
438
- "name": "revokesId",
439
- "type": "foreignKey",
440
- "required": false,
441
- "related": "LegalMemberReference",
442
- "columnType": "UUID"
443
- }
444
- ],
445
- "methods": [
446
- "delete",
447
- "save"
448
- ],
449
- "methodSignatures": [
450
- {
451
- "name": "delete",
452
- "async": true,
453
- "returns": "Promise<void>"
454
- },
455
- {
456
- "name": "save",
457
- "async": true,
458
- "returns": "Promise<this>"
459
- }
460
- ],
461
- "tenant": {
462
- "scoped": true,
463
- "mode": "required",
464
- "field": "tenantId"
465
- },
466
- "conflictColumns": [
467
- "tenant_id",
468
- "slug",
469
- "context"
470
- ],
471
- "surfaces": [],
472
- "withheldSurfaces": [
473
- {
474
- "kind": "api",
475
- "operation": "save",
476
- "code": "lifecycle-method",
477
- "reason": "`save` is a framework lifecycle method, not a distinct operation",
478
- "objectName": "@happyvertical/smrt-users:LegalMemberReference"
479
- }
480
- ],
481
- "relationshipFeatures": [
482
- "foreignKey",
483
- "uuidColumns"
484
- ],
485
- "tags": [],
486
- "risks": []
487
- },
488
- {
489
- "name": "MemberOfficerAppointment",
490
- "qualifiedName": "@happyvertical/smrt-users:MemberOfficerAppointment",
491
- "collection": "memberofficerappointments",
492
- "description": "A dated register of board/officer appointments; it does not implement elections.",
493
- "tableName": "member_officer_appointments",
494
- "packageName": "@happyvertical/smrt-users",
495
- "extends": "SmrtObject",
496
- "fields": [
497
- {
498
- "name": "tenantId",
499
- "type": "text",
500
- "required": true,
501
- "columnType": "UUID"
502
- },
503
- {
504
- "name": "memberId",
505
- "type": "foreignKey",
506
- "required": false,
507
- "related": "LegalMember",
508
- "columnType": "UUID"
509
- },
510
- {
511
- "name": "role",
512
- "type": "text",
513
- "required": false,
514
- "columnType": "TEXT"
515
- },
516
- {
517
- "name": "effectiveFrom",
518
- "type": "text",
519
- "required": false,
520
- "columnType": "TEXT"
521
- },
522
- {
523
- "name": "effectiveTo",
524
- "type": "text",
525
- "required": false,
526
- "columnType": "TEXT"
527
- },
528
- {
529
- "name": "authority",
530
- "type": "json",
531
- "required": false,
532
- "columnType": "JSON"
533
- }
534
- ],
535
- "relationships": [
536
- {
537
- "name": "memberId",
538
- "type": "foreignKey",
539
- "required": false,
540
- "related": "LegalMember",
541
- "columnType": "UUID"
542
- }
543
- ],
544
- "methods": [],
545
- "tenant": {
546
- "scoped": true,
547
- "mode": "required",
548
- "field": "tenantId"
549
- },
550
- "conflictColumns": [
551
- "tenant_id",
552
- "slug",
553
- "context"
554
- ],
555
- "surfaces": [],
556
- "relationshipFeatures": [
557
- "foreignKey",
558
- "uuidColumns"
559
- ],
560
- "tags": [],
561
- "risks": []
562
- },
563
- {
564
- "name": "MemberEligibilitySnapshot",
565
- "qualifiedName": "@happyvertical/smrt-users:MemberEligibilitySnapshot",
566
- "collection": "membereligibilitysnapshots",
567
- "tableName": "member_eligibility_snapshots",
568
- "packageName": "@happyvertical/smrt-users",
569
- "extends": "SmrtObject",
570
- "fields": [
571
- {
572
- "name": "tenantId",
573
- "type": "text",
574
- "required": true,
575
- "columnType": "UUID"
576
- },
577
- {
578
- "name": "memberId",
579
- "type": "foreignKey",
580
- "required": false,
581
- "related": "LegalMember",
582
- "columnType": "UUID"
583
- },
584
- {
585
- "name": "recordDate",
586
- "type": "text",
587
- "required": false,
588
- "columnType": "TEXT"
589
- },
590
- {
591
- "name": "eligible",
592
- "type": "boolean",
593
- "required": false,
594
- "columnType": "BOOLEAN"
595
- },
596
- {
597
- "name": "reason",
598
- "type": "text",
599
- "required": false,
600
- "columnType": "TEXT"
601
- },
602
- {
603
- "name": "evidence",
604
- "type": "json",
605
- "required": false,
606
- "columnType": "JSON"
607
- }
608
- ],
609
- "relationships": [
610
- {
611
- "name": "memberId",
612
- "type": "foreignKey",
613
- "required": false,
614
- "related": "LegalMember",
615
- "columnType": "UUID"
616
- }
617
- ],
618
- "methods": [
619
- "delete",
620
- "save"
621
- ],
622
- "methodSignatures": [
623
- {
624
- "name": "delete",
625
- "async": true,
626
- "returns": "Promise<void>"
627
- },
628
- {
629
- "name": "save",
630
- "async": true,
631
- "returns": "Promise<this>"
632
- }
633
- ],
634
- "tenant": {
635
- "scoped": true,
636
- "mode": "required",
637
- "field": "tenantId"
638
- },
639
- "conflictColumns": [
640
- "tenant_id",
641
- "slug",
642
- "context"
643
- ],
644
- "surfaces": [],
645
- "withheldSurfaces": [
646
- {
647
- "kind": "api",
648
- "operation": "save",
649
- "code": "lifecycle-method",
650
- "reason": "`save` is a framework lifecycle method, not a distinct operation",
651
- "objectName": "@happyvertical/smrt-users:MemberEligibilitySnapshot"
652
- }
653
- ],
654
- "relationshipFeatures": [
655
- "foreignKey",
656
- "uuidColumns"
657
- ],
658
- "tags": [],
659
- "risks": []
660
- },
661
- {
662
- "name": "MemberClassCollection",
663
- "qualifiedName": "@happyvertical/smrt-users:MemberClassCollection",
664
- "collection": "memberclasses",
665
- "tableName": "member_classes",
666
- "packageName": "@happyvertical/smrt-users",
667
- "extends": "SmrtCollection",
668
- "fields": [],
669
- "relationships": [],
670
- "methods": [],
671
- "surfaces": [],
672
- "relationshipFeatures": [
673
- "uuidColumns"
674
- ],
675
- "tags": [],
676
- "risks": []
677
- },
678
- {
679
- "name": "LegalMemberCollection",
680
- "qualifiedName": "@happyvertical/smrt-users:LegalMemberCollection",
681
- "collection": "legalmembers",
682
- "tableName": "legal_members",
683
- "packageName": "@happyvertical/smrt-users",
684
- "extends": "SmrtCollection",
685
- "fields": [],
686
- "relationships": [],
687
- "methods": [],
688
- "surfaces": [],
689
- "relationshipFeatures": [
690
- "uuidColumns"
691
- ],
692
- "tags": [],
693
- "risks": []
694
- },
695
- {
696
- "name": "LegalMemberStatusHistoryCollection",
697
- "qualifiedName": "@happyvertical/smrt-users:LegalMemberStatusHistoryCollection",
698
- "collection": "legalmemberstatushistories",
699
- "tableName": "legal_member_status_history",
700
- "packageName": "@happyvertical/smrt-users",
701
- "extends": "SmrtCollection",
702
- "fields": [],
703
- "relationships": [],
704
- "methods": [],
705
- "surfaces": [],
706
- "relationshipFeatures": [
707
- "uuidColumns"
708
- ],
709
- "tags": [],
710
- "risks": []
711
- },
712
- {
713
- "name": "LegalMemberReferenceCollection",
714
- "qualifiedName": "@happyvertical/smrt-users:LegalMemberReferenceCollection",
715
- "collection": "legalmemberreferences",
716
- "tableName": "legal_member_references",
717
- "packageName": "@happyvertical/smrt-users",
718
- "extends": "SmrtCollection",
719
- "fields": [],
720
- "relationships": [],
721
- "methods": [],
722
- "surfaces": [],
723
- "relationshipFeatures": [
724
- "uuidColumns"
725
- ],
726
- "tags": [],
727
- "risks": []
728
- },
729
- {
730
- "name": "MemberOfficerAppointmentCollection",
731
- "qualifiedName": "@happyvertical/smrt-users:MemberOfficerAppointmentCollection",
732
- "collection": "memberofficerappointments",
733
- "tableName": "member_officer_appointments",
734
- "packageName": "@happyvertical/smrt-users",
735
- "extends": "SmrtCollection",
736
- "fields": [],
737
- "relationships": [],
738
- "methods": [],
739
- "surfaces": [],
740
- "relationshipFeatures": [
741
- "uuidColumns"
742
- ],
743
- "tags": [],
744
- "risks": []
745
- },
746
- {
747
- "name": "MemberEligibilitySnapshotCollection",
748
- "qualifiedName": "@happyvertical/smrt-users:MemberEligibilitySnapshotCollection",
749
- "collection": "membereligibilitysnapshots",
750
- "tableName": "member_eligibility_snapshots",
751
- "packageName": "@happyvertical/smrt-users",
752
- "extends": "SmrtCollection",
753
- "fields": [],
754
- "relationships": [],
755
- "methods": [],
756
- "surfaces": [],
757
- "relationshipFeatures": [
758
- "uuidColumns"
759
- ],
760
- "tags": [],
761
- "risks": []
762
- },
763
82
  {
764
83
  "name": "AccessRequestCollection",
765
84
  "qualifiedName": "@happyvertical/smrt-users:AccessRequestCollection",
@@ -2600,131 +1919,404 @@
2600
1919
  ],
2601
1920
  "methodSignatures": [
2602
1921
  {
2603
- "name": "addPermission",
1922
+ "name": "addPermission",
1923
+ "async": true,
1924
+ "params": [
1925
+ "roleId: string",
1926
+ "permissionId: string"
1927
+ ],
1928
+ "returns": "Promise<RolePermission>"
1929
+ },
1930
+ {
1931
+ "name": "findByPermission",
1932
+ "async": true,
1933
+ "params": [
1934
+ "permissionId: string"
1935
+ ],
1936
+ "returns": "Promise<RolePermission[]>"
1937
+ },
1938
+ {
1939
+ "name": "findByRole",
1940
+ "async": true,
1941
+ "params": [
1942
+ "roleId: string"
1943
+ ],
1944
+ "returns": "Promise<RolePermission[]>"
1945
+ },
1946
+ {
1947
+ "name": "getPermissionIds",
1948
+ "async": true,
1949
+ "params": [
1950
+ "roleId: string"
1951
+ ],
1952
+ "returns": "Promise<string[]>"
1953
+ },
1954
+ {
1955
+ "name": "hasPermission",
1956
+ "async": true,
1957
+ "params": [
1958
+ "roleId: string",
1959
+ "permissionId: string"
1960
+ ],
1961
+ "returns": "Promise<boolean>"
1962
+ },
1963
+ {
1964
+ "name": "removePermission",
1965
+ "async": true,
1966
+ "params": [
1967
+ "roleId: string",
1968
+ "permissionId: string"
1969
+ ],
1970
+ "returns": "Promise<boolean>"
1971
+ },
1972
+ {
1973
+ "name": "seedDefaultRolePersonalizationPermissions",
1974
+ "async": true,
1975
+ "params": [
1976
+ "options?: Omit<SeedRolePermissionsOptions, 'prune'>"
1977
+ ],
1978
+ "returns": "Promise<SeedRolePermissionsResult>"
1979
+ },
1980
+ {
1981
+ "name": "seedRolePermissions",
1982
+ "async": true,
1983
+ "params": [
1984
+ "matrix?: RolePermissionPatternMatrix",
1985
+ "options?: SeedRolePermissionsOptions"
1986
+ ],
1987
+ "returns": "Promise<SeedRolePermissionsResult>"
1988
+ }
1989
+ ],
1990
+ "surfaces": [],
1991
+ "withheldSurfaces": [
1992
+ {
1993
+ "kind": "api",
1994
+ "operation": "addPermission",
1995
+ "code": "not-included",
1996
+ "reason": "not listed in api.include",
1997
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
1998
+ },
1999
+ {
2000
+ "kind": "api",
2001
+ "operation": "findByPermission",
2002
+ "code": "not-included",
2003
+ "reason": "not listed in api.include",
2004
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2005
+ },
2006
+ {
2007
+ "kind": "api",
2008
+ "operation": "findByRole",
2009
+ "code": "not-included",
2010
+ "reason": "not listed in api.include",
2011
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2012
+ },
2013
+ {
2014
+ "kind": "api",
2015
+ "operation": "getPermissionIds",
2016
+ "code": "not-included",
2017
+ "reason": "not listed in api.include",
2018
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2019
+ },
2020
+ {
2021
+ "kind": "api",
2022
+ "operation": "hasPermission",
2023
+ "code": "not-included",
2024
+ "reason": "not listed in api.include",
2025
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2026
+ },
2027
+ {
2028
+ "kind": "api",
2029
+ "operation": "removePermission",
2030
+ "code": "not-included",
2031
+ "reason": "not listed in api.include",
2032
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2033
+ },
2034
+ {
2035
+ "kind": "api",
2036
+ "operation": "seedDefaultRolePersonalizationPermissions",
2037
+ "code": "not-included",
2038
+ "reason": "not listed in api.include",
2039
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2040
+ },
2041
+ {
2042
+ "kind": "api",
2043
+ "operation": "seedRolePermissions",
2044
+ "code": "not-included",
2045
+ "reason": "not listed in api.include",
2046
+ "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2047
+ }
2048
+ ],
2049
+ "relationshipFeatures": [
2050
+ "uuidColumns"
2051
+ ],
2052
+ "tags": [],
2053
+ "risks": []
2054
+ },
2055
+ {
2056
+ "name": "SessionCollection",
2057
+ "qualifiedName": "@happyvertical/smrt-users:SessionCollection",
2058
+ "collection": "sessions",
2059
+ "description": "Collection for managing Session objects",
2060
+ "tableName": "sessions",
2061
+ "packageName": "@happyvertical/smrt-users",
2062
+ "extends": "SmrtCollection",
2063
+ "fields": [],
2064
+ "relationships": [],
2065
+ "methods": [
2066
+ "countUserSessions",
2067
+ "createSession",
2068
+ "deleteExpired",
2069
+ "deleteUserSessions",
2070
+ "findByUser",
2071
+ "findChildren",
2072
+ "findValidSession",
2073
+ "getSessionData",
2074
+ "revokeChildren",
2075
+ "revokeSession",
2076
+ "revokeUserSessions",
2077
+ "revokeUserSessionsByAuthMethod",
2078
+ "setSessionData",
2079
+ "setSessionTenant",
2080
+ "touch"
2081
+ ],
2082
+ "methodSignatures": [
2083
+ {
2084
+ "name": "countUserSessions",
2085
+ "async": true,
2086
+ "params": [
2087
+ "userId: string"
2088
+ ],
2089
+ "returns": "Promise<number>"
2090
+ },
2091
+ {
2092
+ "name": "createSession",
2093
+ "async": true,
2094
+ "params": [
2095
+ "options: CreateSessionOptions"
2096
+ ],
2097
+ "returns": "Promise<Session>"
2098
+ },
2099
+ {
2100
+ "name": "deleteExpired",
2101
+ "async": true,
2102
+ "params": [
2103
+ "options?: object"
2104
+ ],
2105
+ "returns": "Promise<number>"
2106
+ },
2107
+ {
2108
+ "name": "deleteUserSessions",
2109
+ "async": true,
2110
+ "params": [
2111
+ "userId: string"
2112
+ ],
2113
+ "returns": "Promise<number>"
2114
+ },
2115
+ {
2116
+ "name": "findByUser",
2117
+ "async": true,
2118
+ "params": [
2119
+ "userId: string"
2120
+ ],
2121
+ "returns": "Promise<Session[]>"
2122
+ },
2123
+ {
2124
+ "name": "findChildren",
2125
+ "async": true,
2126
+ "params": [
2127
+ "parentSessionId: string"
2128
+ ],
2129
+ "returns": "Promise<Session[]>"
2130
+ },
2131
+ {
2132
+ "name": "findValidSession",
2133
+ "async": true,
2134
+ "params": [
2135
+ "sessionId: string"
2136
+ ],
2137
+ "returns": "Promise<Session | null>"
2138
+ },
2139
+ {
2140
+ "name": "getSessionData",
2604
2141
  "async": true,
2605
2142
  "params": [
2606
- "roleId: string",
2607
- "permissionId: string"
2143
+ "sessionId: string",
2144
+ "key: string"
2608
2145
  ],
2609
- "returns": "Promise<RolePermission>"
2146
+ "returns": "Promise<T | undefined>"
2610
2147
  },
2611
2148
  {
2612
- "name": "findByPermission",
2149
+ "name": "revokeChildren",
2613
2150
  "async": true,
2614
2151
  "params": [
2615
- "permissionId: string"
2152
+ "parentSessionId: string",
2153
+ "options?: object"
2616
2154
  ],
2617
- "returns": "Promise<RolePermission[]>"
2155
+ "returns": "Promise<number>"
2618
2156
  },
2619
2157
  {
2620
- "name": "findByRole",
2158
+ "name": "revokeSession",
2621
2159
  "async": true,
2622
2160
  "params": [
2623
- "roleId: string"
2161
+ "sessionId: string"
2624
2162
  ],
2625
- "returns": "Promise<RolePermission[]>"
2163
+ "returns": "Promise<boolean>"
2626
2164
  },
2627
2165
  {
2628
- "name": "getPermissionIds",
2166
+ "name": "revokeUserSessions",
2629
2167
  "async": true,
2630
2168
  "params": [
2631
- "roleId: string"
2169
+ "userId: string",
2170
+ "options?: object"
2632
2171
  ],
2633
- "returns": "Promise<string[]>"
2172
+ "returns": "Promise<number>"
2634
2173
  },
2635
2174
  {
2636
- "name": "hasPermission",
2175
+ "name": "revokeUserSessionsByAuthMethod",
2637
2176
  "async": true,
2638
2177
  "params": [
2639
- "roleId: string",
2640
- "permissionId: string"
2178
+ "userId: string",
2179
+ "authMethod: SessionAuthMethod",
2180
+ "options?: object"
2641
2181
  ],
2642
- "returns": "Promise<boolean>"
2182
+ "returns": "Promise<number>"
2643
2183
  },
2644
2184
  {
2645
- "name": "removePermission",
2185
+ "name": "setSessionData",
2646
2186
  "async": true,
2647
2187
  "params": [
2648
- "roleId: string",
2649
- "permissionId: string"
2188
+ "sessionId: string",
2189
+ "key: string",
2190
+ "value: unknown"
2650
2191
  ],
2651
2192
  "returns": "Promise<boolean>"
2652
2193
  },
2653
2194
  {
2654
- "name": "seedDefaultRolePersonalizationPermissions",
2195
+ "name": "setSessionTenant",
2655
2196
  "async": true,
2656
2197
  "params": [
2657
- "options?: Omit<SeedRolePermissionsOptions, 'prune'>"
2198
+ "sessionId: string",
2199
+ "tenantId: string | null"
2658
2200
  ],
2659
- "returns": "Promise<SeedRolePermissionsResult>"
2201
+ "returns": "Promise<boolean>"
2660
2202
  },
2661
2203
  {
2662
- "name": "seedRolePermissions",
2204
+ "name": "touch",
2663
2205
  "async": true,
2664
2206
  "params": [
2665
- "matrix?: RolePermissionPatternMatrix",
2666
- "options?: SeedRolePermissionsOptions"
2207
+ "sessionId: string",
2208
+ "extendTtl?: boolean",
2209
+ "ttl?: number"
2667
2210
  ],
2668
- "returns": "Promise<SeedRolePermissionsResult>"
2211
+ "returns": "Promise<boolean>"
2669
2212
  }
2670
2213
  ],
2671
2214
  "surfaces": [],
2672
2215
  "withheldSurfaces": [
2673
2216
  {
2674
2217
  "kind": "api",
2675
- "operation": "addPermission",
2218
+ "operation": "countUserSessions",
2676
2219
  "code": "not-included",
2677
2220
  "reason": "not listed in api.include",
2678
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2221
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2679
2222
  },
2680
2223
  {
2681
2224
  "kind": "api",
2682
- "operation": "findByPermission",
2225
+ "operation": "createSession",
2683
2226
  "code": "not-included",
2684
2227
  "reason": "not listed in api.include",
2685
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2228
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2686
2229
  },
2687
2230
  {
2688
2231
  "kind": "api",
2689
- "operation": "findByRole",
2232
+ "operation": "deleteExpired",
2690
2233
  "code": "not-included",
2691
2234
  "reason": "not listed in api.include",
2692
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2235
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2693
2236
  },
2694
2237
  {
2695
2238
  "kind": "api",
2696
- "operation": "getPermissionIds",
2239
+ "operation": "deleteUserSessions",
2697
2240
  "code": "not-included",
2698
2241
  "reason": "not listed in api.include",
2699
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2242
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2700
2243
  },
2701
2244
  {
2702
2245
  "kind": "api",
2703
- "operation": "hasPermission",
2246
+ "operation": "findByUser",
2704
2247
  "code": "not-included",
2705
2248
  "reason": "not listed in api.include",
2706
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2249
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2707
2250
  },
2708
2251
  {
2709
2252
  "kind": "api",
2710
- "operation": "removePermission",
2253
+ "operation": "findChildren",
2711
2254
  "code": "not-included",
2712
2255
  "reason": "not listed in api.include",
2713
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2256
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2714
2257
  },
2715
2258
  {
2716
2259
  "kind": "api",
2717
- "operation": "seedDefaultRolePersonalizationPermissions",
2260
+ "operation": "findValidSession",
2718
2261
  "code": "not-included",
2719
2262
  "reason": "not listed in api.include",
2720
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2263
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2721
2264
  },
2722
2265
  {
2723
2266
  "kind": "api",
2724
- "operation": "seedRolePermissions",
2267
+ "operation": "getSessionData",
2725
2268
  "code": "not-included",
2726
2269
  "reason": "not listed in api.include",
2727
- "objectName": "@happyvertical/smrt-users:RolePermissionCollection"
2270
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2271
+ },
2272
+ {
2273
+ "kind": "api",
2274
+ "operation": "revokeChildren",
2275
+ "code": "not-included",
2276
+ "reason": "not listed in api.include",
2277
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2278
+ },
2279
+ {
2280
+ "kind": "api",
2281
+ "operation": "revokeSession",
2282
+ "code": "not-included",
2283
+ "reason": "not listed in api.include",
2284
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2285
+ },
2286
+ {
2287
+ "kind": "api",
2288
+ "operation": "revokeUserSessions",
2289
+ "code": "not-included",
2290
+ "reason": "not listed in api.include",
2291
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2292
+ },
2293
+ {
2294
+ "kind": "api",
2295
+ "operation": "revokeUserSessionsByAuthMethod",
2296
+ "code": "not-included",
2297
+ "reason": "not listed in api.include",
2298
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2299
+ },
2300
+ {
2301
+ "kind": "api",
2302
+ "operation": "setSessionData",
2303
+ "code": "not-included",
2304
+ "reason": "not listed in api.include",
2305
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2306
+ },
2307
+ {
2308
+ "kind": "api",
2309
+ "operation": "setSessionTenant",
2310
+ "code": "not-included",
2311
+ "reason": "not listed in api.include",
2312
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2313
+ },
2314
+ {
2315
+ "kind": "api",
2316
+ "operation": "touch",
2317
+ "code": "not-included",
2318
+ "reason": "not listed in api.include",
2319
+ "objectName": "@happyvertical/smrt-users:SessionCollection"
2728
2320
  }
2729
2321
  ],
2730
2322
  "relationshipFeatures": [
@@ -2734,270 +2326,374 @@
2734
2326
  "risks": []
2735
2327
  },
2736
2328
  {
2737
- "name": "SessionCollection",
2738
- "qualifiedName": "@happyvertical/smrt-users:SessionCollection",
2739
- "collection": "sessions",
2740
- "description": "Collection for managing Session objects",
2741
- "tableName": "sessions",
2329
+ "name": "TenantCollection",
2330
+ "qualifiedName": "@happyvertical/smrt-users:TenantCollection",
2331
+ "collection": "tenants",
2332
+ "description": "Collection for managing Tenant objects with hierarchical support.",
2333
+ "tableName": "tenants",
2742
2334
  "packageName": "@happyvertical/smrt-users",
2743
2335
  "extends": "SmrtCollection",
2744
2336
  "fields": [],
2745
2337
  "relationships": [],
2746
2338
  "methods": [
2747
- "countUserSessions",
2748
- "createSession",
2749
- "deleteExpired",
2750
- "deleteUserSessions",
2751
- "findByUser",
2339
+ "createChild",
2340
+ "findActive",
2341
+ "findBySlug",
2342
+ "findByStatus",
2752
2343
  "findChildren",
2753
- "findValidSession",
2754
- "getSessionData",
2755
- "revokeChildren",
2756
- "revokeSession",
2757
- "revokeUserSessions",
2758
- "revokeUserSessionsByAuthMethod",
2759
- "setSessionData",
2760
- "setSessionTenant",
2761
- "touch"
2344
+ "findParent",
2345
+ "findRoots",
2346
+ "getAncestorIds",
2347
+ "getAncestors",
2348
+ "getAncestorsFromRoot",
2349
+ "getDescendantIds",
2350
+ "getDescendants",
2351
+ "getSiblings",
2352
+ "getTree",
2353
+ "isAncestorOf",
2354
+ "isDescendantOf",
2355
+ "makeRoot",
2356
+ "moveToParent",
2357
+ "requireChildOf",
2358
+ "validateHierarchy",
2359
+ "withTenantCatalogReadScope",
2360
+ "withTenantHierarchyContext"
2762
2361
  ],
2763
2362
  "methodSignatures": [
2764
2363
  {
2765
- "name": "countUserSessions",
2364
+ "name": "createChild",
2766
2365
  "async": true,
2767
2366
  "params": [
2768
- "userId: string"
2367
+ "parentTenantId: string",
2368
+ "options: CreateChildTenantOptions"
2769
2369
  ],
2770
- "returns": "Promise<number>"
2370
+ "returns": "Promise<Tenant>"
2771
2371
  },
2772
2372
  {
2773
- "name": "createSession",
2373
+ "name": "findActive",
2374
+ "async": true,
2375
+ "returns": "Promise<Tenant[]>"
2376
+ },
2377
+ {
2378
+ "name": "findBySlug",
2774
2379
  "async": true,
2775
2380
  "params": [
2776
- "options: CreateSessionOptions"
2381
+ "slug: string"
2777
2382
  ],
2778
- "returns": "Promise<Session>"
2383
+ "returns": "Promise<Tenant | null>"
2779
2384
  },
2780
2385
  {
2781
- "name": "deleteExpired",
2386
+ "name": "findByStatus",
2782
2387
  "async": true,
2783
2388
  "params": [
2784
- "options?: object"
2389
+ "status: TenantStatus"
2785
2390
  ],
2786
- "returns": "Promise<number>"
2391
+ "returns": "Promise<Tenant[]>"
2392
+ },
2393
+ {
2394
+ "name": "findChildren",
2395
+ "async": true,
2396
+ "params": [
2397
+ "parentTenantId: string"
2398
+ ],
2399
+ "returns": "Promise<Tenant[]>"
2400
+ },
2401
+ {
2402
+ "name": "findParent",
2403
+ "async": true,
2404
+ "params": [
2405
+ "tenantId: string"
2406
+ ],
2407
+ "returns": "Promise<Tenant | null>"
2408
+ },
2409
+ {
2410
+ "name": "findRoots",
2411
+ "async": true,
2412
+ "returns": "Promise<Tenant[]>"
2413
+ },
2414
+ {
2415
+ "name": "getAncestorIds",
2416
+ "async": true,
2417
+ "params": [
2418
+ "tenantId: string"
2419
+ ],
2420
+ "returns": "Promise<string[]>"
2421
+ },
2422
+ {
2423
+ "name": "getAncestors",
2424
+ "async": true,
2425
+ "params": [
2426
+ "tenantId: string"
2427
+ ],
2428
+ "returns": "Promise<Tenant[]>"
2429
+ },
2430
+ {
2431
+ "name": "getAncestorsFromRoot",
2432
+ "async": true,
2433
+ "params": [
2434
+ "tenantId: string"
2435
+ ],
2436
+ "returns": "Promise<Tenant[]>"
2787
2437
  },
2788
2438
  {
2789
- "name": "deleteUserSessions",
2439
+ "name": "getDescendantIds",
2790
2440
  "async": true,
2791
2441
  "params": [
2792
- "userId: string"
2442
+ "tenantId: string"
2793
2443
  ],
2794
- "returns": "Promise<number>"
2444
+ "returns": "Promise<string[]>"
2795
2445
  },
2796
2446
  {
2797
- "name": "findByUser",
2447
+ "name": "getDescendants",
2798
2448
  "async": true,
2799
2449
  "params": [
2800
- "userId: string"
2450
+ "tenantId: string"
2801
2451
  ],
2802
- "returns": "Promise<Session[]>"
2452
+ "returns": "Promise<Tenant[]>"
2803
2453
  },
2804
2454
  {
2805
- "name": "findChildren",
2455
+ "name": "getSiblings",
2806
2456
  "async": true,
2807
2457
  "params": [
2808
- "parentSessionId: string"
2458
+ "tenantId: string"
2809
2459
  ],
2810
- "returns": "Promise<Session[]>"
2460
+ "returns": "Promise<Tenant[]>"
2811
2461
  },
2812
2462
  {
2813
- "name": "findValidSession",
2463
+ "name": "getTree",
2814
2464
  "async": true,
2815
2465
  "params": [
2816
- "sessionId: string"
2466
+ "rootTenantId?: string"
2817
2467
  ],
2818
- "returns": "Promise<Session | null>"
2468
+ "returns": "any"
2819
2469
  },
2820
2470
  {
2821
- "name": "getSessionData",
2471
+ "name": "isAncestorOf",
2822
2472
  "async": true,
2823
2473
  "params": [
2824
- "sessionId: string",
2825
- "key: string"
2474
+ "potentialAncestorId: string",
2475
+ "tenantId: string"
2826
2476
  ],
2827
- "returns": "Promise<T | undefined>"
2477
+ "returns": "Promise<boolean>"
2828
2478
  },
2829
2479
  {
2830
- "name": "revokeChildren",
2480
+ "name": "isDescendantOf",
2831
2481
  "async": true,
2832
2482
  "params": [
2833
- "parentSessionId: string",
2834
- "options?: object"
2483
+ "potentialDescendantId: string",
2484
+ "tenantId: string"
2835
2485
  ],
2836
- "returns": "Promise<number>"
2486
+ "returns": "Promise<boolean>"
2837
2487
  },
2838
2488
  {
2839
- "name": "revokeSession",
2489
+ "name": "makeRoot",
2840
2490
  "async": true,
2841
2491
  "params": [
2842
- "sessionId: string"
2492
+ "tenantId: string"
2843
2493
  ],
2844
- "returns": "Promise<boolean>"
2494
+ "returns": "Promise<Tenant>"
2845
2495
  },
2846
2496
  {
2847
- "name": "revokeUserSessions",
2497
+ "name": "moveToParent",
2848
2498
  "async": true,
2849
2499
  "params": [
2850
- "userId: string",
2851
- "options?: object"
2500
+ "tenantId: string",
2501
+ "newParentId: string | null"
2852
2502
  ],
2853
- "returns": "Promise<number>"
2503
+ "returns": "Promise<Tenant>"
2854
2504
  },
2855
2505
  {
2856
- "name": "revokeUserSessionsByAuthMethod",
2506
+ "name": "requireChildOf",
2857
2507
  "async": true,
2858
2508
  "params": [
2859
- "userId: string",
2860
- "authMethod: SessionAuthMethod",
2861
- "options?: object"
2509
+ "parentId: string",
2510
+ "childId: string"
2862
2511
  ],
2863
- "returns": "Promise<number>"
2512
+ "returns": "Promise<void>"
2864
2513
  },
2865
2514
  {
2866
- "name": "setSessionData",
2515
+ "name": "validateHierarchy",
2867
2516
  "async": true,
2868
2517
  "params": [
2869
- "sessionId: string",
2870
- "key: string",
2871
- "value: unknown"
2518
+ "tenantId: string"
2872
2519
  ],
2873
- "returns": "Promise<boolean>"
2520
+ "returns": "Promise<string[]>"
2874
2521
  },
2875
2522
  {
2876
- "name": "setSessionTenant",
2523
+ "name": "withTenantCatalogReadScope",
2877
2524
  "async": true,
2878
2525
  "params": [
2879
- "sessionId: string",
2880
- "tenantId: string | null"
2526
+ "options: TenantReadScopeOptions",
2527
+ "callback: Function"
2881
2528
  ],
2882
- "returns": "Promise<boolean>"
2529
+ "returns": "Promise<T>"
2883
2530
  },
2884
2531
  {
2885
- "name": "touch",
2532
+ "name": "withTenantHierarchyContext",
2886
2533
  "async": true,
2887
2534
  "params": [
2888
- "sessionId: string",
2889
- "extendTtl?: boolean",
2890
- "ttl?: number"
2535
+ "rootTenantId: string",
2536
+ "options: TenantReadScopeOptions",
2537
+ "callback: Function"
2891
2538
  ],
2892
- "returns": "Promise<boolean>"
2539
+ "returns": "Promise<T>"
2893
2540
  }
2894
2541
  ],
2895
2542
  "surfaces": [],
2896
2543
  "withheldSurfaces": [
2897
2544
  {
2898
2545
  "kind": "api",
2899
- "operation": "countUserSessions",
2546
+ "operation": "createChild",
2900
2547
  "code": "not-included",
2901
2548
  "reason": "not listed in api.include",
2902
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2549
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2903
2550
  },
2904
2551
  {
2905
2552
  "kind": "api",
2906
- "operation": "createSession",
2553
+ "operation": "findActive",
2907
2554
  "code": "not-included",
2908
2555
  "reason": "not listed in api.include",
2909
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2556
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2910
2557
  },
2911
2558
  {
2912
2559
  "kind": "api",
2913
- "operation": "deleteExpired",
2560
+ "operation": "findBySlug",
2914
2561
  "code": "not-included",
2915
2562
  "reason": "not listed in api.include",
2916
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2563
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2917
2564
  },
2918
2565
  {
2919
2566
  "kind": "api",
2920
- "operation": "deleteUserSessions",
2567
+ "operation": "findByStatus",
2921
2568
  "code": "not-included",
2922
2569
  "reason": "not listed in api.include",
2923
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2570
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2924
2571
  },
2925
2572
  {
2926
2573
  "kind": "api",
2927
- "operation": "findByUser",
2574
+ "operation": "findChildren",
2928
2575
  "code": "not-included",
2929
2576
  "reason": "not listed in api.include",
2930
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2577
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2931
2578
  },
2932
2579
  {
2933
2580
  "kind": "api",
2934
- "operation": "findChildren",
2581
+ "operation": "findParent",
2935
2582
  "code": "not-included",
2936
2583
  "reason": "not listed in api.include",
2937
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2584
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2938
2585
  },
2939
2586
  {
2940
2587
  "kind": "api",
2941
- "operation": "findValidSession",
2588
+ "operation": "findRoots",
2942
2589
  "code": "not-included",
2943
2590
  "reason": "not listed in api.include",
2944
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2591
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2945
2592
  },
2946
2593
  {
2947
2594
  "kind": "api",
2948
- "operation": "getSessionData",
2595
+ "operation": "getAncestorIds",
2949
2596
  "code": "not-included",
2950
2597
  "reason": "not listed in api.include",
2951
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2598
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2952
2599
  },
2953
2600
  {
2954
2601
  "kind": "api",
2955
- "operation": "revokeChildren",
2602
+ "operation": "getAncestors",
2956
2603
  "code": "not-included",
2957
2604
  "reason": "not listed in api.include",
2958
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2605
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2959
2606
  },
2960
2607
  {
2961
2608
  "kind": "api",
2962
- "operation": "revokeSession",
2609
+ "operation": "getAncestorsFromRoot",
2963
2610
  "code": "not-included",
2964
2611
  "reason": "not listed in api.include",
2965
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2612
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2966
2613
  },
2967
2614
  {
2968
2615
  "kind": "api",
2969
- "operation": "revokeUserSessions",
2616
+ "operation": "getDescendantIds",
2970
2617
  "code": "not-included",
2971
2618
  "reason": "not listed in api.include",
2972
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2619
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2973
2620
  },
2974
2621
  {
2975
2622
  "kind": "api",
2976
- "operation": "revokeUserSessionsByAuthMethod",
2623
+ "operation": "getDescendants",
2977
2624
  "code": "not-included",
2978
2625
  "reason": "not listed in api.include",
2979
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2626
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2980
2627
  },
2981
2628
  {
2982
2629
  "kind": "api",
2983
- "operation": "setSessionData",
2630
+ "operation": "getSiblings",
2984
2631
  "code": "not-included",
2985
2632
  "reason": "not listed in api.include",
2986
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2633
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2987
2634
  },
2988
2635
  {
2989
2636
  "kind": "api",
2990
- "operation": "setSessionTenant",
2637
+ "operation": "getTree",
2991
2638
  "code": "not-included",
2992
2639
  "reason": "not listed in api.include",
2993
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2640
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2994
2641
  },
2995
2642
  {
2996
2643
  "kind": "api",
2997
- "operation": "touch",
2644
+ "operation": "isAncestorOf",
2998
2645
  "code": "not-included",
2999
2646
  "reason": "not listed in api.include",
3000
- "objectName": "@happyvertical/smrt-users:SessionCollection"
2647
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2648
+ },
2649
+ {
2650
+ "kind": "api",
2651
+ "operation": "isDescendantOf",
2652
+ "code": "not-included",
2653
+ "reason": "not listed in api.include",
2654
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2655
+ },
2656
+ {
2657
+ "kind": "api",
2658
+ "operation": "makeRoot",
2659
+ "code": "not-included",
2660
+ "reason": "not listed in api.include",
2661
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2662
+ },
2663
+ {
2664
+ "kind": "api",
2665
+ "operation": "moveToParent",
2666
+ "code": "not-included",
2667
+ "reason": "not listed in api.include",
2668
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2669
+ },
2670
+ {
2671
+ "kind": "api",
2672
+ "operation": "requireChildOf",
2673
+ "code": "not-included",
2674
+ "reason": "not listed in api.include",
2675
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2676
+ },
2677
+ {
2678
+ "kind": "api",
2679
+ "operation": "validateHierarchy",
2680
+ "code": "not-included",
2681
+ "reason": "not listed in api.include",
2682
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2683
+ },
2684
+ {
2685
+ "kind": "api",
2686
+ "operation": "withTenantCatalogReadScope",
2687
+ "code": "not-included",
2688
+ "reason": "not listed in api.include",
2689
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
2690
+ },
2691
+ {
2692
+ "kind": "api",
2693
+ "operation": "withTenantHierarchyContext",
2694
+ "code": "not-included",
2695
+ "reason": "not listed in api.include",
2696
+ "objectName": "@happyvertical/smrt-users:TenantCollection"
3001
2697
  }
3002
2698
  ],
3003
2699
  "relationshipFeatures": [
@@ -3007,374 +2703,356 @@
3007
2703
  "risks": []
3008
2704
  },
3009
2705
  {
3010
- "name": "TenantCollection",
3011
- "qualifiedName": "@happyvertical/smrt-users:TenantCollection",
3012
- "collection": "tenants",
3013
- "description": "Collection for managing Tenant objects with hierarchical support.",
3014
- "tableName": "tenants",
2706
+ "name": "TenantIntegrationCollection",
2707
+ "qualifiedName": "@happyvertical/smrt-users:TenantIntegrationCollection",
2708
+ "collection": "tenantintegrations",
2709
+ "tableName": "tenant_integrations",
3015
2710
  "packageName": "@happyvertical/smrt-users",
3016
2711
  "extends": "SmrtCollection",
3017
2712
  "fields": [],
3018
2713
  "relationships": [],
3019
2714
  "methods": [
3020
- "createChild",
3021
- "findActive",
3022
- "findBySlug",
3023
- "findByStatus",
3024
- "findChildren",
3025
- "findParent",
3026
- "findRoots",
3027
- "getAncestorIds",
3028
- "getAncestors",
3029
- "getAncestorsFromRoot",
3030
- "getDescendantIds",
3031
- "getDescendants",
3032
- "getSiblings",
3033
- "getTree",
3034
- "isAncestorOf",
3035
- "isDescendantOf",
3036
- "makeRoot",
3037
- "moveToParent",
3038
- "requireChildOf",
3039
- "validateHierarchy",
3040
- "withTenantCatalogReadScope",
3041
- "withTenantHierarchyContext"
3042
- ],
3043
- "methodSignatures": [
3044
- {
3045
- "name": "createChild",
3046
- "async": true,
3047
- "params": [
3048
- "parentTenantId: string",
3049
- "options: CreateChildTenantOptions"
3050
- ],
3051
- "returns": "Promise<Tenant>"
3052
- },
3053
- {
3054
- "name": "findActive",
3055
- "async": true,
3056
- "returns": "Promise<Tenant[]>"
3057
- },
3058
- {
3059
- "name": "findBySlug",
3060
- "async": true,
3061
- "params": [
3062
- "slug: string"
3063
- ],
3064
- "returns": "Promise<Tenant | null>"
3065
- },
2715
+ "findFor",
2716
+ "findOrInit",
2717
+ "listForTenant"
2718
+ ],
2719
+ "methodSignatures": [
3066
2720
  {
3067
- "name": "findByStatus",
2721
+ "name": "findFor",
3068
2722
  "async": true,
3069
2723
  "params": [
3070
- "status: TenantStatus"
2724
+ "tenantId: string",
2725
+ "provider: TenantIntegrationProvider"
3071
2726
  ],
3072
- "returns": "Promise<Tenant[]>"
2727
+ "returns": "Promise<TenantIntegration | null>"
3073
2728
  },
3074
2729
  {
3075
- "name": "findChildren",
2730
+ "name": "findOrInit",
3076
2731
  "async": true,
3077
2732
  "params": [
3078
- "parentTenantId: string"
2733
+ "tenantId: string",
2734
+ "provider: TenantIntegrationProvider"
3079
2735
  ],
3080
- "returns": "Promise<Tenant[]>"
2736
+ "returns": "Promise<TenantIntegration>"
3081
2737
  },
3082
2738
  {
3083
- "name": "findParent",
2739
+ "name": "listForTenant",
3084
2740
  "async": true,
3085
2741
  "params": [
3086
2742
  "tenantId: string"
3087
2743
  ],
3088
- "returns": "Promise<Tenant | null>"
2744
+ "returns": "Promise<TenantIntegration[]>"
2745
+ }
2746
+ ],
2747
+ "surfaces": [],
2748
+ "withheldSurfaces": [
2749
+ {
2750
+ "kind": "api",
2751
+ "operation": "findFor",
2752
+ "code": "not-included",
2753
+ "reason": "not listed in api.include",
2754
+ "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
3089
2755
  },
3090
2756
  {
3091
- "name": "findRoots",
2757
+ "kind": "api",
2758
+ "operation": "findOrInit",
2759
+ "code": "not-included",
2760
+ "reason": "not listed in api.include",
2761
+ "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
2762
+ },
2763
+ {
2764
+ "kind": "api",
2765
+ "operation": "listForTenant",
2766
+ "code": "not-included",
2767
+ "reason": "not listed in api.include",
2768
+ "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
2769
+ }
2770
+ ],
2771
+ "relationshipFeatures": [
2772
+ "uuidColumns"
2773
+ ],
2774
+ "tags": [],
2775
+ "risks": []
2776
+ },
2777
+ {
2778
+ "name": "TenantPermissionOverrideCollection",
2779
+ "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection",
2780
+ "collection": "tenantpermissionoverrides",
2781
+ "description": "Collection for managing TenantPermissionOverride objects.",
2782
+ "tableName": "tenant_permission_overrides",
2783
+ "packageName": "@happyvertical/smrt-users",
2784
+ "extends": "SmrtCollection",
2785
+ "fields": [],
2786
+ "relationships": [],
2787
+ "methods": [
2788
+ "bulkSetOverrides",
2789
+ "copyOverrides",
2790
+ "denyPermission",
2791
+ "findByTenant",
2792
+ "findDenies",
2793
+ "findGrants",
2794
+ "findInherits",
2795
+ "getDeniedPermissionIds",
2796
+ "getGrantedPermissionIds",
2797
+ "getOverridesByEffect",
2798
+ "getOverridesByEffectBatch",
2799
+ "grantPermission",
2800
+ "inheritPermission",
2801
+ "removeAllOverrides",
2802
+ "removeOverride",
2803
+ "setOverride"
2804
+ ],
2805
+ "methodSignatures": [
2806
+ {
2807
+ "name": "bulkSetOverrides",
3092
2808
  "async": true,
3093
- "returns": "Promise<Tenant[]>"
2809
+ "params": [
2810
+ "tenantId: string",
2811
+ "overrides: Array<object>"
2812
+ ],
2813
+ "returns": "Promise<TenantPermissionOverride[]>"
3094
2814
  },
3095
2815
  {
3096
- "name": "getAncestorIds",
2816
+ "name": "copyOverrides",
3097
2817
  "async": true,
3098
2818
  "params": [
3099
- "tenantId: string"
2819
+ "fromTenantId: string",
2820
+ "toTenantId: string"
3100
2821
  ],
3101
- "returns": "Promise<string[]>"
2822
+ "returns": "Promise<TenantPermissionOverride[]>"
3102
2823
  },
3103
2824
  {
3104
- "name": "getAncestors",
2825
+ "name": "denyPermission",
3105
2826
  "async": true,
3106
2827
  "params": [
3107
- "tenantId: string"
2828
+ "tenantId: string",
2829
+ "permissionId: string"
3108
2830
  ],
3109
- "returns": "Promise<Tenant[]>"
2831
+ "returns": "Promise<TenantPermissionOverride>"
3110
2832
  },
3111
2833
  {
3112
- "name": "getAncestorsFromRoot",
2834
+ "name": "findByTenant",
3113
2835
  "async": true,
3114
2836
  "params": [
3115
2837
  "tenantId: string"
3116
2838
  ],
3117
- "returns": "Promise<Tenant[]>"
2839
+ "returns": "Promise<TenantPermissionOverride[]>"
3118
2840
  },
3119
2841
  {
3120
- "name": "getDescendantIds",
2842
+ "name": "findDenies",
3121
2843
  "async": true,
3122
2844
  "params": [
3123
2845
  "tenantId: string"
3124
2846
  ],
3125
- "returns": "Promise<string[]>"
2847
+ "returns": "Promise<TenantPermissionOverride[]>"
3126
2848
  },
3127
2849
  {
3128
- "name": "getDescendants",
2850
+ "name": "findGrants",
3129
2851
  "async": true,
3130
2852
  "params": [
3131
2853
  "tenantId: string"
3132
2854
  ],
3133
- "returns": "Promise<Tenant[]>"
2855
+ "returns": "Promise<TenantPermissionOverride[]>"
3134
2856
  },
3135
2857
  {
3136
- "name": "getSiblings",
2858
+ "name": "findInherits",
3137
2859
  "async": true,
3138
2860
  "params": [
3139
2861
  "tenantId: string"
3140
2862
  ],
3141
- "returns": "Promise<Tenant[]>"
2863
+ "returns": "Promise<TenantPermissionOverride[]>"
3142
2864
  },
3143
2865
  {
3144
- "name": "getTree",
2866
+ "name": "getDeniedPermissionIds",
3145
2867
  "async": true,
3146
2868
  "params": [
3147
- "rootTenantId?: string"
2869
+ "tenantId: string"
3148
2870
  ],
3149
- "returns": "any"
2871
+ "returns": "Promise<string[]>"
3150
2872
  },
3151
2873
  {
3152
- "name": "isAncestorOf",
2874
+ "name": "getGrantedPermissionIds",
3153
2875
  "async": true,
3154
2876
  "params": [
3155
- "potentialAncestorId: string",
3156
2877
  "tenantId: string"
3157
2878
  ],
3158
- "returns": "Promise<boolean>"
2879
+ "returns": "Promise<string[]>"
3159
2880
  },
3160
2881
  {
3161
- "name": "isDescendantOf",
2882
+ "name": "getOverridesByEffect",
3162
2883
  "async": true,
3163
2884
  "params": [
3164
- "potentialDescendantId: string",
3165
2885
  "tenantId: string"
3166
2886
  ],
3167
- "returns": "Promise<boolean>"
2887
+ "returns": "Promise<TenantPermissionOverrideResult>"
3168
2888
  },
3169
2889
  {
3170
- "name": "makeRoot",
2890
+ "name": "getOverridesByEffectBatch",
3171
2891
  "async": true,
3172
2892
  "params": [
3173
- "tenantId: string"
2893
+ "tenantIds: string[]"
3174
2894
  ],
3175
- "returns": "Promise<Tenant>"
2895
+ "returns": "Promise<Map<string, TenantPermissionOverrideResult>>"
3176
2896
  },
3177
2897
  {
3178
- "name": "moveToParent",
2898
+ "name": "grantPermission",
3179
2899
  "async": true,
3180
2900
  "params": [
3181
2901
  "tenantId: string",
3182
- "newParentId: string | null"
2902
+ "permissionId: string"
3183
2903
  ],
3184
- "returns": "Promise<Tenant>"
2904
+ "returns": "Promise<TenantPermissionOverride>"
3185
2905
  },
3186
2906
  {
3187
- "name": "requireChildOf",
2907
+ "name": "inheritPermission",
3188
2908
  "async": true,
3189
2909
  "params": [
3190
- "parentId: string",
3191
- "childId: string"
2910
+ "tenantId: string",
2911
+ "permissionId: string"
3192
2912
  ],
3193
- "returns": "Promise<void>"
2913
+ "returns": "Promise<TenantPermissionOverride>"
3194
2914
  },
3195
2915
  {
3196
- "name": "validateHierarchy",
2916
+ "name": "removeAllOverrides",
3197
2917
  "async": true,
3198
2918
  "params": [
3199
2919
  "tenantId: string"
3200
2920
  ],
3201
- "returns": "Promise<string[]>"
2921
+ "returns": "Promise<number>"
3202
2922
  },
3203
2923
  {
3204
- "name": "withTenantCatalogReadScope",
2924
+ "name": "removeOverride",
3205
2925
  "async": true,
3206
2926
  "params": [
3207
- "options: TenantReadScopeOptions",
3208
- "callback: Function"
2927
+ "tenantId: string",
2928
+ "permissionId: string"
3209
2929
  ],
3210
- "returns": "Promise<T>"
2930
+ "returns": "Promise<boolean>"
3211
2931
  },
3212
2932
  {
3213
- "name": "withTenantHierarchyContext",
2933
+ "name": "setOverride",
3214
2934
  "async": true,
3215
2935
  "params": [
3216
- "rootTenantId: string",
3217
- "options: TenantReadScopeOptions",
3218
- "callback: Function"
2936
+ "tenantId: string",
2937
+ "permissionId: string",
2938
+ "effect: TenantPermissionEffect"
3219
2939
  ],
3220
- "returns": "Promise<T>"
2940
+ "returns": "Promise<TenantPermissionOverride>"
3221
2941
  }
3222
2942
  ],
3223
2943
  "surfaces": [],
3224
2944
  "withheldSurfaces": [
3225
2945
  {
3226
2946
  "kind": "api",
3227
- "operation": "createChild",
3228
- "code": "not-included",
3229
- "reason": "not listed in api.include",
3230
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3231
- },
3232
- {
3233
- "kind": "api",
3234
- "operation": "findActive",
3235
- "code": "not-included",
3236
- "reason": "not listed in api.include",
3237
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3238
- },
3239
- {
3240
- "kind": "api",
3241
- "operation": "findBySlug",
3242
- "code": "not-included",
3243
- "reason": "not listed in api.include",
3244
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3245
- },
3246
- {
3247
- "kind": "api",
3248
- "operation": "findByStatus",
3249
- "code": "not-included",
3250
- "reason": "not listed in api.include",
3251
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3252
- },
3253
- {
3254
- "kind": "api",
3255
- "operation": "findChildren",
3256
- "code": "not-included",
3257
- "reason": "not listed in api.include",
3258
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3259
- },
3260
- {
3261
- "kind": "api",
3262
- "operation": "findParent",
3263
- "code": "not-included",
3264
- "reason": "not listed in api.include",
3265
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3266
- },
3267
- {
3268
- "kind": "api",
3269
- "operation": "findRoots",
2947
+ "operation": "bulkSetOverrides",
3270
2948
  "code": "not-included",
3271
2949
  "reason": "not listed in api.include",
3272
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2950
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3273
2951
  },
3274
2952
  {
3275
2953
  "kind": "api",
3276
- "operation": "getAncestorIds",
2954
+ "operation": "copyOverrides",
3277
2955
  "code": "not-included",
3278
2956
  "reason": "not listed in api.include",
3279
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2957
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3280
2958
  },
3281
2959
  {
3282
2960
  "kind": "api",
3283
- "operation": "getAncestors",
2961
+ "operation": "denyPermission",
3284
2962
  "code": "not-included",
3285
2963
  "reason": "not listed in api.include",
3286
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2964
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3287
2965
  },
3288
2966
  {
3289
2967
  "kind": "api",
3290
- "operation": "getAncestorsFromRoot",
2968
+ "operation": "findByTenant",
3291
2969
  "code": "not-included",
3292
2970
  "reason": "not listed in api.include",
3293
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2971
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3294
2972
  },
3295
2973
  {
3296
2974
  "kind": "api",
3297
- "operation": "getDescendantIds",
2975
+ "operation": "findDenies",
3298
2976
  "code": "not-included",
3299
2977
  "reason": "not listed in api.include",
3300
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2978
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3301
2979
  },
3302
2980
  {
3303
2981
  "kind": "api",
3304
- "operation": "getDescendants",
2982
+ "operation": "findGrants",
3305
2983
  "code": "not-included",
3306
2984
  "reason": "not listed in api.include",
3307
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2985
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3308
2986
  },
3309
2987
  {
3310
2988
  "kind": "api",
3311
- "operation": "getSiblings",
2989
+ "operation": "findInherits",
3312
2990
  "code": "not-included",
3313
2991
  "reason": "not listed in api.include",
3314
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2992
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3315
2993
  },
3316
2994
  {
3317
2995
  "kind": "api",
3318
- "operation": "getTree",
2996
+ "operation": "getDeniedPermissionIds",
3319
2997
  "code": "not-included",
3320
2998
  "reason": "not listed in api.include",
3321
- "objectName": "@happyvertical/smrt-users:TenantCollection"
2999
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3322
3000
  },
3323
3001
  {
3324
3002
  "kind": "api",
3325
- "operation": "isAncestorOf",
3003
+ "operation": "getGrantedPermissionIds",
3326
3004
  "code": "not-included",
3327
3005
  "reason": "not listed in api.include",
3328
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3006
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3329
3007
  },
3330
3008
  {
3331
3009
  "kind": "api",
3332
- "operation": "isDescendantOf",
3010
+ "operation": "getOverridesByEffect",
3333
3011
  "code": "not-included",
3334
3012
  "reason": "not listed in api.include",
3335
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3013
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3336
3014
  },
3337
3015
  {
3338
3016
  "kind": "api",
3339
- "operation": "makeRoot",
3017
+ "operation": "getOverridesByEffectBatch",
3340
3018
  "code": "not-included",
3341
3019
  "reason": "not listed in api.include",
3342
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3020
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3343
3021
  },
3344
3022
  {
3345
3023
  "kind": "api",
3346
- "operation": "moveToParent",
3024
+ "operation": "grantPermission",
3347
3025
  "code": "not-included",
3348
3026
  "reason": "not listed in api.include",
3349
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3027
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3350
3028
  },
3351
3029
  {
3352
3030
  "kind": "api",
3353
- "operation": "requireChildOf",
3031
+ "operation": "inheritPermission",
3354
3032
  "code": "not-included",
3355
3033
  "reason": "not listed in api.include",
3356
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3034
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3357
3035
  },
3358
3036
  {
3359
3037
  "kind": "api",
3360
- "operation": "validateHierarchy",
3038
+ "operation": "removeAllOverrides",
3361
3039
  "code": "not-included",
3362
3040
  "reason": "not listed in api.include",
3363
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3041
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3364
3042
  },
3365
3043
  {
3366
3044
  "kind": "api",
3367
- "operation": "withTenantCatalogReadScope",
3045
+ "operation": "removeOverride",
3368
3046
  "code": "not-included",
3369
3047
  "reason": "not listed in api.include",
3370
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3048
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3371
3049
  },
3372
3050
  {
3373
3051
  "kind": "api",
3374
- "operation": "withTenantHierarchyContext",
3052
+ "operation": "setOverride",
3375
3053
  "code": "not-included",
3376
3054
  "reason": "not listed in api.include",
3377
- "objectName": "@happyvertical/smrt-users:TenantCollection"
3055
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3378
3056
  }
3379
3057
  ],
3380
3058
  "relationshipFeatures": [
@@ -3384,69 +3062,130 @@
3384
3062
  "risks": []
3385
3063
  },
3386
3064
  {
3387
- "name": "TenantIntegrationCollection",
3388
- "qualifiedName": "@happyvertical/smrt-users:TenantIntegrationCollection",
3389
- "collection": "tenantintegrations",
3390
- "tableName": "tenant_integrations",
3065
+ "name": "UserCollection",
3066
+ "qualifiedName": "@happyvertical/smrt-users:UserCollection",
3067
+ "collection": "users",
3068
+ "description": "Collection for managing User objects",
3069
+ "tableName": "users",
3391
3070
  "packageName": "@happyvertical/smrt-users",
3392
3071
  "extends": "SmrtCollection",
3393
3072
  "fields": [],
3394
3073
  "relationships": [],
3395
3074
  "methods": [
3396
- "findFor",
3397
- "findOrInit",
3398
- "listForTenant"
3075
+ "findActive",
3076
+ "findByEmail",
3077
+ "findByProfile",
3078
+ "findByStatus",
3079
+ "findPending",
3080
+ "getOrCreateForProfile",
3081
+ "getOrCreateFromOidc"
3399
3082
  ],
3400
3083
  "methodSignatures": [
3401
3084
  {
3402
- "name": "findFor",
3085
+ "name": "findActive",
3086
+ "async": true,
3087
+ "returns": "Promise<User[]>"
3088
+ },
3089
+ {
3090
+ "name": "findByEmail",
3403
3091
  "async": true,
3404
3092
  "params": [
3405
- "tenantId: string",
3406
- "provider: TenantIntegrationProvider"
3093
+ "email: string"
3407
3094
  ],
3408
- "returns": "Promise<TenantIntegration | null>"
3095
+ "returns": "Promise<User | null>"
3409
3096
  },
3410
3097
  {
3411
- "name": "findOrInit",
3098
+ "name": "findByProfile",
3412
3099
  "async": true,
3413
3100
  "params": [
3414
- "tenantId: string",
3415
- "provider: TenantIntegrationProvider"
3101
+ "profileId: string"
3416
3102
  ],
3417
- "returns": "Promise<TenantIntegration>"
3103
+ "returns": "Promise<User | null>"
3418
3104
  },
3419
3105
  {
3420
- "name": "listForTenant",
3106
+ "name": "findByStatus",
3421
3107
  "async": true,
3422
3108
  "params": [
3423
- "tenantId: string"
3109
+ "status: UserStatus"
3424
3110
  ],
3425
- "returns": "Promise<TenantIntegration[]>"
3111
+ "returns": "Promise<User[]>"
3112
+ },
3113
+ {
3114
+ "name": "findPending",
3115
+ "async": true,
3116
+ "returns": "Promise<User[]>"
3117
+ },
3118
+ {
3119
+ "name": "getOrCreateForProfile",
3120
+ "async": true,
3121
+ "params": [
3122
+ "profileId: string",
3123
+ "email: string",
3124
+ "defaults?: Partial<object>"
3125
+ ],
3126
+ "returns": "Promise<User>"
3127
+ },
3128
+ {
3129
+ "name": "getOrCreateFromOidc",
3130
+ "async": true,
3131
+ "params": [
3132
+ "claims: OidcClaims",
3133
+ "provider: string",
3134
+ "options?: GetOrCreateFromOidcOptions"
3135
+ ],
3136
+ "returns": "Promise<OidcIdentityResult>"
3426
3137
  }
3427
3138
  ],
3428
3139
  "surfaces": [],
3429
3140
  "withheldSurfaces": [
3430
3141
  {
3431
3142
  "kind": "api",
3432
- "operation": "findFor",
3143
+ "operation": "findActive",
3433
3144
  "code": "not-included",
3434
3145
  "reason": "not listed in api.include",
3435
- "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
3146
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3436
3147
  },
3437
3148
  {
3438
3149
  "kind": "api",
3439
- "operation": "findOrInit",
3150
+ "operation": "findByEmail",
3440
3151
  "code": "not-included",
3441
3152
  "reason": "not listed in api.include",
3442
- "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
3153
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3443
3154
  },
3444
3155
  {
3445
3156
  "kind": "api",
3446
- "operation": "listForTenant",
3157
+ "operation": "findByProfile",
3447
3158
  "code": "not-included",
3448
3159
  "reason": "not listed in api.include",
3449
- "objectName": "@happyvertical/smrt-users:TenantIntegrationCollection"
3160
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3161
+ },
3162
+ {
3163
+ "kind": "api",
3164
+ "operation": "findByStatus",
3165
+ "code": "not-included",
3166
+ "reason": "not listed in api.include",
3167
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3168
+ },
3169
+ {
3170
+ "kind": "api",
3171
+ "operation": "findPending",
3172
+ "code": "not-included",
3173
+ "reason": "not listed in api.include",
3174
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3175
+ },
3176
+ {
3177
+ "kind": "api",
3178
+ "operation": "getOrCreateForProfile",
3179
+ "code": "not-included",
3180
+ "reason": "not listed in api.include",
3181
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3182
+ },
3183
+ {
3184
+ "kind": "api",
3185
+ "operation": "getOrCreateFromOidc",
3186
+ "code": "not-included",
3187
+ "reason": "not listed in api.include",
3188
+ "objectName": "@happyvertical/smrt-users:UserCollection"
3450
3189
  }
3451
3190
  ],
3452
3191
  "relationshipFeatures": [
@@ -3456,419 +3195,680 @@
3456
3195
  "risks": []
3457
3196
  },
3458
3197
  {
3459
- "name": "TenantPermissionOverrideCollection",
3460
- "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection",
3461
- "collection": "tenantpermissionoverrides",
3462
- "description": "Collection for managing TenantPermissionOverride objects.",
3463
- "tableName": "tenant_permission_overrides",
3198
+ "name": "MemberClass",
3199
+ "qualifiedName": "@happyvertical/smrt-users:MemberClass",
3200
+ "displayLabelField": "name",
3201
+ "collection": "memberclasses",
3202
+ "description": "A tenant-configured legal class; it has no authority or entitlement effect.",
3203
+ "tableName": "member_classes",
3464
3204
  "packageName": "@happyvertical/smrt-users",
3465
- "extends": "SmrtCollection",
3466
- "fields": [],
3205
+ "extends": "SmrtObject",
3206
+ "fields": [
3207
+ {
3208
+ "name": "tenantId",
3209
+ "type": "text",
3210
+ "required": true,
3211
+ "columnType": "UUID"
3212
+ },
3213
+ {
3214
+ "name": "key",
3215
+ "type": "text",
3216
+ "required": false,
3217
+ "columnType": "TEXT"
3218
+ },
3219
+ {
3220
+ "name": "name",
3221
+ "type": "text",
3222
+ "required": false,
3223
+ "columnType": "TEXT"
3224
+ },
3225
+ {
3226
+ "name": "description",
3227
+ "type": "text",
3228
+ "required": false,
3229
+ "columnType": "TEXT"
3230
+ },
3231
+ {
3232
+ "name": "policyMetadata",
3233
+ "type": "json",
3234
+ "required": false,
3235
+ "columnType": "JSON"
3236
+ }
3237
+ ],
3467
3238
  "relationships": [],
3468
- "methods": [
3469
- "bulkSetOverrides",
3470
- "copyOverrides",
3471
- "denyPermission",
3472
- "findByTenant",
3473
- "findDenies",
3474
- "findGrants",
3475
- "findInherits",
3476
- "getDeniedPermissionIds",
3477
- "getGrantedPermissionIds",
3478
- "getOverridesByEffect",
3479
- "getOverridesByEffectBatch",
3480
- "grantPermission",
3481
- "inheritPermission",
3482
- "removeAllOverrides",
3483
- "removeOverride",
3484
- "setOverride"
3239
+ "methods": [],
3240
+ "tenant": {
3241
+ "scoped": true,
3242
+ "mode": "required",
3243
+ "field": "tenantId"
3244
+ },
3245
+ "conflictColumns": [
3246
+ "tenant_id",
3247
+ "slug",
3248
+ "context"
3485
3249
  ],
3486
- "methodSignatures": [
3250
+ "surfaces": [],
3251
+ "relationshipFeatures": [
3252
+ "uuidColumns"
3253
+ ],
3254
+ "tags": [],
3255
+ "risks": []
3256
+ },
3257
+ {
3258
+ "name": "LegalMember",
3259
+ "qualifiedName": "@happyvertical/smrt-users:LegalMember",
3260
+ "collection": "legalmembers",
3261
+ "description": "The legal register entry, deliberately separate from RBAC Membership.",
3262
+ "tableName": "legal_members",
3263
+ "packageName": "@happyvertical/smrt-users",
3264
+ "extends": "SmrtObject",
3265
+ "fields": [
3487
3266
  {
3488
- "name": "bulkSetOverrides",
3489
- "async": true,
3490
- "params": [
3491
- "tenantId: string",
3492
- "overrides: Array<object>"
3493
- ],
3494
- "returns": "Promise<TenantPermissionOverride[]>"
3267
+ "name": "tenantId",
3268
+ "type": "text",
3269
+ "required": true,
3270
+ "columnType": "UUID"
3271
+ },
3272
+ {
3273
+ "name": "memberClassId",
3274
+ "type": "foreignKey",
3275
+ "required": false,
3276
+ "related": "MemberClass",
3277
+ "columnType": "UUID"
3278
+ },
3279
+ {
3280
+ "name": "kind",
3281
+ "type": "text",
3282
+ "required": false,
3283
+ "columnType": "TEXT"
3284
+ },
3285
+ {
3286
+ "name": "displayName",
3287
+ "type": "text",
3288
+ "required": false,
3289
+ "columnType": "TEXT"
3495
3290
  },
3496
3291
  {
3497
- "name": "copyOverrides",
3498
- "async": true,
3499
- "params": [
3500
- "fromTenantId: string",
3501
- "toTenantId: string"
3502
- ],
3503
- "returns": "Promise<TenantPermissionOverride[]>"
3292
+ "name": "userId",
3293
+ "type": "foreignKey",
3294
+ "required": false,
3295
+ "related": "User",
3296
+ "columnType": "UUID"
3504
3297
  },
3505
3298
  {
3506
- "name": "denyPermission",
3507
- "async": true,
3508
- "params": [
3509
- "tenantId: string",
3510
- "permissionId: string"
3511
- ],
3512
- "returns": "Promise<TenantPermissionOverride>"
3299
+ "name": "profileId",
3300
+ "type": "crossPackageRef",
3301
+ "required": false,
3302
+ "related": "@happyvertical/smrt-profiles:Profile",
3303
+ "columnType": "UUID"
3513
3304
  },
3514
3305
  {
3515
- "name": "findByTenant",
3516
- "async": true,
3517
- "params": [
3518
- "tenantId: string"
3519
- ],
3520
- "returns": "Promise<TenantPermissionOverride[]>"
3306
+ "name": "externalPartyRef",
3307
+ "type": "text",
3308
+ "required": false,
3309
+ "columnType": "TEXT"
3521
3310
  },
3522
3311
  {
3523
- "name": "findDenies",
3524
- "async": true,
3525
- "params": [
3526
- "tenantId: string"
3527
- ],
3528
- "returns": "Promise<TenantPermissionOverride[]>"
3312
+ "name": "joinedOn",
3313
+ "type": "text",
3314
+ "required": false,
3315
+ "columnType": "TEXT"
3529
3316
  },
3530
3317
  {
3531
- "name": "findGrants",
3532
- "async": true,
3533
- "params": [
3534
- "tenantId: string"
3535
- ],
3536
- "returns": "Promise<TenantPermissionOverride[]>"
3318
+ "name": "leftOn",
3319
+ "type": "text",
3320
+ "required": false,
3321
+ "columnType": "TEXT"
3537
3322
  },
3538
3323
  {
3539
- "name": "findInherits",
3540
- "async": true,
3541
- "params": [
3542
- "tenantId: string"
3543
- ],
3544
- "returns": "Promise<TenantPermissionOverride[]>"
3324
+ "name": "status",
3325
+ "type": "text",
3326
+ "required": false,
3327
+ "columnType": "TEXT"
3328
+ }
3329
+ ],
3330
+ "relationships": [
3331
+ {
3332
+ "name": "memberClassId",
3333
+ "type": "foreignKey",
3334
+ "required": false,
3335
+ "related": "MemberClass",
3336
+ "columnType": "UUID"
3545
3337
  },
3546
3338
  {
3547
- "name": "getDeniedPermissionIds",
3548
- "async": true,
3549
- "params": [
3550
- "tenantId: string"
3551
- ],
3552
- "returns": "Promise<string[]>"
3339
+ "name": "userId",
3340
+ "type": "foreignKey",
3341
+ "required": false,
3342
+ "related": "User",
3343
+ "columnType": "UUID"
3553
3344
  },
3554
3345
  {
3555
- "name": "getGrantedPermissionIds",
3556
- "async": true,
3557
- "params": [
3558
- "tenantId: string"
3559
- ],
3560
- "returns": "Promise<string[]>"
3346
+ "name": "profileId",
3347
+ "type": "crossPackageRef",
3348
+ "required": false,
3349
+ "related": "@happyvertical/smrt-profiles:Profile",
3350
+ "columnType": "UUID"
3351
+ }
3352
+ ],
3353
+ "methods": [],
3354
+ "tenant": {
3355
+ "scoped": true,
3356
+ "mode": "required",
3357
+ "field": "tenantId"
3358
+ },
3359
+ "conflictColumns": [
3360
+ "tenant_id",
3361
+ "slug",
3362
+ "context"
3363
+ ],
3364
+ "surfaces": [],
3365
+ "relationshipFeatures": [
3366
+ "crossPackageRef",
3367
+ "foreignKey",
3368
+ "uuidColumns"
3369
+ ],
3370
+ "tags": [],
3371
+ "risks": []
3372
+ },
3373
+ {
3374
+ "name": "LegalMemberStatusHistory",
3375
+ "qualifiedName": "@happyvertical/smrt-users:LegalMemberStatusHistory",
3376
+ "collection": "legalmemberstatushistories",
3377
+ "description": "Append-only effective history; current status never erases it.",
3378
+ "tableName": "legal_member_status_history",
3379
+ "packageName": "@happyvertical/smrt-users",
3380
+ "extends": "SmrtObject",
3381
+ "fields": [
3382
+ {
3383
+ "name": "tenantId",
3384
+ "type": "text",
3385
+ "required": true,
3386
+ "columnType": "UUID"
3561
3387
  },
3562
3388
  {
3563
- "name": "getOverridesByEffect",
3564
- "async": true,
3565
- "params": [
3566
- "tenantId: string"
3567
- ],
3568
- "returns": "Promise<TenantPermissionOverrideResult>"
3389
+ "name": "memberId",
3390
+ "type": "foreignKey",
3391
+ "required": false,
3392
+ "related": "LegalMember",
3393
+ "columnType": "UUID"
3569
3394
  },
3570
3395
  {
3571
- "name": "getOverridesByEffectBatch",
3572
- "async": true,
3573
- "params": [
3574
- "tenantIds: string[]"
3575
- ],
3576
- "returns": "Promise<Map<string, TenantPermissionOverrideResult>>"
3396
+ "name": "status",
3397
+ "type": "text",
3398
+ "required": false,
3399
+ "columnType": "TEXT"
3577
3400
  },
3578
3401
  {
3579
- "name": "grantPermission",
3580
- "async": true,
3581
- "params": [
3582
- "tenantId: string",
3583
- "permissionId: string"
3584
- ],
3585
- "returns": "Promise<TenantPermissionOverride>"
3402
+ "name": "effectiveOn",
3403
+ "type": "text",
3404
+ "required": false,
3405
+ "columnType": "TEXT"
3586
3406
  },
3587
3407
  {
3588
- "name": "inheritPermission",
3589
- "async": true,
3590
- "params": [
3591
- "tenantId: string",
3592
- "permissionId: string"
3593
- ],
3594
- "returns": "Promise<TenantPermissionOverride>"
3408
+ "name": "sequence",
3409
+ "type": "integer",
3410
+ "required": false,
3411
+ "columnType": "INTEGER"
3595
3412
  },
3596
3413
  {
3597
- "name": "removeAllOverrides",
3598
- "async": true,
3599
- "params": [
3600
- "tenantId: string"
3601
- ],
3602
- "returns": "Promise<number>"
3414
+ "name": "reason",
3415
+ "type": "text",
3416
+ "required": false,
3417
+ "columnType": "TEXT"
3603
3418
  },
3604
3419
  {
3605
- "name": "removeOverride",
3420
+ "name": "actorRef",
3421
+ "type": "text",
3422
+ "required": false,
3423
+ "columnType": "TEXT"
3424
+ }
3425
+ ],
3426
+ "relationships": [
3427
+ {
3428
+ "name": "memberId",
3429
+ "type": "foreignKey",
3430
+ "required": false,
3431
+ "related": "LegalMember",
3432
+ "columnType": "UUID"
3433
+ }
3434
+ ],
3435
+ "methods": [
3436
+ "delete",
3437
+ "save"
3438
+ ],
3439
+ "methodSignatures": [
3440
+ {
3441
+ "name": "delete",
3606
3442
  "async": true,
3607
- "params": [
3608
- "tenantId: string",
3609
- "permissionId: string"
3610
- ],
3611
- "returns": "Promise<boolean>"
3443
+ "returns": "Promise<void>"
3612
3444
  },
3613
3445
  {
3614
- "name": "setOverride",
3446
+ "name": "save",
3615
3447
  "async": true,
3616
- "params": [
3617
- "tenantId: string",
3618
- "permissionId: string",
3619
- "effect: TenantPermissionEffect"
3620
- ],
3621
- "returns": "Promise<TenantPermissionOverride>"
3448
+ "returns": "Promise<this>"
3622
3449
  }
3623
3450
  ],
3451
+ "tenant": {
3452
+ "scoped": true,
3453
+ "mode": "required",
3454
+ "field": "tenantId"
3455
+ },
3456
+ "conflictColumns": [
3457
+ "tenant_id",
3458
+ "slug",
3459
+ "context"
3460
+ ],
3624
3461
  "surfaces": [],
3625
3462
  "withheldSurfaces": [
3626
3463
  {
3627
3464
  "kind": "api",
3628
- "operation": "bulkSetOverrides",
3629
- "code": "not-included",
3630
- "reason": "not listed in api.include",
3631
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3465
+ "operation": "save",
3466
+ "code": "lifecycle-method",
3467
+ "reason": "`save` is a framework lifecycle method, not a distinct operation",
3468
+ "objectName": "@happyvertical/smrt-users:LegalMemberStatusHistory"
3469
+ }
3470
+ ],
3471
+ "relationshipFeatures": [
3472
+ "foreignKey",
3473
+ "uuidColumns"
3474
+ ],
3475
+ "tags": [],
3476
+ "risks": []
3477
+ },
3478
+ {
3479
+ "name": "LegalMemberReference",
3480
+ "qualifiedName": "@happyvertical/smrt-users:LegalMemberReference",
3481
+ "collection": "legalmemberreferences",
3482
+ "description": "A link to authoritative share/dues/subscription/agreement/ledger evidence.",
3483
+ "tableName": "legal_member_references",
3484
+ "packageName": "@happyvertical/smrt-users",
3485
+ "extends": "SmrtObject",
3486
+ "fields": [
3487
+ {
3488
+ "name": "tenantId",
3489
+ "type": "text",
3490
+ "required": true,
3491
+ "columnType": "UUID"
3632
3492
  },
3633
3493
  {
3634
- "kind": "api",
3635
- "operation": "copyOverrides",
3636
- "code": "not-included",
3637
- "reason": "not listed in api.include",
3638
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3494
+ "name": "memberId",
3495
+ "type": "foreignKey",
3496
+ "required": false,
3497
+ "related": "LegalMember",
3498
+ "columnType": "UUID"
3639
3499
  },
3640
3500
  {
3641
- "kind": "api",
3642
- "operation": "denyPermission",
3643
- "code": "not-included",
3644
- "reason": "not listed in api.include",
3645
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3501
+ "name": "kind",
3502
+ "type": "text",
3503
+ "required": false,
3504
+ "columnType": "TEXT"
3646
3505
  },
3647
3506
  {
3648
- "kind": "api",
3649
- "operation": "findByTenant",
3650
- "code": "not-included",
3651
- "reason": "not listed in api.include",
3652
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3507
+ "name": "sourceType",
3508
+ "type": "text",
3509
+ "required": false,
3510
+ "columnType": "TEXT"
3653
3511
  },
3654
3512
  {
3655
- "kind": "api",
3656
- "operation": "findDenies",
3657
- "code": "not-included",
3658
- "reason": "not listed in api.include",
3659
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3513
+ "name": "sourceId",
3514
+ "type": "text",
3515
+ "required": false,
3516
+ "columnType": "TEXT"
3660
3517
  },
3661
3518
  {
3662
- "kind": "api",
3663
- "operation": "findGrants",
3664
- "code": "not-included",
3665
- "reason": "not listed in api.include",
3666
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3519
+ "name": "authoritative",
3520
+ "type": "boolean",
3521
+ "required": false,
3522
+ "columnType": "BOOLEAN"
3667
3523
  },
3668
3524
  {
3669
- "kind": "api",
3670
- "operation": "findInherits",
3671
- "code": "not-included",
3672
- "reason": "not listed in api.include",
3673
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3525
+ "name": "effectiveFrom",
3526
+ "type": "text",
3527
+ "required": false,
3528
+ "columnType": "TEXT"
3674
3529
  },
3675
3530
  {
3676
- "kind": "api",
3677
- "operation": "getDeniedPermissionIds",
3678
- "code": "not-included",
3679
- "reason": "not listed in api.include",
3680
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3531
+ "name": "effectiveTo",
3532
+ "type": "text",
3533
+ "required": false,
3534
+ "columnType": "TEXT"
3681
3535
  },
3682
3536
  {
3683
- "kind": "api",
3684
- "operation": "getGrantedPermissionIds",
3685
- "code": "not-included",
3686
- "reason": "not listed in api.include",
3687
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3537
+ "name": "revokesId",
3538
+ "type": "foreignKey",
3539
+ "required": false,
3540
+ "related": "LegalMemberReference",
3541
+ "columnType": "UUID"
3542
+ }
3543
+ ],
3544
+ "relationships": [
3545
+ {
3546
+ "name": "memberId",
3547
+ "type": "foreignKey",
3548
+ "required": false,
3549
+ "related": "LegalMember",
3550
+ "columnType": "UUID"
3688
3551
  },
3689
3552
  {
3690
- "kind": "api",
3691
- "operation": "getOverridesByEffect",
3692
- "code": "not-included",
3693
- "reason": "not listed in api.include",
3694
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3553
+ "name": "revokesId",
3554
+ "type": "foreignKey",
3555
+ "required": false,
3556
+ "related": "LegalMemberReference",
3557
+ "columnType": "UUID"
3558
+ }
3559
+ ],
3560
+ "methods": [
3561
+ "delete",
3562
+ "save"
3563
+ ],
3564
+ "methodSignatures": [
3565
+ {
3566
+ "name": "delete",
3567
+ "async": true,
3568
+ "returns": "Promise<void>"
3695
3569
  },
3570
+ {
3571
+ "name": "save",
3572
+ "async": true,
3573
+ "returns": "Promise<this>"
3574
+ }
3575
+ ],
3576
+ "tenant": {
3577
+ "scoped": true,
3578
+ "mode": "required",
3579
+ "field": "tenantId"
3580
+ },
3581
+ "conflictColumns": [
3582
+ "tenant_id",
3583
+ "slug",
3584
+ "context"
3585
+ ],
3586
+ "surfaces": [],
3587
+ "withheldSurfaces": [
3696
3588
  {
3697
3589
  "kind": "api",
3698
- "operation": "getOverridesByEffectBatch",
3699
- "code": "not-included",
3700
- "reason": "not listed in api.include",
3701
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3590
+ "operation": "save",
3591
+ "code": "lifecycle-method",
3592
+ "reason": "`save` is a framework lifecycle method, not a distinct operation",
3593
+ "objectName": "@happyvertical/smrt-users:LegalMemberReference"
3594
+ }
3595
+ ],
3596
+ "relationshipFeatures": [
3597
+ "foreignKey",
3598
+ "uuidColumns"
3599
+ ],
3600
+ "tags": [],
3601
+ "risks": []
3602
+ },
3603
+ {
3604
+ "name": "MemberOfficerAppointment",
3605
+ "qualifiedName": "@happyvertical/smrt-users:MemberOfficerAppointment",
3606
+ "collection": "memberofficerappointments",
3607
+ "description": "A dated register of board/officer appointments; it does not implement elections.",
3608
+ "tableName": "member_officer_appointments",
3609
+ "packageName": "@happyvertical/smrt-users",
3610
+ "extends": "SmrtObject",
3611
+ "fields": [
3612
+ {
3613
+ "name": "tenantId",
3614
+ "type": "text",
3615
+ "required": true,
3616
+ "columnType": "UUID"
3702
3617
  },
3703
3618
  {
3704
- "kind": "api",
3705
- "operation": "grantPermission",
3706
- "code": "not-included",
3707
- "reason": "not listed in api.include",
3708
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3619
+ "name": "memberId",
3620
+ "type": "foreignKey",
3621
+ "required": false,
3622
+ "related": "LegalMember",
3623
+ "columnType": "UUID"
3709
3624
  },
3710
3625
  {
3711
- "kind": "api",
3712
- "operation": "inheritPermission",
3713
- "code": "not-included",
3714
- "reason": "not listed in api.include",
3715
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3626
+ "name": "role",
3627
+ "type": "text",
3628
+ "required": false,
3629
+ "columnType": "TEXT"
3716
3630
  },
3717
3631
  {
3718
- "kind": "api",
3719
- "operation": "removeAllOverrides",
3720
- "code": "not-included",
3721
- "reason": "not listed in api.include",
3722
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3632
+ "name": "effectiveFrom",
3633
+ "type": "text",
3634
+ "required": false,
3635
+ "columnType": "TEXT"
3723
3636
  },
3724
3637
  {
3725
- "kind": "api",
3726
- "operation": "removeOverride",
3727
- "code": "not-included",
3728
- "reason": "not listed in api.include",
3729
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3638
+ "name": "effectiveTo",
3639
+ "type": "text",
3640
+ "required": false,
3641
+ "columnType": "TEXT"
3730
3642
  },
3731
3643
  {
3732
- "kind": "api",
3733
- "operation": "setOverride",
3734
- "code": "not-included",
3735
- "reason": "not listed in api.include",
3736
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection"
3644
+ "name": "authority",
3645
+ "type": "json",
3646
+ "required": false,
3647
+ "columnType": "JSON"
3648
+ }
3649
+ ],
3650
+ "relationships": [
3651
+ {
3652
+ "name": "memberId",
3653
+ "type": "foreignKey",
3654
+ "required": false,
3655
+ "related": "LegalMember",
3656
+ "columnType": "UUID"
3737
3657
  }
3738
3658
  ],
3659
+ "methods": [],
3660
+ "tenant": {
3661
+ "scoped": true,
3662
+ "mode": "required",
3663
+ "field": "tenantId"
3664
+ },
3665
+ "conflictColumns": [
3666
+ "tenant_id",
3667
+ "slug",
3668
+ "context"
3669
+ ],
3670
+ "surfaces": [],
3739
3671
  "relationshipFeatures": [
3672
+ "foreignKey",
3740
3673
  "uuidColumns"
3741
3674
  ],
3742
3675
  "tags": [],
3743
3676
  "risks": []
3744
3677
  },
3745
3678
  {
3746
- "name": "UserCollection",
3747
- "qualifiedName": "@happyvertical/smrt-users:UserCollection",
3748
- "collection": "users",
3749
- "description": "Collection for managing User objects",
3750
- "tableName": "users",
3679
+ "name": "MemberEligibilitySnapshot",
3680
+ "qualifiedName": "@happyvertical/smrt-users:MemberEligibilitySnapshot",
3681
+ "collection": "membereligibilitysnapshots",
3682
+ "tableName": "member_eligibility_snapshots",
3751
3683
  "packageName": "@happyvertical/smrt-users",
3752
- "extends": "SmrtCollection",
3753
- "fields": [],
3754
- "relationships": [],
3755
- "methods": [
3756
- "findActive",
3757
- "findByEmail",
3758
- "findByProfile",
3759
- "findByStatus",
3760
- "findPending",
3761
- "getOrCreateForProfile",
3762
- "getOrCreateFromOidc"
3763
- ],
3764
- "methodSignatures": [
3765
- {
3766
- "name": "findActive",
3767
- "async": true,
3768
- "returns": "Promise<User[]>"
3684
+ "extends": "SmrtObject",
3685
+ "fields": [
3686
+ {
3687
+ "name": "tenantId",
3688
+ "type": "text",
3689
+ "required": true,
3690
+ "columnType": "UUID"
3769
3691
  },
3770
3692
  {
3771
- "name": "findByEmail",
3772
- "async": true,
3773
- "params": [
3774
- "email: string"
3775
- ],
3776
- "returns": "Promise<User | null>"
3693
+ "name": "memberId",
3694
+ "type": "foreignKey",
3695
+ "required": false,
3696
+ "related": "LegalMember",
3697
+ "columnType": "UUID"
3777
3698
  },
3778
3699
  {
3779
- "name": "findByProfile",
3780
- "async": true,
3781
- "params": [
3782
- "profileId: string"
3783
- ],
3784
- "returns": "Promise<User | null>"
3700
+ "name": "recordDate",
3701
+ "type": "text",
3702
+ "required": false,
3703
+ "columnType": "TEXT"
3785
3704
  },
3786
3705
  {
3787
- "name": "findByStatus",
3788
- "async": true,
3789
- "params": [
3790
- "status: UserStatus"
3791
- ],
3792
- "returns": "Promise<User[]>"
3706
+ "name": "eligible",
3707
+ "type": "boolean",
3708
+ "required": false,
3709
+ "columnType": "BOOLEAN"
3793
3710
  },
3794
3711
  {
3795
- "name": "findPending",
3796
- "async": true,
3797
- "returns": "Promise<User[]>"
3712
+ "name": "reason",
3713
+ "type": "text",
3714
+ "required": false,
3715
+ "columnType": "TEXT"
3798
3716
  },
3799
3717
  {
3800
- "name": "getOrCreateForProfile",
3718
+ "name": "evidence",
3719
+ "type": "json",
3720
+ "required": false,
3721
+ "columnType": "JSON"
3722
+ }
3723
+ ],
3724
+ "relationships": [
3725
+ {
3726
+ "name": "memberId",
3727
+ "type": "foreignKey",
3728
+ "required": false,
3729
+ "related": "LegalMember",
3730
+ "columnType": "UUID"
3731
+ }
3732
+ ],
3733
+ "methods": [
3734
+ "delete",
3735
+ "save"
3736
+ ],
3737
+ "methodSignatures": [
3738
+ {
3739
+ "name": "delete",
3801
3740
  "async": true,
3802
- "params": [
3803
- "profileId: string",
3804
- "email: string",
3805
- "defaults?: Partial<object>"
3806
- ],
3807
- "returns": "Promise<User>"
3741
+ "returns": "Promise<void>"
3808
3742
  },
3809
3743
  {
3810
- "name": "getOrCreateFromOidc",
3744
+ "name": "save",
3811
3745
  "async": true,
3812
- "params": [
3813
- "claims: OidcClaims",
3814
- "provider: string",
3815
- "options?: GetOrCreateFromOidcOptions"
3816
- ],
3817
- "returns": "Promise<OidcIdentityResult>"
3746
+ "returns": "Promise<this>"
3818
3747
  }
3819
3748
  ],
3749
+ "tenant": {
3750
+ "scoped": true,
3751
+ "mode": "required",
3752
+ "field": "tenantId"
3753
+ },
3754
+ "conflictColumns": [
3755
+ "tenant_id",
3756
+ "slug",
3757
+ "context"
3758
+ ],
3820
3759
  "surfaces": [],
3821
3760
  "withheldSurfaces": [
3822
3761
  {
3823
3762
  "kind": "api",
3824
- "operation": "findActive",
3825
- "code": "not-included",
3826
- "reason": "not listed in api.include",
3827
- "objectName": "@happyvertical/smrt-users:UserCollection"
3828
- },
3829
- {
3830
- "kind": "api",
3831
- "operation": "findByEmail",
3832
- "code": "not-included",
3833
- "reason": "not listed in api.include",
3834
- "objectName": "@happyvertical/smrt-users:UserCollection"
3835
- },
3836
- {
3837
- "kind": "api",
3838
- "operation": "findByProfile",
3839
- "code": "not-included",
3840
- "reason": "not listed in api.include",
3841
- "objectName": "@happyvertical/smrt-users:UserCollection"
3842
- },
3843
- {
3844
- "kind": "api",
3845
- "operation": "findByStatus",
3846
- "code": "not-included",
3847
- "reason": "not listed in api.include",
3848
- "objectName": "@happyvertical/smrt-users:UserCollection"
3849
- },
3850
- {
3851
- "kind": "api",
3852
- "operation": "findPending",
3853
- "code": "not-included",
3854
- "reason": "not listed in api.include",
3855
- "objectName": "@happyvertical/smrt-users:UserCollection"
3856
- },
3857
- {
3858
- "kind": "api",
3859
- "operation": "getOrCreateForProfile",
3860
- "code": "not-included",
3861
- "reason": "not listed in api.include",
3862
- "objectName": "@happyvertical/smrt-users:UserCollection"
3863
- },
3864
- {
3865
- "kind": "api",
3866
- "operation": "getOrCreateFromOidc",
3867
- "code": "not-included",
3868
- "reason": "not listed in api.include",
3869
- "objectName": "@happyvertical/smrt-users:UserCollection"
3763
+ "operation": "save",
3764
+ "code": "lifecycle-method",
3765
+ "reason": "`save` is a framework lifecycle method, not a distinct operation",
3766
+ "objectName": "@happyvertical/smrt-users:MemberEligibilitySnapshot"
3870
3767
  }
3871
3768
  ],
3769
+ "relationshipFeatures": [
3770
+ "foreignKey",
3771
+ "uuidColumns"
3772
+ ],
3773
+ "tags": [],
3774
+ "risks": []
3775
+ },
3776
+ {
3777
+ "name": "MemberClassCollection",
3778
+ "qualifiedName": "@happyvertical/smrt-users:MemberClassCollection",
3779
+ "collection": "memberclasses",
3780
+ "tableName": "member_classes",
3781
+ "packageName": "@happyvertical/smrt-users",
3782
+ "extends": "SmrtCollection",
3783
+ "fields": [],
3784
+ "relationships": [],
3785
+ "methods": [],
3786
+ "surfaces": [],
3787
+ "relationshipFeatures": [
3788
+ "uuidColumns"
3789
+ ],
3790
+ "tags": [],
3791
+ "risks": []
3792
+ },
3793
+ {
3794
+ "name": "LegalMemberCollection",
3795
+ "qualifiedName": "@happyvertical/smrt-users:LegalMemberCollection",
3796
+ "collection": "legalmembers",
3797
+ "tableName": "legal_members",
3798
+ "packageName": "@happyvertical/smrt-users",
3799
+ "extends": "SmrtCollection",
3800
+ "fields": [],
3801
+ "relationships": [],
3802
+ "methods": [],
3803
+ "surfaces": [],
3804
+ "relationshipFeatures": [
3805
+ "uuidColumns"
3806
+ ],
3807
+ "tags": [],
3808
+ "risks": []
3809
+ },
3810
+ {
3811
+ "name": "LegalMemberStatusHistoryCollection",
3812
+ "qualifiedName": "@happyvertical/smrt-users:LegalMemberStatusHistoryCollection",
3813
+ "collection": "legalmemberstatushistories",
3814
+ "tableName": "legal_member_status_history",
3815
+ "packageName": "@happyvertical/smrt-users",
3816
+ "extends": "SmrtCollection",
3817
+ "fields": [],
3818
+ "relationships": [],
3819
+ "methods": [],
3820
+ "surfaces": [],
3821
+ "relationshipFeatures": [
3822
+ "uuidColumns"
3823
+ ],
3824
+ "tags": [],
3825
+ "risks": []
3826
+ },
3827
+ {
3828
+ "name": "LegalMemberReferenceCollection",
3829
+ "qualifiedName": "@happyvertical/smrt-users:LegalMemberReferenceCollection",
3830
+ "collection": "legalmemberreferences",
3831
+ "tableName": "legal_member_references",
3832
+ "packageName": "@happyvertical/smrt-users",
3833
+ "extends": "SmrtCollection",
3834
+ "fields": [],
3835
+ "relationships": [],
3836
+ "methods": [],
3837
+ "surfaces": [],
3838
+ "relationshipFeatures": [
3839
+ "uuidColumns"
3840
+ ],
3841
+ "tags": [],
3842
+ "risks": []
3843
+ },
3844
+ {
3845
+ "name": "MemberOfficerAppointmentCollection",
3846
+ "qualifiedName": "@happyvertical/smrt-users:MemberOfficerAppointmentCollection",
3847
+ "collection": "memberofficerappointments",
3848
+ "tableName": "member_officer_appointments",
3849
+ "packageName": "@happyvertical/smrt-users",
3850
+ "extends": "SmrtCollection",
3851
+ "fields": [],
3852
+ "relationships": [],
3853
+ "methods": [],
3854
+ "surfaces": [],
3855
+ "relationshipFeatures": [
3856
+ "uuidColumns"
3857
+ ],
3858
+ "tags": [],
3859
+ "risks": []
3860
+ },
3861
+ {
3862
+ "name": "MemberEligibilitySnapshotCollection",
3863
+ "qualifiedName": "@happyvertical/smrt-users:MemberEligibilitySnapshotCollection",
3864
+ "collection": "membereligibilitysnapshots",
3865
+ "tableName": "member_eligibility_snapshots",
3866
+ "packageName": "@happyvertical/smrt-users",
3867
+ "extends": "SmrtCollection",
3868
+ "fields": [],
3869
+ "relationships": [],
3870
+ "methods": [],
3871
+ "surfaces": [],
3872
3872
  "relationshipFeatures": [
3873
3873
  "uuidColumns"
3874
3874
  ],
@@ -7105,6 +7105,21 @@
7105
7105
  "readonly": true,
7106
7106
  "description": "The standardized email address used to recognize this account; maintained automatically."
7107
7107
  },
7108
+ {
7109
+ "name": "username",
7110
+ "type": "text",
7111
+ "required": false,
7112
+ "columnType": "TEXT",
7113
+ "description": "Optional username used to sign in; lowercase and globally unique."
7114
+ },
7115
+ {
7116
+ "name": "usernameKey",
7117
+ "type": "text",
7118
+ "required": false,
7119
+ "columnType": "TEXT",
7120
+ "readonly": true,
7121
+ "description": "The standardized username used to recognize this account; maintained automatically."
7122
+ },
7108
7123
  {
7109
7124
  "name": "status",
7110
7125
  "type": "text",