@shipfox/api-auth 9.1.0 → 9.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/CHANGELOG.md +20 -0
  3. package/README.md +28 -3
  4. package/dist/config.d.ts +4 -0
  5. package/dist/config.d.ts.map +1 -1
  6. package/dist/config.js +22 -0
  7. package/dist/config.js.map +1 -1
  8. package/dist/core/admin-role-model.d.ts +5 -0
  9. package/dist/core/admin-role-model.d.ts.map +1 -0
  10. package/dist/core/admin-role-model.js +18 -0
  11. package/dist/core/admin-role-model.js.map +1 -0
  12. package/dist/core/admin-role.d.ts +13 -0
  13. package/dist/core/admin-role.d.ts.map +1 -0
  14. package/dist/core/admin-role.js +21 -0
  15. package/dist/core/admin-role.js.map +1 -0
  16. package/dist/core/auth.d.ts +9 -0
  17. package/dist/core/auth.d.ts.map +1 -1
  18. package/dist/core/auth.js +71 -20
  19. package/dist/core/auth.js.map +1 -1
  20. package/dist/core/entities/admin-grant.d.ts +10 -0
  21. package/dist/core/entities/admin-grant.d.ts.map +1 -0
  22. package/dist/core/entities/admin-grant.js +3 -0
  23. package/dist/core/entities/admin-grant.js.map +1 -0
  24. package/dist/core/errors.d.ts +10 -0
  25. package/dist/core/errors.d.ts.map +1 -1
  26. package/dist/core/errors.js +19 -0
  27. package/dist/core/errors.js.map +1 -1
  28. package/dist/core/ports.d.ts +13 -0
  29. package/dist/core/ports.d.ts.map +1 -0
  30. package/dist/core/ports.js +3 -0
  31. package/dist/core/ports.js.map +1 -0
  32. package/dist/core/signup-policy.d.ts +10 -0
  33. package/dist/core/signup-policy.d.ts.map +1 -0
  34. package/dist/core/signup-policy.js +39 -0
  35. package/dist/core/signup-policy.js.map +1 -0
  36. package/dist/db/admin-grants.d.ts +15 -0
  37. package/dist/db/admin-grants.d.ts.map +1 -0
  38. package/dist/db/admin-grants.js +49 -0
  39. package/dist/db/admin-grants.js.map +1 -0
  40. package/dist/db/db.d.ts +218 -0
  41. package/dist/db/db.d.ts.map +1 -1
  42. package/dist/db/db.js +2 -0
  43. package/dist/db/db.js.map +1 -1
  44. package/dist/db/schema/admin-grants.d.ts +115 -0
  45. package/dist/db/schema/admin-grants.d.ts.map +1 -0
  46. package/dist/db/schema/admin-grants.js +42 -0
  47. package/dist/db/schema/admin-grants.js.map +1 -0
  48. package/dist/index.d.ts +11 -4
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +6 -3
  51. package/dist/index.js.map +1 -1
  52. package/dist/presentation/dto/user.d.ts +2 -1
  53. package/dist/presentation/dto/user.d.ts.map +1 -1
  54. package/dist/presentation/dto/user.js +2 -1
  55. package/dist/presentation/dto/user.js.map +1 -1
  56. package/dist/presentation/inter-module.d.ts.map +1 -1
  57. package/dist/presentation/inter-module.js +26 -2
  58. package/dist/presentation/inter-module.js.map +1 -1
  59. package/dist/presentation/routes/index.d.ts +2 -1
  60. package/dist/presentation/routes/index.d.ts.map +1 -1
  61. package/dist/presentation/routes/index.js +2 -2
  62. package/dist/presentation/routes/index.js.map +1 -1
  63. package/dist/presentation/routes/registration/signup.d.ts +2 -1
  64. package/dist/presentation/routes/registration/signup.d.ts.map +1 -1
  65. package/dist/presentation/routes/registration/signup.js +14 -3
  66. package/dist/presentation/routes/registration/signup.js.map +1 -1
  67. package/dist/presentation/routes/session/me.d.ts.map +1 -1
  68. package/dist/presentation/routes/session/me.js +5 -1
  69. package/dist/presentation/routes/session/me.js.map +1 -1
  70. package/dist/tsconfig.test.tsbuildinfo +1 -1
  71. package/drizzle/0001_brainy_shriek.sql +14 -0
  72. package/drizzle/meta/0001_snapshot.json +702 -0
  73. package/drizzle/meta/_journal.json +7 -0
  74. package/package.json +5 -5
  75. package/src/config.test.ts +39 -0
  76. package/src/config.ts +30 -0
  77. package/src/core/admin-role-model.ts +25 -0
  78. package/src/core/admin-role.test.ts +39 -0
  79. package/src/core/admin-role.ts +25 -0
  80. package/src/core/auth.test.ts +110 -0
  81. package/src/core/auth.ts +78 -21
  82. package/src/core/entities/admin-grant.ts +10 -0
  83. package/src/core/errors.ts +24 -0
  84. package/src/core/jwt.test.ts +1 -0
  85. package/src/core/ports.ts +7 -0
  86. package/src/core/signup-policy.test.ts +78 -0
  87. package/src/core/signup-policy.ts +42 -0
  88. package/src/db/admin-grants.test.ts +57 -0
  89. package/src/db/admin-grants.ts +83 -0
  90. package/src/db/db.ts +2 -0
  91. package/src/db/schema/admin-grants.ts +49 -0
  92. package/src/index.test.ts +53 -0
  93. package/src/index.ts +28 -5
  94. package/src/presentation/dto/user.ts +7 -2
  95. package/src/presentation/inter-module.test.ts +47 -0
  96. package/src/presentation/inter-module.ts +22 -1
  97. package/src/presentation/routes/index.ts +3 -1
  98. package/src/presentation/routes/registration/signup.test.ts +26 -0
  99. package/src/presentation/routes/registration/signup.ts +22 -2
  100. package/src/presentation/routes/session/login.test.ts +1 -0
  101. package/src/presentation/routes/session/me.test.ts +18 -2
  102. package/src/presentation/routes/session/me.ts +5 -1
  103. package/test/globalSetup.ts +1 -1
  104. package/tsconfig.build.tsbuildinfo +1 -1
package/dist/db/db.d.ts CHANGED
@@ -1,5 +1,114 @@
1
1
  import { type NodePgDatabase } from '@shipfox/node-drizzle';
