@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.
- 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 +32 -4
- 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 +15 -10
- package/dist/admin/config.d.ts.map +1 -1
- package/dist/admin/config.js +38 -11
- 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 +137 -0
- package/dist/admin/server/admin-session.d.ts.map +1 -0
- package/dist/admin/server/admin-session.js +229 -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/auth/config.d.ts.map +1 -1
- package/dist/auth/config.js +11 -2
- package/dist/auth/config.js.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,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/accept-invite
|
|
3
|
+
*
|
|
4
|
+
* Public API routes for the admin invite acceptance flow.
|
|
5
|
+
*
|
|
6
|
+
* Two methods on the same route:
|
|
7
|
+
* - GET ?token=X — non-destructive validation; returns invitee snippet
|
|
8
|
+
* (email, name, role) so the UI can render context
|
|
9
|
+
* - POST { token, password } — consume the token, set password, activate
|
|
10
|
+
*
|
|
11
|
+
* **Unauthenticated** — the token IS the auth. Anyone holding a valid
|
|
12
|
+
* invite token can accept the invite. No `requireAdmin` guard; the
|
|
13
|
+
* service layer enforces all the real invariants (token validity,
|
|
14
|
+
* expiry, admin status, password strength).
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // app/api/admin/accept-invite/route.ts
|
|
19
|
+
* export { GET, POST } from '@rovela-ai/sdk/admin/api/accept-invite'
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { NextResponse } from 'next/server';
|
|
23
|
+
import type { AdminApiError } from '../types';
|
|
24
|
+
import type { AdminRole } from '../../core/types';
|
|
25
|
+
export declare const runtime = "nodejs";
|
|
26
|
+
interface ValidateInviteResponse {
|
|
27
|
+
valid: boolean;
|
|
28
|
+
error?: string;
|
|
29
|
+
admin?: {
|
|
30
|
+
email: string;
|
|
31
|
+
name: string;
|
|
32
|
+
role: AdminRole;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
interface AcceptInviteResponse {
|
|
36
|
+
success: boolean;
|
|
37
|
+
message: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* GET /api/admin/accept-invite?token=X
|
|
41
|
+
*
|
|
42
|
+
* Used by the accept-invite page on mount to decide whether to render
|
|
43
|
+
* the password form or an "invalid/expired link" error. Returns the
|
|
44
|
+
* invitee's email, name, and role so the UI can personalize the form
|
|
45
|
+
* ("Welcome, Jane — you've been invited as Administrator").
|
|
46
|
+
*
|
|
47
|
+
* Does NOT consume the token.
|
|
48
|
+
*/
|
|
49
|
+
export declare function GET(request: Request): Promise<NextResponse<ValidateInviteResponse>>;
|
|
50
|
+
/**
|
|
51
|
+
* POST /api/admin/accept-invite
|
|
52
|
+
*
|
|
53
|
+
* Body: `{ "token": "...", "password": "..." }`
|
|
54
|
+
*
|
|
55
|
+
* Consumes the invite token, hashes and stores the new password, flips
|
|
56
|
+
* the admin's status from `invited` to `active`, and deletes all invite
|
|
57
|
+
* + password reset tokens for the admin so they can't be reused.
|
|
58
|
+
*
|
|
59
|
+
* After this succeeds, the invitee should be redirected to /admin/login
|
|
60
|
+
* where they sign in with their new credentials. No session is issued
|
|
61
|
+
* here — accept-invite is a one-shot flow.
|
|
62
|
+
*/
|
|
63
|
+
export declare function POST(request: Request): Promise<NextResponse<AcceptInviteResponse | AdminApiError>>;
|
|
64
|
+
export {};
|
|
65
|
+
//# sourceMappingURL=accept-invite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-invite.d.ts","sourceRoot":"","sources":["../../../src/admin/api/accept-invite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAK1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAC7C,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,eAAO,MAAM,OAAO,WAAW,CAAA;AAM/B,UAAU,sBAAsB;IAC9B,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE;QACN,KAAK,EAAE,MAAM,CAAA;QACb,IAAI,EAAE,MAAM,CAAA;QACZ,IAAI,EAAE,SAAS,CAAA;KAChB,CAAA;CACF;AAED,UAAU,oBAAoB;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAMD;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,YAAY,CAAC,sBAAsB,CAAC,CAAC,CAyC/C;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,YAAY,CAAC,oBAAoB,GAAG,aAAa,CAAC,CAAC,CAmD7D"}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/accept-invite
|
|
3
|
+
*
|
|
4
|
+
* Public API routes for the admin invite acceptance flow.
|
|
5
|
+
*
|
|
6
|
+
* Two methods on the same route:
|
|
7
|
+
* - GET ?token=X — non-destructive validation; returns invitee snippet
|
|
8
|
+
* (email, name, role) so the UI can render context
|
|
9
|
+
* - POST { token, password } — consume the token, set password, activate
|
|
10
|
+
*
|
|
11
|
+
* **Unauthenticated** — the token IS the auth. Anyone holding a valid
|
|
12
|
+
* invite token can accept the invite. No `requireAdmin` guard; the
|
|
13
|
+
* service layer enforces all the real invariants (token validity,
|
|
14
|
+
* expiry, admin status, password strength).
|
|
15
|
+
*
|
|
16
|
+
* Usage:
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // app/api/admin/accept-invite/route.ts
|
|
19
|
+
* export { GET, POST } from '@rovela-ai/sdk/admin/api/accept-invite'
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
import { NextResponse } from 'next/server';
|
|
23
|
+
import { validateInviteToken, acceptAdminInvite, } from '../server/admin-invite';
|
|
24
|
+
export const runtime = 'nodejs';
|
|
25
|
+
// =============================================================================
|
|
26
|
+
// GET — validate token (non-destructive)
|
|
27
|
+
// =============================================================================
|
|
28
|
+
/**
|
|
29
|
+
* GET /api/admin/accept-invite?token=X
|
|
30
|
+
*
|
|
31
|
+
* Used by the accept-invite page on mount to decide whether to render
|
|
32
|
+
* the password form or an "invalid/expired link" error. Returns the
|
|
33
|
+
* invitee's email, name, and role so the UI can personalize the form
|
|
34
|
+
* ("Welcome, Jane — you've been invited as Administrator").
|
|
35
|
+
*
|
|
36
|
+
* Does NOT consume the token.
|
|
37
|
+
*/
|
|
38
|
+
export async function GET(request) {
|
|
39
|
+
try {
|
|
40
|
+
const { searchParams } = new URL(request.url);
|
|
41
|
+
const token = searchParams.get('token');
|
|
42
|
+
if (!token) {
|
|
43
|
+
return NextResponse.json({ valid: false, error: 'Invite token is required.' }, { status: 400 });
|
|
44
|
+
}
|
|
45
|
+
const result = await validateInviteToken(token);
|
|
46
|
+
if (!result.valid) {
|
|
47
|
+
return NextResponse.json({ valid: false, error: result.error }, { status: 400 });
|
|
48
|
+
}
|
|
49
|
+
// Return a SAFE snippet of the invitee — just enough for the form
|
|
50
|
+
// to render ("Hi {name}, you're invited as {role}"). The full admin
|
|
51
|
+
// row is never returned to an unauthenticated caller.
|
|
52
|
+
return NextResponse.json({
|
|
53
|
+
valid: true,
|
|
54
|
+
admin: result.admin
|
|
55
|
+
? {
|
|
56
|
+
email: result.admin.email,
|
|
57
|
+
name: result.admin.name,
|
|
58
|
+
role: result.admin.role,
|
|
59
|
+
}
|
|
60
|
+
: undefined,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error('[Admin Accept Invite] Validation error:', error);
|
|
65
|
+
return NextResponse.json({ valid: false, error: 'Failed to validate invite. Please try again.' }, { status: 500 });
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// =============================================================================
|
|
69
|
+
// POST — consume token, activate admin
|
|
70
|
+
// =============================================================================
|
|
71
|
+
/**
|
|
72
|
+
* POST /api/admin/accept-invite
|
|
73
|
+
*
|
|
74
|
+
* Body: `{ "token": "...", "password": "..." }`
|
|
75
|
+
*
|
|
76
|
+
* Consumes the invite token, hashes and stores the new password, flips
|
|
77
|
+
* the admin's status from `invited` to `active`, and deletes all invite
|
|
78
|
+
* + password reset tokens for the admin so they can't be reused.
|
|
79
|
+
*
|
|
80
|
+
* After this succeeds, the invitee should be redirected to /admin/login
|
|
81
|
+
* where they sign in with their new credentials. No session is issued
|
|
82
|
+
* here — accept-invite is a one-shot flow.
|
|
83
|
+
*/
|
|
84
|
+
export async function POST(request) {
|
|
85
|
+
try {
|
|
86
|
+
const body = (await request.json().catch(() => null));
|
|
87
|
+
const token = typeof body?.token === 'string' ? body.token : '';
|
|
88
|
+
const password = typeof body?.password === 'string' ? body.password : '';
|
|
89
|
+
if (!token) {
|
|
90
|
+
return NextResponse.json({ error: 'Invite token is required.', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
91
|
+
}
|
|
92
|
+
if (!password) {
|
|
93
|
+
return NextResponse.json({ error: 'Password is required.', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
94
|
+
}
|
|
95
|
+
const result = await acceptAdminInvite(token, password);
|
|
96
|
+
if (!result.success) {
|
|
97
|
+
return NextResponse.json({
|
|
98
|
+
error: result.error || 'Failed to accept invite.',
|
|
99
|
+
code: 'VALIDATION_ERROR',
|
|
100
|
+
}, { status: 400 });
|
|
101
|
+
}
|
|
102
|
+
return NextResponse.json({
|
|
103
|
+
success: true,
|
|
104
|
+
message: 'Invite accepted. You can now sign in to the admin dashboard with your new password.',
|
|
105
|
+
});
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
console.error('[Admin Accept Invite] Error:', error);
|
|
109
|
+
return NextResponse.json({
|
|
110
|
+
error: 'Failed to accept invite. Please try again.',
|
|
111
|
+
code: 'INTERNAL_ERROR',
|
|
112
|
+
}, { status: 500 });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=accept-invite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"accept-invite.js","sourceRoot":"","sources":["../../../src/admin/api/accept-invite.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../src/admin/api/categories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"categories.d.ts","sourceRoot":"","sources":["../../../src/admin/api/categories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAUvD,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAMzD;;;;;;;GAOG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC;IAAE,IAAI,EAAE,OAAO,EAAE,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CA2B5D;AAED;;;;GAIG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,CAyD5D;AAMD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,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,OAAO,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CAyB1D;AAED;;;;GAIG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,GAC9C,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,CAkE5D;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAC1B,OAAO,EAAE,WAAW,EACpB,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,CAkC7D"}
|
|
@@ -13,22 +13,10 @@
|
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
15
|
import { NextResponse } from 'next/server';
|
|
16
|
-
import {
|
|
17
|
-
import { createAuthOptions } from '../../auth/config';
|
|
16
|
+
import { requireAdmin } from '../server/admin-session';
|
|
18
17
|
import { findCategories, findCategoryById, createCategory, updateCategory, deleteCategory, } from '../../core/db/queries';
|
|
19
18
|
import { generateSlug } from '../../core/utils';
|
|
20
19
|
// =============================================================================
|
|
21
|
-
// Auth Helper
|
|
22
|
-
// =============================================================================
|
|
23
|
-
async function requireAdmin() {
|
|
24
|
-
const session = await getServerSession(createAuthOptions());
|
|
25
|
-
const user = session?.user;
|
|
26
|
-
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
27
|
-
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
28
|
-
}
|
|
29
|
-
return null; // Auth passed
|
|
30
|
-
}
|
|
31
|
-
// =============================================================================
|
|
32
20
|
// List Categories
|
|
33
21
|
// =============================================================================
|
|
34
22
|
/**
|
|
@@ -40,9 +28,10 @@ async function requireAdmin() {
|
|
|
40
28
|
* - flat: boolean - Return flat list instead of tree (default false)
|
|
41
29
|
*/
|
|
42
30
|
export async function GET(request) {
|
|
43
|
-
const
|
|
44
|
-
if (
|
|
45
|
-
return
|
|
31
|
+
const guard = await requireAdmin();
|
|
32
|
+
if (!guard.ok) {
|
|
33
|
+
return guard.response;
|
|
34
|
+
}
|
|
46
35
|
try {
|
|
47
36
|
const searchParams = request.nextUrl.searchParams;
|
|
48
37
|
const flat = searchParams.get('flat') === 'true';
|
|
@@ -65,9 +54,10 @@ export async function GET(request) {
|
|
|
65
54
|
* Create a new category.
|
|
66
55
|
*/
|
|
67
56
|
export async function POST(request) {
|
|
68
|
-
const
|
|
69
|
-
if (
|
|
70
|
-
return
|
|
57
|
+
const guard = await requireAdmin();
|
|
58
|
+
if (!guard.ok) {
|
|
59
|
+
return guard.response;
|
|
60
|
+
}
|
|
71
61
|
try {
|
|
72
62
|
const body = await request.json();
|
|
73
63
|
// Validate required fields
|
|
@@ -111,9 +101,10 @@ export async function POST(request) {
|
|
|
111
101
|
* Get a single category by ID.
|
|
112
102
|
*/
|
|
113
103
|
export async function getCategory(request, { params }) {
|
|
114
|
-
const
|
|
115
|
-
if (
|
|
116
|
-
return
|
|
104
|
+
const guard = await requireAdmin();
|
|
105
|
+
if (!guard.ok) {
|
|
106
|
+
return guard.response;
|
|
107
|
+
}
|
|
117
108
|
try {
|
|
118
109
|
const { id } = await params;
|
|
119
110
|
const category = await findCategoryById(id);
|
|
@@ -133,9 +124,10 @@ export async function getCategory(request, { params }) {
|
|
|
133
124
|
* Update a category by ID.
|
|
134
125
|
*/
|
|
135
126
|
export async function PUT(request, { params }) {
|
|
136
|
-
const
|
|
137
|
-
if (
|
|
138
|
-
return
|
|
127
|
+
const guard = await requireAdmin();
|
|
128
|
+
if (!guard.ok) {
|
|
129
|
+
return guard.response;
|
|
130
|
+
}
|
|
139
131
|
try {
|
|
140
132
|
const { id } = await params;
|
|
141
133
|
const body = await request.json();
|
|
@@ -187,9 +179,10 @@ export async function PUT(request, { params }) {
|
|
|
187
179
|
* Delete a category by ID.
|
|
188
180
|
*/
|
|
189
181
|
export async function DELETE(request, { params }) {
|
|
190
|
-
const
|
|
191
|
-
if (
|
|
192
|
-
return
|
|
182
|
+
const guard = await requireAdmin();
|
|
183
|
+
if (!guard.ok) {
|
|
184
|
+
return guard.response;
|
|
185
|
+
}
|
|
193
186
|
try {
|
|
194
187
|
const { id } = await params;
|
|
195
188
|
const deleted = await deleteCategory(id);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../../src/admin/api/categories.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"categories.js","sourceRoot":"","sources":["../../../src/admin/api/categories.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../../src/admin/api/customers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;
|
|
1
|
+
{"version":3,"file":"customers.d.ts","sourceRoot":"","sources":["../../../src/admin/api/customers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAUvD,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAA;AAMhE;;;;;;;;;GASG;AACH,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,OAAO,CAAC,GAAG,aAAa,CAAC,CAAC,CAkDnE;AAMD;;;;GAIG;AACH,wBAAsB,WAAW,CAC/B,OAAO,EAAE,WAAW,EACpB,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,OAAO,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CAoD1D;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,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,OAAO,CAAA;CAAE,GAAG,aAAa,CAAC,CAAC,CAmE1D;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,OAAO,EAAE,WAAW,EACpB,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,CA4C7D"}
|
|
@@ -15,22 +15,10 @@
|
|
|
15
15
|
* ```
|
|
16
16
|
*/
|
|
17
17
|
import { NextResponse } from 'next/server';
|
|
18
|
-
import {
|
|
19
|
-
import { createAuthOptions } from '../../auth/config';
|
|
18
|
+
import { requireAdmin } from '../server/admin-session';
|
|
20
19
|
import { findCustomers, findCustomerById, countCustomers, findCustomerOrders, deleteCustomer as deleteCustomerData, } from '../../core/db/queries';
|
|
21
20
|
import { updateCustomer as updateCustomerData } from '../../auth/server/customer-service';
|
|
22
21
|
// =============================================================================
|
|
23
|
-
// Auth Helper
|
|
24
|
-
// =============================================================================
|
|
25
|
-
async function requireAdmin() {
|
|
26
|
-
const session = await getServerSession(createAuthOptions());
|
|
27
|
-
const user = session?.user;
|
|
28
|
-
if (!user?.role || !['owner', 'admin'].includes(user.role)) {
|
|
29
|
-
return NextResponse.json({ error: 'Unauthorized', code: 'UNAUTHORIZED' }, { status: 401 });
|
|
30
|
-
}
|
|
31
|
-
return null; // Auth passed
|
|
32
|
-
}
|
|
33
|
-
// =============================================================================
|
|
34
22
|
// List Customers
|
|
35
23
|
// =============================================================================
|
|
36
24
|
/**
|
|
@@ -44,9 +32,10 @@ async function requireAdmin() {
|
|
|
44
32
|
* - limit: number (default 20, max 100)
|
|
45
33
|
*/
|
|
46
34
|
export async function GET(request) {
|
|
47
|
-
const
|
|
48
|
-
if (
|
|
49
|
-
return
|
|
35
|
+
const guard = await requireAdmin();
|
|
36
|
+
if (!guard.ok) {
|
|
37
|
+
return guard.response;
|
|
38
|
+
}
|
|
50
39
|
try {
|
|
51
40
|
const searchParams = request.nextUrl.searchParams;
|
|
52
41
|
// Parse pagination
|
|
@@ -91,9 +80,10 @@ export async function GET(request) {
|
|
|
91
80
|
* Get a single customer by ID with order history.
|
|
92
81
|
*/
|
|
93
82
|
export async function getCustomer(request, { params }) {
|
|
94
|
-
const
|
|
95
|
-
if (
|
|
96
|
-
return
|
|
83
|
+
const guard = await requireAdmin();
|
|
84
|
+
if (!guard.ok) {
|
|
85
|
+
return guard.response;
|
|
86
|
+
}
|
|
97
87
|
try {
|
|
98
88
|
const { id } = await params;
|
|
99
89
|
const customer = await findCustomerById(id);
|
|
@@ -140,9 +130,10 @@ export async function getCustomer(request, { params }) {
|
|
|
140
130
|
* - email?: string - Customer email
|
|
141
131
|
*/
|
|
142
132
|
export async function updateCustomer(request, { params }) {
|
|
143
|
-
const
|
|
144
|
-
if (
|
|
145
|
-
return
|
|
133
|
+
const guard = await requireAdmin();
|
|
134
|
+
if (!guard.ok) {
|
|
135
|
+
return guard.response;
|
|
136
|
+
}
|
|
146
137
|
try {
|
|
147
138
|
const { id } = await params;
|
|
148
139
|
const body = await request.json();
|
|
@@ -194,9 +185,10 @@ export async function updateCustomer(request, { params }) {
|
|
|
194
185
|
* - Complies with GDPR "right to erasure" through anonymization
|
|
195
186
|
*/
|
|
196
187
|
export async function deleteCustomer(request, { params }) {
|
|
197
|
-
const
|
|
198
|
-
if (
|
|
199
|
-
return
|
|
188
|
+
const guard = await requireAdmin();
|
|
189
|
+
if (!guard.ok) {
|
|
190
|
+
return guard.response;
|
|
191
|
+
}
|
|
200
192
|
try {
|
|
201
193
|
const { id } = await params;
|
|
202
194
|
// Check if customer exists and is not already deleted
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../../../src/admin/api/customers.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAe,YAAY,EAAE,MAAM,aAAa,CAAA;AACvD,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"customers.js","sourceRoot":"","sources":["../../../src/admin/api/customers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/forgot-password
|
|
3
|
+
*
|
|
4
|
+
* API route handler for the admin forgot-password flow.
|
|
5
|
+
*
|
|
6
|
+
* Unauthenticated endpoint — any visitor may POST. The response shape is
|
|
7
|
+
* identical regardless of whether the email corresponds to a real admin
|
|
8
|
+
* (enumeration safety). The service layer also silently skips deactivated
|
|
9
|
+
* and invited admins.
|
|
10
|
+
*
|
|
11
|
+
* Runtime: Node.js (DB + email service dependencies). We set this
|
|
12
|
+
* explicitly so a future `export const runtime = 'edge'` accidentally
|
|
13
|
+
* dropped into this file wouldn't silently break the flow.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // app/api/admin/forgot-password/route.ts
|
|
18
|
+
* export { POST } from '@rovela-ai/sdk/admin/api/forgot-password'
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { NextResponse } from 'next/server';
|
|
22
|
+
import type { AdminApiError } from '../types';
|
|
23
|
+
export declare const runtime = "nodejs";
|
|
24
|
+
interface ForgotPasswordResponse {
|
|
25
|
+
success: boolean;
|
|
26
|
+
message: string;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* POST /api/admin/forgot-password
|
|
30
|
+
*
|
|
31
|
+
* Body: `{ "email": "admin@store.com" }`
|
|
32
|
+
*
|
|
33
|
+
* Always returns `200 { success: true, message }` when the request is
|
|
34
|
+
* well-formed, even if the email doesn't correspond to a real admin.
|
|
35
|
+
* Returns `400 VALIDATION_ERROR` only for missing/malformed email input.
|
|
36
|
+
*/
|
|
37
|
+
export declare function POST(request: Request): Promise<NextResponse<ForgotPasswordResponse | AdminApiError>>;
|
|
38
|
+
export {};
|
|
39
|
+
//# sourceMappingURL=forgot-password.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password.d.ts","sourceRoot":"","sources":["../../../src/admin/api/forgot-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAA;AAE7C,eAAO,MAAM,OAAO,WAAW,CAAA;AAM/B,UAAU,sBAAsB;IAC9B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;CAChB;AAeD;;;;;;;;GAQG;AACH,wBAAsB,IAAI,CACxB,OAAO,EAAE,OAAO,GACf,OAAO,CAAC,YAAY,CAAC,sBAAsB,GAAG,aAAa,CAAC,CAAC,CAoC/D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/api/forgot-password
|
|
3
|
+
*
|
|
4
|
+
* API route handler for the admin forgot-password flow.
|
|
5
|
+
*
|
|
6
|
+
* Unauthenticated endpoint — any visitor may POST. The response shape is
|
|
7
|
+
* identical regardless of whether the email corresponds to a real admin
|
|
8
|
+
* (enumeration safety). The service layer also silently skips deactivated
|
|
9
|
+
* and invited admins.
|
|
10
|
+
*
|
|
11
|
+
* Runtime: Node.js (DB + email service dependencies). We set this
|
|
12
|
+
* explicitly so a future `export const runtime = 'edge'` accidentally
|
|
13
|
+
* dropped into this file wouldn't silently break the flow.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* // app/api/admin/forgot-password/route.ts
|
|
18
|
+
* export { POST } from '@rovela-ai/sdk/admin/api/forgot-password'
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
import { NextResponse } from 'next/server';
|
|
22
|
+
import { requestAdminPasswordReset } from '../server/admin-password-reset';
|
|
23
|
+
export const runtime = 'nodejs';
|
|
24
|
+
// =============================================================================
|
|
25
|
+
// Helpers
|
|
26
|
+
// =============================================================================
|
|
27
|
+
function isValidEmail(email) {
|
|
28
|
+
// Minimal format check — full RFC validation isn't worth it server-side.
|
|
29
|
+
return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email);
|
|
30
|
+
}
|
|
31
|
+
// =============================================================================
|
|
32
|
+
// Handler
|
|
33
|
+
// =============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* POST /api/admin/forgot-password
|
|
36
|
+
*
|
|
37
|
+
* Body: `{ "email": "admin@store.com" }`
|
|
38
|
+
*
|
|
39
|
+
* Always returns `200 { success: true, message }` when the request is
|
|
40
|
+
* well-formed, even if the email doesn't correspond to a real admin.
|
|
41
|
+
* Returns `400 VALIDATION_ERROR` only for missing/malformed email input.
|
|
42
|
+
*/
|
|
43
|
+
export async function POST(request) {
|
|
44
|
+
try {
|
|
45
|
+
const body = (await request.json().catch(() => null));
|
|
46
|
+
const email = typeof body?.email === 'string' ? body.email.trim() : '';
|
|
47
|
+
if (!email) {
|
|
48
|
+
return NextResponse.json({ error: 'Email is required', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
49
|
+
}
|
|
50
|
+
if (!isValidEmail(email)) {
|
|
51
|
+
return NextResponse.json({ error: 'Please enter a valid email address', code: 'VALIDATION_ERROR' }, { status: 400 });
|
|
52
|
+
}
|
|
53
|
+
// Service is responsible for all enumeration-safe behavior —
|
|
54
|
+
// we just call it and pass through the (always successful) result.
|
|
55
|
+
await requestAdminPasswordReset(email);
|
|
56
|
+
return NextResponse.json({
|
|
57
|
+
success: true,
|
|
58
|
+
message: "If an account exists with this email, we've sent a password reset link.",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
console.error('[Admin Forgot Password] Error:', error);
|
|
63
|
+
return NextResponse.json({ error: 'Failed to process request. Please try again.', code: 'INTERNAL_ERROR' }, { status: 500 });
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=forgot-password.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"forgot-password.js","sourceRoot":"","sources":["../../../src/admin/api/forgot-password.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAC1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAA;AAG1E,MAAM,CAAC,MAAM,OAAO,GAAG,QAAQ,CAAA;AAW/B,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF,SAAS,YAAY,CAAC,KAAa;IACjC,yEAAyE;IACzE,OAAO,4BAA4B,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AACjD,CAAC;AAED,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,IAAI,CACxB,OAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAA+B,CAAA;QAEnF,MAAM,KAAK,GAAG,OAAO,IAAI,EAAE,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAA;QAEtE,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,kBAAkB,EAAE,EACxD,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAA;QACH,CAAC;QAED,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,oCAAoC,EAAE,IAAI,EAAE,kBAAkB,EAAE,EACzE,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAA;QACH,CAAC;QAED,6DAA6D;QAC7D,mEAAmE;QACnE,MAAM,yBAAyB,CAAC,KAAK,CAAC,CAAA;QAEtC,OAAO,YAAY,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,IAAI;YACb,OAAO,EACL,yEAAyE;SAC5E,CAAC,CAAA;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,EAAE,KAAK,CAAC,CAAA;QACtD,OAAO,YAAY,CAAC,IAAI,CACtB,EAAE,KAAK,EAAE,8CAA8C,EAAE,IAAI,EAAE,gBAAgB,EAAE,EACjF,EAAE,MAAM,EAAE,GAAG,EAAE,CAChB,CAAA;IACH,CAAC;AACH,CAAC"}
|
|
@@ -86,6 +86,12 @@ export { GET as getCategories, POST as createCategory, getCategory, PUT as updat
|
|
|
86
86
|
export { GET as getCustomers, getCustomer, updateCustomer, deleteCustomer, } from './customers';
|
|
87
87
|
export { POST as setupAdmin } from './setup';
|
|
88
88
|
export { GET as checkAdminExists } from './check';
|
|
89
|
+
export { POST as adminForgotPassword } from './forgot-password';
|
|
90
|
+
export { GET as validateAdminResetTokenHandler, POST as adminResetPassword, } from './reset-password';
|
|
91
|
+
export { GET as getUsers, POST as inviteUser, getUser, PATCH as updateUser, DELETE as deleteUser, } from './users';
|
|
92
|
+
export type { AdminListItem } from './users';
|
|
93
|
+
export { GET as validateAdminInviteHandler, POST as acceptAdminInviteHandler, } from './accept-invite';
|
|
94
|
+
export { GET as getMe, PATCH as updateMe, PATCH_PASSWORD as updateMyPassword, } from './me';
|
|
89
95
|
export { GET as getSettings, PUT as updateSettings } from './settings';
|
|
90
96
|
export { GET as getStripeStatus } from './stripe-status';
|
|
91
97
|
export { getCarriers as getShippingCarriers, createCarrier as createShippingCarrier, getCarrier as getShippingCarrier, updateCarrier as updateShippingCarrier, deleteCarrier as deleteShippingCarrier, } from './shipping';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAGhD,OAAO,EACL,GAAG,IAAI,WAAW,EAClB,IAAI,IAAI,aAAa,EACrB,UAAU,EACV,GAAG,IAAI,aAAa,EACpB,MAAM,IAAI,aAAa,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,GAAG,IAAI,SAAS,EAChB,QAAQ,EACR,GAAG,IAAI,WAAW,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAGhD,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,UAAU,CAAA;AAGrF,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGzC,OAAO,EACL,GAAG,IAAI,aAAa,EACpB,IAAI,IAAI,cAAc,EACtB,WAAW,EACX,GAAG,IAAI,cAAc,EACrB,MAAM,IAAI,cAAc,GACzB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,GAAG,IAAI,YAAY,EACnB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAG5C,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAGjD,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAGtE,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGxD,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,IAAI,qBAAqB,EACtC,UAAU,IAAI,kBAAkB,EAChC,aAAa,IAAI,qBAAqB,EACtC,aAAa,IAAI,qBAAqB,GACvC,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,QAAQ,IAAI,gBAAgB,EAC5B,UAAU,IAAI,kBAAkB,EAChC,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AAGH,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAGhD,OAAO,EACL,GAAG,IAAI,WAAW,EAClB,IAAI,IAAI,aAAa,EACrB,UAAU,EACV,GAAG,IAAI,aAAa,EACpB,MAAM,IAAI,aAAa,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,GAAG,IAAI,SAAS,EAChB,QAAQ,EACR,GAAG,IAAI,WAAW,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,UAAU,CAAA;AAGjB,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAGhD,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,UAAU,CAAA;AAGrF,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAGzC,OAAO,EACL,GAAG,IAAI,aAAa,EACpB,IAAI,IAAI,cAAc,EACtB,WAAW,EACX,GAAG,IAAI,cAAc,EACrB,MAAM,IAAI,cAAc,GACzB,MAAM,cAAc,CAAA;AAGrB,OAAO,EACL,GAAG,IAAI,YAAY,EACnB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAGpB,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAG5C,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAGjD,OAAO,EAAE,IAAI,IAAI,mBAAmB,EAAE,MAAM,mBAAmB,CAAA;AAC/D,OAAO,EACL,GAAG,IAAI,8BAA8B,EACrC,IAAI,IAAI,kBAAkB,GAC3B,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACL,GAAG,IAAI,QAAQ,EACf,IAAI,IAAI,UAAU,EAClB,OAAO,EACP,KAAK,IAAI,UAAU,EACnB,MAAM,IAAI,UAAU,GACrB,MAAM,SAAS,CAAA;AAChB,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAG5C,OAAO,EACL,GAAG,IAAI,0BAA0B,EACjC,IAAI,IAAI,wBAAwB,GACjC,MAAM,iBAAiB,CAAA;AAGxB,OAAO,EACL,GAAG,IAAI,KAAK,EACZ,KAAK,IAAI,QAAQ,EACjB,cAAc,IAAI,gBAAgB,GACnC,MAAM,MAAM,CAAA;AAGb,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAGtE,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAGxD,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,IAAI,qBAAqB,EACtC,UAAU,IAAI,kBAAkB,EAChC,aAAa,IAAI,qBAAqB,EACtC,aAAa,IAAI,qBAAqB,GACvC,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,QAAQ,IAAI,gBAAgB,EAC5B,UAAU,IAAI,kBAAkB,EAChC,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AAGnB,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAA"}
|
package/dist/admin/api/index.js
CHANGED
|
@@ -96,6 +96,15 @@ export { GET as getCustomers, getCustomer, updateCustomer, deleteCustomer, } fro
|
|
|
96
96
|
export { POST as setupAdmin } from './setup';
|
|
97
97
|
// Check (check if admin exists)
|
|
98
98
|
export { GET as checkAdminExists } from './check';
|
|
99
|
+
// Password reset (forgot + reset flow)
|
|
100
|
+
export { POST as adminForgotPassword } from './forgot-password';
|
|
101
|
+
export { GET as validateAdminResetTokenHandler, POST as adminResetPassword, } from './reset-password';
|
|
102
|
+
// User management (list, invite, detail, lifecycle actions, hard delete)
|
|
103
|
+
export { GET as getUsers, POST as inviteUser, getUser, PATCH as updateUser, DELETE as deleteUser, } from './users';
|
|
104
|
+
// Accept invite (Phase 3) — unauthenticated, public routes
|
|
105
|
+
export { GET as validateAdminInviteHandler, POST as acceptAdminInviteHandler, } from './accept-invite';
|
|
106
|
+
// Self-service (Phase 4)
|
|
107
|
+
export { GET as getMe, PATCH as updateMe, PATCH_PASSWORD as updateMyPassword, } from './me';
|
|
99
108
|
// Settings
|
|
100
109
|
export { GET as getSettings, PUT as updateSettings } from './settings';
|
|
101
110
|
// Stripe Status
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EG;AAEH,OAAO;AACP,OAAO,EAAE,uBAAuB,EAAE,MAAM,QAAQ,CAAA;AAEhD,WAAW;AACX,OAAO,EACL,GAAG,IAAI,WAAW,EAClB,IAAI,IAAI,aAAa,EACrB,UAAU,EACV,GAAG,IAAI,aAAa,EACpB,MAAM,IAAI,aAAa,EACvB,UAAU,EACV,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,YAAY,CAAA;AAEnB,SAAS;AACT,OAAO,EACL,GAAG,IAAI,SAAS,EAChB,QAAQ,EACR,GAAG,IAAI,WAAW,EAClB,sBAAsB,EACtB,cAAc,GACf,MAAM,UAAU,CAAA;AAEjB,SAAS;AACT,OAAO,EAAE,IAAI,IAAI,aAAa,EAAE,MAAM,UAAU,CAAA;AAEhD,0CAA0C;AAC1C,OAAO,EAAE,YAAY,IAAI,aAAa,EAAE,WAAW,IAAI,YAAY,EAAE,MAAM,UAAU,CAAA;AAErF,QAAQ;AACR,OAAO,EAAE,GAAG,IAAI,QAAQ,EAAE,MAAM,SAAS,CAAA;AAEzC,aAAa;AACb,OAAO,EACL,GAAG,IAAI,aAAa,EACpB,IAAI,IAAI,cAAc,EACtB,WAAW,EACX,GAAG,IAAI,cAAc,EACrB,MAAM,IAAI,cAAc,GACzB,MAAM,cAAc,CAAA;AAErB,YAAY;AACZ,OAAO,EACL,GAAG,IAAI,YAAY,EACnB,WAAW,EACX,cAAc,EACd,cAAc,GACf,MAAM,aAAa,CAAA;AAEpB,oCAAoC;AACpC,OAAO,EAAE,IAAI,IAAI,UAAU,EAAE,MAAM,SAAS,CAAA;AAE5C,gCAAgC;AAChC,OAAO,EAAE,GAAG,IAAI,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAEjD,WAAW;AACX,OAAO,EAAE,GAAG,IAAI,WAAW,EAAE,GAAG,IAAI,cAAc,EAAE,MAAM,YAAY,CAAA;AAEtE,gBAAgB;AAChB,OAAO,EAAE,GAAG,IAAI,eAAe,EAAE,MAAM,iBAAiB,CAAA;AAExD,oBAAoB;AACpB,OAAO,EACL,WAAW,IAAI,mBAAmB,EAClC,aAAa,IAAI,qBAAqB,EACtC,UAAU,IAAI,kBAAkB,EAChC,aAAa,IAAI,qBAAqB,EACtC,aAAa,IAAI,qBAAqB,GACvC,MAAM,YAAY,CAAA;AAEnB,yBAAyB;AACzB,OAAO,EACL,QAAQ,IAAI,gBAAgB,EAC5B,UAAU,IAAI,kBAAkB,EAChC,OAAO,IAAI,eAAe,EAC1B,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,UAAU,IAAI,kBAAkB,EAChC,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,YAAY,CAAA;AAEnB,YAAY;AACZ,OAAO,EACL,WAAW,EACX,aAAa,EACb,UAAU,EACV,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/admin/api/index.ts"],"names":[],"mappings":"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"}
|