@happyvertical/smrt-users 0.40.7 → 0.40.9

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.
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "generatedAt": "2026-07-17T06:28:30.007Z",
3
+ "generatedAt": "2026-07-17T20:11:32.164Z",
4
4
  "packageName": "@happyvertical/smrt-users",
5
- "packageVersion": "0.40.7",
5
+ "packageVersion": "0.40.9",
6
6
  "sourceManifestPath": "dist/manifest.json",
7
7
  "agentDocPath": "AGENTS.md",
8
8
  "sourceHashes": {
9
- "manifest": "cd4163fc8f79ac5074ec759a2349ca382698a5cf7c5b235594e5f8dad151271f",
10
- "packageJson": "653bdf644188e79742b92ab6c9c2f6d2ce931462e858fc482dd2745d708701fe",
9
+ "manifest": "010385ee5f0b65095b9c19c1bbfcccecc3711789eea47f30ecf63174be4c0c19",
10
+ "packageJson": "2af07401d74d1f7c6109580181ed835d167a716de70fc060730def3ab8800edd",
11
11
  "agents": "60d1174c3558a153e66eeea1763ce4550231610cc1d7d537781d7ca7ef274047"
12
12
  },
13
13
  "exports": [
@@ -58,89 +58,19 @@
58
58
  "risks": [],
59
59
  "objects": [
60
60
  {
61
- "name": "AccessRequest",
62
- "qualifiedName": "@happyvertical/smrt-users:AccessRequest",
61
+ "name": "AccessRequestCollection",
62
+ "qualifiedName": "@happyvertical/smrt-users:AccessRequestCollection",
63
63
  "collection": "accessrequests",
64
64
  "tableName": "access_requests",
65
65
  "packageName": "@happyvertical/smrt-users",
66
- "extends": "SmrtObject",
67
- "fields": [
68
- {
69
- "name": "email",
70
- "type": "text",
71
- "required": true,
72
- "columnType": "TEXT"
73
- },
74
- {
75
- "name": "name",
76
- "type": "text",
77
- "required": false,
78
- "columnType": "TEXT"
79
- },
80
- {
81
- "name": "status",
82
- "type": "text",
83
- "required": false,
84
- "columnType": "TEXT"
85
- },
86
- {
87
- "name": "source",
88
- "type": "text",
89
- "required": false,
90
- "columnType": "TEXT"
91
- },
92
- {
93
- "name": "requestContext",
94
- "type": "text",
95
- "required": false,
96
- "columnType": "TEXT"
97
- },
98
- {
99
- "name": "note",
100
- "type": "text",
101
- "required": false,
102
- "columnType": "TEXT"
103
- },
104
- {
105
- "name": "requestedAt",
106
- "type": "datetime",
107
- "required": false,
108
- "columnType": "TIMESTAMP"
109
- },
110
- {
111
- "name": "decidedAt",
112
- "type": "datetime",
113
- "required": false,
114
- "columnType": "TIMESTAMP"
115
- },
116
- {
117
- "name": "decidedBy",
118
- "type": "text",
119
- "required": false,
120
- "columnType": "TEXT"
121
- },
122
- {
123
- "name": "resultingUserId",
124
- "type": "text",
125
- "required": false,
126
- "columnType": "TEXT"
127
- },
128
- {
129
- "name": "tenantHint",
130
- "type": "text",
131
- "required": false,
132
- "columnType": "TEXT"
133
- }
134
- ],
66
+ "extends": "SmrtCollection",
67
+ "fields": [],
135
68
  "relationships": [],
136
69
  "methods": [
137
- "getRequestContext",
138
- "getTenantHint",
139
- "isApproved",
140
- "isOpen",
141
- "isTerminal",
142
- "setRequestContext",
143
- "setTenantHint"
70
+ "findByEmail",
71
+ "findByStatus",
72
+ "findOpen",
73
+ "findOpenByEmail"
144
74
  ],
145
75
  "surfaces": [],
146
76
  "relationshipFeatures": [
@@ -150,64 +80,19 @@
150
80
  "risks": []
151
81
  },
152
82
  {
153
- "name": "UsersCliAuthRequest",
154
- "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequest",
83
+ "name": "UsersCliAuthRequestCollection",
84
+ "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequestCollection",
155
85
  "collection": "userscliauthrequests",
156
86
  "tableName": "users_cli_auth_requests",
157
87
  "packageName": "@happyvertical/smrt-users",
158
- "extends": "SmrtObject",
159
- "fields": [
160
- {
161
- "name": "userCode",
162
- "type": "text",
163
- "required": false,
164
- "columnType": "TEXT"
165
- },
166
- {
167
- "name": "deviceCodeHash",
168
- "type": "text",
169
- "required": false,
170
- "columnType": "TEXT"
171
- },
172
- {
173
- "name": "status",
174
- "type": "text",
175
- "required": false,
176
- "columnType": "TEXT"
177
- },
178
- {
179
- "name": "userId",
180
- "type": "text",
181
- "required": false,
182
- "columnType": "TEXT"
183
- },
184
- {
185
- "name": "tenantId",
186
- "type": "text",
187
- "required": false,
188
- "columnType": "TEXT"
189
- },
190
- {
191
- "name": "sessionId",
192
- "type": "text",
193
- "required": false,
194
- "columnType": "TEXT"
195
- },
196
- {
197
- "name": "expiresAt",
198
- "type": "datetime",
199
- "required": false,
200
- "columnType": "TIMESTAMP"
201
- },
202
- {
203
- "name": "approvedAt",
204
- "type": "datetime",
205
- "required": false,
206
- "columnType": "TIMESTAMP"
207
- }
208
- ],
88
+ "extends": "SmrtCollection",
89
+ "fields": [],
209
90
  "relationships": [],
210
- "methods": [],
91
+ "methods": [
92
+ "deleteExpired",
93
+ "findByDeviceCodeHash",
94
+ "findByUserCode"
95
+ ],
211
96
  "surfaces": [],
212
97
  "relationshipFeatures": [
213
98
  "uuidColumns"
@@ -216,394 +101,90 @@
216
101
  "risks": []
217
102
  },
218
103
  {
219
- "name": "Group",
220
- "qualifiedName": "@happyvertical/smrt-users:Group",
104
+ "name": "GroupCollection",
105
+ "qualifiedName": "@happyvertical/smrt-users:GroupCollection",
221
106
  "collection": "groups",
222
- "tableName": "groups",
107
+ "tableName": "group_collections",
223
108
  "packageName": "@happyvertical/smrt-users",
224
- "extends": "SmrtObject",
225
- "fields": [
226
- {
227
- "name": "tenantId",
228
- "type": "foreignKey",
229
- "required": true,
230
- "related": "Tenant",
231
- "columnType": "UUID"
232
- },
233
- {
234
- "name": "name",
235
- "type": "text",
236
- "required": false,
237
- "columnType": "TEXT"
238
- },
239
- {
240
- "name": "description",
241
- "type": "text",
242
- "required": false,
243
- "columnType": "TEXT"
244
- }
245
- ],
246
- "relationships": [
247
- {
248
- "name": "tenantId",
249
- "type": "foreignKey",
250
- "required": true,
251
- "related": "Tenant",
252
- "columnType": "UUID"
253
- }
254
- ],
255
- "methods": [],
256
- "surfaces": [
257
- {
258
- "kind": "api",
259
- "name": "groups.list",
260
- "operation": "list",
261
- "objectName": "@happyvertical/smrt-users:Group",
262
- "path": "/groups",
263
- "method": "GET"
264
- },
265
- {
266
- "kind": "api",
267
- "name": "groups.get",
268
- "operation": "get",
269
- "objectName": "@happyvertical/smrt-users:Group",
270
- "path": "/groups/[id]",
271
- "method": "GET"
272
- },
273
- {
274
- "kind": "cli",
275
- "name": "group_list",
276
- "operation": "list",
277
- "objectName": "@happyvertical/smrt-users:Group"
278
- },
279
- {
280
- "kind": "cli",
281
- "name": "group_get",
282
- "operation": "get",
283
- "objectName": "@happyvertical/smrt-users:Group"
284
- },
285
- {
286
- "kind": "cli",
287
- "name": "group_create",
288
- "operation": "create",
289
- "objectName": "@happyvertical/smrt-users:Group"
290
- },
291
- {
292
- "kind": "cli",
293
- "name": "group_update",
294
- "operation": "update",
295
- "objectName": "@happyvertical/smrt-users:Group"
296
- },
297
- {
298
- "kind": "cli",
299
- "name": "group_delete",
300
- "operation": "delete",
301
- "objectName": "@happyvertical/smrt-users:Group"
302
- },
303
- {
304
- "kind": "mcp",
305
- "name": "group_list",
306
- "operation": "list",
307
- "objectName": "@happyvertical/smrt-users:Group"
308
- },
309
- {
310
- "kind": "mcp",
311
- "name": "group_get",
312
- "operation": "get",
313
- "objectName": "@happyvertical/smrt-users:Group"
314
- }
109
+ "extends": "SmrtCollection",
110
+ "fields": [],
111
+ "relationships": [],
112
+ "methods": [
113
+ "findBySlug",
114
+ "findByTenant"
315
115
  ],
116
+ "surfaces": [],
316
117
  "relationshipFeatures": [
317
- "foreignKey",
318
118
  "uuidColumns"
319
119
  ],
320
120
  "tags": [],
321
121
  "risks": []
322
122
  },
323
123
  {
324
- "name": "GroupMember",
325
- "qualifiedName": "@happyvertical/smrt-users:GroupMember",
124
+ "name": "GroupMemberCollection",
125
+ "qualifiedName": "@happyvertical/smrt-users:GroupMemberCollection",
326
126
  "collection": "groupmembers",
327
- "tableName": "group_members",
127
+ "tableName": "group_member_collections",
328
128
  "packageName": "@happyvertical/smrt-users",
329
- "extends": "SmrtObject",
330
- "fields": [
331
- {
332
- "name": "groupId",
333
- "type": "foreignKey",
334
- "required": true,
335
- "related": "Group",
336
- "columnType": "UUID"
337
- },
338
- {
339
- "name": "userId",
340
- "type": "foreignKey",
341
- "required": true,
342
- "related": "User",
343
- "columnType": "UUID"
344
- }
345
- ],
346
- "relationships": [
347
- {
348
- "name": "groupId",
349
- "type": "foreignKey",
350
- "required": true,
351
- "related": "Group",
352
- "columnType": "UUID"
353
- },
354
- {
355
- "name": "userId",
356
- "type": "foreignKey",
357
- "required": true,
358
- "related": "User",
359
- "columnType": "UUID"
360
- }
361
- ],
362
- "methods": [],
363
- "surfaces": [
364
- {
365
- "kind": "api",
366
- "name": "groupmembers.list",
367
- "operation": "list",
368
- "objectName": "@happyvertical/smrt-users:GroupMember",
369
- "path": "/groupmembers",
370
- "method": "GET"
371
- },
372
- {
373
- "kind": "api",
374
- "name": "groupmembers.get",
375
- "operation": "get",
376
- "objectName": "@happyvertical/smrt-users:GroupMember",
377
- "path": "/groupmembers/[id]",
378
- "method": "GET"
379
- },
380
- {
381
- "kind": "cli",
382
- "name": "groupmember_list",
383
- "operation": "list",
384
- "objectName": "@happyvertical/smrt-users:GroupMember"
385
- },
386
- {
387
- "kind": "cli",
388
- "name": "groupmember_get",
389
- "operation": "get",
390
- "objectName": "@happyvertical/smrt-users:GroupMember"
391
- },
392
- {
393
- "kind": "cli",
394
- "name": "groupmember_create",
395
- "operation": "create",
396
- "objectName": "@happyvertical/smrt-users:GroupMember"
397
- },
398
- {
399
- "kind": "cli",
400
- "name": "groupmember_update",
401
- "operation": "update",
402
- "objectName": "@happyvertical/smrt-users:GroupMember"
403
- },
404
- {
405
- "kind": "cli",
406
- "name": "groupmember_delete",
407
- "operation": "delete",
408
- "objectName": "@happyvertical/smrt-users:GroupMember"
409
- },
410
- {
411
- "kind": "mcp",
412
- "name": "groupmember_list",
413
- "operation": "list",
414
- "objectName": "@happyvertical/smrt-users:GroupMember"
415
- },
416
- {
417
- "kind": "mcp",
418
- "name": "groupmember_get",
419
- "operation": "get",
420
- "objectName": "@happyvertical/smrt-users:GroupMember"
421
- }
129
+ "extends": "SmrtCollection",
130
+ "fields": [],
131
+ "relationships": [],
132
+ "methods": [
133
+ "addMember",
134
+ "findByGroup",
135
+ "findByUser",
136
+ "getGroupIds",
137
+ "getGroupIdsForTenant",
138
+ "getUserIds",
139
+ "isMember",
140
+ "removeMember"
422
141
  ],
142
+ "surfaces": [],
423
143
  "relationshipFeatures": [
424
- "foreignKey",
425
144
  "uuidColumns"
426
145
  ],
427
146
  "tags": [],
428
147
  "risks": []
429
148
  },
430
149
  {
431
- "name": "GroupRole",
432
- "qualifiedName": "@happyvertical/smrt-users:GroupRole",
150
+ "name": "GroupRoleCollection",
151
+ "qualifiedName": "@happyvertical/smrt-users:GroupRoleCollection",
433
152
  "collection": "grouproles",
434
- "tableName": "group_roles",
153
+ "tableName": "group_role_collections",
435
154
  "packageName": "@happyvertical/smrt-users",
436
- "extends": "SmrtObject",
437
- "fields": [
438
- {
439
- "name": "groupId",
440
- "type": "foreignKey",
441
- "required": true,
442
- "related": "Group",
443
- "columnType": "UUID"
444
- },
445
- {
446
- "name": "roleId",
447
- "type": "foreignKey",
448
- "required": true,
449
- "related": "Role",
450
- "columnType": "UUID"
451
- }
452
- ],
453
- "relationships": [
454
- {
455
- "name": "groupId",
456
- "type": "foreignKey",
457
- "required": true,
458
- "related": "Group",
459
- "columnType": "UUID"
460
- },
461
- {
462
- "name": "roleId",
463
- "type": "foreignKey",
464
- "required": true,
465
- "related": "Role",
466
- "columnType": "UUID"
467
- }
468
- ],
469
- "methods": [],
470
- "surfaces": [
471
- {
472
- "kind": "api",
473
- "name": "grouproles.list",
474
- "operation": "list",
475
- "objectName": "@happyvertical/smrt-users:GroupRole",
476
- "path": "/grouproles",
477
- "method": "GET"
478
- },
479
- {
480
- "kind": "api",
481
- "name": "grouproles.get",
482
- "operation": "get",
483
- "objectName": "@happyvertical/smrt-users:GroupRole",
484
- "path": "/grouproles/[id]",
485
- "method": "GET"
486
- },
487
- {
488
- "kind": "cli",
489
- "name": "grouprole_list",
490
- "operation": "list",
491
- "objectName": "@happyvertical/smrt-users:GroupRole"
492
- },
493
- {
494
- "kind": "cli",
495
- "name": "grouprole_get",
496
- "operation": "get",
497
- "objectName": "@happyvertical/smrt-users:GroupRole"
498
- },
499
- {
500
- "kind": "cli",
501
- "name": "grouprole_create",
502
- "operation": "create",
503
- "objectName": "@happyvertical/smrt-users:GroupRole"
504
- },
505
- {
506
- "kind": "cli",
507
- "name": "grouprole_update",
508
- "operation": "update",
509
- "objectName": "@happyvertical/smrt-users:GroupRole"
510
- },
511
- {
512
- "kind": "cli",
513
- "name": "grouprole_delete",
514
- "operation": "delete",
515
- "objectName": "@happyvertical/smrt-users:GroupRole"
516
- },
517
- {
518
- "kind": "mcp",
519
- "name": "grouprole_list",
520
- "operation": "list",
521
- "objectName": "@happyvertical/smrt-users:GroupRole"
522
- },
523
- {
524
- "kind": "mcp",
525
- "name": "grouprole_get",
526
- "operation": "get",
527
- "objectName": "@happyvertical/smrt-users:GroupRole"
528
- }
155
+ "extends": "SmrtCollection",
156
+ "fields": [],
157
+ "relationships": [],
158
+ "methods": [
159
+ "addRole",
160
+ "findByGroup",
161
+ "findByRole",
162
+ "getRoleIds",
163
+ "hasRole",
164
+ "removeRole"
529
165
  ],
166
+ "surfaces": [],
530
167
  "relationshipFeatures": [
531
- "foreignKey",
532
168
  "uuidColumns"
533
169
  ],
534
170
  "tags": [],
535
171
  "risks": []
536
172
  },
537
173
  {
538
- "name": "UsersMagicLinkToken",
539
- "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkToken",
174
+ "name": "UsersMagicLinkTokenCollection",
175
+ "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkTokenCollection",
540
176
  "collection": "usersmagiclinktokens",
541
177
  "tableName": "users_magic_link_tokens",
542
178
  "packageName": "@happyvertical/smrt-users",
543
- "extends": "SmrtObject",
544
- "fields": [
545
- {
546
- "name": "nonce",
547
- "type": "text",
548
- "required": true,
549
- "columnType": "TEXT"
550
- },
551
- {
552
- "name": "email",
553
- "type": "text",
554
- "required": false,
555
- "columnType": "TEXT"
556
- },
557
- {
558
- "name": "used",
559
- "type": "boolean",
560
- "required": false,
561
- "columnType": "BOOLEAN"
562
- },
563
- {
564
- "name": "expiresAt",
565
- "type": "datetime",
566
- "required": false,
567
- "columnType": "TIMESTAMP"
568
- }
569
- ],
179
+ "extends": "SmrtCollection",
180
+ "fields": [],
570
181
  "relationships": [],
571
182
  "methods": [
572
- "isExpired",
573
- "isValid"
574
- ],
575
- "surfaces": [
576
- {
577
- "kind": "cli",
578
- "name": "usersmagiclinktoken_list",
579
- "operation": "list",
580
- "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
581
- },
582
- {
583
- "kind": "cli",
584
- "name": "usersmagiclinktoken_get",
585
- "operation": "get",
586
- "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
587
- },
588
- {
589
- "kind": "cli",
590
- "name": "usersmagiclinktoken_create",
591
- "operation": "create",
592
- "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
593
- },
594
- {
595
- "kind": "cli",
596
- "name": "usersmagiclinktoken_update",
597
- "operation": "update",
598
- "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
599
- },
600
- {
601
- "kind": "cli",
602
- "name": "usersmagiclinktoken_delete",
603
- "operation": "delete",
604
- "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
605
- }
183
+ "deleteExpired",
184
+ "findByNonce",
185
+ "markUsed"
606
186
  ],
187
+ "surfaces": [],
607
188
  "relationshipFeatures": [
608
189
  "uuidColumns"
609
190
  ],
@@ -611,345 +192,97 @@
611
192
  "risks": []
612
193
  },
613
194
  {
614
- "name": "Membership",
615
- "qualifiedName": "@happyvertical/smrt-users:Membership",
195
+ "name": "MembershipCollection",
196
+ "qualifiedName": "@happyvertical/smrt-users:MembershipCollection",
616
197
  "collection": "memberships",
617
- "tableName": "memberships",
198
+ "tableName": "membership_collections",
618
199
  "packageName": "@happyvertical/smrt-users",
619
- "extends": "SmrtObject",
620
- "fields": [
621
- {
622
- "name": "userId",
623
- "type": "foreignKey",
624
- "required": true,
625
- "related": "User",
626
- "columnType": "UUID"
627
- },
628
- {
629
- "name": "tenantId",
630
- "type": "foreignKey",
631
- "required": true,
632
- "related": "Tenant",
633
- "columnType": "UUID"
634
- },
635
- {
636
- "name": "roleId",
637
- "type": "foreignKey",
638
- "required": true,
639
- "related": "Role",
640
- "columnType": "UUID"
641
- },
642
- {
643
- "name": "status",
644
- "type": "text",
645
- "required": false,
646
- "columnType": "TEXT"
647
- }
648
- ],
649
- "relationships": [
650
- {
651
- "name": "userId",
652
- "type": "foreignKey",
653
- "required": true,
654
- "related": "User",
655
- "columnType": "UUID"
656
- },
657
- {
658
- "name": "tenantId",
659
- "type": "foreignKey",
660
- "required": true,
661
- "related": "Tenant",
662
- "columnType": "UUID"
663
- },
664
- {
665
- "name": "roleId",
666
- "type": "foreignKey",
667
- "required": true,
668
- "related": "Role",
669
- "columnType": "UUID"
670
- }
671
- ],
200
+ "extends": "SmrtCollection",
201
+ "fields": [],
202
+ "relationships": [],
672
203
  "methods": [
673
- "isActive",
674
- "isPending"
675
- ],
676
- "surfaces": [
677
- {
678
- "kind": "api",
679
- "name": "memberships.list",
680
- "operation": "list",
681
- "objectName": "@happyvertical/smrt-users:Membership",
682
- "path": "/memberships",
683
- "method": "GET"
684
- },
685
- {
686
- "kind": "api",
687
- "name": "memberships.get",
688
- "operation": "get",
689
- "objectName": "@happyvertical/smrt-users:Membership",
690
- "path": "/memberships/[id]",
691
- "method": "GET"
692
- },
693
- {
694
- "kind": "cli",
695
- "name": "membership_list",
696
- "operation": "list",
697
- "objectName": "@happyvertical/smrt-users:Membership"
698
- },
699
- {
700
- "kind": "cli",
701
- "name": "membership_get",
702
- "operation": "get",
703
- "objectName": "@happyvertical/smrt-users:Membership"
704
- },
705
- {
706
- "kind": "cli",
707
- "name": "membership_create",
708
- "operation": "create",
709
- "objectName": "@happyvertical/smrt-users:Membership"
710
- },
711
- {
712
- "kind": "cli",
713
- "name": "membership_update",
714
- "operation": "update",
715
- "objectName": "@happyvertical/smrt-users:Membership"
716
- },
717
- {
718
- "kind": "cli",
719
- "name": "membership_delete",
720
- "operation": "delete",
721
- "objectName": "@happyvertical/smrt-users:Membership"
722
- },
723
- {
724
- "kind": "mcp",
725
- "name": "membership_list",
726
- "operation": "list",
727
- "objectName": "@happyvertical/smrt-users:Membership"
728
- },
729
- {
730
- "kind": "mcp",
731
- "name": "membership_get",
732
- "operation": "get",
733
- "objectName": "@happyvertical/smrt-users:Membership"
734
- }
204
+ "findActiveByTenant",
205
+ "findActiveByUser",
206
+ "findByRole",
207
+ "findByStatus",
208
+ "findByTenant",
209
+ "findByUser",
210
+ "findByUserAndTenant"
735
211
  ],
212
+ "surfaces": [],
736
213
  "relationshipFeatures": [
737
- "foreignKey",
738
214
  "uuidColumns"
739
215
  ],
740
216
  "tags": [],
741
217
  "risks": []
742
218
  },
743
219
  {
744
- "name": "MembershipOverride",
745
- "qualifiedName": "@happyvertical/smrt-users:MembershipOverride",
220
+ "name": "MembershipOverrideCollection",
221
+ "qualifiedName": "@happyvertical/smrt-users:MembershipOverrideCollection",
746
222
  "collection": "membershipoverrides",
747
- "tableName": "membership_overrides",
223
+ "tableName": "membership_override_collections",
748
224
  "packageName": "@happyvertical/smrt-users",
749
- "extends": "SmrtObject",
750
- "fields": [
751
- {
752
- "name": "membershipId",
753
- "type": "foreignKey",
754
- "required": true,
755
- "related": "Membership",
756
- "columnType": "UUID"
757
- },
758
- {
759
- "name": "permissionId",
760
- "type": "foreignKey",
761
- "required": true,
762
- "related": "Permission",
763
- "columnType": "UUID"
764
- },
765
- {
766
- "name": "effect",
767
- "type": "text",
768
- "required": false,
769
- "columnType": "TEXT"
770
- }
225
+ "extends": "SmrtCollection",
226
+ "fields": [],
227
+ "relationships": [],
228
+ "methods": [
229
+ "denyPermission",
230
+ "findByMembership",
231
+ "findDenies",
232
+ "findGrants",
233
+ "getDeniedPermissionIds",
234
+ "getGrantedPermissionIds",
235
+ "grantPermission",
236
+ "removeOverride",
237
+ "setOverride"
771
238
  ],
772
- "relationships": [
773
- {
774
- "name": "membershipId",
775
- "type": "foreignKey",
776
- "required": true,
777
- "related": "Membership",
778
- "columnType": "UUID"
779
- },
780
- {
781
- "name": "permissionId",
782
- "type": "foreignKey",
783
- "required": true,
784
- "related": "Permission",
785
- "columnType": "UUID"
786
- }
239
+ "surfaces": [],
240
+ "relationshipFeatures": [
241
+ "uuidColumns"
787
242
  ],
243
+ "tags": [],
244
+ "risks": []
245
+ },
246
+ {
247
+ "name": "PermissionCollection",
248
+ "qualifiedName": "@happyvertical/smrt-users:PermissionCollection",
249
+ "collection": "permissions",
250
+ "tableName": "permission_collections",
251
+ "packageName": "@happyvertical/smrt-users",
252
+ "extends": "SmrtCollection",
253
+ "fields": [],
254
+ "relationships": [],
788
255
  "methods": [
789
- "isDeny",
790
- "isGrant"
791
- ],
792
- "surfaces": [
793
- {
794
- "kind": "api",
795
- "name": "membershipoverrides.list",
796
- "operation": "list",
797
- "objectName": "@happyvertical/smrt-users:MembershipOverride",
798
- "path": "/membershipoverrides",
799
- "method": "GET"
800
- },
801
- {
802
- "kind": "api",
803
- "name": "membershipoverrides.get",
804
- "operation": "get",
805
- "objectName": "@happyvertical/smrt-users:MembershipOverride",
806
- "path": "/membershipoverrides/[id]",
807
- "method": "GET"
808
- },
809
- {
810
- "kind": "cli",
811
- "name": "membershipoverride_list",
812
- "operation": "list",
813
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
814
- },
815
- {
816
- "kind": "cli",
817
- "name": "membershipoverride_get",
818
- "operation": "get",
819
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
820
- },
821
- {
822
- "kind": "cli",
823
- "name": "membershipoverride_create",
824
- "operation": "create",
825
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
826
- },
827
- {
828
- "kind": "cli",
829
- "name": "membershipoverride_update",
830
- "operation": "update",
831
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
832
- },
833
- {
834
- "kind": "cli",
835
- "name": "membershipoverride_delete",
836
- "operation": "delete",
837
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
838
- },
839
- {
840
- "kind": "mcp",
841
- "name": "membershipoverride_list",
842
- "operation": "list",
843
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
844
- },
845
- {
846
- "kind": "mcp",
847
- "name": "membershipoverride_get",
848
- "operation": "get",
849
- "objectName": "@happyvertical/smrt-users:MembershipOverride"
850
- }
256
+ "findByCategory",
257
+ "findByIds",
258
+ "findBySlug",
259
+ "findOrCreate",
260
+ "getCategories"
851
261
  ],
262
+ "surfaces": [],
852
263
  "relationshipFeatures": [
853
- "foreignKey",
854
264
  "uuidColumns"
855
265
  ],
856
266
  "tags": [],
857
267
  "risks": []
858
268
  },
859
269
  {
860
- "name": "Permission",
861
- "qualifiedName": "@happyvertical/smrt-users:Permission",
862
- "collection": "permissions",
863
- "tableName": "permissions",
270
+ "name": "RoleCollection",
271
+ "qualifiedName": "@happyvertical/smrt-users:RoleCollection",
272
+ "collection": "roles",
273
+ "tableName": "role_collections",
864
274
  "packageName": "@happyvertical/smrt-users",
865
- "extends": "SmrtObject",
866
- "fields": [
867
- {
868
- "name": "name",
869
- "type": "text",
870
- "required": false,
871
- "columnType": "TEXT"
872
- },
873
- {
874
- "name": "description",
875
- "type": "text",
876
- "required": false,
877
- "columnType": "TEXT"
878
- },
879
- {
880
- "name": "category",
881
- "type": "text",
882
- "required": false,
883
- "columnType": "TEXT"
884
- }
885
- ],
275
+ "extends": "SmrtCollection",
276
+ "fields": [],
886
277
  "relationships": [],
887
278
  "methods": [
888
- "getAction",
889
- "getResource",
890
- "isValidSlug",
891
- "parseSlug"
892
- ],
893
- "surfaces": [
894
- {
895
- "kind": "api",
896
- "name": "permissions.list",
897
- "operation": "list",
898
- "objectName": "@happyvertical/smrt-users:Permission",
899
- "path": "/permissions",
900
- "method": "GET"
901
- },
902
- {
903
- "kind": "api",
904
- "name": "permissions.get",
905
- "operation": "get",
906
- "objectName": "@happyvertical/smrt-users:Permission",
907
- "path": "/permissions/[id]",
908
- "method": "GET"
909
- },
910
- {
911
- "kind": "cli",
912
- "name": "permission_list",
913
- "operation": "list",
914
- "objectName": "@happyvertical/smrt-users:Permission"
915
- },
916
- {
917
- "kind": "cli",
918
- "name": "permission_get",
919
- "operation": "get",
920
- "objectName": "@happyvertical/smrt-users:Permission"
921
- },
922
- {
923
- "kind": "cli",
924
- "name": "permission_create",
925
- "operation": "create",
926
- "objectName": "@happyvertical/smrt-users:Permission"
927
- },
928
- {
929
- "kind": "cli",
930
- "name": "permission_update",
931
- "operation": "update",
932
- "objectName": "@happyvertical/smrt-users:Permission"
933
- },
934
- {
935
- "kind": "cli",
936
- "name": "permission_delete",
937
- "operation": "delete",
938
- "objectName": "@happyvertical/smrt-users:Permission"
939
- },
940
- {
941
- "kind": "mcp",
942
- "name": "permission_list",
943
- "operation": "list",
944
- "objectName": "@happyvertical/smrt-users:Permission"
945
- },
946
- {
947
- "kind": "mcp",
948
- "name": "permission_get",
949
- "operation": "get",
950
- "objectName": "@happyvertical/smrt-users:Permission"
951
- }
279
+ "findBySlug",
280
+ "findByTenant",
281
+ "findSystemRoles",
282
+ "findTenantRoles",
283
+ "seedSystemRoles"
952
284
  ],
285
+ "surfaces": [],
953
286
  "relationshipFeatures": [
954
287
  "uuidColumns"
955
288
  ],
@@ -957,163 +290,368 @@
957
290
  "risks": []
958
291
  },
959
292
  {
960
- "name": "Role",
961
- "qualifiedName": "@happyvertical/smrt-users:Role",
962
- "collection": "roles",
963
- "tableName": "roles",
293
+ "name": "RolePermissionCollection",
294
+ "qualifiedName": "@happyvertical/smrt-users:RolePermissionCollection",
295
+ "collection": "rolepermissions",
296
+ "tableName": "role_permission_collections",
964
297
  "packageName": "@happyvertical/smrt-users",
965
- "extends": "SmrtObject",
966
- "fields": [
967
- {
968
- "name": "tenantId",
969
- "type": "foreignKey",
970
- "required": false,
971
- "related": "Tenant",
972
- "columnType": "UUID"
973
- },
974
- {
975
- "name": "name",
976
- "type": "text",
977
- "required": false,
978
- "columnType": "TEXT"
979
- },
980
- {
981
- "name": "description",
982
- "type": "text",
983
- "required": false,
984
- "columnType": "TEXT"
985
- },
986
- {
987
- "name": "isSystem",
988
- "type": "boolean",
989
- "required": false,
990
- "columnType": "BOOLEAN"
991
- },
992
- {
993
- "name": "inheritsToDescendants",
994
- "type": "boolean",
995
- "required": false,
996
- "columnType": "BOOLEAN"
997
- }
298
+ "extends": "SmrtCollection",
299
+ "fields": [],
300
+ "relationships": [],
301
+ "methods": [
302
+ "addPermission",
303
+ "findByPermission",
304
+ "findByRole",
305
+ "getPermissionIds",
306
+ "hasPermission",
307
+ "removePermission",
308
+ "seedRolePermissions"
998
309
  ],
999
- "relationships": [
1000
- {
1001
- "name": "tenantId",
1002
- "type": "foreignKey",
1003
- "required": false,
1004
- "related": "Tenant",
1005
- "columnType": "UUID"
1006
- }
310
+ "surfaces": [],
311
+ "relationshipFeatures": [
312
+ "uuidColumns"
1007
313
  ],
314
+ "tags": [],
315
+ "risks": []
316
+ },
317
+ {
318
+ "name": "SessionCollection",
319
+ "qualifiedName": "@happyvertical/smrt-users:SessionCollection",
320
+ "collection": "sessions",
321
+ "tableName": "session_collections",
322
+ "packageName": "@happyvertical/smrt-users",
323
+ "extends": "SmrtCollection",
324
+ "fields": [],
325
+ "relationships": [],
1008
326
  "methods": [
1009
- "canDelete",
1010
- "delete",
1011
- "isSystemRole",
1012
- "isTenantRole"
327
+ "countUserSessions",
328
+ "createSession",
329
+ "deleteExpired",
330
+ "deleteUserSessions",
331
+ "findByUser",
332
+ "findValidSession",
333
+ "getSessionData",
334
+ "revokeSession",
335
+ "revokeUserSessions",
336
+ "setSessionData",
337
+ "setSessionTenant",
338
+ "touch"
1013
339
  ],
1014
- "surfaces": [
1015
- {
1016
- "kind": "api",
1017
- "name": "roles.list",
1018
- "operation": "list",
1019
- "objectName": "@happyvertical/smrt-users:Role",
1020
- "path": "/roles",
1021
- "method": "GET"
1022
- },
1023
- {
1024
- "kind": "api",
1025
- "name": "roles.get",
1026
- "operation": "get",
1027
- "objectName": "@happyvertical/smrt-users:Role",
1028
- "path": "/roles/[id]",
1029
- "method": "GET"
340
+ "surfaces": [],
341
+ "relationshipFeatures": [
342
+ "uuidColumns"
343
+ ],
344
+ "tags": [],
345
+ "risks": []
346
+ },
347
+ {
348
+ "name": "TenantCollection",
349
+ "qualifiedName": "@happyvertical/smrt-users:TenantCollection",
350
+ "collection": "tenants",
351
+ "tableName": "tenant_collections",
352
+ "packageName": "@happyvertical/smrt-users",
353
+ "extends": "SmrtCollection",
354
+ "fields": [],
355
+ "relationships": [],
356
+ "methods": [
357
+ "create",
358
+ "createChild",
359
+ "findActive",
360
+ "findBySlug",
361
+ "findByStatus",
362
+ "findChildren",
363
+ "findParent",
364
+ "findRoots",
365
+ "getAncestors",
366
+ "getAncestorsFromRoot",
367
+ "getDescendants",
368
+ "getSiblings",
369
+ "getTree",
370
+ "isAncestorOf",
371
+ "isDescendantOf",
372
+ "makeRoot",
373
+ "moveToParent",
374
+ "validateHierarchy"
375
+ ],
376
+ "surfaces": [],
377
+ "relationshipFeatures": [
378
+ "uuidColumns"
379
+ ],
380
+ "tags": [],
381
+ "risks": []
382
+ },
383
+ {
384
+ "name": "TenantIntegrationCollection",
385
+ "qualifiedName": "@happyvertical/smrt-users:TenantIntegrationCollection",
386
+ "collection": "tenantintegrations",
387
+ "tableName": "tenant_integrations",
388
+ "packageName": "@happyvertical/smrt-users",
389
+ "extends": "SmrtCollection",
390
+ "fields": [],
391
+ "relationships": [],
392
+ "methods": [
393
+ "findFor",
394
+ "findOrInit",
395
+ "listForTenant"
396
+ ],
397
+ "surfaces": [],
398
+ "relationshipFeatures": [
399
+ "uuidColumns"
400
+ ],
401
+ "tags": [],
402
+ "risks": []
403
+ },
404
+ {
405
+ "name": "TenantPermissionOverrideCollection",
406
+ "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection",
407
+ "collection": "tenantpermissionoverrides",
408
+ "tableName": "tenant_permission_override_collections",
409
+ "packageName": "@happyvertical/smrt-users",
410
+ "extends": "SmrtCollection",
411
+ "fields": [],
412
+ "relationships": [],
413
+ "methods": [
414
+ "bulkSetOverrides",
415
+ "copyOverrides",
416
+ "denyPermission",
417
+ "findByTenant",
418
+ "findDenies",
419
+ "findGrants",
420
+ "findInherits",
421
+ "getDeniedPermissionIds",
422
+ "getGrantedPermissionIds",
423
+ "getOverridesByEffect",
424
+ "getOverridesByEffectBatch",
425
+ "grantPermission",
426
+ "inheritPermission",
427
+ "removeAllOverrides",
428
+ "removeOverride",
429
+ "setOverride"
430
+ ],
431
+ "surfaces": [],
432
+ "relationshipFeatures": [
433
+ "uuidColumns"
434
+ ],
435
+ "tags": [],
436
+ "risks": []
437
+ },
438
+ {
439
+ "name": "UserCollection",
440
+ "qualifiedName": "@happyvertical/smrt-users:UserCollection",
441
+ "collection": "users",
442
+ "tableName": "user_collections",
443
+ "packageName": "@happyvertical/smrt-users",
444
+ "extends": "SmrtCollection",
445
+ "fields": [],
446
+ "relationships": [],
447
+ "methods": [
448
+ "findActive",
449
+ "findByEmail",
450
+ "findByProfile",
451
+ "findByStatus",
452
+ "findPending",
453
+ "getOrCreateForProfile",
454
+ "getOrCreateFromOidc"
455
+ ],
456
+ "surfaces": [],
457
+ "relationshipFeatures": [
458
+ "uuidColumns"
459
+ ],
460
+ "tags": [],
461
+ "risks": []
462
+ },
463
+ {
464
+ "name": "AccessRequest",
465
+ "qualifiedName": "@happyvertical/smrt-users:AccessRequest",
466
+ "collection": "accessrequests",
467
+ "tableName": "access_requests",
468
+ "packageName": "@happyvertical/smrt-users",
469
+ "extends": "SmrtObject",
470
+ "fields": [
471
+ {
472
+ "name": "email",
473
+ "type": "text",
474
+ "required": true,
475
+ "columnType": "TEXT"
1030
476
  },
1031
477
  {
1032
- "kind": "cli",
1033
- "name": "role_list",
1034
- "operation": "list",
1035
- "objectName": "@happyvertical/smrt-users:Role"
478
+ "name": "name",
479
+ "type": "text",
480
+ "required": false,
481
+ "columnType": "TEXT"
1036
482
  },
1037
483
  {
1038
- "kind": "cli",
1039
- "name": "role_get",
1040
- "operation": "get",
1041
- "objectName": "@happyvertical/smrt-users:Role"
484
+ "name": "status",
485
+ "type": "text",
486
+ "required": false,
487
+ "columnType": "TEXT"
1042
488
  },
1043
489
  {
1044
- "kind": "cli",
1045
- "name": "role_create",
1046
- "operation": "create",
1047
- "objectName": "@happyvertical/smrt-users:Role"
490
+ "name": "source",
491
+ "type": "text",
492
+ "required": false,
493
+ "columnType": "TEXT"
1048
494
  },
1049
495
  {
1050
- "kind": "cli",
1051
- "name": "role_update",
1052
- "operation": "update",
1053
- "objectName": "@happyvertical/smrt-users:Role"
496
+ "name": "requestContext",
497
+ "type": "text",
498
+ "required": false,
499
+ "columnType": "TEXT"
1054
500
  },
1055
501
  {
1056
- "kind": "cli",
1057
- "name": "role_delete",
1058
- "operation": "delete",
1059
- "objectName": "@happyvertical/smrt-users:Role"
502
+ "name": "note",
503
+ "type": "text",
504
+ "required": false,
505
+ "columnType": "TEXT"
1060
506
  },
1061
507
  {
1062
- "kind": "mcp",
1063
- "name": "role_list",
1064
- "operation": "list",
1065
- "objectName": "@happyvertical/smrt-users:Role"
508
+ "name": "requestedAt",
509
+ "type": "datetime",
510
+ "required": false,
511
+ "columnType": "TIMESTAMP"
1066
512
  },
1067
513
  {
1068
- "kind": "mcp",
1069
- "name": "role_get",
1070
- "operation": "get",
1071
- "objectName": "@happyvertical/smrt-users:Role"
514
+ "name": "decidedAt",
515
+ "type": "datetime",
516
+ "required": false,
517
+ "columnType": "TIMESTAMP"
518
+ },
519
+ {
520
+ "name": "decidedBy",
521
+ "type": "text",
522
+ "required": false,
523
+ "columnType": "TEXT"
524
+ },
525
+ {
526
+ "name": "resultingUserId",
527
+ "type": "text",
528
+ "required": false,
529
+ "columnType": "TEXT"
530
+ },
531
+ {
532
+ "name": "tenantHint",
533
+ "type": "text",
534
+ "required": false,
535
+ "columnType": "TEXT"
1072
536
  }
1073
537
  ],
538
+ "relationships": [],
539
+ "methods": [
540
+ "getRequestContext",
541
+ "getTenantHint",
542
+ "isApproved",
543
+ "isOpen",
544
+ "isTerminal",
545
+ "setRequestContext",
546
+ "setTenantHint"
547
+ ],
548
+ "surfaces": [],
1074
549
  "relationshipFeatures": [
1075
- "foreignKey",
1076
550
  "uuidColumns"
1077
551
  ],
1078
552
  "tags": [],
1079
553
  "risks": []
1080
554
  },
1081
555
  {
1082
- "name": "RolePermission",
1083
- "qualifiedName": "@happyvertical/smrt-users:RolePermission",
1084
- "collection": "rolepermissions",
1085
- "tableName": "role_permissions",
556
+ "name": "UsersCliAuthRequest",
557
+ "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequest",
558
+ "collection": "userscliauthrequests",
559
+ "tableName": "users_cli_auth_requests",
1086
560
  "packageName": "@happyvertical/smrt-users",
1087
561
  "extends": "SmrtObject",
1088
562
  "fields": [
1089
563
  {
1090
- "name": "roleId",
1091
- "type": "foreignKey",
1092
- "required": true,
1093
- "related": "Role",
1094
- "columnType": "UUID"
564
+ "name": "userCode",
565
+ "type": "text",
566
+ "required": false,
567
+ "columnType": "TEXT"
1095
568
  },
1096
569
  {
1097
- "name": "permissionId",
1098
- "type": "foreignKey",
1099
- "required": true,
1100
- "related": "Permission",
1101
- "columnType": "UUID"
1102
- }
1103
- ],
1104
- "relationships": [
1105
- {
1106
- "name": "roleId",
1107
- "type": "foreignKey",
570
+ "name": "deviceCodeHash",
571
+ "type": "text",
572
+ "required": false,
573
+ "columnType": "TEXT"
574
+ },
575
+ {
576
+ "name": "status",
577
+ "type": "text",
578
+ "required": false,
579
+ "columnType": "TEXT"
580
+ },
581
+ {
582
+ "name": "userId",
583
+ "type": "text",
584
+ "required": false,
585
+ "columnType": "TEXT"
586
+ },
587
+ {
588
+ "name": "tenantId",
589
+ "type": "text",
590
+ "required": false,
591
+ "columnType": "TEXT"
592
+ },
593
+ {
594
+ "name": "sessionId",
595
+ "type": "text",
596
+ "required": false,
597
+ "columnType": "TEXT"
598
+ },
599
+ {
600
+ "name": "expiresAt",
601
+ "type": "datetime",
602
+ "required": false,
603
+ "columnType": "TIMESTAMP"
604
+ },
605
+ {
606
+ "name": "approvedAt",
607
+ "type": "datetime",
608
+ "required": false,
609
+ "columnType": "TIMESTAMP"
610
+ }
611
+ ],
612
+ "relationships": [],
613
+ "methods": [],
614
+ "surfaces": [],
615
+ "relationshipFeatures": [
616
+ "uuidColumns"
617
+ ],
618
+ "tags": [],
619
+ "risks": []
620
+ },
621
+ {
622
+ "name": "Group",
623
+ "qualifiedName": "@happyvertical/smrt-users:Group",
624
+ "collection": "groups",
625
+ "tableName": "groups",
626
+ "packageName": "@happyvertical/smrt-users",
627
+ "extends": "SmrtObject",
628
+ "fields": [
629
+ {
630
+ "name": "tenantId",
631
+ "type": "foreignKey",
1108
632
  "required": true,
1109
- "related": "Role",
633
+ "related": "Tenant",
1110
634
  "columnType": "UUID"
1111
635
  },
1112
636
  {
1113
- "name": "permissionId",
637
+ "name": "name",
638
+ "type": "text",
639
+ "required": false,
640
+ "columnType": "TEXT"
641
+ },
642
+ {
643
+ "name": "description",
644
+ "type": "text",
645
+ "required": false,
646
+ "columnType": "TEXT"
647
+ }
648
+ ],
649
+ "relationships": [
650
+ {
651
+ "name": "tenantId",
1114
652
  "type": "foreignKey",
1115
653
  "required": true,
1116
- "related": "Permission",
654
+ "related": "Tenant",
1117
655
  "columnType": "UUID"
1118
656
  }
1119
657
  ],
@@ -1121,61 +659,61 @@
1121
659
  "surfaces": [
1122
660
  {
1123
661
  "kind": "api",
1124
- "name": "rolepermissions.list",
662
+ "name": "groups.list",
1125
663
  "operation": "list",
1126
- "objectName": "@happyvertical/smrt-users:RolePermission",
1127
- "path": "/rolepermissions",
664
+ "objectName": "@happyvertical/smrt-users:Group",
665
+ "path": "/groups",
1128
666
  "method": "GET"
1129
667
  },
1130
668
  {
1131
669
  "kind": "api",
1132
- "name": "rolepermissions.get",
670
+ "name": "groups.get",
1133
671
  "operation": "get",
1134
- "objectName": "@happyvertical/smrt-users:RolePermission",
1135
- "path": "/rolepermissions/[id]",
672
+ "objectName": "@happyvertical/smrt-users:Group",
673
+ "path": "/groups/[id]",
1136
674
  "method": "GET"
1137
675
  },
1138
676
  {
1139
677
  "kind": "cli",
1140
- "name": "rolepermission_list",
678
+ "name": "group_list",
1141
679
  "operation": "list",
1142
- "objectName": "@happyvertical/smrt-users:RolePermission"
680
+ "objectName": "@happyvertical/smrt-users:Group"
1143
681
  },
1144
682
  {
1145
683
  "kind": "cli",
1146
- "name": "rolepermission_get",
684
+ "name": "group_get",
1147
685
  "operation": "get",
1148
- "objectName": "@happyvertical/smrt-users:RolePermission"
686
+ "objectName": "@happyvertical/smrt-users:Group"
1149
687
  },
1150
688
  {
1151
689
  "kind": "cli",
1152
- "name": "rolepermission_create",
690
+ "name": "group_create",
1153
691
  "operation": "create",
1154
- "objectName": "@happyvertical/smrt-users:RolePermission"
692
+ "objectName": "@happyvertical/smrt-users:Group"
1155
693
  },
1156
694
  {
1157
695
  "kind": "cli",
1158
- "name": "rolepermission_update",
696
+ "name": "group_update",
1159
697
  "operation": "update",
1160
- "objectName": "@happyvertical/smrt-users:RolePermission"
698
+ "objectName": "@happyvertical/smrt-users:Group"
1161
699
  },
1162
700
  {
1163
701
  "kind": "cli",
1164
- "name": "rolepermission_delete",
702
+ "name": "group_delete",
1165
703
  "operation": "delete",
1166
- "objectName": "@happyvertical/smrt-users:RolePermission"
704
+ "objectName": "@happyvertical/smrt-users:Group"
1167
705
  },
1168
706
  {
1169
707
  "kind": "mcp",
1170
- "name": "rolepermission_list",
708
+ "name": "group_list",
1171
709
  "operation": "list",
1172
- "objectName": "@happyvertical/smrt-users:RolePermission"
710
+ "objectName": "@happyvertical/smrt-users:Group"
1173
711
  },
1174
712
  {
1175
713
  "kind": "mcp",
1176
- "name": "rolepermission_get",
714
+ "name": "group_get",
1177
715
  "operation": "get",
1178
- "objectName": "@happyvertical/smrt-users:RolePermission"
716
+ "objectName": "@happyvertical/smrt-users:Group"
1179
717
  }
1180
718
  ],
1181
719
  "relationshipFeatures": [
@@ -1186,138 +724,103 @@
1186
724
  "risks": []
1187
725
  },
1188
726
  {
1189
- "name": "Session",
1190
- "qualifiedName": "@happyvertical/smrt-users:Session",
1191
- "collection": "sessions",
1192
- "tableName": "sessions",
727
+ "name": "GroupMember",
728
+ "qualifiedName": "@happyvertical/smrt-users:GroupMember",
729
+ "collection": "groupmembers",
730
+ "tableName": "group_members",
1193
731
  "packageName": "@happyvertical/smrt-users",
1194
732
  "extends": "SmrtObject",
1195
733
  "fields": [
1196
734
  {
1197
- "name": "userId",
735
+ "name": "groupId",
1198
736
  "type": "foreignKey",
1199
- "required": false,
1200
- "related": "User",
737
+ "required": true,
738
+ "related": "Group",
1201
739
  "columnType": "UUID"
1202
740
  },
1203
741
  {
1204
- "name": "tenantId",
742
+ "name": "userId",
1205
743
  "type": "foreignKey",
1206
- "required": false,
1207
- "related": "Tenant",
744
+ "required": true,
745
+ "related": "User",
1208
746
  "columnType": "UUID"
1209
- },
1210
- {
1211
- "name": "status",
1212
- "type": "text",
1213
- "required": false,
1214
- "columnType": "TEXT"
1215
- },
1216
- {
1217
- "name": "expiresAt",
1218
- "type": "datetime",
1219
- "required": false,
1220
- "columnType": "TIMESTAMP"
1221
- },
1222
- {
1223
- "name": "userAgent",
1224
- "type": "text",
1225
- "required": false,
1226
- "columnType": "TEXT"
1227
- },
1228
- {
1229
- "name": "ipAddress",
1230
- "type": "text",
1231
- "required": false,
1232
- "columnType": "TEXT"
1233
- },
1234
- {
1235
- "name": "lastAccessedAt",
1236
- "type": "datetime",
1237
- "required": false,
1238
- "columnType": "TIMESTAMP"
1239
- },
1240
- {
1241
- "name": "data",
1242
- "type": "json",
1243
- "required": false,
1244
- "columnType": "JSON"
1245
747
  }
1246
748
  ],
1247
749
  "relationships": [
1248
750
  {
1249
- "name": "userId",
751
+ "name": "groupId",
1250
752
  "type": "foreignKey",
1251
- "required": false,
1252
- "related": "User",
753
+ "required": true,
754
+ "related": "Group",
1253
755
  "columnType": "UUID"
1254
756
  },
1255
757
  {
1256
- "name": "tenantId",
758
+ "name": "userId",
1257
759
  "type": "foreignKey",
1258
- "required": false,
1259
- "related": "Tenant",
760
+ "required": true,
761
+ "related": "User",
1260
762
  "columnType": "UUID"
1261
763
  }
1262
764
  ],
1263
- "methods": [
1264
- "extend",
1265
- "getData",
1266
- "isExpired",
1267
- "isRevoked",
1268
- "isValid",
1269
- "removeData",
1270
- "revoke",
1271
- "setData",
1272
- "setTenant",
1273
- "touch"
1274
- ],
765
+ "methods": [],
1275
766
  "surfaces": [
1276
767
  {
1277
768
  "kind": "api",
1278
- "name": "sessions.get",
1279
- "operation": "get",
1280
- "objectName": "@happyvertical/smrt-users:Session",
1281
- "path": "/sessions/[id]",
769
+ "name": "groupmembers.list",
770
+ "operation": "list",
771
+ "objectName": "@happyvertical/smrt-users:GroupMember",
772
+ "path": "/groupmembers",
1282
773
  "method": "GET"
1283
774
  },
1284
775
  {
1285
776
  "kind": "api",
1286
- "name": "sessions.delete",
1287
- "operation": "delete",
1288
- "objectName": "@happyvertical/smrt-users:Session",
1289
- "path": "/sessions/[id]",
1290
- "method": "DELETE"
777
+ "name": "groupmembers.get",
778
+ "operation": "get",
779
+ "objectName": "@happyvertical/smrt-users:GroupMember",
780
+ "path": "/groupmembers/[id]",
781
+ "method": "GET"
1291
782
  },
1292
783
  {
1293
784
  "kind": "cli",
1294
- "name": "session_list",
785
+ "name": "groupmember_list",
1295
786
  "operation": "list",
1296
- "objectName": "@happyvertical/smrt-users:Session"
787
+ "objectName": "@happyvertical/smrt-users:GroupMember"
1297
788
  },
1298
789
  {
1299
790
  "kind": "cli",
1300
- "name": "session_get",
791
+ "name": "groupmember_get",
1301
792
  "operation": "get",
1302
- "objectName": "@happyvertical/smrt-users:Session"
793
+ "objectName": "@happyvertical/smrt-users:GroupMember"
1303
794
  },
1304
795
  {
1305
796
  "kind": "cli",
1306
- "name": "session_create",
797
+ "name": "groupmember_create",
1307
798
  "operation": "create",
1308
- "objectName": "@happyvertical/smrt-users:Session"
799
+ "objectName": "@happyvertical/smrt-users:GroupMember"
1309
800
  },
1310
801
  {
1311
802
  "kind": "cli",
1312
- "name": "session_update",
803
+ "name": "groupmember_update",
1313
804
  "operation": "update",
1314
- "objectName": "@happyvertical/smrt-users:Session"
805
+ "objectName": "@happyvertical/smrt-users:GroupMember"
1315
806
  },
1316
807
  {
1317
808
  "kind": "cli",
1318
- "name": "session_delete",
809
+ "name": "groupmember_delete",
1319
810
  "operation": "delete",
1320
- "objectName": "@happyvertical/smrt-users:Session"
811
+ "objectName": "@happyvertical/smrt-users:GroupMember"
812
+ },
813
+ {
814
+ "kind": "mcp",
815
+ "name": "groupmember_list",
816
+ "operation": "list",
817
+ "objectName": "@happyvertical/smrt-users:GroupMember"
818
+ },
819
+ {
820
+ "kind": "mcp",
821
+ "name": "groupmember_get",
822
+ "operation": "get",
823
+ "objectName": "@happyvertical/smrt-users:GroupMember"
1321
824
  }
1322
825
  ],
1323
826
  "relationshipFeatures": [
@@ -1328,191 +831,103 @@
1328
831
  "risks": []
1329
832
  },
1330
833
  {
1331
- "name": "Tenant",
1332
- "qualifiedName": "@happyvertical/smrt-users:Tenant",
1333
- "collection": "tenants",
1334
- "tableName": "tenants",
834
+ "name": "GroupRole",
835
+ "qualifiedName": "@happyvertical/smrt-users:GroupRole",
836
+ "collection": "grouproles",
837
+ "tableName": "group_roles",
1335
838
  "packageName": "@happyvertical/smrt-users",
1336
839
  "extends": "SmrtObject",
1337
840
  "fields": [
1338
841
  {
1339
- "name": "created_at",
1340
- "type": "datetime",
1341
- "required": false,
1342
- "columnType": "TIMESTAMP"
1343
- },
1344
- {
1345
- "name": "updated_at",
1346
- "type": "datetime",
1347
- "required": false,
1348
- "columnType": "TIMESTAMP"
1349
- },
1350
- {
1351
- "name": "name",
1352
- "type": "text",
1353
- "required": false,
1354
- "columnType": "TEXT"
1355
- },
1356
- {
1357
- "name": "status",
1358
- "type": "text",
1359
- "required": false,
1360
- "columnType": "TEXT"
1361
- },
1362
- {
1363
- "name": "description",
1364
- "type": "text",
1365
- "required": false,
1366
- "columnType": "TEXT"
1367
- },
1368
- {
1369
- "name": "parentTenantId",
842
+ "name": "groupId",
1370
843
  "type": "foreignKey",
1371
- "required": false,
1372
- "related": "Tenant",
844
+ "required": true,
845
+ "related": "Group",
1373
846
  "columnType": "UUID"
1374
847
  },
1375
848
  {
1376
- "name": "hierarchyLevel",
1377
- "type": "integer",
1378
- "required": false,
1379
- "columnType": "INTEGER"
1380
- },
1381
- {
1382
- "name": "hierarchyPath",
1383
- "type": "text",
1384
- "required": false,
1385
- "columnType": "TEXT"
1386
- },
1387
- {
1388
- "name": "cascadePermissions",
1389
- "type": "boolean",
1390
- "required": false,
1391
- "columnType": "BOOLEAN"
1392
- },
1393
- {
1394
- "name": "inheritPermissions",
1395
- "type": "boolean",
1396
- "required": false,
1397
- "columnType": "BOOLEAN"
849
+ "name": "roleId",
850
+ "type": "foreignKey",
851
+ "required": true,
852
+ "related": "Role",
853
+ "columnType": "UUID"
1398
854
  }
1399
855
  ],
1400
856
  "relationships": [
1401
857
  {
1402
- "name": "parentTenantId",
858
+ "name": "groupId",
1403
859
  "type": "foreignKey",
1404
- "required": false,
1405
- "related": "Tenant",
860
+ "required": true,
861
+ "related": "Group",
862
+ "columnType": "UUID"
863
+ },
864
+ {
865
+ "name": "roleId",
866
+ "type": "foreignKey",
867
+ "required": true,
868
+ "related": "Role",
1406
869
  "columnType": "UUID"
1407
870
  }
1408
871
  ],
1409
- "methods": [
1410
- "_setLoadedRelationship",
1411
- "acceptsInheritance",
1412
- "canCascadeToChildren",
1413
- "classifyConstraintError",
1414
- "clearEmbeddings",
1415
- "delete",
1416
- "describe",
1417
- "destroy",
1418
- "do",
1419
- "executeToolCall",
1420
- "forget",
1421
- "forgetScope",
1422
- "generateEmbeddings",
1423
- "getAiUsageSnapshot",
1424
- "getAncestorIds",
1425
- "getAvailableTools",
1426
- "getEmbedding",
1427
- "getFields",
1428
- "getId",
1429
- "getRelated",
1430
- "getSavedId",
1431
- "getSlug",
1432
- "hasStaleEmbeddings",
1433
- "initialize",
1434
- "is",
1435
- "isActive",
1436
- "isRelatedLoaded",
1437
- "isRoot",
1438
- "isSaved",
1439
- "isSuspended",
1440
- "listAiUsage",
1441
- "loadDataFromDb",
1442
- "loadFromId",
1443
- "loadFromSlug",
1444
- "loadRelated",
1445
- "loadRelatedMany",
1446
- "markAsPersisted",
1447
- "recall",
1448
- "recallAll",
1449
- "remember",
1450
- "requireInsertOnSave",
1451
- "resetAiUsage",
1452
- "save",
1453
- "summarizeAiUsage",
1454
- "toJSON",
1455
- "toPlainObject",
1456
- "toPublicJSON"
1457
- ],
872
+ "methods": [],
1458
873
  "surfaces": [
1459
874
  {
1460
875
  "kind": "api",
1461
- "name": "tenants.list",
876
+ "name": "grouproles.list",
1462
877
  "operation": "list",
1463
- "objectName": "@happyvertical/smrt-users:Tenant",
1464
- "path": "/tenants",
878
+ "objectName": "@happyvertical/smrt-users:GroupRole",
879
+ "path": "/grouproles",
1465
880
  "method": "GET"
1466
881
  },
1467
882
  {
1468
883
  "kind": "api",
1469
- "name": "tenants.get",
884
+ "name": "grouproles.get",
1470
885
  "operation": "get",
1471
- "objectName": "@happyvertical/smrt-users:Tenant",
1472
- "path": "/tenants/[id]",
886
+ "objectName": "@happyvertical/smrt-users:GroupRole",
887
+ "path": "/grouproles/[id]",
1473
888
  "method": "GET"
1474
889
  },
1475
890
  {
1476
891
  "kind": "cli",
1477
- "name": "tenant_list",
892
+ "name": "grouprole_list",
1478
893
  "operation": "list",
1479
- "objectName": "@happyvertical/smrt-users:Tenant"
894
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1480
895
  },
1481
896
  {
1482
897
  "kind": "cli",
1483
- "name": "tenant_get",
898
+ "name": "grouprole_get",
1484
899
  "operation": "get",
1485
- "objectName": "@happyvertical/smrt-users:Tenant"
900
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1486
901
  },
1487
902
  {
1488
903
  "kind": "cli",
1489
- "name": "tenant_create",
904
+ "name": "grouprole_create",
1490
905
  "operation": "create",
1491
- "objectName": "@happyvertical/smrt-users:Tenant"
906
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1492
907
  },
1493
908
  {
1494
909
  "kind": "cli",
1495
- "name": "tenant_update",
910
+ "name": "grouprole_update",
1496
911
  "operation": "update",
1497
- "objectName": "@happyvertical/smrt-users:Tenant"
912
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1498
913
  },
1499
914
  {
1500
915
  "kind": "cli",
1501
- "name": "tenant_delete",
916
+ "name": "grouprole_delete",
1502
917
  "operation": "delete",
1503
- "objectName": "@happyvertical/smrt-users:Tenant"
918
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1504
919
  },
1505
920
  {
1506
921
  "kind": "mcp",
1507
- "name": "tenant_list",
922
+ "name": "grouprole_list",
1508
923
  "operation": "list",
1509
- "objectName": "@happyvertical/smrt-users:Tenant"
924
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1510
925
  },
1511
926
  {
1512
927
  "kind": "mcp",
1513
- "name": "tenant_get",
928
+ "name": "grouprole_get",
1514
929
  "operation": "get",
1515
- "objectName": "@happyvertical/smrt-users:Tenant"
930
+ "objectName": "@happyvertical/smrt-users:GroupRole"
1516
931
  }
1517
932
  ],
1518
933
  "relationshipFeatures": [
@@ -1523,125 +938,73 @@
1523
938
  "risks": []
1524
939
  },
1525
940
  {
1526
- "name": "TenantIntegration",
1527
- "qualifiedName": "@happyvertical/smrt-users:TenantIntegration",
1528
- "collection": "tenantintegrations",
1529
- "tableName": "tenant_integrations",
941
+ "name": "UsersMagicLinkToken",
942
+ "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkToken",
943
+ "collection": "usersmagiclinktokens",
944
+ "tableName": "users_magic_link_tokens",
1530
945
  "packageName": "@happyvertical/smrt-users",
1531
946
  "extends": "SmrtObject",
1532
947
  "fields": [
1533
948
  {
1534
- "name": "tenantId",
949
+ "name": "nonce",
1535
950
  "type": "text",
1536
951
  "required": true,
1537
- "columnType": "UUID"
1538
- },
1539
- {
1540
- "name": "provider",
1541
- "type": "text",
1542
- "required": false,
1543
952
  "columnType": "TEXT"
1544
953
  },
1545
954
  {
1546
- "name": "externalIds",
955
+ "name": "email",
1547
956
  "type": "text",
1548
957
  "required": false,
1549
958
  "columnType": "TEXT"
1550
959
  },
1551
960
  {
1552
- "name": "status",
1553
- "type": "text",
961
+ "name": "used",
962
+ "type": "boolean",
1554
963
  "required": false,
1555
- "columnType": "TEXT"
964
+ "columnType": "BOOLEAN"
1556
965
  },
1557
966
  {
1558
- "name": "lastCheckedAt",
967
+ "name": "expiresAt",
1559
968
  "type": "datetime",
1560
969
  "required": false,
1561
970
  "columnType": "TIMESTAMP"
1562
- },
1563
- {
1564
- "name": "lastCheckSummary",
1565
- "type": "text",
1566
- "required": false,
1567
- "columnType": "TEXT"
1568
- },
1569
- {
1570
- "name": "lastError",
1571
- "type": "text",
1572
- "required": false,
1573
- "columnType": "TEXT"
1574
971
  }
1575
972
  ],
1576
973
  "relationships": [],
1577
974
  "methods": [
1578
- "getExternalId",
1579
- "getExternalIds",
1580
- "getLastCheckSummary",
1581
- "initialize",
1582
- "recordDoctorRun",
1583
- "setExternalId",
1584
- "setExternalIds",
1585
- "setLastCheckSummary"
975
+ "isExpired",
976
+ "isValid"
1586
977
  ],
1587
978
  "surfaces": [
1588
- {
1589
- "kind": "api",
1590
- "name": "tenantintegrations.list",
1591
- "operation": "list",
1592
- "objectName": "@happyvertical/smrt-users:TenantIntegration",
1593
- "path": "/tenantintegrations",
1594
- "method": "GET"
1595
- },
1596
- {
1597
- "kind": "api",
1598
- "name": "tenantintegrations.get",
1599
- "operation": "get",
1600
- "objectName": "@happyvertical/smrt-users:TenantIntegration",
1601
- "path": "/tenantintegrations/[id]",
1602
- "method": "GET"
1603
- },
1604
979
  {
1605
980
  "kind": "cli",
1606
- "name": "tenantintegration_list",
981
+ "name": "usersmagiclinktoken_list",
1607
982
  "operation": "list",
1608
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
983
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
1609
984
  },
1610
985
  {
1611
986
  "kind": "cli",
1612
- "name": "tenantintegration_get",
987
+ "name": "usersmagiclinktoken_get",
1613
988
  "operation": "get",
1614
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
989
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
1615
990
  },
1616
991
  {
1617
992
  "kind": "cli",
1618
- "name": "tenantintegration_create",
993
+ "name": "usersmagiclinktoken_create",
1619
994
  "operation": "create",
1620
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
995
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
1621
996
  },
1622
997
  {
1623
998
  "kind": "cli",
1624
- "name": "tenantintegration_update",
999
+ "name": "usersmagiclinktoken_update",
1625
1000
  "operation": "update",
1626
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
1001
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
1627
1002
  },
1628
1003
  {
1629
1004
  "kind": "cli",
1630
- "name": "tenantintegration_delete",
1005
+ "name": "usersmagiclinktoken_delete",
1631
1006
  "operation": "delete",
1632
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
1633
- },
1634
- {
1635
- "kind": "mcp",
1636
- "name": "tenantintegration_list",
1637
- "operation": "list",
1638
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
1639
- },
1640
- {
1641
- "kind": "mcp",
1642
- "name": "tenantintegration_get",
1643
- "operation": "get",
1644
- "objectName": "@happyvertical/smrt-users:TenantIntegration"
1007
+ "objectName": "@happyvertical/smrt-users:UsersMagicLinkToken"
1645
1008
  }
1646
1009
  ],
1647
1010
  "relationshipFeatures": [
@@ -1651,13 +1014,20 @@
1651
1014
  "risks": []
1652
1015
  },
1653
1016
  {
1654
- "name": "TenantPermissionOverride",
1655
- "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverride",
1656
- "collection": "tenantpermissionoverrides",
1657
- "tableName": "tenant_permission_overrides",
1017
+ "name": "Membership",
1018
+ "qualifiedName": "@happyvertical/smrt-users:Membership",
1019
+ "collection": "memberships",
1020
+ "tableName": "memberships",
1658
1021
  "packageName": "@happyvertical/smrt-users",
1659
1022
  "extends": "SmrtObject",
1660
1023
  "fields": [
1024
+ {
1025
+ "name": "userId",
1026
+ "type": "foreignKey",
1027
+ "required": true,
1028
+ "related": "User",
1029
+ "columnType": "UUID"
1030
+ },
1661
1031
  {
1662
1032
  "name": "tenantId",
1663
1033
  "type": "foreignKey",
@@ -1666,20 +1036,27 @@
1666
1036
  "columnType": "UUID"
1667
1037
  },
1668
1038
  {
1669
- "name": "permissionId",
1039
+ "name": "roleId",
1670
1040
  "type": "foreignKey",
1671
1041
  "required": true,
1672
- "related": "Permission",
1042
+ "related": "Role",
1673
1043
  "columnType": "UUID"
1674
1044
  },
1675
1045
  {
1676
- "name": "effect",
1046
+ "name": "status",
1677
1047
  "type": "text",
1678
1048
  "required": false,
1679
1049
  "columnType": "TEXT"
1680
1050
  }
1681
1051
  ],
1682
1052
  "relationships": [
1053
+ {
1054
+ "name": "userId",
1055
+ "type": "foreignKey",
1056
+ "required": true,
1057
+ "related": "User",
1058
+ "columnType": "UUID"
1059
+ },
1683
1060
  {
1684
1061
  "name": "tenantId",
1685
1062
  "type": "foreignKey",
@@ -1688,77 +1065,75 @@
1688
1065
  "columnType": "UUID"
1689
1066
  },
1690
1067
  {
1691
- "name": "permissionId",
1068
+ "name": "roleId",
1692
1069
  "type": "foreignKey",
1693
1070
  "required": true,
1694
- "related": "Permission",
1071
+ "related": "Role",
1695
1072
  "columnType": "UUID"
1696
1073
  }
1697
1074
  ],
1698
1075
  "methods": [
1699
- "hasExplicitEffect",
1700
- "isDeny",
1701
- "isGrant",
1702
- "isInherit"
1076
+ "isActive",
1077
+ "isPending"
1703
1078
  ],
1704
1079
  "surfaces": [
1705
1080
  {
1706
1081
  "kind": "api",
1707
- "name": "tenantpermissionoverrides.list",
1082
+ "name": "memberships.list",
1708
1083
  "operation": "list",
1709
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
1710
- "path": "/tenantpermissionoverrides",
1084
+ "objectName": "@happyvertical/smrt-users:Membership",
1085
+ "path": "/memberships",
1711
1086
  "method": "GET"
1712
1087
  },
1713
1088
  {
1714
1089
  "kind": "api",
1715
- "name": "tenantpermissionoverrides.get",
1090
+ "name": "memberships.get",
1716
1091
  "operation": "get",
1717
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
1718
- "path": "/tenantpermissionoverrides/[id]",
1092
+ "objectName": "@happyvertical/smrt-users:Membership",
1093
+ "path": "/memberships/[id]",
1719
1094
  "method": "GET"
1720
1095
  },
1721
1096
  {
1722
1097
  "kind": "cli",
1723
- "name": "tenantpermissionoverride_list",
1098
+ "name": "membership_list",
1724
1099
  "operation": "list",
1725
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1100
+ "objectName": "@happyvertical/smrt-users:Membership"
1726
1101
  },
1727
1102
  {
1728
1103
  "kind": "cli",
1729
- "name": "tenantpermissionoverride_get",
1104
+ "name": "membership_get",
1730
1105
  "operation": "get",
1731
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1106
+ "objectName": "@happyvertical/smrt-users:Membership"
1732
1107
  },
1733
1108
  {
1734
1109
  "kind": "cli",
1735
- "name": "tenantpermissionoverride_create",
1110
+ "name": "membership_create",
1736
1111
  "operation": "create",
1737
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1112
+ "objectName": "@happyvertical/smrt-users:Membership"
1738
1113
  },
1739
1114
  {
1740
1115
  "kind": "cli",
1741
- "name": "tenantpermissionoverride_update",
1116
+ "name": "membership_update",
1742
1117
  "operation": "update",
1743
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1118
+ "objectName": "@happyvertical/smrt-users:Membership"
1744
1119
  },
1745
1120
  {
1746
1121
  "kind": "cli",
1747
- "name": "tenantpermissionoverride_delete",
1122
+ "name": "membership_delete",
1748
1123
  "operation": "delete",
1749
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1124
+ "objectName": "@happyvertical/smrt-users:Membership"
1750
1125
  },
1751
1126
  {
1752
1127
  "kind": "mcp",
1753
- "name": "tenantpermissionoverride_list",
1128
+ "name": "membership_list",
1754
1129
  "operation": "list",
1755
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1130
+ "objectName": "@happyvertical/smrt-users:Membership"
1756
1131
  },
1757
1132
  {
1758
1133
  "kind": "mcp",
1759
- "name": "tenantpermissionoverride_get",
1134
+ "name": "membership_get",
1760
1135
  "operation": "get",
1761
- "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
1136
+ "objectName": "@happyvertical/smrt-users:Membership"
1762
1137
  }
1763
1138
  ],
1764
1139
  "relationshipFeatures": [
@@ -1769,186 +1144,215 @@
1769
1144
  "risks": []
1770
1145
  },
1771
1146
  {
1772
- "name": "User",
1773
- "qualifiedName": "@happyvertical/smrt-users:User",
1774
- "collection": "users",
1775
- "tableName": "users",
1147
+ "name": "MembershipOverride",
1148
+ "qualifiedName": "@happyvertical/smrt-users:MembershipOverride",
1149
+ "collection": "membershipoverrides",
1150
+ "tableName": "membership_overrides",
1776
1151
  "packageName": "@happyvertical/smrt-users",
1777
1152
  "extends": "SmrtObject",
1778
1153
  "fields": [
1779
1154
  {
1780
- "name": "profileId",
1781
- "type": "crossPackageRef",
1782
- "required": false,
1783
- "related": "@happyvertical/smrt-profiles:Profile",
1155
+ "name": "membershipId",
1156
+ "type": "foreignKey",
1157
+ "required": true,
1158
+ "related": "Membership",
1784
1159
  "columnType": "UUID"
1785
1160
  },
1786
1161
  {
1787
- "name": "email",
1788
- "type": "text",
1789
- "required": false,
1790
- "columnType": "TEXT"
1791
- },
1792
- {
1793
- "name": "emailKey",
1794
- "type": "text",
1795
- "required": false,
1796
- "columnType": "TEXT"
1162
+ "name": "permissionId",
1163
+ "type": "foreignKey",
1164
+ "required": true,
1165
+ "related": "Permission",
1166
+ "columnType": "UUID"
1797
1167
  },
1798
1168
  {
1799
- "name": "status",
1169
+ "name": "effect",
1800
1170
  "type": "text",
1801
1171
  "required": false,
1802
1172
  "columnType": "TEXT"
1803
- },
1804
- {
1805
- "name": "lastLoginAt",
1806
- "type": "datetime",
1807
- "required": false,
1808
- "columnType": "TIMESTAMP"
1809
1173
  }
1810
1174
  ],
1811
1175
  "relationships": [
1812
1176
  {
1813
- "name": "profileId",
1814
- "type": "crossPackageRef",
1815
- "required": false,
1816
- "related": "@happyvertical/smrt-profiles:Profile",
1177
+ "name": "membershipId",
1178
+ "type": "foreignKey",
1179
+ "required": true,
1180
+ "related": "Membership",
1181
+ "columnType": "UUID"
1182
+ },
1183
+ {
1184
+ "name": "permissionId",
1185
+ "type": "foreignKey",
1186
+ "required": true,
1187
+ "related": "Permission",
1817
1188
  "columnType": "UUID"
1818
1189
  }
1819
1190
  ],
1820
1191
  "methods": [
1821
- "hasValidEmail",
1822
- "isActive",
1823
- "isPending",
1824
- "isSuspended",
1825
- "recordLogin",
1826
- "save"
1192
+ "isDeny",
1193
+ "isGrant"
1827
1194
  ],
1828
1195
  "surfaces": [
1829
1196
  {
1830
1197
  "kind": "api",
1831
- "name": "users.list",
1198
+ "name": "membershipoverrides.list",
1832
1199
  "operation": "list",
1833
- "objectName": "@happyvertical/smrt-users:User",
1834
- "path": "/users",
1200
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
1201
+ "path": "/membershipoverrides",
1835
1202
  "method": "GET"
1836
1203
  },
1837
1204
  {
1838
1205
  "kind": "api",
1839
- "name": "users.get",
1206
+ "name": "membershipoverrides.get",
1840
1207
  "operation": "get",
1841
- "objectName": "@happyvertical/smrt-users:User",
1842
- "path": "/users/[id]",
1208
+ "objectName": "@happyvertical/smrt-users:MembershipOverride",
1209
+ "path": "/membershipoverrides/[id]",
1843
1210
  "method": "GET"
1844
1211
  },
1845
1212
  {
1846
1213
  "kind": "cli",
1847
- "name": "user_list",
1214
+ "name": "membershipoverride_list",
1848
1215
  "operation": "list",
1849
- "objectName": "@happyvertical/smrt-users:User"
1216
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1850
1217
  },
1851
1218
  {
1852
1219
  "kind": "cli",
1853
- "name": "user_get",
1220
+ "name": "membershipoverride_get",
1854
1221
  "operation": "get",
1855
- "objectName": "@happyvertical/smrt-users:User"
1222
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1856
1223
  },
1857
1224
  {
1858
1225
  "kind": "cli",
1859
- "name": "user_create",
1226
+ "name": "membershipoverride_create",
1860
1227
  "operation": "create",
1861
- "objectName": "@happyvertical/smrt-users:User"
1228
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1862
1229
  },
1863
1230
  {
1864
1231
  "kind": "cli",
1865
- "name": "user_update",
1232
+ "name": "membershipoverride_update",
1866
1233
  "operation": "update",
1867
- "objectName": "@happyvertical/smrt-users:User"
1234
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1868
1235
  },
1869
1236
  {
1870
1237
  "kind": "cli",
1871
- "name": "user_delete",
1238
+ "name": "membershipoverride_delete",
1872
1239
  "operation": "delete",
1873
- "objectName": "@happyvertical/smrt-users:User"
1240
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1874
1241
  },
1875
1242
  {
1876
1243
  "kind": "mcp",
1877
- "name": "user_list",
1244
+ "name": "membershipoverride_list",
1878
1245
  "operation": "list",
1879
- "objectName": "@happyvertical/smrt-users:User"
1246
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1880
1247
  },
1881
1248
  {
1882
1249
  "kind": "mcp",
1883
- "name": "user_get",
1250
+ "name": "membershipoverride_get",
1884
1251
  "operation": "get",
1885
- "objectName": "@happyvertical/smrt-users:User"
1252
+ "objectName": "@happyvertical/smrt-users:MembershipOverride"
1886
1253
  }
1887
1254
  ],
1888
1255
  "relationshipFeatures": [
1889
- "crossPackageRef",
1256
+ "foreignKey",
1890
1257
  "uuidColumns"
1891
1258
  ],
1892
1259
  "tags": [],
1893
1260
  "risks": []
1894
1261
  },
1895
1262
  {
1896
- "name": "AccessRequestCollection",
1897
- "qualifiedName": "@happyvertical/smrt-users:AccessRequestCollection",
1898
- "collection": "accessrequests",
1899
- "tableName": "access_requests",
1263
+ "name": "Permission",
1264
+ "qualifiedName": "@happyvertical/smrt-users:Permission",
1265
+ "collection": "permissions",
1266
+ "tableName": "permissions",
1900
1267
  "packageName": "@happyvertical/smrt-users",
1901
- "extends": "SmrtCollection",
1902
- "fields": [],
1903
- "relationships": [],
1904
- "methods": [
1905
- "findByEmail",
1906
- "findByStatus",
1907
- "findOpen",
1908
- "findOpenByEmail"
1909
- ],
1910
- "surfaces": [],
1911
- "relationshipFeatures": [
1912
- "uuidColumns"
1268
+ "extends": "SmrtObject",
1269
+ "fields": [
1270
+ {
1271
+ "name": "name",
1272
+ "type": "text",
1273
+ "required": false,
1274
+ "columnType": "TEXT"
1275
+ },
1276
+ {
1277
+ "name": "description",
1278
+ "type": "text",
1279
+ "required": false,
1280
+ "columnType": "TEXT"
1281
+ },
1282
+ {
1283
+ "name": "category",
1284
+ "type": "text",
1285
+ "required": false,
1286
+ "columnType": "TEXT"
1287
+ }
1913
1288
  ],
1914
- "tags": [],
1915
- "risks": []
1916
- },
1917
- {
1918
- "name": "UsersCliAuthRequestCollection",
1919
- "qualifiedName": "@happyvertical/smrt-users:UsersCliAuthRequestCollection",
1920
- "collection": "userscliauthrequests",
1921
- "tableName": "users_cli_auth_requests",
1922
- "packageName": "@happyvertical/smrt-users",
1923
- "extends": "SmrtCollection",
1924
- "fields": [],
1925
1289
  "relationships": [],
1926
1290
  "methods": [
1927
- "deleteExpired",
1928
- "findByDeviceCodeHash",
1929
- "findByUserCode"
1930
- ],
1931
- "surfaces": [],
1932
- "relationshipFeatures": [
1933
- "uuidColumns"
1291
+ "getAction",
1292
+ "getResource",
1293
+ "isValidSlug",
1294
+ "parseSlug"
1934
1295
  ],
1935
- "tags": [],
1936
- "risks": []
1937
- },
1938
- {
1939
- "name": "GroupCollection",
1940
- "qualifiedName": "@happyvertical/smrt-users:GroupCollection",
1941
- "collection": "groups",
1942
- "tableName": "group_collections",
1943
- "packageName": "@happyvertical/smrt-users",
1944
- "extends": "SmrtCollection",
1945
- "fields": [],
1946
- "relationships": [],
1947
- "methods": [
1948
- "findBySlug",
1949
- "findByTenant"
1296
+ "surfaces": [
1297
+ {
1298
+ "kind": "api",
1299
+ "name": "permissions.list",
1300
+ "operation": "list",
1301
+ "objectName": "@happyvertical/smrt-users:Permission",
1302
+ "path": "/permissions",
1303
+ "method": "GET"
1304
+ },
1305
+ {
1306
+ "kind": "api",
1307
+ "name": "permissions.get",
1308
+ "operation": "get",
1309
+ "objectName": "@happyvertical/smrt-users:Permission",
1310
+ "path": "/permissions/[id]",
1311
+ "method": "GET"
1312
+ },
1313
+ {
1314
+ "kind": "cli",
1315
+ "name": "permission_list",
1316
+ "operation": "list",
1317
+ "objectName": "@happyvertical/smrt-users:Permission"
1318
+ },
1319
+ {
1320
+ "kind": "cli",
1321
+ "name": "permission_get",
1322
+ "operation": "get",
1323
+ "objectName": "@happyvertical/smrt-users:Permission"
1324
+ },
1325
+ {
1326
+ "kind": "cli",
1327
+ "name": "permission_create",
1328
+ "operation": "create",
1329
+ "objectName": "@happyvertical/smrt-users:Permission"
1330
+ },
1331
+ {
1332
+ "kind": "cli",
1333
+ "name": "permission_update",
1334
+ "operation": "update",
1335
+ "objectName": "@happyvertical/smrt-users:Permission"
1336
+ },
1337
+ {
1338
+ "kind": "cli",
1339
+ "name": "permission_delete",
1340
+ "operation": "delete",
1341
+ "objectName": "@happyvertical/smrt-users:Permission"
1342
+ },
1343
+ {
1344
+ "kind": "mcp",
1345
+ "name": "permission_list",
1346
+ "operation": "list",
1347
+ "objectName": "@happyvertical/smrt-users:Permission"
1348
+ },
1349
+ {
1350
+ "kind": "mcp",
1351
+ "name": "permission_get",
1352
+ "operation": "get",
1353
+ "objectName": "@happyvertical/smrt-users:Permission"
1354
+ }
1950
1355
  ],
1951
- "surfaces": [],
1952
1356
  "relationshipFeatures": [
1953
1357
  "uuidColumns"
1954
1358
  ],
@@ -1956,340 +1360,936 @@
1956
1360
  "risks": []
1957
1361
  },
1958
1362
  {
1959
- "name": "GroupMemberCollection",
1960
- "qualifiedName": "@happyvertical/smrt-users:GroupMemberCollection",
1961
- "collection": "groupmembers",
1962
- "tableName": "group_member_collections",
1363
+ "name": "Role",
1364
+ "qualifiedName": "@happyvertical/smrt-users:Role",
1365
+ "collection": "roles",
1366
+ "tableName": "roles",
1963
1367
  "packageName": "@happyvertical/smrt-users",
1964
- "extends": "SmrtCollection",
1965
- "fields": [],
1966
- "relationships": [],
1967
- "methods": [
1968
- "addMember",
1969
- "findByGroup",
1970
- "findByUser",
1971
- "getGroupIds",
1972
- "getGroupIdsForTenant",
1973
- "getUserIds",
1974
- "isMember",
1975
- "removeMember"
1368
+ "extends": "SmrtObject",
1369
+ "fields": [
1370
+ {
1371
+ "name": "tenantId",
1372
+ "type": "foreignKey",
1373
+ "required": false,
1374
+ "related": "Tenant",
1375
+ "columnType": "UUID"
1376
+ },
1377
+ {
1378
+ "name": "name",
1379
+ "type": "text",
1380
+ "required": false,
1381
+ "columnType": "TEXT"
1382
+ },
1383
+ {
1384
+ "name": "description",
1385
+ "type": "text",
1386
+ "required": false,
1387
+ "columnType": "TEXT"
1388
+ },
1389
+ {
1390
+ "name": "isSystem",
1391
+ "type": "boolean",
1392
+ "required": false,
1393
+ "columnType": "BOOLEAN"
1394
+ },
1395
+ {
1396
+ "name": "inheritsToDescendants",
1397
+ "type": "boolean",
1398
+ "required": false,
1399
+ "columnType": "BOOLEAN"
1400
+ }
1976
1401
  ],
1977
- "surfaces": [],
1978
- "relationshipFeatures": [
1979
- "uuidColumns"
1402
+ "relationships": [
1403
+ {
1404
+ "name": "tenantId",
1405
+ "type": "foreignKey",
1406
+ "required": false,
1407
+ "related": "Tenant",
1408
+ "columnType": "UUID"
1409
+ }
1980
1410
  ],
1981
- "tags": [],
1982
- "risks": []
1983
- },
1984
- {
1985
- "name": "GroupRoleCollection",
1986
- "qualifiedName": "@happyvertical/smrt-users:GroupRoleCollection",
1987
- "collection": "grouproles",
1988
- "tableName": "group_role_collections",
1989
- "packageName": "@happyvertical/smrt-users",
1990
- "extends": "SmrtCollection",
1991
- "fields": [],
1992
- "relationships": [],
1993
1411
  "methods": [
1994
- "addRole",
1995
- "findByGroup",
1996
- "findByRole",
1997
- "getRoleIds",
1998
- "hasRole",
1999
- "removeRole"
2000
- ],
2001
- "surfaces": [],
2002
- "relationshipFeatures": [
2003
- "uuidColumns"
1412
+ "canDelete",
1413
+ "delete",
1414
+ "isSystemRole",
1415
+ "isTenantRole"
2004
1416
  ],
2005
- "tags": [],
2006
- "risks": []
2007
- },
2008
- {
2009
- "name": "UsersMagicLinkTokenCollection",
2010
- "qualifiedName": "@happyvertical/smrt-users:UsersMagicLinkTokenCollection",
2011
- "collection": "usersmagiclinktokens",
2012
- "tableName": "users_magic_link_tokens",
2013
- "packageName": "@happyvertical/smrt-users",
2014
- "extends": "SmrtCollection",
2015
- "fields": [],
2016
- "relationships": [],
2017
- "methods": [
2018
- "deleteExpired",
2019
- "findByNonce",
2020
- "markUsed"
1417
+ "surfaces": [
1418
+ {
1419
+ "kind": "api",
1420
+ "name": "roles.list",
1421
+ "operation": "list",
1422
+ "objectName": "@happyvertical/smrt-users:Role",
1423
+ "path": "/roles",
1424
+ "method": "GET"
1425
+ },
1426
+ {
1427
+ "kind": "api",
1428
+ "name": "roles.get",
1429
+ "operation": "get",
1430
+ "objectName": "@happyvertical/smrt-users:Role",
1431
+ "path": "/roles/[id]",
1432
+ "method": "GET"
1433
+ },
1434
+ {
1435
+ "kind": "cli",
1436
+ "name": "role_list",
1437
+ "operation": "list",
1438
+ "objectName": "@happyvertical/smrt-users:Role"
1439
+ },
1440
+ {
1441
+ "kind": "cli",
1442
+ "name": "role_get",
1443
+ "operation": "get",
1444
+ "objectName": "@happyvertical/smrt-users:Role"
1445
+ },
1446
+ {
1447
+ "kind": "cli",
1448
+ "name": "role_create",
1449
+ "operation": "create",
1450
+ "objectName": "@happyvertical/smrt-users:Role"
1451
+ },
1452
+ {
1453
+ "kind": "cli",
1454
+ "name": "role_update",
1455
+ "operation": "update",
1456
+ "objectName": "@happyvertical/smrt-users:Role"
1457
+ },
1458
+ {
1459
+ "kind": "cli",
1460
+ "name": "role_delete",
1461
+ "operation": "delete",
1462
+ "objectName": "@happyvertical/smrt-users:Role"
1463
+ },
1464
+ {
1465
+ "kind": "mcp",
1466
+ "name": "role_list",
1467
+ "operation": "list",
1468
+ "objectName": "@happyvertical/smrt-users:Role"
1469
+ },
1470
+ {
1471
+ "kind": "mcp",
1472
+ "name": "role_get",
1473
+ "operation": "get",
1474
+ "objectName": "@happyvertical/smrt-users:Role"
1475
+ }
2021
1476
  ],
2022
- "surfaces": [],
2023
1477
  "relationshipFeatures": [
1478
+ "foreignKey",
2024
1479
  "uuidColumns"
2025
1480
  ],
2026
1481
  "tags": [],
2027
1482
  "risks": []
2028
1483
  },
2029
1484
  {
2030
- "name": "MembershipCollection",
2031
- "qualifiedName": "@happyvertical/smrt-users:MembershipCollection",
2032
- "collection": "memberships",
2033
- "tableName": "membership_collections",
1485
+ "name": "RolePermission",
1486
+ "qualifiedName": "@happyvertical/smrt-users:RolePermission",
1487
+ "collection": "rolepermissions",
1488
+ "tableName": "role_permissions",
2034
1489
  "packageName": "@happyvertical/smrt-users",
2035
- "extends": "SmrtCollection",
2036
- "fields": [],
2037
- "relationships": [],
2038
- "methods": [
2039
- "findActiveByTenant",
2040
- "findActiveByUser",
2041
- "findByRole",
2042
- "findByStatus",
2043
- "findByTenant",
2044
- "findByUser",
2045
- "findByUserAndTenant"
1490
+ "extends": "SmrtObject",
1491
+ "fields": [
1492
+ {
1493
+ "name": "roleId",
1494
+ "type": "foreignKey",
1495
+ "required": true,
1496
+ "related": "Role",
1497
+ "columnType": "UUID"
1498
+ },
1499
+ {
1500
+ "name": "permissionId",
1501
+ "type": "foreignKey",
1502
+ "required": true,
1503
+ "related": "Permission",
1504
+ "columnType": "UUID"
1505
+ }
1506
+ ],
1507
+ "relationships": [
1508
+ {
1509
+ "name": "roleId",
1510
+ "type": "foreignKey",
1511
+ "required": true,
1512
+ "related": "Role",
1513
+ "columnType": "UUID"
1514
+ },
1515
+ {
1516
+ "name": "permissionId",
1517
+ "type": "foreignKey",
1518
+ "required": true,
1519
+ "related": "Permission",
1520
+ "columnType": "UUID"
1521
+ }
1522
+ ],
1523
+ "methods": [],
1524
+ "surfaces": [
1525
+ {
1526
+ "kind": "api",
1527
+ "name": "rolepermissions.list",
1528
+ "operation": "list",
1529
+ "objectName": "@happyvertical/smrt-users:RolePermission",
1530
+ "path": "/rolepermissions",
1531
+ "method": "GET"
1532
+ },
1533
+ {
1534
+ "kind": "api",
1535
+ "name": "rolepermissions.get",
1536
+ "operation": "get",
1537
+ "objectName": "@happyvertical/smrt-users:RolePermission",
1538
+ "path": "/rolepermissions/[id]",
1539
+ "method": "GET"
1540
+ },
1541
+ {
1542
+ "kind": "cli",
1543
+ "name": "rolepermission_list",
1544
+ "operation": "list",
1545
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1546
+ },
1547
+ {
1548
+ "kind": "cli",
1549
+ "name": "rolepermission_get",
1550
+ "operation": "get",
1551
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1552
+ },
1553
+ {
1554
+ "kind": "cli",
1555
+ "name": "rolepermission_create",
1556
+ "operation": "create",
1557
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1558
+ },
1559
+ {
1560
+ "kind": "cli",
1561
+ "name": "rolepermission_update",
1562
+ "operation": "update",
1563
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1564
+ },
1565
+ {
1566
+ "kind": "cli",
1567
+ "name": "rolepermission_delete",
1568
+ "operation": "delete",
1569
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1570
+ },
1571
+ {
1572
+ "kind": "mcp",
1573
+ "name": "rolepermission_list",
1574
+ "operation": "list",
1575
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1576
+ },
1577
+ {
1578
+ "kind": "mcp",
1579
+ "name": "rolepermission_get",
1580
+ "operation": "get",
1581
+ "objectName": "@happyvertical/smrt-users:RolePermission"
1582
+ }
2046
1583
  ],
2047
- "surfaces": [],
2048
1584
  "relationshipFeatures": [
1585
+ "foreignKey",
2049
1586
  "uuidColumns"
2050
1587
  ],
2051
1588
  "tags": [],
2052
1589
  "risks": []
2053
1590
  },
2054
1591
  {
2055
- "name": "MembershipOverrideCollection",
2056
- "qualifiedName": "@happyvertical/smrt-users:MembershipOverrideCollection",
2057
- "collection": "membershipoverrides",
2058
- "tableName": "membership_override_collections",
1592
+ "name": "Session",
1593
+ "qualifiedName": "@happyvertical/smrt-users:Session",
1594
+ "collection": "sessions",
1595
+ "tableName": "sessions",
2059
1596
  "packageName": "@happyvertical/smrt-users",
2060
- "extends": "SmrtCollection",
2061
- "fields": [],
2062
- "relationships": [],
1597
+ "extends": "SmrtObject",
1598
+ "fields": [
1599
+ {
1600
+ "name": "userId",
1601
+ "type": "foreignKey",
1602
+ "required": false,
1603
+ "related": "User",
1604
+ "columnType": "UUID"
1605
+ },
1606
+ {
1607
+ "name": "tenantId",
1608
+ "type": "foreignKey",
1609
+ "required": false,
1610
+ "related": "Tenant",
1611
+ "columnType": "UUID"
1612
+ },
1613
+ {
1614
+ "name": "status",
1615
+ "type": "text",
1616
+ "required": false,
1617
+ "columnType": "TEXT"
1618
+ },
1619
+ {
1620
+ "name": "expiresAt",
1621
+ "type": "datetime",
1622
+ "required": false,
1623
+ "columnType": "TIMESTAMP"
1624
+ },
1625
+ {
1626
+ "name": "userAgent",
1627
+ "type": "text",
1628
+ "required": false,
1629
+ "columnType": "TEXT"
1630
+ },
1631
+ {
1632
+ "name": "ipAddress",
1633
+ "type": "text",
1634
+ "required": false,
1635
+ "columnType": "TEXT"
1636
+ },
1637
+ {
1638
+ "name": "lastAccessedAt",
1639
+ "type": "datetime",
1640
+ "required": false,
1641
+ "columnType": "TIMESTAMP"
1642
+ },
1643
+ {
1644
+ "name": "data",
1645
+ "type": "json",
1646
+ "required": false,
1647
+ "columnType": "JSON"
1648
+ }
1649
+ ],
1650
+ "relationships": [
1651
+ {
1652
+ "name": "userId",
1653
+ "type": "foreignKey",
1654
+ "required": false,
1655
+ "related": "User",
1656
+ "columnType": "UUID"
1657
+ },
1658
+ {
1659
+ "name": "tenantId",
1660
+ "type": "foreignKey",
1661
+ "required": false,
1662
+ "related": "Tenant",
1663
+ "columnType": "UUID"
1664
+ }
1665
+ ],
2063
1666
  "methods": [
2064
- "denyPermission",
2065
- "findByMembership",
2066
- "findDenies",
2067
- "findGrants",
2068
- "getDeniedPermissionIds",
2069
- "getGrantedPermissionIds",
2070
- "grantPermission",
2071
- "removeOverride",
2072
- "setOverride"
1667
+ "extend",
1668
+ "getData",
1669
+ "isExpired",
1670
+ "isRevoked",
1671
+ "isValid",
1672
+ "removeData",
1673
+ "revoke",
1674
+ "setData",
1675
+ "setTenant",
1676
+ "touch"
1677
+ ],
1678
+ "surfaces": [
1679
+ {
1680
+ "kind": "api",
1681
+ "name": "sessions.get",
1682
+ "operation": "get",
1683
+ "objectName": "@happyvertical/smrt-users:Session",
1684
+ "path": "/sessions/[id]",
1685
+ "method": "GET"
1686
+ },
1687
+ {
1688
+ "kind": "api",
1689
+ "name": "sessions.delete",
1690
+ "operation": "delete",
1691
+ "objectName": "@happyvertical/smrt-users:Session",
1692
+ "path": "/sessions/[id]",
1693
+ "method": "DELETE"
1694
+ },
1695
+ {
1696
+ "kind": "cli",
1697
+ "name": "session_list",
1698
+ "operation": "list",
1699
+ "objectName": "@happyvertical/smrt-users:Session"
1700
+ },
1701
+ {
1702
+ "kind": "cli",
1703
+ "name": "session_get",
1704
+ "operation": "get",
1705
+ "objectName": "@happyvertical/smrt-users:Session"
1706
+ },
1707
+ {
1708
+ "kind": "cli",
1709
+ "name": "session_create",
1710
+ "operation": "create",
1711
+ "objectName": "@happyvertical/smrt-users:Session"
1712
+ },
1713
+ {
1714
+ "kind": "cli",
1715
+ "name": "session_update",
1716
+ "operation": "update",
1717
+ "objectName": "@happyvertical/smrt-users:Session"
1718
+ },
1719
+ {
1720
+ "kind": "cli",
1721
+ "name": "session_delete",
1722
+ "operation": "delete",
1723
+ "objectName": "@happyvertical/smrt-users:Session"
1724
+ }
2073
1725
  ],
2074
- "surfaces": [],
2075
1726
  "relationshipFeatures": [
1727
+ "foreignKey",
2076
1728
  "uuidColumns"
2077
1729
  ],
2078
1730
  "tags": [],
2079
1731
  "risks": []
2080
1732
  },
2081
1733
  {
2082
- "name": "PermissionCollection",
2083
- "qualifiedName": "@happyvertical/smrt-users:PermissionCollection",
2084
- "collection": "permissions",
2085
- "tableName": "permission_collections",
1734
+ "name": "Tenant",
1735
+ "qualifiedName": "@happyvertical/smrt-users:Tenant",
1736
+ "collection": "tenants",
1737
+ "tableName": "tenants",
2086
1738
  "packageName": "@happyvertical/smrt-users",
2087
- "extends": "SmrtCollection",
2088
- "fields": [],
2089
- "relationships": [],
2090
- "methods": [
2091
- "findByCategory",
2092
- "findByIds",
2093
- "findBySlug",
2094
- "findOrCreate",
2095
- "getCategories"
2096
- ],
2097
- "surfaces": [],
2098
- "relationshipFeatures": [
2099
- "uuidColumns"
2100
- ],
2101
- "tags": [],
2102
- "risks": []
2103
- },
2104
- {
2105
- "name": "RoleCollection",
2106
- "qualifiedName": "@happyvertical/smrt-users:RoleCollection",
2107
- "collection": "roles",
2108
- "tableName": "role_collections",
2109
- "packageName": "@happyvertical/smrt-users",
2110
- "extends": "SmrtCollection",
2111
- "fields": [],
2112
- "relationships": [],
2113
- "methods": [
2114
- "findBySlug",
2115
- "findByTenant",
2116
- "findSystemRoles",
2117
- "findTenantRoles",
2118
- "seedSystemRoles"
2119
- ],
2120
- "surfaces": [],
2121
- "relationshipFeatures": [
2122
- "uuidColumns"
2123
- ],
2124
- "tags": [],
2125
- "risks": []
2126
- },
2127
- {
2128
- "name": "RolePermissionCollection",
2129
- "qualifiedName": "@happyvertical/smrt-users:RolePermissionCollection",
2130
- "collection": "rolepermissions",
2131
- "tableName": "role_permission_collections",
2132
- "packageName": "@happyvertical/smrt-users",
2133
- "extends": "SmrtCollection",
2134
- "fields": [],
2135
- "relationships": [],
2136
- "methods": [
2137
- "addPermission",
2138
- "findByPermission",
2139
- "findByRole",
2140
- "getPermissionIds",
2141
- "hasPermission",
2142
- "removePermission",
2143
- "seedRolePermissions"
1739
+ "extends": "SmrtObject",
1740
+ "fields": [
1741
+ {
1742
+ "name": "created_at",
1743
+ "type": "datetime",
1744
+ "required": false,
1745
+ "columnType": "TIMESTAMP"
1746
+ },
1747
+ {
1748
+ "name": "updated_at",
1749
+ "type": "datetime",
1750
+ "required": false,
1751
+ "columnType": "TIMESTAMP"
1752
+ },
1753
+ {
1754
+ "name": "name",
1755
+ "type": "text",
1756
+ "required": false,
1757
+ "columnType": "TEXT"
1758
+ },
1759
+ {
1760
+ "name": "status",
1761
+ "type": "text",
1762
+ "required": false,
1763
+ "columnType": "TEXT"
1764
+ },
1765
+ {
1766
+ "name": "description",
1767
+ "type": "text",
1768
+ "required": false,
1769
+ "columnType": "TEXT"
1770
+ },
1771
+ {
1772
+ "name": "parentTenantId",
1773
+ "type": "foreignKey",
1774
+ "required": false,
1775
+ "related": "Tenant",
1776
+ "columnType": "UUID"
1777
+ },
1778
+ {
1779
+ "name": "hierarchyLevel",
1780
+ "type": "integer",
1781
+ "required": false,
1782
+ "columnType": "INTEGER"
1783
+ },
1784
+ {
1785
+ "name": "hierarchyPath",
1786
+ "type": "text",
1787
+ "required": false,
1788
+ "columnType": "TEXT"
1789
+ },
1790
+ {
1791
+ "name": "cascadePermissions",
1792
+ "type": "boolean",
1793
+ "required": false,
1794
+ "columnType": "BOOLEAN"
1795
+ },
1796
+ {
1797
+ "name": "inheritPermissions",
1798
+ "type": "boolean",
1799
+ "required": false,
1800
+ "columnType": "BOOLEAN"
1801
+ }
2144
1802
  ],
2145
- "surfaces": [],
2146
- "relationshipFeatures": [
2147
- "uuidColumns"
1803
+ "relationships": [
1804
+ {
1805
+ "name": "parentTenantId",
1806
+ "type": "foreignKey",
1807
+ "required": false,
1808
+ "related": "Tenant",
1809
+ "columnType": "UUID"
1810
+ }
2148
1811
  ],
2149
- "tags": [],
2150
- "risks": []
2151
- },
2152
- {
2153
- "name": "SessionCollection",
2154
- "qualifiedName": "@happyvertical/smrt-users:SessionCollection",
2155
- "collection": "sessions",
2156
- "tableName": "session_collections",
2157
- "packageName": "@happyvertical/smrt-users",
2158
- "extends": "SmrtCollection",
2159
- "fields": [],
2160
- "relationships": [],
2161
1812
  "methods": [
2162
- "countUserSessions",
2163
- "createSession",
2164
- "deleteExpired",
2165
- "deleteUserSessions",
2166
- "findByUser",
2167
- "findValidSession",
2168
- "getSessionData",
2169
- "revokeSession",
2170
- "revokeUserSessions",
2171
- "setSessionData",
2172
- "setSessionTenant",
2173
- "touch"
2174
- ],
2175
- "surfaces": [],
2176
- "relationshipFeatures": [
2177
- "uuidColumns"
1813
+ "_setLoadedRelationship",
1814
+ "acceptsInheritance",
1815
+ "canCascadeToChildren",
1816
+ "classifyConstraintError",
1817
+ "clearEmbeddings",
1818
+ "delete",
1819
+ "describe",
1820
+ "destroy",
1821
+ "do",
1822
+ "executeToolCall",
1823
+ "forget",
1824
+ "forgetScope",
1825
+ "generateEmbeddings",
1826
+ "getAiUsageSnapshot",
1827
+ "getAncestorIds",
1828
+ "getAvailableTools",
1829
+ "getEmbedding",
1830
+ "getFields",
1831
+ "getId",
1832
+ "getRelated",
1833
+ "getSavedId",
1834
+ "getSlug",
1835
+ "hasStaleEmbeddings",
1836
+ "initialize",
1837
+ "is",
1838
+ "isActive",
1839
+ "isRelatedLoaded",
1840
+ "isRoot",
1841
+ "isSaved",
1842
+ "isSuspended",
1843
+ "listAiUsage",
1844
+ "loadDataFromDb",
1845
+ "loadFromId",
1846
+ "loadFromSlug",
1847
+ "loadRelated",
1848
+ "loadRelatedMany",
1849
+ "markAsPersisted",
1850
+ "recall",
1851
+ "recallAll",
1852
+ "remember",
1853
+ "requireInsertOnSave",
1854
+ "resetAiUsage",
1855
+ "save",
1856
+ "summarizeAiUsage",
1857
+ "toJSON",
1858
+ "toPlainObject",
1859
+ "toPublicJSON"
2178
1860
  ],
2179
- "tags": [],
2180
- "risks": []
2181
- },
2182
- {
2183
- "name": "TenantCollection",
2184
- "qualifiedName": "@happyvertical/smrt-users:TenantCollection",
2185
- "collection": "tenants",
2186
- "tableName": "tenant_collections",
2187
- "packageName": "@happyvertical/smrt-users",
2188
- "extends": "SmrtCollection",
2189
- "fields": [],
2190
- "relationships": [],
2191
- "methods": [
2192
- "create",
2193
- "createChild",
2194
- "findActive",
2195
- "findBySlug",
2196
- "findByStatus",
2197
- "findChildren",
2198
- "findParent",
2199
- "findRoots",
2200
- "getAncestors",
2201
- "getAncestorsFromRoot",
2202
- "getDescendants",
2203
- "getSiblings",
2204
- "getTree",
2205
- "isAncestorOf",
2206
- "isDescendantOf",
2207
- "makeRoot",
2208
- "moveToParent",
2209
- "validateHierarchy"
1861
+ "surfaces": [
1862
+ {
1863
+ "kind": "api",
1864
+ "name": "tenants.list",
1865
+ "operation": "list",
1866
+ "objectName": "@happyvertical/smrt-users:Tenant",
1867
+ "path": "/tenants",
1868
+ "method": "GET"
1869
+ },
1870
+ {
1871
+ "kind": "api",
1872
+ "name": "tenants.get",
1873
+ "operation": "get",
1874
+ "objectName": "@happyvertical/smrt-users:Tenant",
1875
+ "path": "/tenants/[id]",
1876
+ "method": "GET"
1877
+ },
1878
+ {
1879
+ "kind": "cli",
1880
+ "name": "tenant_list",
1881
+ "operation": "list",
1882
+ "objectName": "@happyvertical/smrt-users:Tenant"
1883
+ },
1884
+ {
1885
+ "kind": "cli",
1886
+ "name": "tenant_get",
1887
+ "operation": "get",
1888
+ "objectName": "@happyvertical/smrt-users:Tenant"
1889
+ },
1890
+ {
1891
+ "kind": "cli",
1892
+ "name": "tenant_create",
1893
+ "operation": "create",
1894
+ "objectName": "@happyvertical/smrt-users:Tenant"
1895
+ },
1896
+ {
1897
+ "kind": "cli",
1898
+ "name": "tenant_update",
1899
+ "operation": "update",
1900
+ "objectName": "@happyvertical/smrt-users:Tenant"
1901
+ },
1902
+ {
1903
+ "kind": "cli",
1904
+ "name": "tenant_delete",
1905
+ "operation": "delete",
1906
+ "objectName": "@happyvertical/smrt-users:Tenant"
1907
+ },
1908
+ {
1909
+ "kind": "mcp",
1910
+ "name": "tenant_list",
1911
+ "operation": "list",
1912
+ "objectName": "@happyvertical/smrt-users:Tenant"
1913
+ },
1914
+ {
1915
+ "kind": "mcp",
1916
+ "name": "tenant_get",
1917
+ "operation": "get",
1918
+ "objectName": "@happyvertical/smrt-users:Tenant"
1919
+ }
2210
1920
  ],
2211
- "surfaces": [],
2212
1921
  "relationshipFeatures": [
1922
+ "foreignKey",
2213
1923
  "uuidColumns"
2214
1924
  ],
2215
1925
  "tags": [],
2216
1926
  "risks": []
2217
1927
  },
2218
1928
  {
2219
- "name": "TenantIntegrationCollection",
2220
- "qualifiedName": "@happyvertical/smrt-users:TenantIntegrationCollection",
1929
+ "name": "TenantIntegration",
1930
+ "qualifiedName": "@happyvertical/smrt-users:TenantIntegration",
2221
1931
  "collection": "tenantintegrations",
2222
1932
  "tableName": "tenant_integrations",
2223
1933
  "packageName": "@happyvertical/smrt-users",
2224
- "extends": "SmrtCollection",
2225
- "fields": [],
1934
+ "extends": "SmrtObject",
1935
+ "fields": [
1936
+ {
1937
+ "name": "tenantId",
1938
+ "type": "text",
1939
+ "required": true,
1940
+ "columnType": "UUID"
1941
+ },
1942
+ {
1943
+ "name": "provider",
1944
+ "type": "text",
1945
+ "required": false,
1946
+ "columnType": "TEXT"
1947
+ },
1948
+ {
1949
+ "name": "externalIds",
1950
+ "type": "text",
1951
+ "required": false,
1952
+ "columnType": "TEXT"
1953
+ },
1954
+ {
1955
+ "name": "status",
1956
+ "type": "text",
1957
+ "required": false,
1958
+ "columnType": "TEXT"
1959
+ },
1960
+ {
1961
+ "name": "lastCheckedAt",
1962
+ "type": "datetime",
1963
+ "required": false,
1964
+ "columnType": "TIMESTAMP"
1965
+ },
1966
+ {
1967
+ "name": "lastCheckSummary",
1968
+ "type": "text",
1969
+ "required": false,
1970
+ "columnType": "TEXT"
1971
+ },
1972
+ {
1973
+ "name": "lastError",
1974
+ "type": "text",
1975
+ "required": false,
1976
+ "columnType": "TEXT"
1977
+ }
1978
+ ],
2226
1979
  "relationships": [],
2227
1980
  "methods": [
2228
- "findFor",
2229
- "findOrInit",
2230
- "listForTenant"
1981
+ "getExternalId",
1982
+ "getExternalIds",
1983
+ "getLastCheckSummary",
1984
+ "initialize",
1985
+ "recordDoctorRun",
1986
+ "setExternalId",
1987
+ "setExternalIds",
1988
+ "setLastCheckSummary"
1989
+ ],
1990
+ "surfaces": [
1991
+ {
1992
+ "kind": "api",
1993
+ "name": "tenantintegrations.list",
1994
+ "operation": "list",
1995
+ "objectName": "@happyvertical/smrt-users:TenantIntegration",
1996
+ "path": "/tenantintegrations",
1997
+ "method": "GET"
1998
+ },
1999
+ {
2000
+ "kind": "api",
2001
+ "name": "tenantintegrations.get",
2002
+ "operation": "get",
2003
+ "objectName": "@happyvertical/smrt-users:TenantIntegration",
2004
+ "path": "/tenantintegrations/[id]",
2005
+ "method": "GET"
2006
+ },
2007
+ {
2008
+ "kind": "cli",
2009
+ "name": "tenantintegration_list",
2010
+ "operation": "list",
2011
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2012
+ },
2013
+ {
2014
+ "kind": "cli",
2015
+ "name": "tenantintegration_get",
2016
+ "operation": "get",
2017
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2018
+ },
2019
+ {
2020
+ "kind": "cli",
2021
+ "name": "tenantintegration_create",
2022
+ "operation": "create",
2023
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2024
+ },
2025
+ {
2026
+ "kind": "cli",
2027
+ "name": "tenantintegration_update",
2028
+ "operation": "update",
2029
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2030
+ },
2031
+ {
2032
+ "kind": "cli",
2033
+ "name": "tenantintegration_delete",
2034
+ "operation": "delete",
2035
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2036
+ },
2037
+ {
2038
+ "kind": "mcp",
2039
+ "name": "tenantintegration_list",
2040
+ "operation": "list",
2041
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2042
+ },
2043
+ {
2044
+ "kind": "mcp",
2045
+ "name": "tenantintegration_get",
2046
+ "operation": "get",
2047
+ "objectName": "@happyvertical/smrt-users:TenantIntegration"
2048
+ }
2231
2049
  ],
2232
- "surfaces": [],
2233
2050
  "relationshipFeatures": [
2234
2051
  "uuidColumns"
2235
2052
  ],
2236
2053
  "tags": [],
2237
2054
  "risks": []
2238
2055
  },
2239
- {
2240
- "name": "TenantPermissionOverrideCollection",
2241
- "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverrideCollection",
2056
+ {
2057
+ "name": "TenantPermissionOverride",
2058
+ "qualifiedName": "@happyvertical/smrt-users:TenantPermissionOverride",
2242
2059
  "collection": "tenantpermissionoverrides",
2243
- "tableName": "tenant_permission_override_collections",
2060
+ "tableName": "tenant_permission_overrides",
2244
2061
  "packageName": "@happyvertical/smrt-users",
2245
- "extends": "SmrtCollection",
2246
- "fields": [],
2247
- "relationships": [],
2062
+ "extends": "SmrtObject",
2063
+ "fields": [
2064
+ {
2065
+ "name": "tenantId",
2066
+ "type": "foreignKey",
2067
+ "required": true,
2068
+ "related": "Tenant",
2069
+ "columnType": "UUID"
2070
+ },
2071
+ {
2072
+ "name": "permissionId",
2073
+ "type": "foreignKey",
2074
+ "required": true,
2075
+ "related": "Permission",
2076
+ "columnType": "UUID"
2077
+ },
2078
+ {
2079
+ "name": "effect",
2080
+ "type": "text",
2081
+ "required": false,
2082
+ "columnType": "TEXT"
2083
+ }
2084
+ ],
2085
+ "relationships": [
2086
+ {
2087
+ "name": "tenantId",
2088
+ "type": "foreignKey",
2089
+ "required": true,
2090
+ "related": "Tenant",
2091
+ "columnType": "UUID"
2092
+ },
2093
+ {
2094
+ "name": "permissionId",
2095
+ "type": "foreignKey",
2096
+ "required": true,
2097
+ "related": "Permission",
2098
+ "columnType": "UUID"
2099
+ }
2100
+ ],
2248
2101
  "methods": [
2249
- "bulkSetOverrides",
2250
- "copyOverrides",
2251
- "denyPermission",
2252
- "findByTenant",
2253
- "findDenies",
2254
- "findGrants",
2255
- "findInherits",
2256
- "getDeniedPermissionIds",
2257
- "getGrantedPermissionIds",
2258
- "getOverridesByEffect",
2259
- "getOverridesByEffectBatch",
2260
- "grantPermission",
2261
- "inheritPermission",
2262
- "removeAllOverrides",
2263
- "removeOverride",
2264
- "setOverride"
2102
+ "hasExplicitEffect",
2103
+ "isDeny",
2104
+ "isGrant",
2105
+ "isInherit"
2106
+ ],
2107
+ "surfaces": [
2108
+ {
2109
+ "kind": "api",
2110
+ "name": "tenantpermissionoverrides.list",
2111
+ "operation": "list",
2112
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
2113
+ "path": "/tenantpermissionoverrides",
2114
+ "method": "GET"
2115
+ },
2116
+ {
2117
+ "kind": "api",
2118
+ "name": "tenantpermissionoverrides.get",
2119
+ "operation": "get",
2120
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride",
2121
+ "path": "/tenantpermissionoverrides/[id]",
2122
+ "method": "GET"
2123
+ },
2124
+ {
2125
+ "kind": "cli",
2126
+ "name": "tenantpermissionoverride_list",
2127
+ "operation": "list",
2128
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2129
+ },
2130
+ {
2131
+ "kind": "cli",
2132
+ "name": "tenantpermissionoverride_get",
2133
+ "operation": "get",
2134
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2135
+ },
2136
+ {
2137
+ "kind": "cli",
2138
+ "name": "tenantpermissionoverride_create",
2139
+ "operation": "create",
2140
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2141
+ },
2142
+ {
2143
+ "kind": "cli",
2144
+ "name": "tenantpermissionoverride_update",
2145
+ "operation": "update",
2146
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2147
+ },
2148
+ {
2149
+ "kind": "cli",
2150
+ "name": "tenantpermissionoverride_delete",
2151
+ "operation": "delete",
2152
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2153
+ },
2154
+ {
2155
+ "kind": "mcp",
2156
+ "name": "tenantpermissionoverride_list",
2157
+ "operation": "list",
2158
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2159
+ },
2160
+ {
2161
+ "kind": "mcp",
2162
+ "name": "tenantpermissionoverride_get",
2163
+ "operation": "get",
2164
+ "objectName": "@happyvertical/smrt-users:TenantPermissionOverride"
2165
+ }
2265
2166
  ],
2266
- "surfaces": [],
2267
2167
  "relationshipFeatures": [
2168
+ "foreignKey",
2268
2169
  "uuidColumns"
2269
2170
  ],
2270
2171
  "tags": [],
2271
2172
  "risks": []
2272
2173
  },
2273
2174
  {
2274
- "name": "UserCollection",
2275
- "qualifiedName": "@happyvertical/smrt-users:UserCollection",
2175
+ "name": "User",
2176
+ "qualifiedName": "@happyvertical/smrt-users:User",
2276
2177
  "collection": "users",
2277
- "tableName": "user_collections",
2178
+ "tableName": "users",
2278
2179
  "packageName": "@happyvertical/smrt-users",
2279
- "extends": "SmrtCollection",
2280
- "fields": [],
2281
- "relationships": [],
2180
+ "extends": "SmrtObject",
2181
+ "fields": [
2182
+ {
2183
+ "name": "profileId",
2184
+ "type": "crossPackageRef",
2185
+ "required": false,
2186
+ "related": "@happyvertical/smrt-profiles:Profile",
2187
+ "columnType": "UUID"
2188
+ },
2189
+ {
2190
+ "name": "email",
2191
+ "type": "text",
2192
+ "required": false,
2193
+ "columnType": "TEXT"
2194
+ },
2195
+ {
2196
+ "name": "emailKey",
2197
+ "type": "text",
2198
+ "required": false,
2199
+ "columnType": "TEXT"
2200
+ },
2201
+ {
2202
+ "name": "status",
2203
+ "type": "text",
2204
+ "required": false,
2205
+ "columnType": "TEXT"
2206
+ },
2207
+ {
2208
+ "name": "lastLoginAt",
2209
+ "type": "datetime",
2210
+ "required": false,
2211
+ "columnType": "TIMESTAMP"
2212
+ }
2213
+ ],
2214
+ "relationships": [
2215
+ {
2216
+ "name": "profileId",
2217
+ "type": "crossPackageRef",
2218
+ "required": false,
2219
+ "related": "@happyvertical/smrt-profiles:Profile",
2220
+ "columnType": "UUID"
2221
+ }
2222
+ ],
2282
2223
  "methods": [
2283
- "findActive",
2284
- "findByEmail",
2285
- "findByProfile",
2286
- "findByStatus",
2287
- "findPending",
2288
- "getOrCreateForProfile",
2289
- "getOrCreateFromOidc"
2224
+ "hasValidEmail",
2225
+ "isActive",
2226
+ "isPending",
2227
+ "isSuspended",
2228
+ "recordLogin",
2229
+ "save"
2230
+ ],
2231
+ "surfaces": [
2232
+ {
2233
+ "kind": "api",
2234
+ "name": "users.list",
2235
+ "operation": "list",
2236
+ "objectName": "@happyvertical/smrt-users:User",
2237
+ "path": "/users",
2238
+ "method": "GET"
2239
+ },
2240
+ {
2241
+ "kind": "api",
2242
+ "name": "users.get",
2243
+ "operation": "get",
2244
+ "objectName": "@happyvertical/smrt-users:User",
2245
+ "path": "/users/[id]",
2246
+ "method": "GET"
2247
+ },
2248
+ {
2249
+ "kind": "cli",
2250
+ "name": "user_list",
2251
+ "operation": "list",
2252
+ "objectName": "@happyvertical/smrt-users:User"
2253
+ },
2254
+ {
2255
+ "kind": "cli",
2256
+ "name": "user_get",
2257
+ "operation": "get",
2258
+ "objectName": "@happyvertical/smrt-users:User"
2259
+ },
2260
+ {
2261
+ "kind": "cli",
2262
+ "name": "user_create",
2263
+ "operation": "create",
2264
+ "objectName": "@happyvertical/smrt-users:User"
2265
+ },
2266
+ {
2267
+ "kind": "cli",
2268
+ "name": "user_update",
2269
+ "operation": "update",
2270
+ "objectName": "@happyvertical/smrt-users:User"
2271
+ },
2272
+ {
2273
+ "kind": "cli",
2274
+ "name": "user_delete",
2275
+ "operation": "delete",
2276
+ "objectName": "@happyvertical/smrt-users:User"
2277
+ },
2278
+ {
2279
+ "kind": "mcp",
2280
+ "name": "user_list",
2281
+ "operation": "list",
2282
+ "objectName": "@happyvertical/smrt-users:User"
2283
+ },
2284
+ {
2285
+ "kind": "mcp",
2286
+ "name": "user_get",
2287
+ "operation": "get",
2288
+ "objectName": "@happyvertical/smrt-users:User"
2289
+ }
2290
2290
  ],
2291
- "surfaces": [],
2292
2291
  "relationshipFeatures": [
2292
+ "crossPackageRef",
2293
2293
  "uuidColumns"
2294
2294
  ],
2295
2295
  "tags": [],