2
2
  export declare const schema: {
3
+ adminGrants: import("drizzle-orm/pg-core").PgTableWithColumns<{
4
+ name: "admin_grants";
5
+ schema: undefined;
6
+ columns: {
7
+ id: import("drizzle-orm/pg-core").PgColumn<{
8
+ name: "id";
9
+ tableName: "admin_grants";
10
+ dataType: "string";
11
+ columnType: "PgUUID";
12
+ data: string;
13
+ driverParam: string;
14
+ notNull: true;
15
+ hasDefault: true;
16
+ isPrimaryKey: true;
17
+ isAutoincrement: false;
18
+ hasRuntimeDefault: false;
19
+ enumValues: undefined;
20
+ baseColumn: never;
21
+ identity: undefined;
22
+ generated: undefined;
23
+ }, {}, {}>;
24
+ userId: import("drizzle-orm/pg-core").PgColumn<{
25
+ name: "user_id";
26
+ tableName: "admin_grants";
27
+ dataType: "string";
28
+ columnType: "PgUUID";
29
+ data: string;
30
+ driverParam: string;
31
+ notNull: true;
32
+ hasDefault: false;
33
+ isPrimaryKey: false;
34
+ isAutoincrement: false;
35
+ hasRuntimeDefault: false;
36
+ enumValues: undefined;
37
+ baseColumn: never;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }, {}, {}>;
41
+ role: import("drizzle-orm/pg-core").PgColumn<{
42
+ name: "role";
43
+ tableName: "admin_grants";
44
+ dataType: "string";
45
+ columnType: "PgEnumColumn";
46
+ data: "admin-observer" | "admin-operator" | "admin-owner";
47
+ driverParam: string;
48
+ notNull: true;
49
+ hasDefault: false;
50
+ isPrimaryKey: false;
51
+ isAutoincrement: false;
52
+ hasRuntimeDefault: false;
53
+ enumValues: ["admin-observer", "admin-operator", "admin-owner"];
54
+ baseColumn: never;
55
+ identity: undefined;
56
+ generated: undefined;
57
+ }, {}, {}>;
58
+ revokedAt: import("drizzle-orm/pg-core").PgColumn<{
59
+ name: "revoked_at";
60
+ tableName: "admin_grants";
61
+ dataType: "date";
62
+ columnType: "PgTimestamp";
63
+ data: Date;
64
+ driverParam: string;
65
+ notNull: false;
66
+ hasDefault: false;
67
+ isPrimaryKey: false;
68
+ isAutoincrement: false;
69
+ hasRuntimeDefault: false;
70
+ enumValues: undefined;
71
+ baseColumn: never;
72
+ identity: undefined;
73
+ generated: undefined;
74
+ }, {}, {}>;
75
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
76
+ name: "created_at";
77
+ tableName: "admin_grants";
78
+ dataType: "date";
79
+ columnType: "PgTimestamp";
80
+ data: Date;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: true;
84
+ isPrimaryKey: false;
85
+ isAutoincrement: false;
86
+ hasRuntimeDefault: false;
87
+ enumValues: undefined;
88
+ baseColumn: never;
89
+ identity: undefined;
90
+ generated: undefined;
91
+ }, {}, {}>;
92
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
93
+ name: "updated_at";
94
+ tableName: "admin_grants";
95
+ dataType: "date";
96
+ columnType: "PgTimestamp";
97
+ data: Date;
98
+ driverParam: string;
99
+ notNull: true;
100
+ hasDefault: true;
101
+ isPrimaryKey: false;
102
+ isAutoincrement: false;
103
+ hasRuntimeDefault: false;
104
+ enumValues: undefined;
105
+ baseColumn: never;
106
+ identity: undefined;
107
+ generated: undefined;
108
+ }, {}, {}>;
109
+ };
110
+ dialect: "pg";
111
+ }>;
3
112
  users: import("drizzle-orm/pg-core").PgTableWithColumns<{
4
113
  name: "users";
5
114
  schema: undefined;
@@ -768,6 +877,115 @@ export declare const schema: {
768
877
  }>;
769
878
  };
