@rovela-ai/sdk 0.2.1 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (182) hide show
  1. package/dist/admin/api/accept-invite.d.ts +65 -0
  2. package/dist/admin/api/accept-invite.d.ts.map +1 -0
  3. package/dist/admin/api/accept-invite.js +115 -0
  4. package/dist/admin/api/accept-invite.js.map +1 -0
  5. package/dist/admin/api/categories.d.ts.map +1 -1
  6. package/dist/admin/api/categories.js +21 -28
  7. package/dist/admin/api/categories.js.map +1 -1
  8. package/dist/admin/api/customers.d.ts.map +1 -1
  9. package/dist/admin/api/customers.js +17 -25
  10. package/dist/admin/api/customers.js.map +1 -1
  11. package/dist/admin/api/forgot-password.d.ts +39 -0
  12. package/dist/admin/api/forgot-password.d.ts.map +1 -0
  13. package/dist/admin/api/forgot-password.js +66 -0
  14. package/dist/admin/api/forgot-password.js.map +1 -0
  15. package/dist/admin/api/index.d.ts +6 -0
  16. package/dist/admin/api/index.d.ts.map +1 -1
  17. package/dist/admin/api/index.js +9 -0
  18. package/dist/admin/api/index.js.map +1 -1
  19. package/dist/admin/api/me.d.ts +72 -0
  20. package/dist/admin/api/me.d.ts.map +1 -0
  21. package/dist/admin/api/me.js +177 -0
  22. package/dist/admin/api/me.js.map +1 -0
  23. package/dist/admin/api/orders.d.ts.map +1 -1
  24. package/dist/admin/api/orders.js +21 -28
  25. package/dist/admin/api/orders.js.map +1 -1
  26. package/dist/admin/api/products.d.ts.map +1 -1
  27. package/dist/admin/api/products.js +33 -37
  28. package/dist/admin/api/products.js.map +1 -1
  29. package/dist/admin/api/refund.d.ts.map +1 -1
  30. package/dist/admin/api/refund.js +5 -7
  31. package/dist/admin/api/refund.js.map +1 -1
  32. package/dist/admin/api/reset-password.d.ts +49 -0
  33. package/dist/admin/api/reset-password.d.ts.map +1 -0
  34. package/dist/admin/api/reset-password.js +99 -0
  35. package/dist/admin/api/reset-password.js.map +1 -0
  36. package/dist/admin/api/return.d.ts.map +1 -1
  37. package/dist/admin/api/return.js +9 -12
  38. package/dist/admin/api/return.js.map +1 -1
  39. package/dist/admin/api/settings.d.ts.map +1 -1
  40. package/dist/admin/api/settings.js +9 -12
  41. package/dist/admin/api/settings.js.map +1 -1
  42. package/dist/admin/api/shipping.d.ts.map +1 -1
  43. package/dist/admin/api/shipping.js +65 -61
  44. package/dist/admin/api/shipping.js.map +1 -1
  45. package/dist/admin/api/stats.d.ts.map +1 -1
  46. package/dist/admin/api/stats.js +5 -7
  47. package/dist/admin/api/stats.js.map +1 -1
  48. package/dist/admin/api/stripe-status.d.ts.map +1 -1
  49. package/dist/admin/api/stripe-status.js +5 -7
  50. package/dist/admin/api/stripe-status.js.map +1 -1
  51. package/dist/admin/api/tax-zones.d.ts.map +1 -1
  52. package/dist/admin/api/tax-zones.js +21 -28
  53. package/dist/admin/api/tax-zones.js.map +1 -1
  54. package/dist/admin/api/users.d.ts +142 -0
  55. package/dist/admin/api/users.d.ts.map +1 -0
  56. package/dist/admin/api/users.js +356 -0
  57. package/dist/admin/api/users.js.map +1 -0
  58. package/dist/admin/components/AdminAcceptInviteForm.d.ts +3 -0
  59. package/dist/admin/components/AdminAcceptInviteForm.d.ts.map +1 -0
  60. package/dist/admin/components/AdminAcceptInviteForm.js +137 -0
  61. package/dist/admin/components/AdminAcceptInviteForm.js.map +1 -0
  62. package/dist/admin/components/AdminAccountPage.d.ts +10 -0
  63. package/dist/admin/components/AdminAccountPage.d.ts.map +1 -0
  64. package/dist/admin/components/AdminAccountPage.js +123 -0
  65. package/dist/admin/components/AdminAccountPage.js.map +1 -0
  66. package/dist/admin/components/AdminForgotPasswordForm.d.ts +8 -0
  67. package/dist/admin/components/AdminForgotPasswordForm.d.ts.map +1 -0
  68. package/dist/admin/components/AdminForgotPasswordForm.js +59 -0
  69. package/dist/admin/components/AdminForgotPasswordForm.js.map +1 -0
  70. package/dist/admin/components/AdminNav.d.ts.map +1 -1
  71. package/dist/admin/components/AdminNav.js +32 -4
  72. package/dist/admin/components/AdminNav.js.map +1 -1
  73. package/dist/admin/components/AdminResetPasswordForm.d.ts +12 -0
  74. package/dist/admin/components/AdminResetPasswordForm.d.ts.map +1 -0
  75. package/dist/admin/components/AdminResetPasswordForm.js +134 -0
  76. package/dist/admin/components/AdminResetPasswordForm.js.map +1 -0
  77. package/dist/admin/components/AdminUserMenu.d.ts.map +1 -1
  78. package/dist/admin/components/AdminUserMenu.js +2 -2
  79. package/dist/admin/components/AdminUserMenu.js.map +1 -1
  80. package/dist/admin/components/InviteUserDialog.d.ts +3 -0
  81. package/dist/admin/components/InviteUserDialog.d.ts.map +1 -0
  82. package/dist/admin/components/InviteUserDialog.js +127 -0
  83. package/dist/admin/components/InviteUserDialog.js.map +1 -0
  84. package/dist/admin/components/UsersTable.d.ts +3 -0
  85. package/dist/admin/components/UsersTable.d.ts.map +1 -0
  86. package/dist/admin/components/UsersTable.js +399 -0
  87. package/dist/admin/components/UsersTable.js.map +1 -0
  88. package/dist/admin/components/index.d.ts +9 -0
  89. package/dist/admin/components/index.d.ts.map +1 -1
  90. package/dist/admin/components/index.js +9 -0
  91. package/dist/admin/components/index.js.map +1 -1
  92. package/dist/admin/config.d.ts +15 -10
  93. package/dist/admin/config.d.ts.map +1 -1
  94. package/dist/admin/config.js +38 -11
  95. package/dist/admin/config.js.map +1 -1
  96. package/dist/admin/hooks/index.d.ts +4 -0
  97. package/dist/admin/hooks/index.d.ts.map +1 -1
  98. package/dist/admin/hooks/index.js +3 -0
  99. package/dist/admin/hooks/index.js.map +1 -1
  100. package/dist/admin/hooks/useAdminMe.d.ts +31 -0
  101. package/dist/admin/hooks/useAdminMe.d.ts.map +1 -0
  102. package/dist/admin/hooks/useAdminMe.js +103 -0
  103. package/dist/admin/hooks/useAdminMe.js.map +1 -0
  104. package/dist/admin/hooks/useAdminPermissions.d.ts +3 -0
  105. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  106. package/dist/admin/hooks/useAdminPermissions.js +51 -0
  107. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  108. package/dist/admin/hooks/useAdminUsers.d.ts +3 -0
  109. package/dist/admin/hooks/useAdminUsers.d.ts.map +1 -0
  110. package/dist/admin/hooks/useAdminUsers.js +240 -0
  111. package/dist/admin/hooks/useAdminUsers.js.map +1 -0
  112. package/dist/admin/index.d.ts +4 -4
  113. package/dist/admin/index.d.ts.map +1 -1
  114. package/dist/admin/index.js +20 -2
  115. package/dist/admin/index.js.map +1 -1
  116. package/dist/admin/permissions.d.ts +92 -0
  117. package/dist/admin/permissions.d.ts.map +1 -0
  118. package/dist/admin/permissions.js +201 -0
  119. package/dist/admin/permissions.js.map +1 -0
  120. package/dist/admin/server/admin-invite.d.ts +122 -0
  121. package/dist/admin/server/admin-invite.d.ts.map +1 -0
  122. package/dist/admin/server/admin-invite.js +235 -0
  123. package/dist/admin/server/admin-invite.js.map +1 -0
  124. package/dist/admin/server/admin-password-reset.d.ts +87 -0
  125. package/dist/admin/server/admin-password-reset.d.ts.map +1 -0
  126. package/dist/admin/server/admin-password-reset.js +220 -0
  127. package/dist/admin/server/admin-password-reset.js.map +1 -0
  128. package/dist/admin/server/admin-self-service.d.ts +86 -0
  129. package/dist/admin/server/admin-self-service.d.ts.map +1 -0
  130. package/dist/admin/server/admin-self-service.js +188 -0
  131. package/dist/admin/server/admin-self-service.js.map +1 -0
  132. package/dist/admin/server/admin-service.d.ts.map +1 -1
  133. package/dist/admin/server/admin-service.js +21 -2
  134. package/dist/admin/server/admin-service.js.map +1 -1
  135. package/dist/admin/server/admin-session.d.ts +137 -0
  136. package/dist/admin/server/admin-session.d.ts.map +1 -0
  137. package/dist/admin/server/admin-session.js +229 -0
  138. package/dist/admin/server/admin-session.js.map +1 -0
  139. package/dist/admin/server/index.d.ts +7 -0
  140. package/dist/admin/server/index.d.ts.map +1 -1
  141. package/dist/admin/server/index.js +20 -0
  142. package/dist/admin/server/index.js.map +1 -1
  143. package/dist/admin/server/user-management.d.ts +223 -0
  144. package/dist/admin/server/user-management.d.ts.map +1 -0
  145. package/dist/admin/server/user-management.js +846 -0
  146. package/dist/admin/server/user-management.js.map +1 -0
  147. package/dist/admin/types.d.ts +153 -2
  148. package/dist/admin/types.d.ts.map +1 -1
  149. package/dist/auth/config.d.ts.map +1 -1
  150. package/dist/auth/config.js +11 -2
  151. package/dist/auth/config.js.map +1 -1
  152. package/dist/core/db/queries.d.ts +19 -13
  153. package/dist/core/db/queries.d.ts.map +1 -1
  154. package/dist/core/db/schema.d.ts +327 -9
  155. package/dist/core/db/schema.d.ts.map +1 -1
  156. package/dist/core/db/schema.js +80 -3
  157. package/dist/core/db/schema.js.map +1 -1
  158. package/dist/core/types.d.ts +19 -3
  159. package/dist/core/types.d.ts.map +1 -1
  160. package/dist/emails/index.d.ts +2 -2
  161. package/dist/emails/index.d.ts.map +1 -1
  162. package/dist/emails/index.js +3 -1
  163. package/dist/emails/index.js.map +1 -1
  164. package/dist/emails/send/admin-auth.d.ts +94 -0
  165. package/dist/emails/send/admin-auth.d.ts.map +1 -0
  166. package/dist/emails/send/admin-auth.js +118 -0
  167. package/dist/emails/send/admin-auth.js.map +1 -0
  168. package/dist/emails/send/index.d.ts +2 -0
  169. package/dist/emails/send/index.d.ts.map +1 -1
  170. package/dist/emails/send/index.js +4 -0
  171. package/dist/emails/send/index.js.map +1 -1
  172. package/dist/emails/templates/admin-invite.d.ts +40 -0
  173. package/dist/emails/templates/admin-invite.d.ts.map +1 -0
  174. package/dist/emails/templates/admin-invite.js +62 -0
  175. package/dist/emails/templates/admin-invite.js.map +1 -0
  176. package/dist/emails/templates/index.d.ts +1 -0
  177. package/dist/emails/templates/index.d.ts.map +1 -1
  178. package/dist/emails/templates/index.js +4 -0
  179. package/dist/emails/templates/index.js.map +1 -1
  180. package/dist/emails/types.d.ts +22 -1
  181. package/dist/emails/types.d.ts.map +1 -1
  182. 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,3 @@
1
+ import type { AdminAcceptInviteFormProps } from '../types';
2
+ export declare function AdminAcceptInviteForm({ className, loginUrl, redirectDelayMs, }: AdminAcceptInviteFormProps): import("react/jsx-runtime").JSX.Element;
3
+ //# sourceMappingURL=AdminAcceptInviteForm.d.ts.map
@@ -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"}