@prenta/core 7.7.1 → 7.7.2
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/CHANGELOG.md +6 -0
- package/dist/api/route-helpers/auth.d.ts +131 -0
- package/dist/api/route-helpers/auth.d.ts.map +1 -0
- package/dist/api/route-helpers/auth.js +505 -0
- package/dist/api/route-helpers/auth.js.map +1 -0
- package/dist/api/route-helpers/authoring.d.ts +32 -0
- package/dist/api/route-helpers/authoring.d.ts.map +1 -0
- package/dist/api/route-helpers/authoring.js +99 -0
- package/dist/api/route-helpers/authoring.js.map +1 -0
- package/dist/api/route-helpers/forms.d.ts +46 -0
- package/dist/api/route-helpers/forms.d.ts.map +1 -0
- package/dist/api/route-helpers/forms.js +435 -0
- package/dist/api/route-helpers/forms.js.map +1 -0
- package/dist/api/route-helpers/http.d.ts +87 -0
- package/dist/api/route-helpers/http.d.ts.map +1 -0
- package/dist/api/route-helpers/http.js +286 -0
- package/dist/api/route-helpers/http.js.map +1 -0
- package/dist/api/route-helpers/media.d.ts +37 -0
- package/dist/api/route-helpers/media.d.ts.map +1 -0
- package/dist/api/route-helpers/media.js +189 -0
- package/dist/api/route-helpers/media.js.map +1 -0
- package/dist/api/route-helpers/page-shape.d.ts +31 -0
- package/dist/api/route-helpers/page-shape.d.ts.map +1 -0
- package/dist/api/route-helpers/page-shape.js +98 -0
- package/dist/api/route-helpers/page-shape.js.map +1 -0
- package/dist/api/route-helpers.d.ts +8 -358
- package/dist/api/route-helpers.d.ts.map +1 -1
- package/dist/api/route-helpers.js +7 -1592
- package/dist/api/route-helpers.js.map +1 -1
- package/dist/api/routes/users/handlers/api-keys.d.ts +4 -0
- package/dist/api/routes/users/handlers/api-keys.d.ts.map +1 -0
- package/dist/api/routes/users/handlers/api-keys.js +164 -0
- package/dist/api/routes/users/handlers/api-keys.js.map +1 -0
- package/dist/api/routes/users/handlers/invites.d.ts +7 -0
- package/dist/api/routes/users/handlers/invites.d.ts.map +1 -0
- package/dist/api/routes/users/handlers/invites.js +201 -0
- package/dist/api/routes/users/handlers/invites.js.map +1 -0
- package/dist/api/routes/users/handlers/users-admin.d.ts +7 -0
- package/dist/api/routes/users/handlers/users-admin.d.ts.map +1 -0
- package/dist/api/routes/users/handlers/users-admin.js +310 -0
- package/dist/api/routes/users/handlers/users-admin.js.map +1 -0
- package/dist/api/routes/users/handlers/users-detail.d.ts +16 -0
- package/dist/api/routes/users/handlers/users-detail.d.ts.map +1 -0
- package/dist/api/routes/users/handlers/users-detail.js +525 -0
- package/dist/api/routes/users/handlers/users-detail.js.map +1 -0
- package/dist/api/routes/users.d.ts +4 -0
- package/dist/api/routes/users.d.ts.map +1 -1
- package/dist/api/routes/users.js +38 -1177
- package/dist/api/routes/users.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,525 @@
|
|
|
1
|
+
import { createPasswordReset } from '../../../../auth/reset.js';
|
|
2
|
+
import { getUserDetail, listUserSessions, listUserActivity, getUserPermissionView, transferContentOwnership, } from '../../../../auth/user-admin.js';
|
|
3
|
+
import { isOwnerRole } from '../../../../auth/roles.js';
|
|
4
|
+
import { logEvent } from '../../../../security/audit.js';
|
|
5
|
+
import { getPrentaConfig } from '../../../../config/runtime.js';
|
|
6
|
+
import { guardedDb } from '../../../guarded-db.js';
|
|
7
|
+
import { json, errorResponse, internalError, hasModel, modelNotAvailable, requirePasswordReauth, requireAuth, ADMIN_ROLES, requireRole, revokeUserApiKeys, teamOptionsFor, isEmailConfiguredAsync, clientIp, } from '../../../route-helpers.js';
|
|
8
|
+
import { transferContentBodySchema, validateBody } from '../../../validate-body.js';
|
|
9
|
+
const db = guardedDb;
|
|
10
|
+
// ---------------------------------------------------------------------------
|
|
11
|
+
// User detail drawer routes (overview / security / sessions / activity /
|
|
12
|
+
// permissions) + per-user security actions.
|
|
13
|
+
// ---------------------------------------------------------------------------
|
|
14
|
+
/**
|
|
15
|
+
* Load the target user for a security action and run the guards common to all
|
|
16
|
+
* of them. Returns either the user row or an error Response. `requireOwner`
|
|
17
|
+
* is set true for actions where acting on an Owner is owner-only; `blockSelf`
|
|
18
|
+
* for actions a user must not perform on their own account.
|
|
19
|
+
*/
|
|
20
|
+
async function loadActionTarget(auth, id, { blockSelf = false } = {}) {
|
|
21
|
+
const d = db();
|
|
22
|
+
if (!hasModel(d, 'user'))
|
|
23
|
+
return { error: modelNotAvailable('user') };
|
|
24
|
+
const user = await d.user.findUnique({ where: { id } });
|
|
25
|
+
if (!user)
|
|
26
|
+
return { error: errorResponse('User not found', 404) };
|
|
27
|
+
if (blockSelf && auth.session.userId === id) {
|
|
28
|
+
return { error: errorResponse('You cannot perform this action on your own account.', 400) };
|
|
29
|
+
}
|
|
30
|
+
// Acting on an Owner is Owner-only.
|
|
31
|
+
if (isOwnerRole(user.role) && auth.session.role !== 'OWNER') {
|
|
32
|
+
return { error: errorResponse('Only an Owner can manage another Owner.', 403) };
|
|
33
|
+
}
|
|
34
|
+
return { user };
|
|
35
|
+
}
|
|
36
|
+
/** Whether deactivating/suspending/locking `userId` would remove the last Owner. */
|
|
37
|
+
async function wouldOrphanOwnership(user, userId) {
|
|
38
|
+
if (!isOwnerRole(user.role))
|
|
39
|
+
return false;
|
|
40
|
+
const otherOwners = await db().user.count({
|
|
41
|
+
where: { role: 'OWNER', isActive: true, id: { not: userId } },
|
|
42
|
+
});
|
|
43
|
+
return otherOwners === 0;
|
|
44
|
+
}
|
|
45
|
+
export async function getUser(request, params) {
|
|
46
|
+
try {
|
|
47
|
+
const auth = await requireAuth(request);
|
|
48
|
+
if (auth.error)
|
|
49
|
+
return auth.error;
|
|
50
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
51
|
+
if (roleErr)
|
|
52
|
+
return roleErr;
|
|
53
|
+
const d = db();
|
|
54
|
+
if (!hasModel(d, 'user'))
|
|
55
|
+
return modelNotAvailable('user');
|
|
56
|
+
const opts = teamOptionsFor(auth.session);
|
|
57
|
+
const detail = await getUserDetail(d, params.id, {
|
|
58
|
+
workspaceDomain: opts.workspaceDomain,
|
|
59
|
+
currentUserId: auth.session.userId,
|
|
60
|
+
});
|
|
61
|
+
if (!detail)
|
|
62
|
+
return errorResponse('User not found', 404);
|
|
63
|
+
return json({ data: detail });
|
|
64
|
+
}
|
|
65
|
+
catch (err) {
|
|
66
|
+
return internalError(err, 'user detail');
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export async function getUserSessions(request, params) {
|
|
70
|
+
try {
|
|
71
|
+
const auth = await requireAuth(request);
|
|
72
|
+
if (auth.error)
|
|
73
|
+
return auth.error;
|
|
74
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
75
|
+
if (roleErr)
|
|
76
|
+
return roleErr;
|
|
77
|
+
const d = db();
|
|
78
|
+
if (!hasModel(d, 'session'))
|
|
79
|
+
return modelNotAvailable('session');
|
|
80
|
+
// Mark "this device" only when an admin views their own sessions.
|
|
81
|
+
const currentSessionId = auth.session.userId === params.id ? auth.session.sessionId : undefined;
|
|
82
|
+
const sessions = await listUserSessions(d, params.id, currentSessionId);
|
|
83
|
+
return json({ data: sessions });
|
|
84
|
+
}
|
|
85
|
+
catch (err) {
|
|
86
|
+
return internalError(err, 'user sessions');
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export async function deleteUserSession(request, params) {
|
|
90
|
+
try {
|
|
91
|
+
const auth = await requireAuth(request);
|
|
92
|
+
if (auth.error)
|
|
93
|
+
return auth.error;
|
|
94
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
95
|
+
if (roleErr)
|
|
96
|
+
return roleErr;
|
|
97
|
+
const d = db();
|
|
98
|
+
if (!hasModel(d, 'session'))
|
|
99
|
+
return modelNotAvailable('session');
|
|
100
|
+
const target = await loadActionTarget(auth, params.id);
|
|
101
|
+
if (target.error)
|
|
102
|
+
return target.error;
|
|
103
|
+
const session = await d.session.findUnique({ where: { id: params.sessionId } });
|
|
104
|
+
if (!session || session.userId !== params.id) {
|
|
105
|
+
return errorResponse('Session not found', 404);
|
|
106
|
+
}
|
|
107
|
+
await d.session.update({
|
|
108
|
+
where: { id: params.sessionId },
|
|
109
|
+
data: { revokedAt: new Date() },
|
|
110
|
+
});
|
|
111
|
+
await logEvent({
|
|
112
|
+
event: 'session_revoked',
|
|
113
|
+
userId: auth.session.userId,
|
|
114
|
+
ipAddress: clientIp(request),
|
|
115
|
+
userAgent: request.headers.get('user-agent') ?? undefined,
|
|
116
|
+
details: { targetUserId: params.id, sessionId: params.sessionId },
|
|
117
|
+
});
|
|
118
|
+
return json({ data: { success: true } });
|
|
119
|
+
}
|
|
120
|
+
catch (err) {
|
|
121
|
+
return internalError(err, 'revoke session');
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
export async function revokeUserSessions(request, params) {
|
|
125
|
+
try {
|
|
126
|
+
const auth = await requireAuth(request);
|
|
127
|
+
if (auth.error)
|
|
128
|
+
return auth.error;
|
|
129
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
130
|
+
if (roleErr)
|
|
131
|
+
return roleErr;
|
|
132
|
+
const d = db();
|
|
133
|
+
if (!hasModel(d, 'session'))
|
|
134
|
+
return modelNotAvailable('session');
|
|
135
|
+
const target = await loadActionTarget(auth, params.id);
|
|
136
|
+
if (target.error)
|
|
137
|
+
return target.error;
|
|
138
|
+
// When an admin revokes their own sessions, keep the current one so the
|
|
139
|
+
// action doesn't log them out mid-flow (the UI offers a separate path for
|
|
140
|
+
// that). For any other user, revoke everything.
|
|
141
|
+
const keepCurrent = auth.session.userId === params.id;
|
|
142
|
+
await d.session.updateMany({
|
|
143
|
+
where: {
|
|
144
|
+
userId: params.id,
|
|
145
|
+
revokedAt: null,
|
|
146
|
+
...(keepCurrent ? { id: { not: auth.session.sessionId } } : {}),
|
|
147
|
+
},
|
|
148
|
+
data: { revokedAt: new Date() },
|
|
149
|
+
});
|
|
150
|
+
await logEvent({
|
|
151
|
+
event: 'sessions_revoked_all',
|
|
152
|
+
userId: auth.session.userId,
|
|
153
|
+
ipAddress: clientIp(request),
|
|
154
|
+
userAgent: request.headers.get('user-agent') ?? undefined,
|
|
155
|
+
details: { targetUserId: params.id, keptCurrent: keepCurrent },
|
|
156
|
+
});
|
|
157
|
+
return json({ data: { success: true } });
|
|
158
|
+
}
|
|
159
|
+
catch (err) {
|
|
160
|
+
return internalError(err, 'revoke all sessions');
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
export async function getUserActivity(request, params) {
|
|
164
|
+
try {
|
|
165
|
+
const auth = await requireAuth(request);
|
|
166
|
+
if (auth.error)
|
|
167
|
+
return auth.error;
|
|
168
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
169
|
+
if (roleErr)
|
|
170
|
+
return roleErr;
|
|
171
|
+
const d = db();
|
|
172
|
+
if (!hasModel(d, 'auditLog'))
|
|
173
|
+
return json({ data: [] });
|
|
174
|
+
const url = new URL(request.url);
|
|
175
|
+
const limit = Number(url.searchParams.get('limit') ?? '50');
|
|
176
|
+
const events = await listUserActivity(d, params.id, Number.isFinite(limit) ? limit : 50);
|
|
177
|
+
return json({ data: events });
|
|
178
|
+
}
|
|
179
|
+
catch (err) {
|
|
180
|
+
return internalError(err, 'user activity');
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
export async function getUserPermissions(request, params) {
|
|
184
|
+
try {
|
|
185
|
+
const auth = await requireAuth(request);
|
|
186
|
+
if (auth.error)
|
|
187
|
+
return auth.error;
|
|
188
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
189
|
+
if (roleErr)
|
|
190
|
+
return roleErr;
|
|
191
|
+
const d = db();
|
|
192
|
+
if (!hasModel(d, 'user'))
|
|
193
|
+
return modelNotAvailable('user');
|
|
194
|
+
const user = await d.user.findUnique({
|
|
195
|
+
where: { id: params.id },
|
|
196
|
+
select: { role: true },
|
|
197
|
+
});
|
|
198
|
+
if (!user)
|
|
199
|
+
return errorResponse('User not found', 404);
|
|
200
|
+
return json({ data: getUserPermissionView(user.role) });
|
|
201
|
+
}
|
|
202
|
+
catch (err) {
|
|
203
|
+
return internalError(err, 'user permissions');
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
// Send a password reset email to the user. Admins never set or see passwords;
|
|
207
|
+
// this triggers the standard single-use, expiring, hashed-token reset flow.
|
|
208
|
+
export async function postUserPasswordReset(request, params) {
|
|
209
|
+
try {
|
|
210
|
+
const auth = await requireAuth(request);
|
|
211
|
+
if (auth.error)
|
|
212
|
+
return auth.error;
|
|
213
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
214
|
+
if (roleErr)
|
|
215
|
+
return roleErr;
|
|
216
|
+
const target = await loadActionTarget(auth, params.id);
|
|
217
|
+
if (target.error)
|
|
218
|
+
return target.error;
|
|
219
|
+
const user = target.user;
|
|
220
|
+
// SSO/OAuth-only accounts have no local password to reset.
|
|
221
|
+
if (!user.passwordHash) {
|
|
222
|
+
return errorResponse('This account signs in with an external identity provider and has no password to reset.', 409);
|
|
223
|
+
}
|
|
224
|
+
// Resetting an Admin/Owner password is high-impact — require reauth.
|
|
225
|
+
if (isOwnerRole(user.role) || String(user.role).toUpperCase() === 'ADMIN') {
|
|
226
|
+
const reauthErr = await requirePasswordReauth(request, auth.session.userId);
|
|
227
|
+
if (reauthErr)
|
|
228
|
+
return reauthErr;
|
|
229
|
+
}
|
|
230
|
+
if (!(await isEmailConfiguredAsync(db()))) {
|
|
231
|
+
return errorResponse('Email is not configured, so a reset link cannot be sent. Configure an email provider first.', 409);
|
|
232
|
+
}
|
|
233
|
+
const cmsConfig = getPrentaConfig();
|
|
234
|
+
const siteUrl = process.env.NEXT_PUBLIC_SITE_URL ?? new URL(request.url).origin;
|
|
235
|
+
await createPasswordReset(db(), user.email, {
|
|
236
|
+
siteUrl,
|
|
237
|
+
// Split-login installs serve the reset screen on the login mount.
|
|
238
|
+
adminPath: cmsConfig?.admin?.loginPath ?? cmsConfig?.admin?.path ?? '/admin',
|
|
239
|
+
platform: cmsConfig?.platform,
|
|
240
|
+
});
|
|
241
|
+
await logEvent({
|
|
242
|
+
event: 'password_reset_sent',
|
|
243
|
+
userId: auth.session.userId,
|
|
244
|
+
ipAddress: clientIp(request),
|
|
245
|
+
userAgent: request.headers.get('user-agent') ?? undefined,
|
|
246
|
+
details: { targetUserId: user.id, targetEmail: user.email },
|
|
247
|
+
});
|
|
248
|
+
return json({ data: { success: true, emailed: true } });
|
|
249
|
+
}
|
|
250
|
+
catch (err) {
|
|
251
|
+
return internalError(err, 'admin password reset');
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// Toggle "must reset password on next login". Body: { enabled: boolean }.
|
|
255
|
+
export async function postUserForcePasswordReset(request, params) {
|
|
256
|
+
try {
|
|
257
|
+
const auth = await requireAuth(request);
|
|
258
|
+
if (auth.error)
|
|
259
|
+
return auth.error;
|
|
260
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
261
|
+
if (roleErr)
|
|
262
|
+
return roleErr;
|
|
263
|
+
const target = await loadActionTarget(auth, params.id);
|
|
264
|
+
if (target.error)
|
|
265
|
+
return target.error;
|
|
266
|
+
const body = (await request.json().catch(() => ({})));
|
|
267
|
+
const enabled = body.enabled !== false;
|
|
268
|
+
await db().user.update({
|
|
269
|
+
where: { id: params.id },
|
|
270
|
+
data: { forcePasswordReset: enabled },
|
|
271
|
+
});
|
|
272
|
+
await logEvent({
|
|
273
|
+
event: enabled ? 'force_password_reset_enabled' : 'force_password_reset_cleared',
|
|
274
|
+
userId: auth.session.userId,
|
|
275
|
+
details: { targetUserId: params.id },
|
|
276
|
+
});
|
|
277
|
+
return json({ data: { success: true, forcePasswordReset: enabled } });
|
|
278
|
+
}
|
|
279
|
+
catch (err) {
|
|
280
|
+
return internalError(err, 'force password reset');
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
// Reset MFA enrollment: clears the TOTP secret + backup codes and revokes the
|
|
284
|
+
// user's sessions. High-impact — requires reauth and protects the last Owner.
|
|
285
|
+
export async function postUserMfaReset(request, params) {
|
|
286
|
+
try {
|
|
287
|
+
const auth = await requireAuth(request);
|
|
288
|
+
if (auth.error)
|
|
289
|
+
return auth.error;
|
|
290
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
291
|
+
if (roleErr)
|
|
292
|
+
return roleErr;
|
|
293
|
+
const target = await loadActionTarget(auth, params.id);
|
|
294
|
+
if (target.error)
|
|
295
|
+
return target.error;
|
|
296
|
+
const user = target.user;
|
|
297
|
+
const reauthErr = await requirePasswordReauth(request, auth.session.userId);
|
|
298
|
+
if (reauthErr)
|
|
299
|
+
return reauthErr;
|
|
300
|
+
// Don't strip the last Owner's MFA — that would leave the most privileged
|
|
301
|
+
// account with the weakest protection and no recovery-safe path.
|
|
302
|
+
if (isOwnerRole(user.role) && (await wouldOrphanOwnership(user, user.id))) {
|
|
303
|
+
return errorResponse('Cannot reset MFA for the last Owner. Add another Owner first.', 409);
|
|
304
|
+
}
|
|
305
|
+
const d = db();
|
|
306
|
+
await d.user.update({
|
|
307
|
+
where: { id: user.id },
|
|
308
|
+
data: { totpEnabled: false, totpSecret: null, backupCodes: null },
|
|
309
|
+
});
|
|
310
|
+
if (hasModel(d, 'session')) {
|
|
311
|
+
await d.session.updateMany({
|
|
312
|
+
where: { userId: user.id, revokedAt: null },
|
|
313
|
+
data: { revokedAt: new Date() },
|
|
314
|
+
});
|
|
315
|
+
}
|
|
316
|
+
await logEvent({
|
|
317
|
+
event: 'mfa_reset',
|
|
318
|
+
userId: auth.session.userId,
|
|
319
|
+
ipAddress: clientIp(request),
|
|
320
|
+
userAgent: request.headers.get('user-agent') ?? undefined,
|
|
321
|
+
details: { targetUserId: user.id, targetEmail: user.email },
|
|
322
|
+
});
|
|
323
|
+
return json({ data: { success: true } });
|
|
324
|
+
}
|
|
325
|
+
catch (err) {
|
|
326
|
+
return internalError(err, 'mfa reset');
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
// Require the user to enrol MFA before next access. Body: { required: boolean }.
|
|
330
|
+
export async function postUserRequireMfa(request, params) {
|
|
331
|
+
try {
|
|
332
|
+
const auth = await requireAuth(request);
|
|
333
|
+
if (auth.error)
|
|
334
|
+
return auth.error;
|
|
335
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
336
|
+
if (roleErr)
|
|
337
|
+
return roleErr;
|
|
338
|
+
const target = await loadActionTarget(auth, params.id);
|
|
339
|
+
if (target.error)
|
|
340
|
+
return target.error;
|
|
341
|
+
const body = (await request.json().catch(() => ({})));
|
|
342
|
+
const required = body.required !== false;
|
|
343
|
+
await db().user.update({
|
|
344
|
+
where: { id: params.id },
|
|
345
|
+
data: { mfaRequired: required },
|
|
346
|
+
});
|
|
347
|
+
await logEvent({
|
|
348
|
+
event: required ? 'mfa_required' : 'mfa_requirement_cleared',
|
|
349
|
+
userId: auth.session.userId,
|
|
350
|
+
details: { targetUserId: params.id },
|
|
351
|
+
});
|
|
352
|
+
return json({ data: { success: true, mfaRequired: required } });
|
|
353
|
+
}
|
|
354
|
+
catch (err) {
|
|
355
|
+
return internalError(err, 'require mfa');
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
export async function suspendUser(request, params) {
|
|
359
|
+
try {
|
|
360
|
+
const auth = await requireAuth(request);
|
|
361
|
+
if (auth.error)
|
|
362
|
+
return auth.error;
|
|
363
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
364
|
+
if (roleErr)
|
|
365
|
+
return roleErr;
|
|
366
|
+
const target = await loadActionTarget(auth, params.id, { blockSelf: true });
|
|
367
|
+
if (target.error)
|
|
368
|
+
return target.error;
|
|
369
|
+
if (await wouldOrphanOwnership(target.user, params.id)) {
|
|
370
|
+
return errorResponse('Cannot suspend the last Owner.', 409);
|
|
371
|
+
}
|
|
372
|
+
const d = db();
|
|
373
|
+
await d.user.update({ where: { id: params.id }, data: { suspendedAt: new Date() } });
|
|
374
|
+
if (hasModel(d, 'session')) {
|
|
375
|
+
await d.session.updateMany({
|
|
376
|
+
where: { userId: params.id, revokedAt: null },
|
|
377
|
+
data: { revokedAt: new Date() },
|
|
378
|
+
});
|
|
379
|
+
}
|
|
380
|
+
await revokeUserApiKeys(d, params.id);
|
|
381
|
+
await logEvent({
|
|
382
|
+
event: 'user_suspended',
|
|
383
|
+
userId: auth.session.userId,
|
|
384
|
+
details: { targetUserId: params.id, targetEmail: target.user.email },
|
|
385
|
+
});
|
|
386
|
+
return json({ data: { success: true } });
|
|
387
|
+
}
|
|
388
|
+
catch (err) {
|
|
389
|
+
return internalError(err, 'suspend user');
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
export async function reactivateUser(request, params) {
|
|
393
|
+
try {
|
|
394
|
+
const auth = await requireAuth(request);
|
|
395
|
+
if (auth.error)
|
|
396
|
+
return auth.error;
|
|
397
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
398
|
+
if (roleErr)
|
|
399
|
+
return roleErr;
|
|
400
|
+
const target = await loadActionTarget(auth, params.id);
|
|
401
|
+
if (target.error)
|
|
402
|
+
return target.error;
|
|
403
|
+
// Reactivate restores access from any non-active lifecycle state.
|
|
404
|
+
await db().user.update({
|
|
405
|
+
where: { id: params.id },
|
|
406
|
+
data: { suspendedAt: null, lockedAt: null, isActive: true, failedLoginCount: 0 },
|
|
407
|
+
});
|
|
408
|
+
await logEvent({
|
|
409
|
+
event: 'user_reactivated',
|
|
410
|
+
userId: auth.session.userId,
|
|
411
|
+
details: { targetUserId: params.id, targetEmail: target.user.email },
|
|
412
|
+
});
|
|
413
|
+
return json({ data: { success: true } });
|
|
414
|
+
}
|
|
415
|
+
catch (err) {
|
|
416
|
+
return internalError(err, 'reactivate user');
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
export async function lockUser(request, params) {
|
|
420
|
+
try {
|
|
421
|
+
const auth = await requireAuth(request);
|
|
422
|
+
if (auth.error)
|
|
423
|
+
return auth.error;
|
|
424
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
425
|
+
if (roleErr)
|
|
426
|
+
return roleErr;
|
|
427
|
+
const target = await loadActionTarget(auth, params.id, { blockSelf: true });
|
|
428
|
+
if (target.error)
|
|
429
|
+
return target.error;
|
|
430
|
+
if (await wouldOrphanOwnership(target.user, params.id)) {
|
|
431
|
+
return errorResponse('Cannot lock the last Owner.', 409);
|
|
432
|
+
}
|
|
433
|
+
const d = db();
|
|
434
|
+
await d.user.update({ where: { id: params.id }, data: { lockedAt: new Date() } });
|
|
435
|
+
if (hasModel(d, 'session')) {
|
|
436
|
+
await d.session.updateMany({
|
|
437
|
+
where: { userId: params.id, revokedAt: null },
|
|
438
|
+
data: { revokedAt: new Date() },
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
await revokeUserApiKeys(d, params.id);
|
|
442
|
+
await logEvent({
|
|
443
|
+
event: 'user_locked',
|
|
444
|
+
userId: auth.session.userId,
|
|
445
|
+
details: { targetUserId: params.id, targetEmail: target.user.email },
|
|
446
|
+
});
|
|
447
|
+
return json({ data: { success: true } });
|
|
448
|
+
}
|
|
449
|
+
catch (err) {
|
|
450
|
+
return internalError(err, 'lock user');
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
export async function unlockUser(request, params) {
|
|
454
|
+
try {
|
|
455
|
+
const auth = await requireAuth(request);
|
|
456
|
+
if (auth.error)
|
|
457
|
+
return auth.error;
|
|
458
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
459
|
+
if (roleErr)
|
|
460
|
+
return roleErr;
|
|
461
|
+
const target = await loadActionTarget(auth, params.id);
|
|
462
|
+
if (target.error)
|
|
463
|
+
return target.error;
|
|
464
|
+
await db().user.update({
|
|
465
|
+
where: { id: params.id },
|
|
466
|
+
data: { lockedAt: null, failedLoginCount: 0 },
|
|
467
|
+
});
|
|
468
|
+
await logEvent({
|
|
469
|
+
event: 'user_unlocked',
|
|
470
|
+
userId: auth.session.userId,
|
|
471
|
+
details: { targetUserId: params.id, targetEmail: target.user.email },
|
|
472
|
+
});
|
|
473
|
+
return json({ data: { success: true } });
|
|
474
|
+
}
|
|
475
|
+
catch (err) {
|
|
476
|
+
return internalError(err, 'unlock user');
|
|
477
|
+
}
|
|
478
|
+
}
|
|
479
|
+
// Reassign all content owned by :id to another active user. Used before
|
|
480
|
+
// removing someone so their documents/media/templates survive with a real
|
|
481
|
+
// owner. Body: { toUserId }.
|
|
482
|
+
export async function transferUserContent(request, params) {
|
|
483
|
+
try {
|
|
484
|
+
const auth = await requireAuth(request);
|
|
485
|
+
if (auth.error)
|
|
486
|
+
return auth.error;
|
|
487
|
+
const roleErr = requireRole(auth.session.role, ADMIN_ROLES);
|
|
488
|
+
if (roleErr)
|
|
489
|
+
return roleErr;
|
|
490
|
+
const target = await loadActionTarget(auth, params.id);
|
|
491
|
+
if (target.error)
|
|
492
|
+
return target.error;
|
|
493
|
+
const parsed = await validateBody(request, transferContentBodySchema);
|
|
494
|
+
if (!parsed.ok)
|
|
495
|
+
return parsed.error;
|
|
496
|
+
const { toUserId } = parsed.data;
|
|
497
|
+
if (toUserId === params.id) {
|
|
498
|
+
return errorResponse('Choose a different user to receive the content.', 400);
|
|
499
|
+
}
|
|
500
|
+
const recipient = await db().user.findUnique({ where: { id: toUserId } });
|
|
501
|
+
if (!recipient)
|
|
502
|
+
return errorResponse('Recipient not found.', 404);
|
|
503
|
+
if (recipient.isActive === false || recipient.suspendedAt || recipient.lockedAt) {
|
|
504
|
+
return errorResponse('Content can only be transferred to an active user.', 409);
|
|
505
|
+
}
|
|
506
|
+
const counts = await transferContentOwnership(db(), params.id, toUserId);
|
|
507
|
+
await logEvent({
|
|
508
|
+
event: 'content_ownership_transferred',
|
|
509
|
+
userId: auth.session.userId,
|
|
510
|
+
details: {
|
|
511
|
+
fromUserId: params.id,
|
|
512
|
+
toUserId,
|
|
513
|
+
documents: counts.documents,
|
|
514
|
+
media: counts.media,
|
|
515
|
+
templates: counts.templates,
|
|
516
|
+
total: counts.total,
|
|
517
|
+
},
|
|
518
|
+
});
|
|
519
|
+
return json({ data: { success: true, ...counts } });
|
|
520
|
+
}
|
|
521
|
+
catch (err) {
|
|
522
|
+
return internalError(err, 'transfer content ownership');
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
//# sourceMappingURL=users-detail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users-detail.js","sourceRoot":"","sources":["../../../../../src/api/routes/users/handlers/users-detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,7 @@
|
|
|
1
1
|
import type { ApiRouter } from '../router.js';
|
|
2
|
+
/**
|
|
3
|
+
* User, invite, and API-key routes. Handlers live under `./users/handlers`.
|
|
4
|
+
* Request behavior is unchanged.
|
|
5
|
+
*/
|
|
2
6
|
export declare function registerUserRoutes(router: ApiRouter): void;
|
|
3
7
|
//# sourceMappingURL=users.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/api/routes/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/api/routes/users.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAoC7C;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA+B1D"}
|