770
879
  export declare function db(): NodePgDatabase<{
880
+ adminGrants: import("drizzle-orm/pg-core").PgTableWithColumns<{
881
+ name: "admin_grants";
882
+ schema: undefined;
883
+ columns: {
884
+ id: import("drizzle-orm/pg-core").PgColumn<{
885
+ name: "id";
886
+ tableName: "admin_grants";
887
+ dataType: "string";
888
+ columnType: "PgUUID";
889
+ data: string;
890
+ driverParam: string;
891
+ notNull: true;
892
+ hasDefault: true;
893
+ isPrimaryKey: true;
894
+ isAutoincrement: false;
895
+ hasRuntimeDefault: false;
896
+ enumValues: undefined;
897
+ baseColumn: never;
898
+ identity: undefined;
899
+ generated: undefined;
900
+ }, {}, {}>;
901
+ userId: import("drizzle-orm/pg-core").PgColumn<{
902
+ name: "user_id";
903
+ tableName: "admin_grants";
904
+ dataType: "string";
905
+ columnType: "PgUUID";
906
+ data: string;
907
+ driverParam: string;
908
+ notNull: true;
909
+ hasDefault: false;
910
+ isPrimaryKey: false;
911
+ isAutoincrement: false;
912
+ hasRuntimeDefault: false;
913
+ enumValues: undefined;
914
+ baseColumn: never;
915
+ identity: undefined;
916
+ generated: undefined;
917
+ }, {}, {}>;
918
+ role: import("drizzle-orm/pg-core").PgColumn<{
919
+ name: "role";
920
+ tableName: "admin_grants";
921
+ dataType: "string";
922
+ columnType: "PgEnumColumn";
923
+ data: "admin-observer" | "admin-operator" | "admin-owner";
924
+ driverParam: string;
925
+ notNull: true;
926
+ hasDefault: false;
927
+ isPrimaryKey: false;
928
+ isAutoincrement: false;
929
+ hasRuntimeDefault: false;
930
+ enumValues: ["admin-observer", "admin-operator", "admin-owner"];
931
+ baseColumn: never;
932
+ identity: undefined;
933
+ generated: undefined;
934
+ }, {}, {}>;
935
+ revokedAt: import("drizzle-orm/pg-core").PgColumn<{
936
+ name: "revoked_at";
937
+ tableName: "admin_grants";
938
+ dataType: "date";
939
+ columnType: "PgTimestamp";
940
+ data: Date;
941
+ driverParam: string;
942
+ notNull: false;
943
+ hasDefault: false;
944
+ isPrimaryKey: false;
945
+ isAutoincrement: false;
946
+ hasRuntimeDefault: false;
947
+ enumValues: undefined;
948
+ baseColumn: never;
949
+ identity: undefined;
950
+ generated: undefined;
951
+ }, {}, {}>;
952
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
953
+ name: "created_at";
954
+ tableName: "admin_grants";
955
+ dataType: "date";
956
+ columnType: "PgTimestamp";
957
+ data: Date;
958
+ driverParam: string;
959
+ notNull: true;
960
+ hasDefault: true;
961
+ isPrimaryKey: false;
962
+ isAutoincrement: false;
963
+ hasRuntimeDefault: false;
964
+ enumValues: undefined;
965
+ baseColumn: never;
966
+ identity: undefined;
967
+ generated: undefined;
968
+ }, {}, {}>;
969
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
970
+ name: "updated_at";
971
+ tableName: "admin_grants";
972
+ dataType: "date";
973
+ columnType: "PgTimestamp";
974
+ data: Date;
975
+ driverParam: string;
976
+ notNull: true;
977
+ hasDefault: true;
978
+ isPrimaryKey: false;
979
+ isAutoincrement: false;
980
+ hasRuntimeDefault: false;
981
+ enumValues: undefined;
982
+ baseColumn: never;
983
+ identity: undefined;
984
+ generated: undefined;
985
+ }, {}, {}>;
986
+ };
987
+ dialect: "pg";
988
+ }>;
771
989
  users: import("drizzle-orm/pg-core").PgTableWithColumns<{
772
990
  name: "users";
773
991
  schema: undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AAQnE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAMlB,CAAC;AAIF,wBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjB;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/db/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,cAAc,EAAC,MAAM,uBAAuB,CAAC;AASnE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAOlB,CAAC;AAIF,wBAAgB,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAGjB;AAED,wBAAgB,OAAO,IAAI,IAAI,CAE9B"}
package/dist/db/db.js CHANGED
@@ -1,11 +1,13 @@
1
1
  import { drizzle } from '@shipfox/node-drizzle';
2
2
  import { pgClient } from '@shipfox/node-postgres';
3
+ import { adminGrants } from './schema/admin-grants.js';
3
4
  import { authOutbox } from './schema/outbox.js';
4
5
  import { passwordResets } from './schema/password-resets.js';
5
6
  import { authRateLimits } from './schema/rate-limits.js';
6
7
  import { refreshTokens } from './schema/refresh-tokens.js';
7
8
  import { users } from './schema/users.js';
8
9
  export const schema = {
10
+ adminGrants,
9
11
  users,
10
12
  passwordResets,
11
13
  refreshTokens,
package/dist/db/db.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {authOutbox} from './schema/outbox.js';\nimport {passwordResets} from './schema/password-resets.js';\nimport {authRateLimits} from './schema/rate-limits.js';\nimport {refreshTokens} from './schema/refresh-tokens.js';\nimport {users} from './schema/users.js';\n\nexport const schema = {\n users,\n passwordResets,\n refreshTokens,\n authOutbox,\n authRateLimits,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n"],"names":["drizzle","pgClient","authOutbox","passwordResets","authRateLimits","refreshTokens","users","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,UAAU,QAAO,qBAAqB;AAC9C,SAAQC,cAAc,QAAO,8BAA8B;AAC3D,SAAQC,cAAc,QAAO,0BAA0B;AACvD,SAAQC,aAAa,QAAO,6BAA6B;AACzD,SAAQC,KAAK,QAAO,oBAAoB;AAExC,OAAO,MAAMC,SAAS;IACpBD;IACAH;IACAE;IACAH;IACAE;AACF,EAAE;AAEF,IAAII;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMR,QAAQC,YAAY;QAACM;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
1
+ {"version":3,"sources":["../../src/db/db.ts"],"sourcesContent":["import {drizzle, type NodePgDatabase} from '@shipfox/node-drizzle';\nimport {pgClient} from '@shipfox/node-postgres';\nimport {adminGrants} from './schema/admin-grants.js';\nimport {authOutbox} from './schema/outbox.js';\nimport {passwordResets} from './schema/password-resets.js';\nimport {authRateLimits} from './schema/rate-limits.js';\nimport {refreshTokens} from './schema/refresh-tokens.js';\nimport {users} from './schema/users.js';\n\nexport const schema = {\n adminGrants,\n users,\n passwordResets,\n refreshTokens,\n authOutbox,\n authRateLimits,\n};\n\nlet _db: NodePgDatabase<typeof schema> | undefined;\n\nexport function db() {\n if (!_db) _db = drizzle(pgClient(), {schema});\n return _db;\n}\n\nexport function closeDb(): void {\n _db = undefined;\n}\n"],"names":["drizzle","pgClient","adminGrants","authOutbox","passwordResets","authRateLimits","refreshTokens","users","schema","_db","db","closeDb","undefined"],"mappings":"AAAA,SAAQA,OAAO,QAA4B,wBAAwB;AACnE,SAAQC,QAAQ,QAAO,yBAAyB;AAChD,SAAQC,WAAW,QAAO,2BAA2B;AACrD,SAAQC,UAAU,QAAO,qBAAqB;AAC9C,SAAQC,cAAc,QAAO,8BAA8B;AAC3D,SAAQC,cAAc,QAAO,0BAA0B;AACvD,SAAQC,aAAa,QAAO,6BAA6B;AACzD,SAAQC,KAAK,QAAO,oBAAoB;AAExC,OAAO,MAAMC,SAAS;IACpBN;IACAK;IACAH;IACAE;IACAH;IACAE;AACF,EAAE;AAEF,IAAII;AAEJ,OAAO,SAASC;IACd,IAAI,CAACD,KAAKA,MAAMT,QAAQC,YAAY;QAACO;IAAM;IAC3C,OAAOC;AACT;AAEA,OAAO,SAASE;IACdF,MAAMG;AACR"}
@@ -0,0 +1,115 @@
1
+ import type { AdminGrant } from '#core/entities/admin-grant.js';
2
+ export declare const adminRoleEnum: import("drizzle-orm/pg-core").PgEnum<["admin-observer", "admin-operator", "admin-owner"]>;
3
+ export declare const adminGrants: import("drizzle-orm/pg-core").PgTableWithColumns<{
4
+ name: "admin_grants";
5
+ schema: undefined;
6
+ columns: {
7
+ id: import("drizzle-orm/pg-core").PgColumn<{
8
+ name: "id";
9
+ tableName: "admin_grants";
10
+ dataType: "string";
11
+ columnType: "PgUUID";
12
+ data: string;
13
+ driverParam: string;
14
+ notNull: true;
15
+ hasDefault: true;
16
+ isPrimaryKey: true;
17
+ isAutoincrement: false;
18
+ hasRuntimeDefault: false;
19
+ enumValues: undefined;
20
+ baseColumn: never;
21
+ identity: undefined;
22
+ generated: undefined;
23
+ }, {}, {}>;
24
+ userId: import("drizzle-orm/pg-core").PgColumn<{
25
+ name: "user_id";
26
+ tableName: "admin_grants";
27
+ dataType: "string";
28
+ columnType: "PgUUID";
29
+ data: string;
30
+ driverParam: string;
31
+ notNull: true;
32
+ hasDefault: false;
33
+ isPrimaryKey: false;
34
+ isAutoincrement: false;
35
+ hasRuntimeDefault: false;
36
+ enumValues: undefined;
37
+ baseColumn: never;
38
+ identity: undefined;
39
+ generated: undefined;
40
+ }, {}, {}>;
41
+ role: import("drizzle-orm/pg-core").PgColumn<{
42
+ name: "role";
43
+ tableName: "admin_grants";
44
+ dataType: "string";
45
+ columnType: "PgEnumColumn";
46
+ data: "admin-observer" | "admin-operator" | "admin-owner";
47
+ driverParam: string;
48
+ notNull: true;
49
+ hasDefault: false;
50
+ isPrimaryKey: false;
51
+ isAutoincrement: false;
52
+ hasRuntimeDefault: false;
53
+ enumValues: ["admin-observer", "admin-operator", "admin-owner"];
54
+ baseColumn: never;
55
+ identity: undefined;
56
+ generated: undefined;
57
+ }, {}, {}>;
58
+ revokedAt: import("drizzle-orm/pg-core").PgColumn<{
59
+ name: "revoked_at";
60
+ tableName: "admin_grants";
61
+ dataType: "date";
62
+ columnType: "PgTimestamp";
63
+ data: Date;
64
+ driverParam: string;
65
+ notNull: false;
66
+ hasDefault: false;
67
+ isPrimaryKey: false;
68
+ isAutoincrement: false;
69
+ hasRuntimeDefault: false;
70
+ enumValues: undefined;
71
+ baseColumn: never;
72
+ identity: undefined;
73
+ generated: undefined;
74
+ }, {}, {}>;
75
+ createdAt: import("drizzle-orm/pg-core").PgColumn<{
76
+ name: "created_at";
77
+ tableName: "admin_grants";
78
+ dataType: "date";
79
+ columnType: "PgTimestamp";
80
+ data: Date;
81
+ driverParam: string;
82
+ notNull: true;
83
+ hasDefault: true;
84
+ isPrimaryKey: false;
85
+ isAutoincrement: false;
86
+ hasRuntimeDefault: false;
87
+ enumValues: undefined;
88
+ baseColumn: never;
89
+ identity: undefined;
90
+ generated: undefined;
91
+ }, {}, {}>;
92
+ updatedAt: import("drizzle-orm/pg-core").PgColumn<{
93
+ name: "updated_at";
94
+ tableName: "admin_grants";
95
+ dataType: "date";
96
+ columnType: "PgTimestamp";
97
+ data: Date;
98
+ driverParam: string;
99
+ notNull: true;
100
+ hasDefault: true;
101
+ isPrimaryKey: false;
102
+ isAutoincrement: false;
103
+ hasRuntimeDefault: false;
104
+ enumValues: undefined;
105
+ baseColumn: never;
106
+ identity: undefined;
107
+ generated: undefined;
108
+ }, {}, {}>;
109
+ };
110
+ dialect: "pg";
111
+ }>;
112
+ export type AdminGrantDb = typeof adminGrants.$inferSelect;
113
+ export type AdminGrantCreateDb = typeof adminGrants.$inferInsert;
114
+ export declare function toAdminGrant(row: AdminGrantDb): AdminGrant;
115
+ //# sourceMappingURL=admin-grants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-grants.d.ts","sourceRoot":"","sources":["../../../src/db/schema/admin-grants.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,+BAA+B,CAAC;AAI9D,eAAO,MAAM,aAAa,2FAIxB,CAAC;AAEH,eAAO,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqBvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,OAAO,WAAW,CAAC,YAAY,CAAC;AAC3D,MAAM,MAAM,kBAAkB,GAAG,OAAO,WAAW,CAAC,YAAY,CAAC;AAEjE,wBAAgB,YAAY,CAAC,GAAG,EAAE,YAAY,GAAG,UAAU,CAS1D"}
@@ -0,0 +1,42 @@
1
+ import { uuidv7PrimaryKey } from '@shipfox/node-drizzle';
2
+ import { sql } from 'drizzle-orm';
3
+ import { index, pgEnum, timestamp, uniqueIndex, uuid } from 'drizzle-orm/pg-core';
4
+ import { pgTable } from './common.js';
5
+ import { users } from './users.js';
6
+ export const adminRoleEnum = pgEnum('auth_admin_role', [
7
+ 'admin-observer',
8
+ 'admin-operator',
9
+ 'admin-owner'
10
+ ]);
11
+ export const adminGrants = pgTable('admin_grants', {
12
+ id: uuidv7PrimaryKey(),
13
+ userId: uuid('user_id').notNull().references(()=>users.id, {
14
+ onDelete: 'cascade'
15
+ }),
16
+ role: adminRoleEnum('role').notNull(),
17
+ revokedAt: timestamp('revoked_at', {
18
+ withTimezone: true
19
+ }),
20
+ createdAt: timestamp('created_at', {
21
+ withTimezone: true
22
+ }).notNull().defaultNow(),
23
+ updatedAt: timestamp('updated_at', {
24
+ withTimezone: true
25
+ }).notNull().defaultNow()
26
+ }, (table)=>[
27
+ index('auth_admin_grants_user_id_idx').on(table.userId),
28
+ index('auth_admin_grants_active_owners_idx').on(table.userId).where(sql`${table.role} = 'admin-owner' AND ${table.revokedAt} IS NULL`),
29
+ uniqueIndex('auth_admin_grants_active_user_role_unique').on(table.userId, table.role).where(sql`${table.revokedAt} IS NULL`)
30
+ ]);
31
+ export function toAdminGrant(row) {
32
+ return {
33
+ id: row.id,
34
+ userId: row.userId,
35
+ role: row.role,
36
+ revokedAt: row.revokedAt,
37
+ createdAt: row.createdAt,
38
+ updatedAt: row.updatedAt
39
+ };
40
+ }
41
+
42
+ //# sourceMappingURL=admin-grants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/db/schema/admin-grants.ts"],"sourcesContent":["import {uuidv7PrimaryKey} from '@shipfox/node-drizzle';\nimport {sql} from 'drizzle-orm';\nimport {index, pgEnum, timestamp, uniqueIndex, uuid} from 'drizzle-orm/pg-core';\nimport type {AdminGrant} from '#core/entities/admin-grant.js';\nimport {pgTable} from './common.js';\nimport {users} from './users.js';\n\nexport const adminRoleEnum = pgEnum('auth_admin_role', [\n 'admin-observer',\n 'admin-operator',\n 'admin-owner',\n]);\n\nexport const adminGrants = pgTable(\n 'admin_grants',\n {\n id: uuidv7PrimaryKey(),\n userId: uuid('user_id')\n .notNull()\n .references(() => users.id, {onDelete: 'cascade'}),\n role: adminRoleEnum('role').notNull(),\n revokedAt: timestamp('revoked_at', {withTimezone: true}),\n createdAt: timestamp('created_at', {withTimezone: true}).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', {withTimezone: true}).notNull().defaultNow(),\n },\n (table) => [\n index('auth_admin_grants_user_id_idx').on(table.userId),\n index('auth_admin_grants_active_owners_idx')\n .on(table.userId)\n .where(sql`${table.role} = 'admin-owner' AND ${table.revokedAt} IS NULL`),\n uniqueIndex('auth_admin_grants_active_user_role_unique')\n .on(table.userId, table.role)\n .where(sql`${table.revokedAt} IS NULL`),\n ],\n);\n\nexport type AdminGrantDb = typeof adminGrants.$inferSelect;\nexport type AdminGrantCreateDb = typeof adminGrants.$inferInsert;\n\nexport function toAdminGrant(row: AdminGrantDb): AdminGrant {\n return {\n id: row.id,\n userId: row.userId,\n role: row.role,\n revokedAt: row.revokedAt,\n createdAt: row.createdAt,\n updatedAt: row.updatedAt,\n };\n}\n"],"names":["uuidv7PrimaryKey","sql","index","pgEnum","timestamp","uniqueIndex","uuid","pgTable","users","adminRoleEnum","adminGrants","id","userId","notNull","references","onDelete","role","revokedAt","withTimezone","createdAt","defaultNow","updatedAt","table","on","where","toAdminGrant","row"],"mappings":"AAAA,SAAQA,gBAAgB,QAAO,wBAAwB;AACvD,SAAQC,GAAG,QAAO,cAAc;AAChC,SAAQC,KAAK,EAAEC,MAAM,EAAEC,SAAS,EAAEC,WAAW,EAAEC,IAAI,QAAO,sBAAsB;AAEhF,SAAQC,OAAO,QAAO,cAAc;AACpC,SAAQC,KAAK,QAAO,aAAa;AAEjC,OAAO,MAAMC,gBAAgBN,OAAO,mBAAmB;IACrD;IACA;IACA;CACD,EAAE;AAEH,OAAO,MAAMO,cAAcH,QACzB,gBACA;IACEI,IAAIX;IACJY,QAAQN,KAAK,WACVO,OAAO,GACPC,UAAU,CAAC,IAAMN,MAAMG,EAAE,EAAE;QAACI,UAAU;IAAS;IAClDC,MAAMP,cAAc,QAAQI,OAAO;IACnCI,WAAWb,UAAU,cAAc;QAACc,cAAc;IAAI;IACtDC,WAAWf,UAAU,cAAc;QAACc,cAAc;IAAI,GAAGL,OAAO,GAAGO,UAAU;IAC7EC,WAAWjB,UAAU,cAAc;QAACc,cAAc;IAAI,GAAGL,OAAO,GAAGO,UAAU;AAC/E,GACA,CAACE,QAAU;QACTpB,MAAM,iCAAiCqB,EAAE,CAACD,MAAMV,MAAM;QACtDV,MAAM,uCACHqB,EAAE,CAACD,MAAMV,MAAM,EACfY,KAAK,CAACvB,GAAG,CAAC,EAAEqB,MAAMN,IAAI,CAAC,qBAAqB,EAAEM,MAAML,SAAS,CAAC,QAAQ,CAAC;QAC1EZ,YAAY,6CACTkB,EAAE,CAACD,MAAMV,MAAM,EAAEU,MAAMN,IAAI,EAC3BQ,KAAK,CAACvB,GAAG,CAAC,EAAEqB,MAAML,SAAS,CAAC,QAAQ,CAAC;KACzC,EACD;AAKF,OAAO,SAASQ,aAAaC,GAAiB;IAC5C,OAAO;QACLf,IAAIe,IAAIf,EAAE;QACVC,QAAQc,IAAId,MAAM;QAClBI,MAAMU,IAAIV,IAAI;QACdC,WAAWS,IAAIT,SAAS;QACxBE,WAAWO,IAAIP,SAAS;QACxBE,WAAWK,IAAIL,SAAS;IAC1B;AACF"}
package/dist/index.d.ts CHANGED
@@ -1,18 +1,25 @@
1
1
  import type { ShipfoxModule } from '@shipfox/node-module';
2
- export type { JobLeaseTokenClaims, RunnerSessionTokenClaims } from '@shipfox/api-auth-dto';
2
+ import type { SignupPolicy } from '#core/ports.js';
3
+ export type { AdminRole, JobLeaseTokenClaims, RunnerSessionTokenClaims } from '@shipfox/api-auth-dto';
4
+ export { ADMIN_ROLES, getCurrentAdminRole, hasMinimumAdminRole, highestAdminRole, requireAdminRole, revokeAdminGrant, } from '#core/admin-role.js';
3
5
  export type { CreateSessionForUserError, CreateSessionForUserParams, CreateSessionForUserResult, ProvisionUserParams, } from '#core/auth.js';
4
6
  export { createSessionForUser, provisionUser } from '#core/auth.js';
5
7
  export type { EmailOwner, FindUserByEmailParams } from '#core/email-owner.js';
6
8
  export { findUserByEmail } from '#core/email-owner.js';
9
+ export type { AdminGrant } from '#core/entities/admin-grant.js';
7
10
  export type { User, UserStatus } from '#core/entities/user.js';
8
- export { AuthDependencyUnavailableError, EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError, } from '#core/errors.js';
11
+ export { AdminRoleRequiredError, AuthDependencyUnavailableError, EmailNotVerifiedError, InvalidCredentialsError, LastAdminOwnerError, SignupNotAllowedError, UserNotFoundError, } from '#core/errors.js';
9
12
  export { issueJobLeaseToken, jobLeaseParamsFrom, verifyJobLeaseToken, } from '#core/job-lease-token.js';
13
+ export type { SignupPolicy } from '#core/ports.js';
10
14
  export { issueRunnerSessionToken, verifyRunnerSessionToken, } from '#core/runner-session-token.js';
15
+ export { createEnvironmentSignupPolicy, DEFAULT_SIGNUP_NOT_ALLOWED_MESSAGE, } from '#core/signup-policy.js';
11
16
  export { type AuthenticatedSessionContext, createJwtAuthMethod, getAuthenticatedSessionContext, type RefreshSessionId, type UserId, } from '#presentation/auth/jwt-auth.js';
12
17
  export { createLeaseTokenAuthMethod } from '#presentation/auth/lease-token-auth.js';
13
18
  export { authCookiePlugin, clearRefreshTokenCookie, getRefreshTokenCookie, setRefreshTokenCookie, } from '#presentation/auth/refresh-cookie.js';
14
19
  export { createRunnerSessionAuthMethod } from '#presentation/auth/runner-session-auth.js';
15
- export declare function createAuthModule({ workspaces, }: {
20
+ export interface CreateAuthModuleOptions {
16
21
  workspaces: import('@shipfox/api-workspaces-dto/inter-module').WorkspacesInterModuleClient;
17
- }): ShipfoxModule;
22
+ signupPolicy?: SignupPolicy;
23
+ }
24
+ export declare function createAuthModule({ workspaces, signupPolicy, }: CreateAuthModuleOptions): ShipfoxModule;
18
25
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAexD,YAAY,EAAC,mBAAmB,EAAE,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AACzF,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAClE,YAAY,EAAC,UAAU,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAC,IAAI,EAAE,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,EACvB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,KAAK,2BAA2B,EAChC,mBAAmB,EACnB,8BAA8B,EAC9B,KAAK,gBAAgB,EACrB,KAAK,MAAM,GACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,0BAA0B,EAAC,MAAM,wCAAwC,CAAC;AAClF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAC,6BAA6B,EAAC,MAAM,2CAA2C,CAAC;AAIxF,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,GACX,EAAE;IACD,UAAU,EAAE,OAAO,0CAA0C,EAAE,2BAA2B,CAAC;CAC5F,GAAG,aAAa,CAYhB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAC,aAAa,EAAC,MAAM,sBAAsB,CAAC;AAGxD,OAAO,KAAK,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAcjD,YAAY,EAAC,SAAS,EAAE,mBAAmB,EAAE,wBAAwB,EAAC,MAAM,uBAAuB,CAAC;AACpG,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,yBAAyB,EACzB,0BAA0B,EAC1B,0BAA0B,EAC1B,mBAAmB,GACpB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAC,oBAAoB,EAAE,aAAa,EAAC,MAAM,eAAe,CAAC;AAClE,YAAY,EAAC,UAAU,EAAE,qBAAqB,EAAC,MAAM,sBAAsB,CAAC;AAC5E,OAAO,EAAC,eAAe,EAAC,MAAM,sBAAsB,CAAC;AACrD,YAAY,EAAC,UAAU,EAAC,MAAM,+BAA+B,CAAC;AAC9D,YAAY,EAAC,IAAI,EAAE,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EACL,sBAAsB,EACtB,8BAA8B,EAC9B,qBAAqB,EACrB,uBAAuB,EACvB,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,GAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,6BAA6B,EAC7B,kCAAkC,GACnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EACL,KAAK,2BAA2B,EAChC,mBAAmB,EACnB,8BAA8B,EAC9B,KAAK,gBAAgB,EACrB,KAAK,MAAM,GACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAC,0BAA0B,EAAC,MAAM,wCAAwC,CAAC;AAClF,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,qBAAqB,EACrB,qBAAqB,GACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAC,6BAA6B,EAAC,MAAM,2CAA2C,CAAC;AAIxF,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,OAAO,0CAA0C,EAAE,2BAA2B,CAAC;IAC3F,YAAY,CAAC,EAAE,YAAY,CAAC;CAC7B;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,YAA8C,GAC/C,EAAE,uBAAuB,GAAG,aAAa,CAYzC"}
package/dist/index.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { AUTH_PASSWORD_RESET_SEND_REQUESTED, authEventSchemas } from '@shipfox/api-auth-dto';
2
2
  import { subscriberFactory } from '@shipfox/node-module';
3
3
  import { config } from '#config.js';
4
+ import { createEnvironmentSignupPolicy } from '#core/signup-policy.js';
4
5
  import { db } from '#db/db.js';
5
6
  import { migrationsPath } from '#db/migrations.js';
6
7
  import { authOutbox } from '#db/schema/outbox.js';
@@ -12,17 +13,19 @@ import { createAuthInterModulePresentation } from '#presentation/inter-module.js
12
13
  import { buildAuthRoutes } from '#presentation/routes/index.js';
13
14
  import { onPasswordResetSendRequested } from '#presentation/subscribers/index.js';
14
15
  import { passwordLoginMethods } from './login-methods.js';
16
+ export { ADMIN_ROLES, getCurrentAdminRole, hasMinimumAdminRole, highestAdminRole, requireAdminRole, revokeAdminGrant } from '#core/admin-role.js';
15
17
  export { createSessionForUser, provisionUser } from '#core/auth.js';
16
18
  export { findUserByEmail } from '#core/email-owner.js';
17
- export { AuthDependencyUnavailableError, EmailNotVerifiedError, InvalidCredentialsError, UserNotFoundError } from '#core/errors.js';
19
+ export { AdminRoleRequiredError, AuthDependencyUnavailableError, EmailNotVerifiedError, InvalidCredentialsError, LastAdminOwnerError, SignupNotAllowedError, UserNotFoundError } from '#core/errors.js';
18
20
  export { issueJobLeaseToken, jobLeaseParamsFrom, verifyJobLeaseToken } from '#core/job-lease-token.js';
19
21
  export { issueRunnerSessionToken, verifyRunnerSessionToken } from '#core/runner-session-token.js';
22
+ export { createEnvironmentSignupPolicy, DEFAULT_SIGNUP_NOT_ALLOWED_MESSAGE } from '#core/signup-policy.js';
20
23
  export { createJwtAuthMethod, getAuthenticatedSessionContext } from '#presentation/auth/jwt-auth.js';
21
24
  export { createLeaseTokenAuthMethod } from '#presentation/auth/lease-token-auth.js';
22
25
  export { authCookiePlugin, clearRefreshTokenCookie, getRefreshTokenCookie, setRefreshTokenCookie } from '#presentation/auth/refresh-cookie.js';
23
26
  export { createRunnerSessionAuthMethod } from '#presentation/auth/runner-session-auth.js';
24
27
  const subscriber = subscriberFactory();
25
- export function createAuthModule({ workspaces }) {
28
+ export function createAuthModule({ workspaces, signupPolicy = createEnvironmentSignupPolicy() }) {
26
29
  return {
27
30
  name: 'auth',
28
31
  database: {
@@ -37,7 +40,7 @@ export function createAuthModule({ workspaces }) {
37
40
  ],
38
41
  loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),
39
42
  routes: [
40
- buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces)
43
+ buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces, signupPolicy)
41
44
  ],
42
45
  e2eRoutes: [
43
46
  createAuthE2eRoutes(workspaces)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AUTH_PASSWORD_RESET_SEND_REQUESTED,\n type AuthEventMap,\n authEventSchemas,\n} from '@shipfox/api-auth-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {config} from '#config.js';\nimport {db} from '#db/db.js';\nimport {migrationsPath} from '#db/migrations.js';\nimport {authOutbox} from '#db/schema/outbox.js';\nimport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nimport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nimport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\nimport {createAuthE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createAuthInterModulePresentation} from '#presentation/inter-module.js';\nimport {buildAuthRoutes} from '#presentation/routes/index.js';\nimport {onPasswordResetSendRequested} from '#presentation/subscribers/index.js';\nimport {passwordLoginMethods} from './login-methods.js';\n\nexport type {JobLeaseTokenClaims, RunnerSessionTokenClaims} from '@shipfox/api-auth-dto';\nexport type {\n CreateSessionForUserError,\n CreateSessionForUserParams,\n CreateSessionForUserResult,\n ProvisionUserParams,\n} from '#core/auth.js';\nexport {createSessionForUser, provisionUser} from '#core/auth.js';\nexport type {EmailOwner, FindUserByEmailParams} from '#core/email-owner.js';\nexport {findUserByEmail} from '#core/email-owner.js';\nexport type {User, UserStatus} from '#core/entities/user.js';\nexport {\n AuthDependencyUnavailableError,\n EmailNotVerifiedError,\n InvalidCredentialsError,\n UserNotFoundError,\n} from '#core/errors.js';\nexport {\n issueJobLeaseToken,\n jobLeaseParamsFrom,\n verifyJobLeaseToken,\n} from '#core/job-lease-token.js';\nexport {\n issueRunnerSessionToken,\n verifyRunnerSessionToken,\n} from '#core/runner-session-token.js';\nexport {\n type AuthenticatedSessionContext,\n createJwtAuthMethod,\n getAuthenticatedSessionContext,\n type RefreshSessionId,\n type UserId,\n} from '#presentation/auth/jwt-auth.js';\nexport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nexport {\n authCookiePlugin,\n clearRefreshTokenCookie,\n getRefreshTokenCookie,\n setRefreshTokenCookie,\n} from '#presentation/auth/refresh-cookie.js';\nexport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\n\nconst subscriber = subscriberFactory<AuthEventMap>();\n\nexport function createAuthModule({\n workspaces,\n}: {\n workspaces: import('@shipfox/api-workspaces-dto/inter-module').WorkspacesInterModuleClient;\n}): ShipfoxModule {\n return {\n name: 'auth',\n database: {db, migrationsPath, databaseNamespace: 'auth'},\n auth: [createJwtAuthMethod(), createLeaseTokenAuthMethod(), createRunnerSessionAuthMethod()],\n loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),\n routes: [buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces)],\n e2eRoutes: [createAuthE2eRoutes(workspaces)],\n publishers: [{name: 'auth', table: authOutbox, db, eventSchemas: authEventSchemas}],\n subscribers: [subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested)],\n interModulePresentations: [createAuthInterModulePresentation()],\n };\n}\n"],"names":["AUTH_PASSWORD_RESET_SEND_REQUESTED","authEventSchemas","subscriberFactory","config","db","migrationsPath","authOutbox","createJwtAuthMethod","createLeaseTokenAuthMethod","createRunnerSessionAuthMethod","createAuthE2eRoutes","createAuthInterModulePresentation","buildAuthRoutes","onPasswordResetSendRequested","passwordLoginMethods","createSessionForUser","provisionUser","findUserByEmail","AuthDependencyUnavailableError","EmailNotVerifiedError","InvalidCredentialsError","UserNotFoundError","issueJobLeaseToken","jobLeaseParamsFrom","verifyJobLeaseToken","issueRunnerSessionToken","verifyRunnerSessionToken","getAuthenticatedSessionContext","authCookiePlugin","clearRefreshTokenCookie","getRefreshTokenCookie","setRefreshTokenCookie","subscriber","createAuthModule","workspaces","name","database","databaseNamespace","auth","loginMethods","AUTH_PASSWORD_ENABLED","routes","e2eRoutes","publishers","table","eventSchemas","subscribers","interModulePresentations"],"mappings":"AAAA,SACEA,kCAAkC,EAElCC,gBAAgB,QACX,wBAAwB;AAE/B,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,MAAM,QAAO,aAAa;AAClC,SAAQC,EAAE,QAAO,YAAY;AAC7B,SAAQC,cAAc,QAAO,oBAAoB;AACjD,SAAQC,UAAU,QAAO,uBAAuB;AAChD,SAAQC,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SAAQC,6BAA6B,QAAO,4CAA4C;AACxF,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,SAAQC,iCAAiC,QAAO,gCAAgC;AAChF,SAAQC,eAAe,QAAO,gCAAgC;AAC9D,SAAQC,4BAA4B,QAAO,qCAAqC;AAChF,SAAQC,oBAAoB,QAAO,qBAAqB;AASxD,SAAQC,oBAAoB,EAAEC,aAAa,QAAO,gBAAgB;AAElE,SAAQC,eAAe,QAAO,uBAAuB;AAErD,SACEC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,EACvBC,iBAAiB,QACZ,kBAAkB;AACzB,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,QACd,2BAA2B;AAClC,SACEC,uBAAuB,EACvBC,wBAAwB,QACnB,gCAAgC;AACvC,SAEEnB,mBAAmB,EACnBoB,8BAA8B,QAGzB,iCAAiC;AACxC,SAAQnB,0BAA0B,QAAO,yCAAyC;AAClF,SACEoB,gBAAgB,EAChBC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,QAChB,uCAAuC;AAC9C,SAAQtB,6BAA6B,QAAO,4CAA4C;AAExF,MAAMuB,aAAa9B;AAEnB,OAAO,SAAS+B,iBAAiB,EAC/BC,UAAU,EAGX;IACC,OAAO;QACLC,MAAM;QACNC,UAAU;YAAChC;YAAIC;YAAgBgC,mBAAmB;QAAM;QACxDC,MAAM;YAAC/B;YAAuBC;YAA8BC;SAAgC;QAC5F8B,cAAczB,qBAAqBX,OAAOqC,qBAAqB;QAC/DC,QAAQ;YAAC7B,gBAAgBT,OAAOqC,qBAAqB,EAAEN;SAAY;QACnEQ,WAAW;YAAChC,oBAAoBwB;SAAY;QAC5CS,YAAY;YAAC;gBAACR,MAAM;gBAAQS,OAAOtC;gBAAYF;gBAAIyC,cAAc5C;YAAgB;SAAE;QACnF6C,aAAa;YAACd,WAAWhC,oCAAoCa;SAA8B;QAC3FkC,0BAA0B;YAACpC;SAAoC;IACjE;AACF"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import {\n AUTH_PASSWORD_RESET_SEND_REQUESTED,\n type AuthEventMap,\n authEventSchemas,\n} from '@shipfox/api-auth-dto';\nimport type {ShipfoxModule} from '@shipfox/node-module';\nimport {subscriberFactory} from '@shipfox/node-module';\nimport {config} from '#config.js';\nimport type {SignupPolicy} from '#core/ports.js';\nimport {createEnvironmentSignupPolicy} from '#core/signup-policy.js';\nimport {db} from '#db/db.js';\nimport {migrationsPath} from '#db/migrations.js';\nimport {authOutbox} from '#db/schema/outbox.js';\nimport {createJwtAuthMethod} from '#presentation/auth/jwt-auth.js';\nimport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nimport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\nimport {createAuthE2eRoutes} from '#presentation/e2eRoutes/index.js';\nimport {createAuthInterModulePresentation} from '#presentation/inter-module.js';\nimport {buildAuthRoutes} from '#presentation/routes/index.js';\nimport {onPasswordResetSendRequested} from '#presentation/subscribers/index.js';\nimport {passwordLoginMethods} from './login-methods.js';\n\nexport type {AdminRole, JobLeaseTokenClaims, RunnerSessionTokenClaims} from '@shipfox/api-auth-dto';\nexport {\n ADMIN_ROLES,\n getCurrentAdminRole,\n hasMinimumAdminRole,\n highestAdminRole,\n requireAdminRole,\n revokeAdminGrant,\n} from '#core/admin-role.js';\nexport type {\n CreateSessionForUserError,\n CreateSessionForUserParams,\n CreateSessionForUserResult,\n ProvisionUserParams,\n} from '#core/auth.js';\nexport {createSessionForUser, provisionUser} from '#core/auth.js';\nexport type {EmailOwner, FindUserByEmailParams} from '#core/email-owner.js';\nexport {findUserByEmail} from '#core/email-owner.js';\nexport type {AdminGrant} from '#core/entities/admin-grant.js';\nexport type {User, UserStatus} from '#core/entities/user.js';\nexport {\n AdminRoleRequiredError,\n AuthDependencyUnavailableError,\n EmailNotVerifiedError,\n InvalidCredentialsError,\n LastAdminOwnerError,\n SignupNotAllowedError,\n UserNotFoundError,\n} from '#core/errors.js';\nexport {\n issueJobLeaseToken,\n jobLeaseParamsFrom,\n verifyJobLeaseToken,\n} from '#core/job-lease-token.js';\nexport type {SignupPolicy} from '#core/ports.js';\nexport {\n issueRunnerSessionToken,\n verifyRunnerSessionToken,\n} from '#core/runner-session-token.js';\nexport {\n createEnvironmentSignupPolicy,\n DEFAULT_SIGNUP_NOT_ALLOWED_MESSAGE,\n} from '#core/signup-policy.js';\nexport {\n type AuthenticatedSessionContext,\n createJwtAuthMethod,\n getAuthenticatedSessionContext,\n type RefreshSessionId,\n type UserId,\n} from '#presentation/auth/jwt-auth.js';\nexport {createLeaseTokenAuthMethod} from '#presentation/auth/lease-token-auth.js';\nexport {\n authCookiePlugin,\n clearRefreshTokenCookie,\n getRefreshTokenCookie,\n setRefreshTokenCookie,\n} from '#presentation/auth/refresh-cookie.js';\nexport {createRunnerSessionAuthMethod} from '#presentation/auth/runner-session-auth.js';\n\nconst subscriber = subscriberFactory<AuthEventMap>();\n\nexport interface CreateAuthModuleOptions {\n workspaces: import('@shipfox/api-workspaces-dto/inter-module').WorkspacesInterModuleClient;\n signupPolicy?: SignupPolicy;\n}\n\nexport function createAuthModule({\n workspaces,\n signupPolicy = createEnvironmentSignupPolicy(),\n}: CreateAuthModuleOptions): ShipfoxModule {\n return {\n name: 'auth',\n database: {db, migrationsPath, databaseNamespace: 'auth'},\n auth: [createJwtAuthMethod(), createLeaseTokenAuthMethod(), createRunnerSessionAuthMethod()],\n loginMethods: passwordLoginMethods(config.AUTH_PASSWORD_ENABLED),\n routes: [buildAuthRoutes(config.AUTH_PASSWORD_ENABLED, workspaces, signupPolicy)],\n e2eRoutes: [createAuthE2eRoutes(workspaces)],\n publishers: [{name: 'auth', table: authOutbox, db, eventSchemas: authEventSchemas}],\n subscribers: [subscriber(AUTH_PASSWORD_RESET_SEND_REQUESTED, onPasswordResetSendRequested)],\n interModulePresentations: [createAuthInterModulePresentation()],\n };\n}\n"],"names":["AUTH_PASSWORD_RESET_SEND_REQUESTED","authEventSchemas","subscriberFactory","config","createEnvironmentSignupPolicy","db","migrationsPath","authOutbox","createJwtAuthMethod","createLeaseTokenAuthMethod","createRunnerSessionAuthMethod","createAuthE2eRoutes","createAuthInterModulePresentation","buildAuthRoutes","onPasswordResetSendRequested","passwordLoginMethods","ADMIN_ROLES","getCurrentAdminRole","hasMinimumAdminRole","highestAdminRole","requireAdminRole","revokeAdminGrant","createSessionForUser","provisionUser","findUserByEmail","AdminRoleRequiredError","AuthDependencyUnavailableError","EmailNotVerifiedError","InvalidCredentialsError","LastAdminOwnerError","SignupNotAllowedError","UserNotFoundError","issueJobLeaseToken","jobLeaseParamsFrom","verifyJobLeaseToken","issueRunnerSessionToken","verifyRunnerSessionToken","DEFAULT_SIGNUP_NOT_ALLOWED_MESSAGE","getAuthenticatedSessionContext","authCookiePlugin","clearRefreshTokenCookie","getRefreshTokenCookie","setRefreshTokenCookie","subscriber","createAuthModule","workspaces","signupPolicy","name","database","databaseNamespace","auth","loginMethods","AUTH_PASSWORD_ENABLED","routes","e2eRoutes","publishers","table","eventSchemas","subscribers","interModulePresentations"],"mappings":"AAAA,SACEA,kCAAkC,EAElCC,gBAAgB,QACX,wBAAwB;AAE/B,SAAQC,iBAAiB,QAAO,uBAAuB;AACvD,SAAQC,MAAM,QAAO,aAAa;AAElC,SAAQC,6BAA6B,QAAO,yBAAyB;AACrE,SAAQC,EAAE,QAAO,YAAY;AAC7B,SAAQC,cAAc,QAAO,oBAAoB;AACjD,SAAQC,UAAU,QAAO,uBAAuB;AAChD,SAAQC,mBAAmB,QAAO,iCAAiC;AACnE,SAAQC,0BAA0B,QAAO,yCAAyC;AAClF,SAAQC,6BAA6B,QAAO,4CAA4C;AACxF,SAAQC,mBAAmB,QAAO,mCAAmC;AACrE,SAAQC,iCAAiC,QAAO,gCAAgC;AAChF,SAAQC,eAAe,QAAO,gCAAgC;AAC9D,SAAQC,4BAA4B,QAAO,qCAAqC;AAChF,SAAQC,oBAAoB,QAAO,qBAAqB;AAGxD,SACEC,WAAW,EACXC,mBAAmB,EACnBC,mBAAmB,EACnBC,gBAAgB,EAChBC,gBAAgB,EAChBC,gBAAgB,QACX,sBAAsB;AAO7B,SAAQC,oBAAoB,EAAEC,aAAa,QAAO,gBAAgB;AAElE,SAAQC,eAAe,QAAO,uBAAuB;AAGrD,SACEC,sBAAsB,EACtBC,8BAA8B,EAC9BC,qBAAqB,EACrBC,uBAAuB,EACvBC,mBAAmB,EACnBC,qBAAqB,EACrBC,iBAAiB,QACZ,kBAAkB;AACzB,SACEC,kBAAkB,EAClBC,kBAAkB,EAClBC,mBAAmB,QACd,2BAA2B;AAElC,SACEC,uBAAuB,EACvBC,wBAAwB,QACnB,gCAAgC;AACvC,SACEhC,6BAA6B,EAC7BiC,kCAAkC,QAC7B,yBAAyB;AAChC,SAEE7B,mBAAmB,EACnB8B,8BAA8B,QAGzB,iCAAiC;AACxC,SAAQ7B,0BAA0B,QAAO,yCAAyC;AAClF,SACE8B,gBAAgB,EAChBC,uBAAuB,EACvBC,qBAAqB,EACrBC,qBAAqB,QAChB,uCAAuC;AAC9C,SAAQhC,6BAA6B,QAAO,4CAA4C;AAExF,MAAMiC,aAAazC;AAOnB,OAAO,SAAS0C,iBAAiB,EAC/BC,UAAU,EACVC,eAAe1C,+BAA+B,EACtB;IACxB,OAAO;QACL2C,MAAM;QACNC,UAAU;YAAC3C;YAAIC;YAAgB2C,mBAAmB;QAAM;QACxDC,MAAM;YAAC1C;YAAuBC;YAA8BC;SAAgC;QAC5FyC,cAAcpC,qBAAqBZ,OAAOiD,qBAAqB;QAC/DC,QAAQ;YAACxC,gBAAgBV,OAAOiD,qBAAqB,EAAEP,YAAYC;SAAc;QACjFQ,WAAW;YAAC3C,oBAAoBkC;SAAY;QAC5CU,YAAY;YAAC;gBAACR,MAAM;gBAAQS,OAAOjD;gBAAYF;gBAAIoD,cAAcxD;YAAgB;SAAE;QACnFyD,aAAa;YAACf,WAAW3C,oCAAoCc;SAA8B;QAC3F6C,0BAA0B;YAAC/C;SAAoC;IACjE;AACF"}
@@ -1,8 +1,9 @@
1
- import type { LoginResponseDto, UserDto } from '@shipfox/api-auth-dto';
1
+ import type { AdminRole, LoginResponseDto, UserDto } from '@shipfox/api-auth-dto';
2
2
  import type { User } from '#core/entities/user.js';
3
3
  export declare function toUserDto(user: User): UserDto;
4
4
  export declare function toAuthSessionDto(result: {
5
5
  token: string;
6
6
  user: User;
7
+ adminRole?: AdminRole | null;
7
8
  }): LoginResponseDto;
8
9
  //# sourceMappingURL=user.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,gBAAgB,EAAE,OAAO,EAAC,MAAM,uBAAuB,CAAC;AACrE,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAU7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,IAAI,CAAA;CAAC,GAAG,gBAAgB,CAKtF"}
1
+ {"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../src/presentation/dto/user.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAC,MAAM,uBAAuB,CAAC;AAChF,OAAO,KAAK,EAAC,IAAI,EAAC,MAAM,wBAAwB,CAAC;AAEjD,wBAAgB,SAAS,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAU7C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;CAC9B,GAAG,gBAAgB,CAMnB"}
@@ -12,7 +12,8 @@ export function toUserDto(user) {
12
12
  export function toAuthSessionDto(result) {
13
13
  return {
14
14
  token: result.token,
15
- user: toUserDto(result.user)
15
+ user: toUserDto(result.user),
16
+ admin_role: result.adminRole ?? null
16
17
  };
17
18
  }
18
19
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/presentation/dto/user.ts"],"sourcesContent":["import type {LoginResponseDto, UserDto} from '@shipfox/api-auth-dto';\nimport type {User} from '#core/entities/user.js';\n\nexport function toUserDto(user: User): UserDto {\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n email_verified_at: user.emailVerifiedAt ? user.emailVerifiedAt.toISOString() : null,\n status: user.status,\n created_at: user.createdAt.toISOString(),\n updated_at: user.updatedAt.toISOString(),\n };\n}\n\nexport function toAuthSessionDto(result: {token: string; user: User}): LoginResponseDto {\n return {\n token: result.token,\n user: toUserDto(result.user),\n };\n}\n"],"names":["toUserDto","user","id","email","name","email_verified_at","emailVerifiedAt","toISOString","status","created_at","createdAt","updated_at","updatedAt","toAuthSessionDto","result","token"],"mappings":"AAGA,OAAO,SAASA,UAAUC,IAAU;IAClC,OAAO;QACLC,IAAID,KAAKC,EAAE;QACXC,OAAOF,KAAKE,KAAK;QACjBC,MAAMH,KAAKG,IAAI;QACfC,mBAAmBJ,KAAKK,eAAe,GAAGL,KAAKK,eAAe,CAACC,WAAW,KAAK;QAC/EC,QAAQP,KAAKO,MAAM;QACnBC,YAAYR,KAAKS,SAAS,CAACH,WAAW;QACtCI,YAAYV,KAAKW,SAAS,CAACL,WAAW;IACxC;AACF;AAEA,OAAO,SAASM,iBAAiBC,MAAmC;IAClE,OAAO;QACLC,OAAOD,OAAOC,KAAK;QACnBd,MAAMD,UAAUc,OAAOb,IAAI;IAC7B;AACF"}
1
+ {"version":3,"sources":["../../../src/presentation/dto/user.ts"],"sourcesContent":["import type {AdminRole, LoginResponseDto, UserDto} from '@shipfox/api-auth-dto';\nimport type {User} from '#core/entities/user.js';\n\nexport function toUserDto(user: User): UserDto {\n return {\n id: user.id,\n email: user.email,\n name: user.name,\n email_verified_at: user.emailVerifiedAt ? user.emailVerifiedAt.toISOString() : null,\n status: user.status,\n created_at: user.createdAt.toISOString(),\n updated_at: user.updatedAt.toISOString(),\n };\n}\n\nexport function toAuthSessionDto(result: {\n token: string;\n user: User;\n adminRole?: AdminRole | null;\n}): LoginResponseDto {\n return {\n token: result.token,\n user: toUserDto(result.user),\n admin_role: result.adminRole ?? null,\n };\n}\n"],"names":["toUserDto","user","id","email","name","email_verified_at","emailVerifiedAt","toISOString","status","created_at","createdAt","updated_at","updatedAt","toAuthSessionDto","result","token","admin_role","adminRole"],"mappings":"AAGA,OAAO,SAASA,UAAUC,IAAU;IAClC,OAAO;QACLC,IAAID,KAAKC,EAAE;QACXC,OAAOF,KAAKE,KAAK;QACjBC,MAAMH,KAAKG,IAAI;QACfC,mBAAmBJ,KAAKK,eAAe,GAAGL,KAAKK,eAAe,CAACC,WAAW,KAAK;QAC/EC,QAAQP,KAAKO,MAAM;QACnBC,YAAYR,KAAKS,SAAS,CAACH,WAAW;QACtCI,YAAYV,KAAKW,SAAS,CAACL,WAAW;IACxC;AACF;AAEA,OAAO,SAASM,iBAAiBC,MAIhC;IACC,OAAO;QACLC,OAAOD,OAAOC,KAAK;QACnBd,MAAMD,UAAUc,OAAOb,IAAI;QAC3Be,YAAYF,OAAOG,SAAS,IAAI;IAClC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAgC,KAAK,uBAAuB,EAAC,MAAM,uBAAuB,CAAC;AAIlG,wBAAgB,iCAAiC,IAAI,uBAAuB,CAC1E,OAAO,uBAAuB,CAC/B,CAKA"}
1
+ {"version":3,"file":"inter-module.d.ts","sourceRoot":"","sources":["../../src/presentation/inter-module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,uBAAuB,EAAC,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAGL,KAAK,uBAAuB,EAC7B,MAAM,uBAAuB,CAAC;AAM/B,wBAAgB,iCAAiC,IAAI,uBAAuB,CAC1E,OAAO,uBAAuB,CAC/B,CAoBA"}
@@ -1,5 +1,7 @@
1
1
  import { authInterModuleContract } from '@shipfox/api-auth-dto/inter-module';
2
- import { defineInterModulePresentation } from '@shipfox/inter-module';
2
+ import { createInterModuleKnownError, defineInterModulePresentation } from '@shipfox/inter-module';
3
+ import { getCurrentAdminRole, requireAdminRole } from '#core/admin-role.js';
4
+ import { AdminRoleRequiredError } from '#core/errors.js';
3
5
  import { issueJobLeaseToken } from '#core/job-lease-token.js';
4
6
  import { issueRunnerSessionToken } from '#core/runner-session-token.js';
5
7
  export function createAuthInterModulePresentation() {
@@ -9,7 +11,29 @@ export function createAuthInterModulePresentation() {
9
11
  }),
10
12
  mintJobLeaseToken: async (claims)=>({
11
13
  token: await issueJobLeaseToken(claims)
12
- })
14
+ }),
15
+ getCurrentAdminRole: async ({ userId })=>({
16
+ role: await getCurrentAdminRole({
17
+ userId
18
+ })
19
+ }),
20
+ requireAdminRole: async ({ userId, minimumRole })=>{
21
+ try {
22
+ return {
23
+ role: await requireAdminRole({
24
+ userId,
25
+ minimumRole
26
+ })
27
+ };
28
+ } catch (error) {
29
+ if (error instanceof AdminRoleRequiredError) {
30
+ throw createInterModuleKnownError(authInterModuleContract.methods.requireAdminRole, 'admin-role-required', {
31
+ requiredRole: error.minimumRole
32
+ });
33
+ }
34
+ throw error;
35
+ }
36
+ }
13
37
  });
14
38
  }
15
39