@simple-auth-kit/cli 1.4.2 → 1.5.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.
- package/package.json +1 -1
- package/registry/combos/express-drizzle/shared/src/{auth-core-error.middleware.ts → middleware/auth-core-error.middleware.ts} +17 -4
- package/registry/combos/express-drizzle/shared/src/{auth.middleware.ts → middleware/auth.middleware.ts} +23 -7
- package/registry/combos/{express-prisma/shared/src → express-drizzle/shared/src/middleware}/response-envelope.middleware.ts +15 -3
- package/registry/combos/express-drizzle/shared/src/{oauth.repository.ts → repositories/oauth.repository.ts} +32 -9
- package/registry/combos/express-drizzle/shared/src/repositories/password-reset.repository.ts +59 -0
- package/registry/combos/express-drizzle/shared/src/{session.repository.ts → repositories/session.repository.ts} +52 -14
- package/registry/combos/express-drizzle/shared/src/{two-factor.repository.ts → repositories/two-factor.repository.ts} +20 -6
- package/registry/combos/express-drizzle/shared/src/request-context.ts +1 -1
- package/registry/combos/express-drizzle/shared/src/routers/auth.router.ts +395 -0
- package/registry/combos/express-drizzle/variants/base/src/create-auth-app.ts +52 -19
- package/registry/combos/express-drizzle/variants/base/src/{authz.middleware.ts → middleware/authz.middleware.ts} +15 -7
- package/registry/combos/express-drizzle/variants/base/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +28 -10
- package/registry/combos/express-drizzle/variants/base/src/{rbac.repository.ts → repositories/rbac.repository.ts} +239 -48
- package/registry/combos/express-drizzle/variants/base/src/routers/admin.router.ts +497 -0
- package/registry/combos/express-drizzle/variants/base/src/{auth.service.ts → services/auth.service.ts} +480 -109
- package/registry/combos/express-drizzle/variants/workspaces/src/create-auth-app.ts +69 -23
- package/registry/combos/express-drizzle/variants/workspaces/src/{authz.middleware.ts → middleware/authz.middleware.ts} +32 -12
- package/registry/combos/express-drizzle/variants/workspaces/src/openapi-workspace.ts +147 -28
- package/registry/combos/express-drizzle/variants/workspaces/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +30 -11
- package/registry/combos/express-drizzle/variants/workspaces/src/{rbac.repository.ts → repositories/rbac.repository.ts} +319 -70
- package/registry/combos/express-drizzle/variants/workspaces/src/{workspace.repository.ts → repositories/workspace.repository.ts} +127 -30
- package/registry/combos/express-drizzle/variants/workspaces/src/routers/admin.router.ts +534 -0
- package/registry/combos/express-drizzle/variants/workspaces/src/routers/workspace.router.ts +194 -0
- package/registry/combos/express-drizzle/variants/workspaces/src/{auth.service.ts → services/auth.service.ts} +544 -122
- package/registry/combos/express-prisma/shared/src/{auth-core-error.middleware.ts → middleware/auth-core-error.middleware.ts} +17 -4
- package/registry/combos/express-prisma/shared/src/{auth.middleware.ts → middleware/auth.middleware.ts} +19 -6
- package/registry/combos/{express-drizzle/shared/src → express-prisma/shared/src/middleware}/response-envelope.middleware.ts +15 -3
- package/registry/combos/express-prisma/shared/src/{oauth.repository.ts → repositories/oauth.repository.ts} +27 -9
- package/registry/combos/express-prisma/shared/src/repositories/password-reset.repository.ts +55 -0
- package/registry/combos/express-prisma/shared/src/{session.repository.ts → repositories/session.repository.ts} +30 -9
- package/registry/combos/express-prisma/shared/src/{two-factor.repository.ts → repositories/two-factor.repository.ts} +11 -4
- package/registry/combos/express-prisma/shared/src/request-context.ts +1 -1
- package/registry/combos/express-prisma/shared/src/routers/auth.router.ts +398 -0
- package/registry/combos/express-prisma/variants/base/src/create-auth-app.ts +57 -22
- package/registry/combos/express-prisma/variants/base/src/{authz.middleware.ts → middleware/authz.middleware.ts} +15 -7
- package/registry/combos/express-prisma/variants/base/src/rbac.defaults.ts +67 -19
- package/registry/combos/express-prisma/variants/base/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +16 -5
- package/registry/combos/express-prisma/variants/base/src/{rbac.repository.ts → repositories/rbac.repository.ts} +199 -48
- package/registry/combos/express-prisma/variants/base/src/routers/admin.router.ts +508 -0
- package/registry/combos/express-prisma/variants/base/src/seed.ts +78 -20
- package/registry/combos/express-prisma/variants/base/src/{auth.service.ts → services/auth.service.ts} +454 -105
- package/registry/combos/express-prisma/variants/workspaces/src/create-auth-app.ts +81 -26
- package/registry/combos/express-prisma/variants/workspaces/src/{authz.middleware.ts → middleware/authz.middleware.ts} +32 -12
- package/registry/combos/express-prisma/variants/workspaces/src/openapi-workspace.ts +147 -28
- package/registry/combos/express-prisma/variants/workspaces/src/rbac.defaults.ts +73 -21
- package/registry/combos/express-prisma/variants/workspaces/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +16 -5
- package/registry/combos/express-prisma/variants/workspaces/src/{rbac.repository.ts → repositories/rbac.repository.ts} +272 -64
- package/registry/combos/express-prisma/variants/workspaces/src/{workspace.repository.ts → repositories/workspace.repository.ts} +86 -23
- package/registry/combos/express-prisma/variants/workspaces/src/routers/admin.router.ts +545 -0
- package/registry/combos/express-prisma/variants/workspaces/src/routers/workspace.router.ts +194 -0
- package/registry/combos/express-prisma/variants/workspaces/src/seed.ts +109 -29
- package/registry/combos/express-prisma/variants/workspaces/src/{auth.service.ts → services/auth.service.ts} +518 -119
- package/registry/combos/nestjs-drizzle/shared/src/{auth.controller.ts → controllers/auth.controller.ts} +6 -6
- package/registry/combos/nestjs-drizzle/shared/src/{auth-core-error.filter.ts → filters/auth-core-error.filter.ts} +29 -5
- package/registry/combos/nestjs-drizzle/shared/src/{ability.guard.ts → guards/ability.guard.ts} +20 -7
- package/registry/combos/nestjs-drizzle/shared/src/{auth.guard.ts → guards/auth.guard.ts} +19 -7
- package/registry/combos/{nestjs-prisma/shared/src → nestjs-drizzle/shared/src/interceptors}/response.interceptor.ts +10 -2
- package/registry/combos/nestjs-drizzle/shared/src/repositories/oauth.repository.ts +63 -0
- package/registry/combos/nestjs-drizzle/shared/src/repositories/password-reset.repository.ts +59 -0
- package/registry/combos/nestjs-drizzle/shared/src/{session.repository.ts → repositories/session.repository.ts} +52 -14
- package/registry/combos/nestjs-drizzle/shared/src/{two-factor.repository.ts → repositories/two-factor.repository.ts} +21 -7
- package/registry/combos/nestjs-drizzle/shared/src/request-context.ts +1 -1
- package/registry/combos/nestjs-drizzle/test/prove-cycle.ts +1097 -307
- package/registry/combos/nestjs-drizzle/variants/base/src/auth.module.ts +44 -20
- package/registry/combos/nestjs-drizzle/variants/base/src/{admin.controller.ts → controllers/admin.controller.ts} +228 -62
- package/registry/combos/nestjs-drizzle/variants/base/src/{authz.guard.ts → guards/authz.guard.ts} +12 -5
- package/registry/combos/nestjs-drizzle/variants/base/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +27 -10
- package/registry/combos/nestjs-drizzle/variants/base/src/{rbac.repository.ts → repositories/rbac.repository.ts} +249 -51
- package/registry/combos/nestjs-drizzle/variants/base/src/{auth.service.ts → services/auth.service.ts} +499 -116
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/auth.module.ts +48 -22
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{admin.controller.ts → controllers/admin.controller.ts} +269 -70
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{workspace.controller.ts → controllers/workspace.controller.ts} +93 -26
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{authz.guard.ts → guards/authz.guard.ts} +26 -8
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +29 -11
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{rbac.repository.ts → repositories/rbac.repository.ts} +323 -71
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/{workspace.repository.ts → repositories/workspace.repository.ts} +131 -30
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/services/auth.service.ts +988 -0
- package/registry/combos/nestjs-prisma/shared/src/{auth.controller.ts → controllers/auth.controller.ts} +6 -6
- package/registry/combos/nestjs-prisma/shared/src/{auth-core-error.filter.ts → filters/auth-core-error.filter.ts} +29 -5
- package/registry/combos/nestjs-prisma/shared/src/{ability.guard.ts → guards/ability.guard.ts} +20 -7
- package/registry/combos/nestjs-prisma/shared/src/{auth.guard.ts → guards/auth.guard.ts} +19 -7
- package/registry/combos/{nestjs-drizzle/shared/src → nestjs-prisma/shared/src/interceptors}/response.interceptor.ts +10 -2
- package/registry/combos/nestjs-prisma/shared/src/{oauth.repository.ts → repositories/oauth.repository.ts} +25 -8
- package/registry/combos/nestjs-prisma/shared/src/repositories/password-reset.repository.ts +55 -0
- package/registry/combos/nestjs-prisma/shared/src/{session.repository.ts → repositories/session.repository.ts} +30 -9
- package/registry/combos/nestjs-prisma/shared/src/{two-factor.repository.ts → repositories/two-factor.repository.ts} +11 -4
- package/registry/combos/nestjs-prisma/shared/src/request-context.ts +1 -1
- package/registry/combos/nestjs-prisma/test/prove-cycle.ts +1097 -307
- package/registry/combos/nestjs-prisma/variants/base/src/auth.module.ts +59 -28
- package/registry/combos/nestjs-prisma/variants/base/src/{admin.controller.ts → controllers/admin.controller.ts} +469 -110
- package/registry/combos/nestjs-prisma/variants/base/src/{audit-log.gateway.ts → gateways/audit-log.gateway.ts} +22 -6
- package/registry/combos/nestjs-prisma/variants/base/src/{authz.guard.ts → guards/authz.guard.ts} +12 -5
- package/registry/combos/nestjs-prisma/variants/base/src/rbac.defaults.ts +98 -27
- package/registry/combos/nestjs-prisma/variants/base/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +16 -5
- package/registry/combos/nestjs-prisma/variants/base/src/{country.repository.ts → repositories/country.repository.ts} +98 -25
- package/registry/combos/nestjs-prisma/variants/base/src/{customer.repository.ts → repositories/customer.repository.ts} +106 -27
- package/registry/combos/nestjs-prisma/variants/base/src/{language.repository.ts → repositories/language.repository.ts} +93 -25
- package/registry/combos/nestjs-prisma/variants/base/src/{rbac.repository.ts → repositories/rbac.repository.ts} +229 -55
- package/registry/combos/nestjs-prisma/variants/base/src/seed.ts +78 -20
- package/registry/combos/nestjs-prisma/variants/base/src/services/auth.service.ts +1064 -0
- package/registry/combos/nestjs-prisma/variants/workspaces/src/auth.module.ts +55 -27
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{admin.controller.ts → controllers/admin.controller.ts} +544 -128
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{workspace.controller.ts → controllers/workspace.controller.ts} +93 -26
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{authz.guard.ts → guards/authz.guard.ts} +26 -8
- package/registry/combos/nestjs-prisma/variants/workspaces/src/rbac.defaults.ts +104 -29
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{audit-log.repository.ts → repositories/audit-log.repository.ts} +16 -5
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{country.repository.ts → repositories/country.repository.ts} +127 -26
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{customer.repository.ts → repositories/customer.repository.ts} +137 -28
- package/registry/combos/nestjs-prisma/variants/workspaces/src/repositories/language.repository.ts +243 -0
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{rbac.repository.ts → repositories/rbac.repository.ts} +314 -74
- package/registry/combos/nestjs-prisma/variants/workspaces/src/{workspace.repository.ts → repositories/workspace.repository.ts} +94 -24
- package/registry/combos/nestjs-prisma/variants/workspaces/src/seed.ts +109 -29
- package/registry/combos/nestjs-prisma/variants/workspaces/src/services/auth.service.ts +961 -0
- package/registry.json +6 -4
- package/simple-auth-kit.ts +582 -124
- package/registry/combos/express-drizzle/shared/src/auth.router.ts +0 -266
- package/registry/combos/express-drizzle/shared/src/password-reset.repository.ts +0 -35
- package/registry/combos/express-drizzle/variants/base/src/admin.router.ts +0 -307
- package/registry/combos/express-drizzle/variants/workspaces/src/admin.router.ts +0 -323
- package/registry/combos/express-drizzle/variants/workspaces/src/workspace.router.ts +0 -123
- package/registry/combos/express-prisma/shared/src/auth.router.ts +0 -269
- package/registry/combos/express-prisma/shared/src/password-reset.repository.ts +0 -29
- package/registry/combos/express-prisma/variants/base/src/admin.router.ts +0 -314
- package/registry/combos/express-prisma/variants/workspaces/src/admin.router.ts +0 -330
- package/registry/combos/express-prisma/variants/workspaces/src/workspace.router.ts +0 -123
- package/registry/combos/nestjs-drizzle/shared/src/oauth.repository.ts +0 -36
- package/registry/combos/nestjs-drizzle/shared/src/password-reset.repository.ts +0 -29
- package/registry/combos/nestjs-drizzle/variants/workspaces/src/auth.service.ts +0 -553
- package/registry/combos/nestjs-prisma/shared/src/password-reset.repository.ts +0 -29
- package/registry/combos/nestjs-prisma/variants/base/src/auth.service.ts +0 -618
- package/registry/combos/nestjs-prisma/variants/workspaces/src/auth.service.ts +0 -509
- package/registry/combos/nestjs-prisma/variants/workspaces/src/language.repository.ts +0 -143
|
@@ -28,7 +28,7 @@
|
|
|
28
28
|
// `src/workspace.repository.ts` (which provisions every workspace created afterwards, inside the
|
|
29
29
|
// same transaction that creates it, so its creator is never locked out of a workspace they just
|
|
30
30
|
// made).
|
|
31
|
-
import type { PrismaClient } from "
|
|
31
|
+
import type { PrismaClient } from "./../generated/prisma/client.js";
|
|
32
32
|
|
|
33
33
|
/** The display metadata a seeded permission carries. `group`/`order` exist so an admin console can render a stable matrix. */
|
|
34
34
|
export interface PermissionSeed {
|
|
@@ -53,11 +53,22 @@ export interface PermissionSeed {
|
|
|
53
53
|
* evaluate.
|
|
54
54
|
*/
|
|
55
55
|
export const PERMISSION_CATALOG = {
|
|
56
|
-
"users:read": {
|
|
57
|
-
|
|
56
|
+
"users:read": {
|
|
57
|
+
displayName: "List members",
|
|
58
|
+
description: "GET /auth/admin/users, GET /auth/admin/users/:userId",
|
|
59
|
+
group: "Users",
|
|
60
|
+
order: 1,
|
|
61
|
+
},
|
|
62
|
+
"users:block": {
|
|
63
|
+
displayName: "Block and unblock members",
|
|
64
|
+
description: "POST /auth/admin/users/:userId/block, .../unblock",
|
|
65
|
+
group: "Users",
|
|
66
|
+
order: 2,
|
|
67
|
+
},
|
|
58
68
|
"users:manage": {
|
|
59
69
|
displayName: "Edit and delete members",
|
|
60
|
-
description:
|
|
70
|
+
description:
|
|
71
|
+
"Edit a member's profile or delete their account — PATCH /auth/admin/users/:userId, DELETE /auth/admin/users/:userId",
|
|
61
72
|
group: "Users",
|
|
62
73
|
order: 3,
|
|
63
74
|
},
|
|
@@ -70,30 +81,44 @@ export const PERMISSION_CATALOG = {
|
|
|
70
81
|
},
|
|
71
82
|
"roles:assign": {
|
|
72
83
|
displayName: "Assign roles",
|
|
73
|
-
description:
|
|
84
|
+
description:
|
|
85
|
+
"Assign and revoke a member's roles — POST /auth/admin/users/:userId/roles, .../roles/:roleSlug/revoke, PUT /workspaces/members/:memberId/roles",
|
|
74
86
|
group: "Roles",
|
|
75
87
|
order: 2,
|
|
76
88
|
},
|
|
77
|
-
"permissions:read": {
|
|
89
|
+
"permissions:read": {
|
|
90
|
+
displayName: "Read the permission catalog",
|
|
91
|
+
description: "GET /auth/admin/permissions",
|
|
92
|
+
group: "Permissions",
|
|
93
|
+
order: 1,
|
|
94
|
+
},
|
|
78
95
|
"permissions:define": {
|
|
79
96
|
displayName: "Define permissions",
|
|
80
|
-
description:
|
|
97
|
+
description:
|
|
98
|
+
"Create a permission, rename it, or deactivate it — POST /auth/admin/permissions. The authority that defines all the others.",
|
|
81
99
|
group: "Permissions",
|
|
82
100
|
order: 2,
|
|
83
101
|
},
|
|
84
102
|
"permissions:grant": {
|
|
85
103
|
displayName: "Grant permissions directly",
|
|
86
|
-
description:
|
|
104
|
+
description:
|
|
105
|
+
"Grant and revoke a permission straight to a member, bypassing roles — POST /auth/admin/users/:userId/permissions, .../permissions/:slug/revoke",
|
|
87
106
|
group: "Permissions",
|
|
88
107
|
order: 3,
|
|
89
108
|
},
|
|
90
109
|
"members:manage": {
|
|
91
110
|
displayName: "Add and remove members",
|
|
92
|
-
description:
|
|
111
|
+
description:
|
|
112
|
+
"POST /workspaces/members, DELETE /workspaces/members/:memberId",
|
|
93
113
|
group: "Members",
|
|
94
114
|
order: 1,
|
|
95
115
|
},
|
|
96
|
-
"audit-log:read": {
|
|
116
|
+
"audit-log:read": {
|
|
117
|
+
displayName: "Read the audit log",
|
|
118
|
+
description: "GET /auth/admin/audit-log",
|
|
119
|
+
group: "Audit",
|
|
120
|
+
order: 1,
|
|
121
|
+
},
|
|
97
122
|
} as const satisfies Record<string, PermissionSeed>;
|
|
98
123
|
|
|
99
124
|
/**
|
|
@@ -105,10 +130,14 @@ export const PERMISSION_CATALOG = {
|
|
|
105
130
|
*/
|
|
106
131
|
export type PermissionSlug = keyof typeof PERMISSION_CATALOG;
|
|
107
132
|
|
|
108
|
-
export const PERMISSION_SLUGS = Object.keys(
|
|
133
|
+
export const PERMISSION_SLUGS = Object.keys(
|
|
134
|
+
PERMISSION_CATALOG,
|
|
135
|
+
) as PermissionSlug[];
|
|
109
136
|
|
|
110
137
|
/** Groups, in the order an admin console should render them. Derived from the catalog so it cannot drift from it. */
|
|
111
|
-
export const PERMISSION_GROUP_ORDER: string[] = [
|
|
138
|
+
export const PERMISSION_GROUP_ORDER: string[] = [
|
|
139
|
+
...new Set(PERMISSION_SLUGS.map((slug) => PERMISSION_CATALOG[slug].group)),
|
|
140
|
+
];
|
|
112
141
|
|
|
113
142
|
/** The display metadata a seeded role carries, plus what it starts out granting. */
|
|
114
143
|
export interface RoleSeed {
|
|
@@ -144,7 +173,8 @@ export const DEFAULT_ROLES: readonly RoleSeed[] = [
|
|
|
144
173
|
{
|
|
145
174
|
slug: "superadmin",
|
|
146
175
|
displayName: "Super Admin",
|
|
147
|
-
description:
|
|
176
|
+
description:
|
|
177
|
+
"Carries every permission in the catalog — same authority as admin, held by the seeded super_admin account's membership (see SEED_SUPERADMIN_* in seed.ts).",
|
|
148
178
|
isDefault: false,
|
|
149
179
|
order: 1,
|
|
150
180
|
permissions: PERMISSION_SLUGS,
|
|
@@ -152,7 +182,8 @@ export const DEFAULT_ROLES: readonly RoleSeed[] = [
|
|
|
152
182
|
{
|
|
153
183
|
slug: "member",
|
|
154
184
|
displayName: "Member",
|
|
155
|
-
description:
|
|
185
|
+
description:
|
|
186
|
+
"The default for a new membership. Carries no administrative permission.",
|
|
156
187
|
isDefault: true,
|
|
157
188
|
order: 2,
|
|
158
189
|
permissions: [],
|
|
@@ -170,7 +201,10 @@ export const WORKSPACE_CREATOR_ROLES: string[] = ["admin", "member"];
|
|
|
170
201
|
export const SEED_SUPERADMIN_ROLES: string[] = ["superadmin", "member"];
|
|
171
202
|
|
|
172
203
|
/** Anything that can write the catalog tables: the PrismaClient, or a `$transaction` client. */
|
|
173
|
-
export type RbacWriter = Pick<
|
|
204
|
+
export type RbacWriter = Pick<
|
|
205
|
+
PrismaClient,
|
|
206
|
+
"permission" | "role" | "permissionRole"
|
|
207
|
+
>;
|
|
174
208
|
|
|
175
209
|
/**
|
|
176
210
|
* Writes the starting catalog, and one workspace's roles, into `db` — which may be a transaction
|
|
@@ -184,7 +218,10 @@ export type RbacWriter = Pick<PrismaClient, "permission" | "role" | "permissionR
|
|
|
184
218
|
*/
|
|
185
219
|
// Takes bigint directly: both callers (`WorkspaceRepository.create`, `seed.ts`) already have the
|
|
186
220
|
// workspace row's id in hand from their own Prisma call.
|
|
187
|
-
export async function provisionDefaultRoles(
|
|
221
|
+
export async function provisionDefaultRoles(
|
|
222
|
+
db: RbacWriter,
|
|
223
|
+
workspaceId: bigint,
|
|
224
|
+
): Promise<void> {
|
|
188
225
|
await db.permission.createMany({
|
|
189
226
|
data: PERMISSION_SLUGS.map((slug) => ({
|
|
190
227
|
slug,
|
|
@@ -192,12 +229,17 @@ export async function provisionDefaultRoles(db: RbacWriter, workspaceId: bigint)
|
|
|
192
229
|
displayName: PERMISSION_CATALOG[slug].displayName,
|
|
193
230
|
description: PERMISSION_CATALOG[slug].description,
|
|
194
231
|
group: PERMISSION_CATALOG[slug].group,
|
|
195
|
-
groupOrder: PERMISSION_GROUP_ORDER.indexOf(
|
|
232
|
+
groupOrder: PERMISSION_GROUP_ORDER.indexOf(
|
|
233
|
+
PERMISSION_CATALOG[slug].group,
|
|
234
|
+
),
|
|
196
235
|
order: PERMISSION_CATALOG[slug].order,
|
|
197
236
|
})),
|
|
198
237
|
skipDuplicates: true,
|
|
199
238
|
});
|
|
200
|
-
const permissions = await db.permission.findMany({
|
|
239
|
+
const permissions = await db.permission.findMany({
|
|
240
|
+
where: { slug: { in: PERMISSION_SLUGS } },
|
|
241
|
+
select: { id: true, slug: true },
|
|
242
|
+
});
|
|
201
243
|
const permissionId = new Map(permissions.map((p) => [p.slug, p.id]));
|
|
202
244
|
|
|
203
245
|
await db.role.createMany({
|
|
@@ -212,11 +254,21 @@ export async function provisionDefaultRoles(db: RbacWriter, workspaceId: bigint)
|
|
|
212
254
|
})),
|
|
213
255
|
skipDuplicates: true,
|
|
214
256
|
});
|
|
215
|
-
const roles = await db.role.findMany({
|
|
257
|
+
const roles = await db.role.findMany({
|
|
258
|
+
where: { workspaceId, slug: { in: DEFAULT_ROLES.map((r) => r.slug) } },
|
|
259
|
+
select: { id: true, slug: true },
|
|
260
|
+
});
|
|
216
261
|
const seedBySlug = new Map(DEFAULT_ROLES.map((role) => [role.slug, role]));
|
|
217
262
|
|
|
218
263
|
const rolePermissions = roles.flatMap((role) =>
|
|
219
|
-
(seedBySlug.get(role.slug)?.permissions ?? []).map((slug) => ({
|
|
264
|
+
(seedBySlug.get(role.slug)?.permissions ?? []).map((slug) => ({
|
|
265
|
+
roleId: role.id,
|
|
266
|
+
permissionId: permissionId.get(slug)!,
|
|
267
|
+
})),
|
|
220
268
|
);
|
|
221
|
-
if (rolePermissions.length)
|
|
269
|
+
if (rolePermissions.length)
|
|
270
|
+
await db.permissionRole.createMany({
|
|
271
|
+
data: rolePermissions,
|
|
272
|
+
skipDuplicates: true,
|
|
273
|
+
});
|
|
222
274
|
}
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
import type { AuditEvent } from "@/lib/auth/core/types.js";
|
|
2
|
-
import { Prisma, PrismaClient } from "
|
|
3
|
-
import {
|
|
4
|
-
|
|
2
|
+
import { Prisma, PrismaClient } from "../../generated/prisma/client.js";
|
|
3
|
+
import {
|
|
4
|
+
buildPageMeta,
|
|
5
|
+
normalizeLimit,
|
|
6
|
+
normalizePage,
|
|
7
|
+
type Paginated,
|
|
8
|
+
} from "../pagination.js";
|
|
9
|
+
import { toIdOrNull, toIdOrUndefined } from "../id.helper.js";
|
|
5
10
|
|
|
6
11
|
export interface AuditLogEntry {
|
|
7
12
|
id: string;
|
|
@@ -47,7 +52,10 @@ export function toAuditLogEntry(row: AuditLogRow): AuditLogEntry {
|
|
|
47
52
|
/** "role_assigned" -> "Role assigned". Derived rather than passed in, so core never has to carry display text. */
|
|
48
53
|
export function humanizeAction(action: string): string {
|
|
49
54
|
const words = action.split("_");
|
|
50
|
-
return [
|
|
55
|
+
return [
|
|
56
|
+
words[0].charAt(0).toUpperCase() + words[0].slice(1),
|
|
57
|
+
...words.slice(1),
|
|
58
|
+
].join(" ");
|
|
51
59
|
}
|
|
52
60
|
|
|
53
61
|
// Plain class, no DI container — constructed directly with a PrismaClient in
|
|
@@ -60,7 +68,10 @@ export class AuditLogRepository {
|
|
|
60
68
|
* those happen to a user, not inside a workspace. Callers that *are* acting in a workspace
|
|
61
69
|
* pass it, which is what scopes the admin audit-log read below.
|
|
62
70
|
*/
|
|
63
|
-
async append(
|
|
71
|
+
async append(
|
|
72
|
+
event: AuditEvent,
|
|
73
|
+
opts: { workspaceId?: string; remarks?: string } = {},
|
|
74
|
+
): Promise<void> {
|
|
64
75
|
await this.prisma.auditLog.create({
|
|
65
76
|
data: {
|
|
66
77
|
action: event.type,
|