@rovela-ai/sdk 0.2.0 → 0.3.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/dist/admin/api/accept-invite.d.ts +65 -0
- package/dist/admin/api/accept-invite.d.ts.map +1 -0
- package/dist/admin/api/accept-invite.js +115 -0
- package/dist/admin/api/accept-invite.js.map +1 -0
- package/dist/admin/api/categories.d.ts.map +1 -1
- package/dist/admin/api/categories.js +21 -28
- package/dist/admin/api/categories.js.map +1 -1
- package/dist/admin/api/customers.d.ts.map +1 -1
- package/dist/admin/api/customers.js +17 -25
- package/dist/admin/api/customers.js.map +1 -1
- package/dist/admin/api/forgot-password.d.ts +39 -0
- package/dist/admin/api/forgot-password.d.ts.map +1 -0
- package/dist/admin/api/forgot-password.js +66 -0
- package/dist/admin/api/forgot-password.js.map +1 -0
- package/dist/admin/api/index.d.ts +6 -0
- package/dist/admin/api/index.d.ts.map +1 -1
- package/dist/admin/api/index.js +9 -0
- package/dist/admin/api/index.js.map +1 -1
- package/dist/admin/api/me.d.ts +72 -0
- package/dist/admin/api/me.d.ts.map +1 -0
- package/dist/admin/api/me.js +177 -0
- package/dist/admin/api/me.js.map +1 -0
- package/dist/admin/api/orders.d.ts.map +1 -1
- package/dist/admin/api/orders.js +21 -28
- package/dist/admin/api/orders.js.map +1 -1
- package/dist/admin/api/products.d.ts.map +1 -1
- package/dist/admin/api/products.js +33 -37
- package/dist/admin/api/products.js.map +1 -1
- package/dist/admin/api/refund.d.ts.map +1 -1
- package/dist/admin/api/refund.js +5 -7
- package/dist/admin/api/refund.js.map +1 -1
- package/dist/admin/api/reset-password.d.ts +49 -0
- package/dist/admin/api/reset-password.d.ts.map +1 -0
- package/dist/admin/api/reset-password.js +99 -0
- package/dist/admin/api/reset-password.js.map +1 -0
- package/dist/admin/api/return.d.ts.map +1 -1
- package/dist/admin/api/return.js +9 -12
- package/dist/admin/api/return.js.map +1 -1
- package/dist/admin/api/settings.d.ts.map +1 -1
- package/dist/admin/api/settings.js +9 -12
- package/dist/admin/api/settings.js.map +1 -1
- package/dist/admin/api/shipping.d.ts.map +1 -1
- package/dist/admin/api/shipping.js +65 -61
- package/dist/admin/api/shipping.js.map +1 -1
- package/dist/admin/api/stats.d.ts.map +1 -1
- package/dist/admin/api/stats.js +5 -7
- package/dist/admin/api/stats.js.map +1 -1
- package/dist/admin/api/stripe-status.d.ts.map +1 -1
- package/dist/admin/api/stripe-status.js +5 -7
- package/dist/admin/api/stripe-status.js.map +1 -1
- package/dist/admin/api/tax-zones.d.ts.map +1 -1
- package/dist/admin/api/tax-zones.js +21 -28
- package/dist/admin/api/tax-zones.js.map +1 -1
- package/dist/admin/api/users.d.ts +142 -0
- package/dist/admin/api/users.d.ts.map +1 -0
- package/dist/admin/api/users.js +356 -0
- package/dist/admin/api/users.js.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
- package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
- package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
- package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
- package/dist/admin/components/AdminAccountPage.d.ts +10 -0
- package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
- package/dist/admin/components/AdminAccountPage.js +123 -0
- package/dist/admin/components/AdminAccountPage.js.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
- package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
- package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminNav.d.ts.map +1 -1
- package/dist/admin/components/AdminNav.js +39 -8
- package/dist/admin/components/AdminNav.js.map +1 -1
- package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
- package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
- package/dist/admin/components/AdminResetPasswordForm.js +134 -0
- package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
- package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
- package/dist/admin/components/AdminUserMenu.js +2 -2
- package/dist/admin/components/AdminUserMenu.js.map +1 -1
- package/dist/admin/components/InviteUserDialog.d.ts +3 -0
- package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
- package/dist/admin/components/InviteUserDialog.js +127 -0
- package/dist/admin/components/InviteUserDialog.js.map +1 -0
- package/dist/admin/components/UsersTable.d.ts +3 -0
- package/dist/admin/components/UsersTable.d.ts.map +1 -0
- package/dist/admin/components/UsersTable.js +399 -0
- package/dist/admin/components/UsersTable.js.map +1 -0
- package/dist/admin/components/index.d.ts +9 -0
- package/dist/admin/components/index.d.ts.map +1 -1
- package/dist/admin/components/index.js +9 -0
- package/dist/admin/components/index.js.map +1 -1
- package/dist/admin/config.d.ts.map +1 -1
- package/dist/admin/config.js +23 -1
- package/dist/admin/config.js.map +1 -1
- package/dist/admin/hooks/index.d.ts +4 -0
- package/dist/admin/hooks/index.d.ts.map +1 -1
- package/dist/admin/hooks/index.js +3 -0
- package/dist/admin/hooks/index.js.map +1 -1
- package/dist/admin/hooks/useAdminMe.d.ts +31 -0
- package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminMe.js +103 -0
- package/dist/admin/hooks/useAdminMe.js.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
- package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminPermissions.js +51 -0
- package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
- package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
- package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
- package/dist/admin/hooks/useAdminUsers.js +240 -0
- package/dist/admin/hooks/useAdminUsers.js.map +1 -0
- package/dist/admin/index.d.ts +4 -4
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +20 -2
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/permissions.d.ts +92 -0
- package/dist/admin/permissions.d.ts.map +1 -0
- package/dist/admin/permissions.js +201 -0
- package/dist/admin/permissions.js.map +1 -0
- package/dist/admin/server/admin-invite.d.ts +122 -0
- package/dist/admin/server/admin-invite.d.ts.map +1 -0
- package/dist/admin/server/admin-invite.js +235 -0
- package/dist/admin/server/admin-invite.js.map +1 -0
- package/dist/admin/server/admin-password-reset.d.ts +87 -0
- package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
- package/dist/admin/server/admin-password-reset.js +220 -0
- package/dist/admin/server/admin-password-reset.js.map +1 -0
- package/dist/admin/server/admin-self-service.d.ts +86 -0
- package/dist/admin/server/admin-self-service.d.ts.map +1 -0
- package/dist/admin/server/admin-self-service.js +188 -0
- package/dist/admin/server/admin-self-service.js.map +1 -0
- package/dist/admin/server/admin-service.d.ts.map +1 -1
- package/dist/admin/server/admin-service.js +21 -2
- package/dist/admin/server/admin-service.js.map +1 -1
- package/dist/admin/server/admin-session.d.ts +126 -0
- package/dist/admin/server/admin-session.d.ts.map +1 -0
- package/dist/admin/server/admin-session.js +215 -0
- package/dist/admin/server/admin-session.js.map +1 -0
- package/dist/admin/server/index.d.ts +7 -0
- package/dist/admin/server/index.d.ts.map +1 -1
- package/dist/admin/server/index.js +20 -0
- package/dist/admin/server/index.js.map +1 -1
- package/dist/admin/server/user-management.d.ts +223 -0
- package/dist/admin/server/user-management.d.ts.map +1 -0
- package/dist/admin/server/user-management.js +846 -0
- package/dist/admin/server/user-management.js.map +1 -0
- package/dist/admin/types.d.ts +153 -2
- package/dist/admin/types.d.ts.map +1 -1
- package/dist/core/db/queries.d.ts +19 -13
- package/dist/core/db/queries.d.ts.map +1 -1
- package/dist/core/db/schema.d.ts +327 -9
- package/dist/core/db/schema.d.ts.map +1 -1
- package/dist/core/db/schema.js +80 -3
- package/dist/core/db/schema.js.map +1 -1
- package/dist/core/types.d.ts +19 -3
- package/dist/core/types.d.ts.map +1 -1
- package/dist/emails/index.d.ts +2 -2
- package/dist/emails/index.d.ts.map +1 -1
- package/dist/emails/index.js +3 -1
- package/dist/emails/index.js.map +1 -1
- package/dist/emails/send/admin-auth.d.ts +94 -0
- package/dist/emails/send/admin-auth.d.ts.map +1 -0
- package/dist/emails/send/admin-auth.js +118 -0
- package/dist/emails/send/admin-auth.js.map +1 -0
- package/dist/emails/send/index.d.ts +2 -0
- package/dist/emails/send/index.d.ts.map +1 -1
- package/dist/emails/send/index.js +4 -0
- package/dist/emails/send/index.js.map +1 -1
- package/dist/emails/templates/admin-invite.d.ts +40 -0
- package/dist/emails/templates/admin-invite.d.ts.map +1 -0
- package/dist/emails/templates/admin-invite.js +62 -0
- package/dist/emails/templates/admin-invite.js.map +1 -0
- package/dist/emails/templates/index.d.ts +1 -0
- package/dist/emails/templates/index.d.ts.map +1 -1
- package/dist/emails/templates/index.js +4 -0
- package/dist/emails/templates/index.js.map +1 -1
- package/dist/emails/types.d.ts +22 -1
- package/dist/emails/types.d.ts.map +1 -1
- package/package.json +21 -1
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/users
|
|
3
|
+
*
|
|
4
|
+
* API route handlers for admin user management.
|
|
5
|
+
*
|
|
6
|
+
* Routes exposed:
|
|
7
|
+
* GET /api/admin/users — list all admins (owner + administrator)
|
|
8
|
+
* GET /api/admin/users/[id] — detail
|
|
9
|
+
* PATCH /api/admin/users/[id] — action-based: { action: "deactivate" | "reactivate" }
|
|
10
|
+
* DELETE /api/admin/users/[id] — hard delete (owner only, prior deactivation required)
|
|
11
|
+
*
|
|
12
|
+
* All business logic lives in `admin/server/user-management.ts`. These
|
|
13
|
+
* handlers only: parse input, gate on `requireAdmin({ permission })`, call
|
|
14
|
+
* the service, serialize the response, and map error codes to HTTP status.
|
|
15
|
+
*
|
|
16
|
+
* Phase 3 will add `{ action: "change_role", role: "manager" }` to PATCH
|
|
17
|
+
* and a POST route for invites. No structural changes needed for Phase 3 —
|
|
18
|
+
* the discriminated action pattern extends naturally.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // app/api/admin/users/route.ts
|
|
23
|
+
* export { GET } from '@rovela-ai/sdk/admin/api/users'
|
|
24
|
+
*
|
|
25
|
+
* // app/api/admin/users/[id]/route.ts
|
|
26
|
+
* export { getUser as GET, PATCH, DELETE } from '@rovela-ai/sdk/admin/api/users'
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
30
|
+
import type { AdminRole } from '../../core/types';
|
|
31
|
+
import type { AdminApiError, PaginatedResponse } from '../types';
|
|
32
|
+
export declare const runtime = "nodejs";
|
|
33
|
+
/**
|
|
34
|
+
* Safe projection of a store admin — strips `passwordHash` and normalizes
|
|
35
|
+
* dates to ISO strings for JSON serialization.
|
|
36
|
+
*/
|
|
37
|
+
export interface AdminListItem {
|
|
38
|
+
id: string;
|
|
39
|
+
email: string;
|
|
40
|
+
name: string;
|
|
41
|
+
role: AdminRole;
|
|
42
|
+
status: 'active' | 'invited' | 'deactivated';
|
|
43
|
+
createdBy: string | null;
|
|
44
|
+
createdAt: string;
|
|
45
|
+
lastLoginAt: string | null;
|
|
46
|
+
deactivatedAt: string | null;
|
|
47
|
+
deactivatedBy: string | null;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* GET /api/admin/users
|
|
51
|
+
*
|
|
52
|
+
* Query parameters:
|
|
53
|
+
* search — ilike substring match against email OR name
|
|
54
|
+
* status — 'all' | 'active' | 'invited' | 'deactivated' (default: 'all')
|
|
55
|
+
* role — 'all' | 'owner' | 'administrator' | 'manager' | 'user' (default: 'all')
|
|
56
|
+
* page — 1-indexed page number (default: 1)
|
|
57
|
+
* limit — page size, max 100 (default: 20)
|
|
58
|
+
*
|
|
59
|
+
* Response: PaginatedResponse<AdminListItem>
|
|
60
|
+
*
|
|
61
|
+
* Requires: `users.read` (owner + administrator).
|
|
62
|
+
*/
|
|
63
|
+
export declare function GET(request: NextRequest): Promise<NextResponse<PaginatedResponse<AdminListItem> | AdminApiError>>;
|
|
64
|
+
/**
|
|
65
|
+
* GET /api/admin/users/[id]
|
|
66
|
+
*
|
|
67
|
+
* Requires: `users.read`.
|
|
68
|
+
*/
|
|
69
|
+
export declare function getUser(_request: NextRequest, { params }: {
|
|
70
|
+
params: Promise<{
|
|
71
|
+
id: string;
|
|
72
|
+
}>;
|
|
73
|
+
}): Promise<NextResponse<{
|
|
74
|
+
data: AdminListItem;
|
|
75
|
+
} | AdminApiError>>;
|
|
76
|
+
/**
|
|
77
|
+
* POST /api/admin/users
|
|
78
|
+
*
|
|
79
|
+
* Body: `{ email, name, role }`
|
|
80
|
+
*
|
|
81
|
+
* Creates an admin row in `invited` status, issues a 72h invite token,
|
|
82
|
+
* and sends the invite email. Returns the invite URL in the response so
|
|
83
|
+
* the caller can show a "copy link manually" fallback if email delivery
|
|
84
|
+
* is unreliable.
|
|
85
|
+
*
|
|
86
|
+
* Requires: `users.write` (owner + administrator). The service layer
|
|
87
|
+
* additionally enforces `canManageUser({role})` — administrators can only
|
|
88
|
+
* invite managers and users.
|
|
89
|
+
*/
|
|
90
|
+
export declare function POST(request: NextRequest): Promise<NextResponse<{
|
|
91
|
+
success: boolean;
|
|
92
|
+
adminId: string;
|
|
93
|
+
inviteUrl: string;
|
|
94
|
+
message: string;
|
|
95
|
+
} | AdminApiError>>;
|
|
96
|
+
/**
|
|
97
|
+
* PATCH /api/admin/users/[id]
|
|
98
|
+
*
|
|
99
|
+
* Body:
|
|
100
|
+
* { "action": "deactivate" } — Phase 2
|
|
101
|
+
* { "action": "reactivate" } — Phase 2
|
|
102
|
+
* { "action": "change_role", "role": "manager" } — Phase 3
|
|
103
|
+
* { "action": "resend_invite" } — Phase 3
|
|
104
|
+
* { "action": "cancel_invite" } — Phase 3
|
|
105
|
+
*
|
|
106
|
+
* The action discriminator keeps the contract explicit: each action has
|
|
107
|
+
* its own invariants enforced by the service layer. Every action other
|
|
108
|
+
* than `resend_invite` returns `{success: true}` on success.
|
|
109
|
+
* `resend_invite` additionally returns the new inviteUrl so the UI can
|
|
110
|
+
* display a copy-link fallback, matching the POST (invite) shape.
|
|
111
|
+
*
|
|
112
|
+
* Requires: `users.write` (owner + administrator). The service layer
|
|
113
|
+
* additionally enforces `canManageUser` — administrators cannot touch
|
|
114
|
+
* owners or other administrators.
|
|
115
|
+
*/
|
|
116
|
+
export declare function PATCH(request: NextRequest, { params }: {
|
|
117
|
+
params: Promise<{
|
|
118
|
+
id: string;
|
|
119
|
+
}>;
|
|
120
|
+
}): Promise<NextResponse<{
|
|
121
|
+
success: boolean;
|
|
122
|
+
inviteUrl?: string;
|
|
123
|
+
} | AdminApiError>>;
|
|
124
|
+
/**
|
|
125
|
+
* DELETE /api/admin/users/[id]
|
|
126
|
+
*
|
|
127
|
+
* Permanently removes the admin row + cascaded tokens. Requires:
|
|
128
|
+
* - `users.delete` permission (owner only — enforced by the permission matrix)
|
|
129
|
+
* - Target must already be in 'deactivated' status
|
|
130
|
+
* - Target cannot be the actor themselves
|
|
131
|
+
*
|
|
132
|
+
* The service layer re-checks all invariants. Safe to call from any future
|
|
133
|
+
* caller (CLI, scripts) as long as they pass a proper actor.
|
|
134
|
+
*/
|
|
135
|
+
export declare function DELETE(_request: NextRequest, { params }: {
|
|
136
|
+
params: Promise<{
|
|
137
|
+
id: string;
|
|
138
|
+
}>;
|
|
139
|
+
}): Promise<NextResponse<{
|
|
140
|
+
success: boolean;
|
|
141
|
+
} | AdminApiError>>;
|
|
142
|
+
//# sourceMappingURL=users.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../../src/admin/api/users.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAiBvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAGhE,eAAO,MAAM,OAAO,WAAW,CAAA;AAM/B;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;IACf,MAAM,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAA;IAC5C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAC7B;AAgCD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,aAAa,CAAC,GAAG,aAAa,CAAC,CAAC,CAyCzE;AAMD;;;;GAIG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,WAAW,EACrB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,CAAC;IAAE,IAAI,EAAE,aAAa,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CAyBhE;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CACR,YAAY,CACR;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACzE,aAAa,CAChB,CACF,CA2DA;AAaD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,KAAK,CACzB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CACR,YAAY,CACR;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GACxC,aAAa,CAChB,CACF,CAiGA;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,MAAM,CAC1B,QAAQ,EAAE,WAAW,EACrB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,CAAC;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CA6B7D"}
|
|
@@ -0,0 +1,356 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/users
|
|
3
|
+
*
|
|
4
|
+
* API route handlers for admin user management.
|
|
5
|
+
*
|
|
6
|
+
* Routes exposed:
|
|
7
|
+
* GET /api/admin/users — list all admins (owner + administrator)
|
|
8
|
+
* GET /api/admin/users/[id] — detail
|
|
9
|
+
* PATCH /api/admin/users/[id] — action-based: { action: "deactivate" | "reactivate" }
|
|
10
|
+
* DELETE /api/admin/users/[id] — hard delete (owner only, prior deactivation required)
|
|
11
|
+
*
|
|
12
|
+
* All business logic lives in `admin/server/user-management.ts`. These
|
|
13
|
+
* handlers only: parse input, gate on `requireAdmin({ permission })`, call
|
|
14
|
+
* the service, serialize the response, and map error codes to HTTP status.
|
|
15
|
+
*
|
|
16
|
+
* Phase 3 will add `{ action: "change_role", role: "manager" }` to PATCH
|
|
17
|
+
* and a POST route for invites. No structural changes needed for Phase 3 —
|
|
18
|
+
* the discriminated action pattern extends naturally.
|
|
19
|
+
*
|
|
20
|
+
* Usage:
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // app/api/admin/users/route.ts
|
|
23
|
+
* export { GET } from '@rovela-ai/sdk/admin/api/users'
|
|
24
|
+
*
|
|
25
|
+
* // app/api/admin/users/[id]/route.ts
|
|
26
|
+
* export { getUser as GET, PATCH, DELETE } from '@rovela-ai/sdk/admin/api/users'
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
import { NextResponse } from 'next/server';
|
|
30
|
+
import { requireAdmin } from '../server/admin-session';
|
|
31
|
+
import { listAdmins, deactivateAdmin, reactivateAdmin, hardDeleteAdmin, statusCodeFor, inviteAdmin, resendAdminInvite, cancelAdminInvite, changeAdminRole, } from '../server/user-management';
|
|
32
|
+
import { findAdminById } from '../server/admin-service';
|
|
33
|
+
import { canonicalRole } from '../permissions';
|
|
34
|
+
export const runtime = 'nodejs';
|
|
35
|
+
function toListItem(admin) {
|
|
36
|
+
return {
|
|
37
|
+
id: admin.id,
|
|
38
|
+
email: admin.email,
|
|
39
|
+
name: admin.name,
|
|
40
|
+
role: admin.role,
|
|
41
|
+
status: admin.status,
|
|
42
|
+
createdBy: admin.createdBy ?? null,
|
|
43
|
+
createdAt: admin.createdAt instanceof Date
|
|
44
|
+
? admin.createdAt.toISOString()
|
|
45
|
+
: String(admin.createdAt),
|
|
46
|
+
lastLoginAt: admin.lastLoginAt
|
|
47
|
+
? admin.lastLoginAt instanceof Date
|
|
48
|
+
? admin.lastLoginAt.toISOString()
|
|
49
|
+
: String(admin.lastLoginAt)
|
|
50
|
+
: null,
|
|
51
|
+
deactivatedAt: admin.deactivatedAt
|
|
52
|
+
? admin.deactivatedAt instanceof Date
|
|
53
|
+
? admin.deactivatedAt.toISOString()
|
|
54
|
+
: String(admin.deactivatedAt)
|
|
55
|
+
: null,
|
|
56
|
+
deactivatedBy: admin.deactivatedBy ?? null,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
// =============================================================================
|
|
60
|
+
// List
|
|
61
|
+
// =============================================================================
|
|
62
|
+
/**
|
|
63
|
+
* GET /api/admin/users
|
|
64
|
+
*
|
|
65
|
+
* Query parameters:
|
|
66
|
+
* search — ilike substring match against email OR name
|
|
67
|
+
* status — 'all' | 'active' | 'invited' | 'deactivated' (default: 'all')
|
|
68
|
+
* role — 'all' | 'owner' | 'administrator' | 'manager' | 'user' (default: 'all')
|
|
69
|
+
* page — 1-indexed page number (default: 1)
|
|
70
|
+
* limit — page size, max 100 (default: 20)
|
|
71
|
+
*
|
|
72
|
+
* Response: PaginatedResponse<AdminListItem>
|
|
73
|
+
*
|
|
74
|
+
* Requires: `users.read` (owner + administrator).
|
|
75
|
+
*/
|
|
76
|
+
export async function GET(request) {
|
|
77
|
+
const guard = await requireAdmin({ permission: 'users.read' });
|
|
78
|
+
if (!guard.ok) {
|
|
79
|
+
return guard.response;
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const searchParams = request.nextUrl.searchParams;
|
|
83
|
+
const page = Math.max(1, parseInt(searchParams.get('page') || '1', 10));
|
|
84
|
+
const limit = Math.min(100, Math.max(1, parseInt(searchParams.get('limit') || '20', 10)));
|
|
85
|
+
const offset = (page - 1) * limit;
|
|
86
|
+
const search = searchParams.get('search') || undefined;
|
|
87
|
+
const statusParam = searchParams.get('status');
|
|
88
|
+
const status = isValidStatus(statusParam) ? statusParam : 'all';
|
|
89
|
+
const roleParam = searchParams.get('role');
|
|
90
|
+
const role = isValidRoleFilter(roleParam) ? roleParam : 'all';
|
|
91
|
+
const opts = { search, status, role, limit, offset };
|
|
92
|
+
const { admins, total } = await listAdmins(opts);
|
|
93
|
+
return NextResponse.json({
|
|
94
|
+
data: admins.map(toListItem),
|
|
95
|
+
total,
|
|
96
|
+
page,
|
|
97
|
+
pageSize: limit,
|
|
98
|
+
hasMore: offset + admins.length < total,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error('[Admin Users API] GET error:', error);
|
|
103
|
+
return NextResponse.json({ error: 'Failed to fetch users', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// =============================================================================
|
|
107
|
+
// Detail
|
|
108
|
+
// =============================================================================
|
|
109
|
+
/**
|
|
110
|
+
* GET /api/admin/users/[id]
|
|
111
|
+
*
|
|
112
|
+
* Requires: `users.read`.
|
|
113
|
+
*/
|
|
114
|
+
export async function getUser(_request, { params }) {
|
|
115
|
+
const guard = await requireAdmin({ permission: 'users.read' });
|
|
116
|
+
if (!guard.ok) {
|
|
117
|
+
return guard.response;
|
|
118
|
+
}
|
|
119
|
+
try {
|
|
120
|
+
const { id } = await params;
|
|
121
|
+
const admin = await findAdminById(id);
|
|
122
|
+
if (!admin) {
|
|
123
|
+
return NextResponse.json({ error: 'Admin not found', code: 'NOT_FOUND' }, { status: 404 });
|
|
124
|
+
}
|
|
125
|
+
return NextResponse.json({ data: toListItem(admin) });
|
|
126
|
+
}
|
|
127
|
+
catch (error) {
|
|
128
|
+
console.error('[Admin Users API] getUser error:', error);
|
|
129
|
+
return NextResponse.json({ error: 'Failed to fetch user', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// =============================================================================
|
|
133
|
+
// POST — Invite a new admin (Phase 3)
|
|
134
|
+
// =============================================================================
|
|
135
|
+
/**
|
|
136
|
+
* POST /api/admin/users
|
|
137
|
+
*
|
|
138
|
+
* Body: `{ email, name, role }`
|
|
139
|
+
*
|
|
140
|
+
* Creates an admin row in `invited` status, issues a 72h invite token,
|
|
141
|
+
* and sends the invite email. Returns the invite URL in the response so
|
|
142
|
+
* the caller can show a "copy link manually" fallback if email delivery
|
|
143
|
+
* is unreliable.
|
|
144
|
+
*
|
|
145
|
+
* Requires: `users.write` (owner + administrator). The service layer
|
|
146
|
+
* additionally enforces `canManageUser({role})` — administrators can only
|
|
147
|
+
* invite managers and users.
|
|
148
|
+
*/
|
|
149
|
+
export async function POST(request) {
|
|
150
|
+
const guard = await requireAdmin({ permission: 'users.write' });
|
|
151
|
+
if (!guard.ok) {
|
|
152
|
+
return guard.response;
|
|
153
|
+
}
|
|
154
|
+
const actor = {
|
|
155
|
+
id: guard.admin.id,
|
|
156
|
+
role: canonicalRole(guard.admin.role),
|
|
157
|
+
};
|
|
158
|
+
try {
|
|
159
|
+
const body = (await request.json().catch(() => null));
|
|
160
|
+
const email = typeof body?.email === 'string' ? body.email : '';
|
|
161
|
+
const name = typeof body?.name === 'string' ? body.name : '';
|
|
162
|
+
const role = typeof body?.role === 'string' ? body.role : '';
|
|
163
|
+
if (!email || !name || !role) {
|
|
164
|
+
return NextResponse.json({
|
|
165
|
+
error: 'email, name, and role are required.',
|
|
166
|
+
code: 'VALIDATION_ERROR',
|
|
167
|
+
}, { status: 400 });
|
|
168
|
+
}
|
|
169
|
+
// Service does the actual format + role-value validation
|
|
170
|
+
const result = await inviteAdmin(actor, {
|
|
171
|
+
email,
|
|
172
|
+
name,
|
|
173
|
+
role: role,
|
|
174
|
+
});
|
|
175
|
+
if (!result.ok) {
|
|
176
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
177
|
+
}
|
|
178
|
+
return NextResponse.json({
|
|
179
|
+
success: true,
|
|
180
|
+
adminId: result.adminId,
|
|
181
|
+
inviteUrl: result.inviteUrl,
|
|
182
|
+
message: 'Invite sent successfully.',
|
|
183
|
+
}, { status: 201 });
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
console.error('[Admin Users API] POST (invite) error:', error);
|
|
187
|
+
return NextResponse.json({ error: 'Failed to send invite', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* PATCH /api/admin/users/[id]
|
|
192
|
+
*
|
|
193
|
+
* Body:
|
|
194
|
+
* { "action": "deactivate" } — Phase 2
|
|
195
|
+
* { "action": "reactivate" } — Phase 2
|
|
196
|
+
* { "action": "change_role", "role": "manager" } — Phase 3
|
|
197
|
+
* { "action": "resend_invite" } — Phase 3
|
|
198
|
+
* { "action": "cancel_invite" } — Phase 3
|
|
199
|
+
*
|
|
200
|
+
* The action discriminator keeps the contract explicit: each action has
|
|
201
|
+
* its own invariants enforced by the service layer. Every action other
|
|
202
|
+
* than `resend_invite` returns `{success: true}` on success.
|
|
203
|
+
* `resend_invite` additionally returns the new inviteUrl so the UI can
|
|
204
|
+
* display a copy-link fallback, matching the POST (invite) shape.
|
|
205
|
+
*
|
|
206
|
+
* Requires: `users.write` (owner + administrator). The service layer
|
|
207
|
+
* additionally enforces `canManageUser` — administrators cannot touch
|
|
208
|
+
* owners or other administrators.
|
|
209
|
+
*/
|
|
210
|
+
export async function PATCH(request, { params }) {
|
|
211
|
+
const guard = await requireAdmin({ permission: 'users.write' });
|
|
212
|
+
if (!guard.ok) {
|
|
213
|
+
return guard.response;
|
|
214
|
+
}
|
|
215
|
+
const actor = {
|
|
216
|
+
id: guard.admin.id,
|
|
217
|
+
role: canonicalRole(guard.admin.role),
|
|
218
|
+
};
|
|
219
|
+
try {
|
|
220
|
+
const { id } = await params;
|
|
221
|
+
const body = (await request.json().catch(() => null));
|
|
222
|
+
const action = typeof body?.action === 'string' ? body.action : '';
|
|
223
|
+
if (!isValidPatchAction(action)) {
|
|
224
|
+
return NextResponse.json({
|
|
225
|
+
error: 'Invalid or missing action. Expected "deactivate", "reactivate", "change_role", "resend_invite", or "cancel_invite".',
|
|
226
|
+
code: 'VALIDATION_ERROR',
|
|
227
|
+
}, { status: 400 });
|
|
228
|
+
}
|
|
229
|
+
// ---- Branch on action ------------------------------------------------
|
|
230
|
+
if (action === 'deactivate') {
|
|
231
|
+
const result = await deactivateAdmin(actor, id);
|
|
232
|
+
if (!result.ok) {
|
|
233
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
234
|
+
}
|
|
235
|
+
return NextResponse.json({ success: true });
|
|
236
|
+
}
|
|
237
|
+
if (action === 'reactivate') {
|
|
238
|
+
const result = await reactivateAdmin(actor, id);
|
|
239
|
+
if (!result.ok) {
|
|
240
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
241
|
+
}
|
|
242
|
+
return NextResponse.json({ success: true });
|
|
243
|
+
}
|
|
244
|
+
if (action === 'change_role') {
|
|
245
|
+
const newRole = typeof body?.role === 'string' ? body.role : '';
|
|
246
|
+
if (!newRole) {
|
|
247
|
+
return NextResponse.json({ error: 'role is required for change_role.', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
248
|
+
}
|
|
249
|
+
const result = await changeAdminRole(actor, id, newRole);
|
|
250
|
+
if (!result.ok) {
|
|
251
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
252
|
+
}
|
|
253
|
+
return NextResponse.json({ success: true });
|
|
254
|
+
}
|
|
255
|
+
if (action === 'resend_invite') {
|
|
256
|
+
const result = await resendAdminInvite(actor, id);
|
|
257
|
+
if (!result.ok) {
|
|
258
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
259
|
+
}
|
|
260
|
+
return NextResponse.json({ success: true, inviteUrl: result.inviteUrl });
|
|
261
|
+
}
|
|
262
|
+
// action === 'cancel_invite'
|
|
263
|
+
const result = await cancelAdminInvite(actor, id);
|
|
264
|
+
if (!result.ok) {
|
|
265
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
266
|
+
}
|
|
267
|
+
return NextResponse.json({ success: true });
|
|
268
|
+
}
|
|
269
|
+
catch (error) {
|
|
270
|
+
console.error('[Admin Users API] PATCH error:', error);
|
|
271
|
+
return NextResponse.json({ error: 'Failed to update user', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
// =============================================================================
|
|
275
|
+
// DELETE (hard delete, owner-only)
|
|
276
|
+
// =============================================================================
|
|
277
|
+
/**
|
|
278
|
+
* DELETE /api/admin/users/[id]
|
|
279
|
+
*
|
|
280
|
+
* Permanently removes the admin row + cascaded tokens. Requires:
|
|
281
|
+
* - `users.delete` permission (owner only — enforced by the permission matrix)
|
|
282
|
+
* - Target must already be in 'deactivated' status
|
|
283
|
+
* - Target cannot be the actor themselves
|
|
284
|
+
*
|
|
285
|
+
* The service layer re-checks all invariants. Safe to call from any future
|
|
286
|
+
* caller (CLI, scripts) as long as they pass a proper actor.
|
|
287
|
+
*/
|
|
288
|
+
export async function DELETE(_request, { params }) {
|
|
289
|
+
const guard = await requireAdmin({ permission: 'users.delete' });
|
|
290
|
+
if (!guard.ok) {
|
|
291
|
+
return guard.response;
|
|
292
|
+
}
|
|
293
|
+
const actor = {
|
|
294
|
+
id: guard.admin.id,
|
|
295
|
+
role: canonicalRole(guard.admin.role),
|
|
296
|
+
};
|
|
297
|
+
try {
|
|
298
|
+
const { id } = await params;
|
|
299
|
+
const result = await hardDeleteAdmin(actor, id);
|
|
300
|
+
if (!result.ok) {
|
|
301
|
+
return NextResponse.json({ error: result.error.message, code: mapErrorCode(result.error.code) }, { status: statusCodeFor(result.error.code) });
|
|
302
|
+
}
|
|
303
|
+
return NextResponse.json({ success: true });
|
|
304
|
+
}
|
|
305
|
+
catch (error) {
|
|
306
|
+
console.error('[Admin Users API] DELETE error:', error);
|
|
307
|
+
return NextResponse.json({ error: 'Failed to delete user', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// =============================================================================
|
|
311
|
+
// Internal helpers
|
|
312
|
+
// =============================================================================
|
|
313
|
+
function isValidStatus(v) {
|
|
314
|
+
return v === 'all' || v === 'active' || v === 'invited' || v === 'deactivated';
|
|
315
|
+
}
|
|
316
|
+
function isValidRoleFilter(v) {
|
|
317
|
+
return (v === 'all' ||
|
|
318
|
+
v === 'owner' ||
|
|
319
|
+
v === 'admin' ||
|
|
320
|
+
v === 'administrator' ||
|
|
321
|
+
v === 'manager' ||
|
|
322
|
+
v === 'user');
|
|
323
|
+
}
|
|
324
|
+
function isValidPatchAction(v) {
|
|
325
|
+
return (v === 'deactivate' ||
|
|
326
|
+
v === 'reactivate' ||
|
|
327
|
+
v === 'change_role' ||
|
|
328
|
+
v === 'resend_invite' ||
|
|
329
|
+
v === 'cancel_invite');
|
|
330
|
+
}
|
|
331
|
+
/**
|
|
332
|
+
* Map service-layer error codes to the `AdminApiError['code']` union that
|
|
333
|
+
* existing admin handlers return. Keeps the public error-code vocabulary
|
|
334
|
+
* consistent across every admin route.
|
|
335
|
+
*/
|
|
336
|
+
function mapErrorCode(code) {
|
|
337
|
+
switch (code) {
|
|
338
|
+
case 'NOT_FOUND':
|
|
339
|
+
return 'NOT_FOUND';
|
|
340
|
+
case 'FORBIDDEN':
|
|
341
|
+
case 'SELF_ACTION_FORBIDDEN':
|
|
342
|
+
return 'FORBIDDEN';
|
|
343
|
+
case 'EMAIL_ALREADY_EXISTS':
|
|
344
|
+
case 'EMAIL_ALREADY_INVITED':
|
|
345
|
+
case 'EMAIL_DEACTIVATED_EXISTS':
|
|
346
|
+
return 'EMAIL_EXISTS';
|
|
347
|
+
// All other domain-rule violations — collapse to VALIDATION_ERROR.
|
|
348
|
+
// The human-readable `error` message is what drives the UI toast anyway.
|
|
349
|
+
case 'LAST_OWNER_PROTECTED':
|
|
350
|
+
case 'MUST_DEACTIVATE_FIRST':
|
|
351
|
+
case 'INVALID_STATE':
|
|
352
|
+
case 'VALIDATION_ERROR':
|
|
353
|
+
return 'VALIDATION_ERROR';
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
//# sourceMappingURL=users.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"users.js","sourceRoot":"","sources":["../../../src/admin/api/users.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminAcceptInviteForm.d.ts","sourceRoot":"","sources":["../../../src/admin/components/AdminAcceptInviteForm.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,UAAU,CAAA;AAsB1D,wBAAgB,qBAAqB,CAAC,EACpC,SAAc,EACd,QAAyB,EACzB,eAAsB,GACvB,EAAE,0BAA0B,2CAsQ5B"}
|