@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
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { PrismaClient } from "
|
|
2
|
-
import { HttpError } from "
|
|
3
|
-
import {
|
|
1
|
+
import { PrismaClient } from "../../generated/prisma/client.js";
|
|
2
|
+
import { HttpError } from "../http-error.js";
|
|
3
|
+
import {
|
|
4
|
+
provisionDefaultRoles,
|
|
5
|
+
WORKSPACE_CREATOR_ROLES,
|
|
6
|
+
} from "../rbac.defaults.js";
|
|
4
7
|
import { RbacRepository } from "./rbac.repository.js";
|
|
5
|
-
import { toId } from "
|
|
8
|
+
import { toId } from "../id.helper.js";
|
|
6
9
|
|
|
7
10
|
export interface WorkspaceSummary {
|
|
8
11
|
id: string;
|
|
@@ -40,11 +43,23 @@ export class WorkspaceRepository {
|
|
|
40
43
|
async create(userId: string, name: string): Promise<WorkspaceSummary> {
|
|
41
44
|
const userIdBig = toId(userId);
|
|
42
45
|
const workspace = await this.prisma.$transaction(async (tx) => {
|
|
43
|
-
const created = await tx.workspace.create({
|
|
46
|
+
const created = await tx.workspace.create({
|
|
47
|
+
data: { name, createdBy: userIdBig, updatedBy: userIdBig },
|
|
48
|
+
});
|
|
44
49
|
await provisionDefaultRoles(tx, created.id);
|
|
45
|
-
const roles = await tx.role.findMany({
|
|
50
|
+
const roles = await tx.role.findMany({
|
|
51
|
+
where: {
|
|
52
|
+
workspaceId: created.id,
|
|
53
|
+
slug: { in: WORKSPACE_CREATOR_ROLES },
|
|
54
|
+
},
|
|
55
|
+
select: { id: true },
|
|
56
|
+
});
|
|
46
57
|
await tx.workspaceMember.create({
|
|
47
|
-
data: {
|
|
58
|
+
data: {
|
|
59
|
+
workspaceId: created.id,
|
|
60
|
+
userId: userIdBig,
|
|
61
|
+
roles: { create: roles.map((role) => ({ roleId: role.id })) },
|
|
62
|
+
},
|
|
48
63
|
});
|
|
49
64
|
return created;
|
|
50
65
|
});
|
|
@@ -59,7 +74,10 @@ export class WorkspaceRepository {
|
|
|
59
74
|
async listForUser(userId: string): Promise<WorkspaceSummary[]> {
|
|
60
75
|
const memberships = await this.prisma.workspaceMember.findMany({
|
|
61
76
|
where: { userId: toId(userId), workspace: { isDeleted: false } },
|
|
62
|
-
include: {
|
|
77
|
+
include: {
|
|
78
|
+
workspace: true,
|
|
79
|
+
roles: { select: { role: { select: { slug: true } } } },
|
|
80
|
+
},
|
|
63
81
|
orderBy: { createdAt: "asc" },
|
|
64
82
|
});
|
|
65
83
|
return memberships.map((m) => ({
|
|
@@ -73,7 +91,10 @@ export class WorkspaceRepository {
|
|
|
73
91
|
async listMembers(workspaceId: string): Promise<MembershipSummary[]> {
|
|
74
92
|
const rows = await this.prisma.workspaceMember.findMany({
|
|
75
93
|
where: { workspaceId: toId(workspaceId), user: { isDeleted: false } },
|
|
76
|
-
include: {
|
|
94
|
+
include: {
|
|
95
|
+
user: true,
|
|
96
|
+
roles: { select: { role: { select: { slug: true } } } },
|
|
97
|
+
},
|
|
77
98
|
orderBy: { createdAt: "asc" },
|
|
78
99
|
});
|
|
79
100
|
return rows.map((row) => ({
|
|
@@ -85,15 +106,33 @@ export class WorkspaceRepository {
|
|
|
85
106
|
}));
|
|
86
107
|
}
|
|
87
108
|
|
|
88
|
-
private async resolveMemberRoles(
|
|
109
|
+
private async resolveMemberRoles(
|
|
110
|
+
workspaceIdBig: bigint,
|
|
111
|
+
roleSlugs?: string[],
|
|
112
|
+
) {
|
|
89
113
|
const roles = await this.prisma.role.findMany({
|
|
90
114
|
where: roleSlugs
|
|
91
|
-
? {
|
|
92
|
-
|
|
115
|
+
? {
|
|
116
|
+
workspaceId: workspaceIdBig,
|
|
117
|
+
slug: { in: roleSlugs },
|
|
118
|
+
isDeleted: false,
|
|
119
|
+
}
|
|
120
|
+
: {
|
|
121
|
+
workspaceId: workspaceIdBig,
|
|
122
|
+
isDefault: true,
|
|
123
|
+
isActive: true,
|
|
124
|
+
isDeleted: false,
|
|
125
|
+
},
|
|
93
126
|
select: { id: true, slug: true },
|
|
94
127
|
});
|
|
95
|
-
const unknown = (roleSlugs ?? []).filter(
|
|
96
|
-
|
|
128
|
+
const unknown = (roleSlugs ?? []).filter(
|
|
129
|
+
(slug) => !roles.some((role) => role.slug === slug),
|
|
130
|
+
);
|
|
131
|
+
if (unknown.length)
|
|
132
|
+
throw new HttpError(
|
|
133
|
+
404,
|
|
134
|
+
`role(s) not defined in this workspace: ${unknown.join(", ")}`,
|
|
135
|
+
);
|
|
97
136
|
return roles;
|
|
98
137
|
}
|
|
99
138
|
|
|
@@ -102,17 +141,32 @@ export class WorkspaceRepository {
|
|
|
102
141
|
* consuming app's job. With no roles named, the new membership gets whichever of this
|
|
103
142
|
* workspace's roles are flagged `isDefault`, not a slug spelled in code.
|
|
104
143
|
*/
|
|
105
|
-
async addMember(
|
|
144
|
+
async addMember(
|
|
145
|
+
workspaceId: string,
|
|
146
|
+
email: string,
|
|
147
|
+
roleSlugs?: string[],
|
|
148
|
+
): Promise<MembershipSummary> {
|
|
106
149
|
const workspaceIdBig = toId(workspaceId);
|
|
107
|
-
const user = await this.prisma.user.findUnique({
|
|
150
|
+
const user = await this.prisma.user.findUnique({
|
|
151
|
+
where: { email, isDeleted: false },
|
|
152
|
+
});
|
|
108
153
|
if (!user) throw new HttpError(404, "no user with that email");
|
|
109
154
|
|
|
110
|
-
const existing = await this.prisma.workspaceMember.findUnique({
|
|
111
|
-
|
|
155
|
+
const existing = await this.prisma.workspaceMember.findUnique({
|
|
156
|
+
where: {
|
|
157
|
+
userId_workspaceId: { userId: user.id, workspaceId: workspaceIdBig },
|
|
158
|
+
},
|
|
159
|
+
});
|
|
160
|
+
if (existing)
|
|
161
|
+
throw new HttpError(409, "already a member of this workspace");
|
|
112
162
|
|
|
113
163
|
const roles = await this.resolveMemberRoles(workspaceIdBig, roleSlugs);
|
|
114
164
|
const member = await this.prisma.workspaceMember.create({
|
|
115
|
-
data: {
|
|
165
|
+
data: {
|
|
166
|
+
workspaceId: workspaceIdBig,
|
|
167
|
+
userId: user.id,
|
|
168
|
+
roles: { create: roles.map((role) => ({ roleId: role.id })) },
|
|
169
|
+
},
|
|
116
170
|
});
|
|
117
171
|
return {
|
|
118
172
|
memberId: member.id.toString(),
|
|
@@ -143,7 +197,9 @@ export class WorkspaceRepository {
|
|
|
143
197
|
actorUserId: string | null,
|
|
144
198
|
): Promise<MembershipSummary> {
|
|
145
199
|
const workspaceIdBig = toId(workspaceId);
|
|
146
|
-
const existing = await this.prisma.user.findUnique({
|
|
200
|
+
const existing = await this.prisma.user.findUnique({
|
|
201
|
+
where: { email: input.email },
|
|
202
|
+
});
|
|
147
203
|
if (existing) throw new HttpError(409, "email already registered");
|
|
148
204
|
|
|
149
205
|
const roles = await this.resolveMemberRoles(workspaceIdBig, input.roles);
|
|
@@ -160,7 +216,11 @@ export class WorkspaceRepository {
|
|
|
160
216
|
},
|
|
161
217
|
});
|
|
162
218
|
const member = await this.prisma.workspaceMember.create({
|
|
163
|
-
data: {
|
|
219
|
+
data: {
|
|
220
|
+
workspaceId: workspaceIdBig,
|
|
221
|
+
userId: user.id,
|
|
222
|
+
roles: { create: roles.map((role) => ({ roleId: role.id })) },
|
|
223
|
+
},
|
|
164
224
|
});
|
|
165
225
|
return {
|
|
166
226
|
memberId: member.id.toString(),
|
|
@@ -174,8 +234,11 @@ export class WorkspaceRepository {
|
|
|
174
234
|
async removeMember(workspaceId: string, memberId: string): Promise<void> {
|
|
175
235
|
const workspaceIdBig = toId(workspaceId);
|
|
176
236
|
const memberIdBig = toId(memberId);
|
|
177
|
-
const member = await this.prisma.workspaceMember.findUnique({
|
|
178
|
-
|
|
237
|
+
const member = await this.prisma.workspaceMember.findUnique({
|
|
238
|
+
where: { id: memberIdBig },
|
|
239
|
+
});
|
|
240
|
+
if (!member || member.workspaceId !== workspaceIdBig)
|
|
241
|
+
throw new HttpError(404, "member not found in this workspace");
|
|
179
242
|
|
|
180
243
|
// Role assignments and direct grants belong to the membership, so they go with it — that is
|
|
181
244
|
// the point of hanging them off the member row. `onDelete: Cascade` on both join tables is
|