@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
package/dist/admin/index.d.ts
CHANGED
|
@@ -54,12 +54,12 @@
|
|
|
54
54
|
* }
|
|
55
55
|
* ```
|
|
56
56
|
*/
|
|
57
|
-
export type { OrderStatus, ProductStatus, AdminRole, Order, OrderItem, Product, ProductVariant, Customer, StoreAdmin, Category, PaginatedResponse, ApiError, Address, AdminApiError, AdminSession, AdminAuthState, AdminSignInOptions, AdminSignInResult, DashboardStats, LowStockItem, RecentOrder, RevenueDataPoint, OrderStatusDataPoint, UseAdminStatsOptions, ProductFormData, VariantFormData, CategoryFormData, ProductListOptions, OrderListOptions, CustomerListOptions, CrudResult, RefundResult, StoreSettingsData, StoreSettingsInput, ShippingCarrierData, ShippingCarrierInput, ShippingRateData, ShippingZoneData, ShippingZoneInput, ShippingRateInput, ShippingSettingsProps, ShippingZoneFormProps, ShippingRateFormProps, TaxZoneData, TaxZoneInput, TaxSettingsProps, ShippingMode, ShippoAddress, ShippoParcel, ShippoRate, ShippoLabelResult, ShippoTrackingStatus, ShippoValidationResult, AdminOrderListItem, AdminOrderDetail, AdminOrderItem, AdminProductListItem, AdminProductDetail, AdminProductVariant, AdminCustomerListItem, AdminCustomerDetail, AdminCategoryListItem, AdminLayoutProps, AdminGuardProps, AdminLoginFormProps, AdminNavProps, AdminHeaderProps, StatsCardsProps, RecentOrdersProps, LowStockAlertProps, ProductTableProps, ProductFormProps, InventoryEditorProps, OrderTableProps, OrderDetailsProps, RefundDialogProps, StoreSettingsProps, CustomerTableProps, CustomerDetailsProps, AdminAuthConfigOptions, UseAdminAuthReturn, UseAdminStatsReturn, UseAdminOrdersReturn, UseAdminProductsReturn, UseAdminCustomersReturn, UseAdminCategoriesReturn, } from './types';
|
|
57
|
+
export type { OrderStatus, ProductStatus, AdminRole, Order, OrderItem, Product, ProductVariant, Customer, StoreAdmin, Category, PaginatedResponse, ApiError, Address, AdminApiError, AdminSession, AdminAuthState, AdminSignInOptions, AdminSignInResult, DashboardStats, LowStockItem, RecentOrder, RevenueDataPoint, OrderStatusDataPoint, UseAdminStatsOptions, ProductFormData, VariantFormData, CategoryFormData, ProductListOptions, OrderListOptions, CustomerListOptions, CrudResult, RefundResult, StoreSettingsData, StoreSettingsInput, ShippingCarrierData, ShippingCarrierInput, ShippingRateData, ShippingZoneData, ShippingZoneInput, ShippingRateInput, ShippingSettingsProps, ShippingZoneFormProps, ShippingRateFormProps, TaxZoneData, TaxZoneInput, TaxSettingsProps, ShippingMode, ShippoAddress, ShippoParcel, ShippoRate, ShippoLabelResult, ShippoTrackingStatus, ShippoValidationResult, AdminOrderListItem, AdminOrderDetail, AdminOrderItem, AdminProductListItem, AdminProductDetail, AdminProductVariant, AdminCustomerListItem, AdminCustomerDetail, AdminCategoryListItem, AdminListItem, AdminUserListOptions, UsersTableProps, UseAdminUsersReturn, UseAdminPermissionsReturn, AdminInviteData, AdminInviteHookResult, InviteUserDialogProps, AdminAcceptInviteFormProps, AdminLayoutProps, AdminGuardProps, AdminLoginFormProps, AdminNavProps, AdminHeaderProps, StatsCardsProps, RecentOrdersProps, LowStockAlertProps, ProductTableProps, ProductFormProps, InventoryEditorProps, OrderTableProps, OrderDetailsProps, RefundDialogProps, StoreSettingsProps, CustomerTableProps, CustomerDetailsProps, AdminAuthConfigOptions, UseAdminAuthReturn, UseAdminStatsReturn, UseAdminOrdersReturn, UseAdminProductsReturn, UseAdminCustomersReturn, UseAdminCategoriesReturn, } from './types';
|
|
58
58
|
export { createAdminAuthOptions, adminAuthConfig, adminAuthHandlers, createAdminNextAuthHandler, getAdminSession, } from './config';
|
|
59
|
-
export { authenticateAdmin, createAdmin, updateAdminPassword, findAdminForSession, findAdminByEmail, findAdminById, updateAdmin, adminEmailExists, countAdmins, } from './server';
|
|
59
|
+
export { authenticateAdmin, createAdmin, updateAdminPassword, findAdminForSession, findAdminByEmail, findAdminById, updateAdmin, adminEmailExists, countAdmins, requestAdminPasswordReset, validateAdminResetToken, resetAdminPassword, deleteAdminPasswordResetTokens, cleanupExpiredAdminResetTokens, listAdmins, countActiveOwners, deactivateAdmin, reactivateAdmin, hardDeleteAdmin, inviteAdmin, resendAdminInvite, cancelAdminInvite, changeAdminRole, validateInviteToken, acceptAdminInvite, deleteAdminInviteTokens, cleanupExpiredInviteTokens, changeOwnPassword, updateOwnProfile, } from './server';
|
|
60
60
|
export { createAdminAuthHandlers, getProducts, createProduct, getProduct, updateProduct, deleteProduct, addVariant, updateVariantHandler, deleteVariantHandler, getOrders, getOrder, updateOrder, processRefund, getStats, getCategories, createCategory, getCategory, updateCategory, deleteCategory, getCustomers, getCustomer, setupAdmin, checkAdminExists, getSettings, updateSettings, getStripeStatus, getShippingCarriers, createShippingCarrier, getShippingCarrier, updateShippingCarrier, deleteShippingCarrier, getShippingZones, createShippingZone, getShippingZone, updateShippingZone, deleteShippingZone, createShippingRate, updateShippingRate, deleteShippingRate, getTaxZones, createTaxZone, getTaxZone, updateTaxZone, deleteTaxZone, } from './api';
|
|
61
|
-
export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, useAdminCustomers, } from './hooks';
|
|
61
|
+
export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, useAdminCustomers, useAdminUsers, useAdminPermissions, useAdminMe, } from './hooks';
|
|
62
62
|
export type { CategoryTreeItem } from './hooks/useAdminCategories';
|
|
63
|
-
export { AdminGuard, AdminLoginForm, AdminSetupForm, AdminLayout, AdminNav, AdminHeader, StatsCards, RecentOrders, LowStockAlert, RevenueChart, OrderStatusChart, ProductTable, ProductForm, InventoryEditor, CategorySelect, CategoryForm, SEOPreview, TagInput, VariantManager, OrderTable, OrderDetails, RefundDialog, StoreSettings, LogoUpload, PaymentSettings, ShippingSettings, TaxSettings, CustomerTable, CustomerDetails, DeleteConfirmDialog, } from './components';
|
|
63
|
+
export { AdminGuard, AdminLoginForm, AdminSetupForm, AdminLayout, AdminNav, AdminHeader, StatsCards, RecentOrders, LowStockAlert, RevenueChart, OrderStatusChart, ProductTable, ProductForm, InventoryEditor, CategorySelect, CategoryForm, SEOPreview, TagInput, VariantManager, OrderTable, OrderDetails, RefundDialog, StoreSettings, LogoUpload, PaymentSettings, ShippingSettings, TaxSettings, CustomerTable, CustomerDetails, UsersTable, InviteUserDialog, AdminAcceptInviteForm, AdminAccountPage, DeleteConfirmDialog, } from './components';
|
|
64
64
|
export type { AdminSetupFormProps, RevenueChartProps, OrderStatusChartProps, CategorySelectProps, CategoryFormProps, SEOPreviewProps, TagInputProps, VariantManagerProps, VariantOption, VariantData, DeleteConfirmDialogProps, LogoUploadProps, } from './components';
|
|
65
65
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAMH,YAAY,EAEV,WAAW,EACX,aAAa,EACb,SAAS,EACT,KAAK,EACL,SAAS,EACT,OAAO,EACP,cAAc,EACd,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,iBAAiB,EACjB,QAAQ,EACR,OAAO,EAGP,aAAa,EAGb,YAAY,EACZ,cAAc,EACd,kBAAkB,EAClB,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,kBAAkB,EAClB,gBAAgB,EAChB,mBAAmB,EACnB,UAAU,EACV,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAGlB,mBAAmB,EACnB,oBAAoB,EACpB,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,iBAAiB,EACjB,qBAAqB,EACrB,qBAAqB,EACrB,qBAAqB,EAGrB,WAAW,EACX,YAAY,EACZ,gBAAgB,EAGhB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,UAAU,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EAGtB,kBAAkB,EAClB,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,EACnB,qBAAqB,EACrB,mBAAmB,EACnB,qBAAqB,EAGrB,gBAAgB,EAChB,eAAe,EACf,mBAAmB,EACnB,aAAa,EACb,gBAAgB,EAChB,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,gBAAgB,EAChB,oBAAoB,EACpB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,oBAAoB,EAGpB,sBAAsB,EAGtB,kBAAkB,EAClB,mBAAmB,EACnB,oBAAoB,EACpB,sBAAsB,EACtB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,SAAS,CAAA;AAMhB,OAAO,EACL,sBAAsB,EACtB,eAAe,EACf,iBAAiB,EACjB,0BAA0B,EAC1B,eAAe,GAChB,MAAM,UAAU,CAAA;AAMjB,OAAO,EACL,iBAAiB,EACjB,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,gBAAgB,EAChB,aAAa,EACb,WAAW,EACX,gBAAgB,EAChB,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
|
package/dist/admin/index.js
CHANGED
|
@@ -61,7 +61,15 @@ export { createAdminAuthOptions, adminAuthConfig, adminAuthHandlers, createAdmin
|
|
|
61
61
|
// =============================================================================
|
|
62
62
|
// Server-side Services
|
|
63
63
|
// =============================================================================
|
|
64
|
-
export { authenticateAdmin, createAdmin, updateAdminPassword, findAdminForSession, findAdminByEmail, findAdminById, updateAdmin, adminEmailExists, countAdmins,
|
|
64
|
+
export { authenticateAdmin, createAdmin, updateAdminPassword, findAdminForSession, findAdminByEmail, findAdminById, updateAdmin, adminEmailExists, countAdmins,
|
|
65
|
+
// Password reset (Phase 1)
|
|
66
|
+
requestAdminPasswordReset, validateAdminResetToken, resetAdminPassword, deleteAdminPasswordResetTokens, cleanupExpiredAdminResetTokens,
|
|
67
|
+
// User management (Phase 2)
|
|
68
|
+
listAdmins, countActiveOwners, deactivateAdmin, reactivateAdmin, hardDeleteAdmin,
|
|
69
|
+
// Phase 3 — invite flow + role change
|
|
70
|
+
inviteAdmin, resendAdminInvite, cancelAdminInvite, changeAdminRole, validateInviteToken, acceptAdminInvite, deleteAdminInviteTokens, cleanupExpiredInviteTokens,
|
|
71
|
+
// Phase 4 — self-service
|
|
72
|
+
changeOwnPassword, updateOwnProfile, } from './server';
|
|
65
73
|
// =============================================================================
|
|
66
74
|
// API Route Handlers (re-exported for convenience)
|
|
67
75
|
// Can also import from '@rovela-ai/sdk/admin/api' for individual handlers
|
|
@@ -84,7 +92,11 @@ getTaxZones, createTaxZone, getTaxZone, updateTaxZone, deleteTaxZone, } from './
|
|
|
84
92
|
// =============================================================================
|
|
85
93
|
// React Hooks
|
|
86
94
|
// =============================================================================
|
|
87
|
-
export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, useAdminCustomers,
|
|
95
|
+
export { useAdminAuth, useAdminStats, useAdminProducts, useAdminOrders, useAdminCategories, useAdminCustomers,
|
|
96
|
+
// Phase 2
|
|
97
|
+
useAdminUsers, useAdminPermissions,
|
|
98
|
+
// Phase 4
|
|
99
|
+
useAdminMe, } from './hooks';
|
|
88
100
|
// =============================================================================
|
|
89
101
|
// React Components
|
|
90
102
|
// =============================================================================
|
|
@@ -111,6 +123,12 @@ ShippingSettings,
|
|
|
111
123
|
TaxSettings,
|
|
112
124
|
// Customers
|
|
113
125
|
CustomerTable, CustomerDetails,
|
|
126
|
+
// User management (Phase 2)
|
|
127
|
+
UsersTable,
|
|
128
|
+
// User management (Phase 3)
|
|
129
|
+
InviteUserDialog, AdminAcceptInviteForm,
|
|
130
|
+
// Self-service (Phase 4)
|
|
131
|
+
AdminAccountPage,
|
|
114
132
|
// Utility
|
|
115
133
|
DeleteConfirmDialog, } from './components';
|
|
116
134
|
//# sourceMappingURL=index.js.map
|
package/dist/admin/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/permissions
|
|
3
|
+
*
|
|
4
|
+
* Role-based permission matrix for store admins.
|
|
5
|
+
*
|
|
6
|
+
* # Four-role hierarchy (strict)
|
|
7
|
+
*
|
|
8
|
+
* owner (rank 0) can do everything, including managing other owners.
|
|
9
|
+
* Subject to "at least one active owner always exists".
|
|
10
|
+
* administrator (rank 1) can do everything except manage owners or other administrators.
|
|
11
|
+
* Prevents lateral privilege escalation.
|
|
12
|
+
* manager (rank 2) full day-to-day operational access (products, orders, customers,
|
|
13
|
+
* returns, refunds). Cannot touch settings, billing, or users.
|
|
14
|
+
* user (rank 3) read-only on most resources + write access to orders only
|
|
15
|
+
* (for warehouse/fulfillment staff updating tracking).
|
|
16
|
+
*
|
|
17
|
+
* # Legacy 'admin' role
|
|
18
|
+
*
|
|
19
|
+
* Stores created before the four-role system shipped have rows with role='admin'.
|
|
20
|
+
* We never rewrite those rows (Postgres enums can't remove values anyway). The
|
|
21
|
+
* permission map treats 'admin' as an alias for 'administrator' — same exact
|
|
22
|
+
* permission set, same `canManageUser` behavior.
|
|
23
|
+
*
|
|
24
|
+
* # Client vs server
|
|
25
|
+
*
|
|
26
|
+
* All checks in this file are pure functions over static data. They are safe to
|
|
27
|
+
* import from both server and client code. The server uses them as the source
|
|
28
|
+
* of truth for authorization; the client uses them for UX gating (hide/disable
|
|
29
|
+
* buttons). The client is always advisory — the server is the gate.
|
|
30
|
+
*/
|
|
31
|
+
import type { AdminRole } from '../core/types';
|
|
32
|
+
/**
|
|
33
|
+
* Every action an admin can perform, grouped by resource. Adding a new
|
|
34
|
+
* permission here means:
|
|
35
|
+
* 1. Add it to this type union
|
|
36
|
+
* 2. Assign it to one or more roles in the PERMISSIONS map below
|
|
37
|
+
* 3. Reference it via `hasPermission(role, 'foo.bar')` at the relevant API handler
|
|
38
|
+
*/
|
|
39
|
+
export type Permission = 'products.read' | 'products.write' | 'products.delete' | 'orders.read' | 'orders.write' | 'orders.refund' | 'returns.approve' | 'returns.reject' | 'customers.read' | 'customers.write' | 'customers.delete' | 'settings.read' | 'settings.write' | 'billing.read' | 'billing.write' | 'users.read' | 'users.write' | 'users.delete';
|
|
40
|
+
/**
|
|
41
|
+
* Returns true if `actorRole` is at least as powerful as `minRole`.
|
|
42
|
+
*
|
|
43
|
+
* @example
|
|
44
|
+
* meetsMinRole('owner', 'manager') // true
|
|
45
|
+
* meetsMinRole('user', 'manager') // false
|
|
46
|
+
*/
|
|
47
|
+
export declare function meetsMinRole(actorRole: AdminRole | null | undefined, minRole: AdminRole): boolean;
|
|
48
|
+
/**
|
|
49
|
+
* Does this role have a specific permission?
|
|
50
|
+
*
|
|
51
|
+
* Safe to call with `undefined` / `null` actor — returns `false`, which is what
|
|
52
|
+
* unauthenticated requests want.
|
|
53
|
+
*
|
|
54
|
+
* @example
|
|
55
|
+
* hasPermission('owner', 'users.delete') // true
|
|
56
|
+
* hasPermission('administrator', 'users.delete') // false
|
|
57
|
+
* hasPermission(undefined, 'products.read') // false
|
|
58
|
+
*/
|
|
59
|
+
export declare function hasPermission(role: AdminRole | null | undefined, permission: Permission): boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Can `actor` modify `target` as a user-management action?
|
|
62
|
+
*
|
|
63
|
+
* Rules:
|
|
64
|
+
* - Owners can manage anyone, including other owners. The "at least one
|
|
65
|
+
* active owner must remain" invariant is enforced separately at the
|
|
66
|
+
* service layer, not here — this helper only answers "does the actor
|
|
67
|
+
* have the authority in principle?"
|
|
68
|
+
* - Administrators can manage managers and users only. They cannot touch
|
|
69
|
+
* owners or other administrators. (Prevents lateral escalation.)
|
|
70
|
+
* - Managers and users cannot manage anyone.
|
|
71
|
+
* - Actor cannot manage themselves via this helper. Self-actions (password
|
|
72
|
+
* change, profile update) go through /api/admin/me/* endpoints and have
|
|
73
|
+
* their own rules.
|
|
74
|
+
*/
|
|
75
|
+
export declare function canManageUser(actor: {
|
|
76
|
+
id: string;
|
|
77
|
+
role: AdminRole;
|
|
78
|
+
}, target: {
|
|
79
|
+
id: string;
|
|
80
|
+
role: AdminRole;
|
|
81
|
+
}): boolean;
|
|
82
|
+
/**
|
|
83
|
+
* Human-readable label for a role. Maps the legacy 'admin' to
|
|
84
|
+
* 'Administrator' so UI never leaks the old value.
|
|
85
|
+
*/
|
|
86
|
+
export declare function roleLabel(role: AdminRole): string;
|
|
87
|
+
/**
|
|
88
|
+
* Canonical role for a given stored value. Collapses 'admin' → 'administrator'
|
|
89
|
+
* so callers don't need to think about the legacy alias.
|
|
90
|
+
*/
|
|
91
|
+
export declare function canonicalRole(role: AdminRole): Exclude<AdminRole, 'admin'>;
|
|
92
|
+
//# sourceMappingURL=permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../src/admin/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAA;AAM9C;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAElB,eAAe,GACf,gBAAgB,GAChB,iBAAiB,GAEjB,aAAa,GACb,cAAc,GACd,eAAe,GAEf,iBAAiB,GACjB,gBAAgB,GAEhB,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,GAElB,eAAe,GACf,gBAAgB,GAEhB,cAAc,GACd,eAAe,GAEf,YAAY,GACZ,aAAa,GACb,cAAc,CAAA;AAmBlB;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,SAAS,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EACvC,OAAO,EAAE,SAAS,GACjB,OAAO,CAGT;AAoFD;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,SAAS,GAAG,IAAI,GAAG,SAAS,EAClC,UAAU,EAAE,UAAU,GACrB,OAAO,CAIT;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,EACtC,MAAM,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,SAAS,CAAA;CAAE,GACtC,OAAO,CAaT;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,CAYjD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,SAAS,GAAG,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAE1E"}
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/permissions
|
|
3
|
+
*
|
|
4
|
+
* Role-based permission matrix for store admins.
|
|
5
|
+
*
|
|
6
|
+
* # Four-role hierarchy (strict)
|
|
7
|
+
*
|
|
8
|
+
* owner (rank 0) can do everything, including managing other owners.
|
|
9
|
+
* Subject to "at least one active owner always exists".
|
|
10
|
+
* administrator (rank 1) can do everything except manage owners or other administrators.
|
|
11
|
+
* Prevents lateral privilege escalation.
|
|
12
|
+
* manager (rank 2) full day-to-day operational access (products, orders, customers,
|
|
13
|
+
* returns, refunds). Cannot touch settings, billing, or users.
|
|
14
|
+
* user (rank 3) read-only on most resources + write access to orders only
|
|
15
|
+
* (for warehouse/fulfillment staff updating tracking).
|
|
16
|
+
*
|
|
17
|
+
* # Legacy 'admin' role
|
|
18
|
+
*
|
|
19
|
+
* Stores created before the four-role system shipped have rows with role='admin'.
|
|
20
|
+
* We never rewrite those rows (Postgres enums can't remove values anyway). The
|
|
21
|
+
* permission map treats 'admin' as an alias for 'administrator' — same exact
|
|
22
|
+
* permission set, same `canManageUser` behavior.
|
|
23
|
+
*
|
|
24
|
+
* # Client vs server
|
|
25
|
+
*
|
|
26
|
+
* All checks in this file are pure functions over static data. They are safe to
|
|
27
|
+
* import from both server and client code. The server uses them as the source
|
|
28
|
+
* of truth for authorization; the client uses them for UX gating (hide/disable
|
|
29
|
+
* buttons). The client is always advisory — the server is the gate.
|
|
30
|
+
*/
|
|
31
|
+
// =============================================================================
|
|
32
|
+
// Role ranks + hierarchy helpers
|
|
33
|
+
// =============================================================================
|
|
34
|
+
/**
|
|
35
|
+
* Lower number = higher power. Used by `meetsMinRole` to enforce "must be at
|
|
36
|
+
* least an administrator" style checks. 'admin' is explicitly an alias for
|
|
37
|
+
* 'administrator' at rank 1.
|
|
38
|
+
*/
|
|
39
|
+
const ROLE_RANK = {
|
|
40
|
+
owner: 0,
|
|
41
|
+
administrator: 1,
|
|
42
|
+
admin: 1, // legacy alias — identical to 'administrator'
|
|
43
|
+
manager: 2,
|
|
44
|
+
user: 3,
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Returns true if `actorRole` is at least as powerful as `minRole`.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* meetsMinRole('owner', 'manager') // true
|
|
51
|
+
* meetsMinRole('user', 'manager') // false
|
|
52
|
+
*/
|
|
53
|
+
export function meetsMinRole(actorRole, minRole) {
|
|
54
|
+
if (!actorRole)
|
|
55
|
+
return false;
|
|
56
|
+
return ROLE_RANK[actorRole] <= ROLE_RANK[minRole];
|
|
57
|
+
}
|
|
58
|
+
// =============================================================================
|
|
59
|
+
// Permission matrix
|
|
60
|
+
// =============================================================================
|
|
61
|
+
const OWNER_PERMISSIONS = [
|
|
62
|
+
'products.read',
|
|
63
|
+
'products.write',
|
|
64
|
+
'products.delete',
|
|
65
|
+
'orders.read',
|
|
66
|
+
'orders.write',
|
|
67
|
+
'orders.refund',
|
|
68
|
+
'returns.approve',
|
|
69
|
+
'returns.reject',
|
|
70
|
+
'customers.read',
|
|
71
|
+
'customers.write',
|
|
72
|
+
'customers.delete',
|
|
73
|
+
'settings.read',
|
|
74
|
+
'settings.write',
|
|
75
|
+
'billing.read',
|
|
76
|
+
'billing.write',
|
|
77
|
+
'users.read',
|
|
78
|
+
'users.write',
|
|
79
|
+
'users.delete',
|
|
80
|
+
];
|
|
81
|
+
const ADMINISTRATOR_PERMISSIONS = [
|
|
82
|
+
'products.read',
|
|
83
|
+
'products.write',
|
|
84
|
+
'products.delete',
|
|
85
|
+
'orders.read',
|
|
86
|
+
'orders.write',
|
|
87
|
+
'orders.refund',
|
|
88
|
+
'returns.approve',
|
|
89
|
+
'returns.reject',
|
|
90
|
+
'customers.read',
|
|
91
|
+
'customers.write',
|
|
92
|
+
'customers.delete',
|
|
93
|
+
'settings.read',
|
|
94
|
+
'settings.write',
|
|
95
|
+
'billing.read',
|
|
96
|
+
'billing.write',
|
|
97
|
+
'users.read',
|
|
98
|
+
'users.write',
|
|
99
|
+
// NOTE: 'users.delete' is intentionally owner-only. Administrators can
|
|
100
|
+
// deactivate (via users.write + canManageUser) but not hard-delete.
|
|
101
|
+
];
|
|
102
|
+
const MANAGER_PERMISSIONS = [
|
|
103
|
+
'products.read',
|
|
104
|
+
'products.write',
|
|
105
|
+
'orders.read',
|
|
106
|
+
'orders.write',
|
|
107
|
+
'orders.refund',
|
|
108
|
+
'returns.approve',
|
|
109
|
+
'returns.reject',
|
|
110
|
+
'customers.read',
|
|
111
|
+
'customers.write',
|
|
112
|
+
'settings.read',
|
|
113
|
+
];
|
|
114
|
+
const USER_PERMISSIONS = [
|
|
115
|
+
'products.read',
|
|
116
|
+
'orders.read',
|
|
117
|
+
'orders.write', // fulfillment staff update tracking/status
|
|
118
|
+
];
|
|
119
|
+
/**
|
|
120
|
+
* The canonical permission map. Each role points at a Set<Permission> for O(1)
|
|
121
|
+
* membership checks. 'admin' shares the administrator set (legacy alias).
|
|
122
|
+
*/
|
|
123
|
+
const PERMISSIONS = {
|
|
124
|
+
owner: new Set(OWNER_PERMISSIONS),
|
|
125
|
+
administrator: new Set(ADMINISTRATOR_PERMISSIONS),
|
|
126
|
+
admin: new Set(ADMINISTRATOR_PERMISSIONS), // legacy alias
|
|
127
|
+
manager: new Set(MANAGER_PERMISSIONS),
|
|
128
|
+
user: new Set(USER_PERMISSIONS),
|
|
129
|
+
};
|
|
130
|
+
// =============================================================================
|
|
131
|
+
// Public API
|
|
132
|
+
// =============================================================================
|
|
133
|
+
/**
|
|
134
|
+
* Does this role have a specific permission?
|
|
135
|
+
*
|
|
136
|
+
* Safe to call with `undefined` / `null` actor — returns `false`, which is what
|
|
137
|
+
* unauthenticated requests want.
|
|
138
|
+
*
|
|
139
|
+
* @example
|
|
140
|
+
* hasPermission('owner', 'users.delete') // true
|
|
141
|
+
* hasPermission('administrator', 'users.delete') // false
|
|
142
|
+
* hasPermission(undefined, 'products.read') // false
|
|
143
|
+
*/
|
|
144
|
+
export function hasPermission(role, permission) {
|
|
145
|
+
if (!role)
|
|
146
|
+
return false;
|
|
147
|
+
const perms = PERMISSIONS[role];
|
|
148
|
+
return perms ? perms.has(permission) : false;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Can `actor` modify `target` as a user-management action?
|
|
152
|
+
*
|
|
153
|
+
* Rules:
|
|
154
|
+
* - Owners can manage anyone, including other owners. The "at least one
|
|
155
|
+
* active owner must remain" invariant is enforced separately at the
|
|
156
|
+
* service layer, not here — this helper only answers "does the actor
|
|
157
|
+
* have the authority in principle?"
|
|
158
|
+
* - Administrators can manage managers and users only. They cannot touch
|
|
159
|
+
* owners or other administrators. (Prevents lateral escalation.)
|
|
160
|
+
* - Managers and users cannot manage anyone.
|
|
161
|
+
* - Actor cannot manage themselves via this helper. Self-actions (password
|
|
162
|
+
* change, profile update) go through /api/admin/me/* endpoints and have
|
|
163
|
+
* their own rules.
|
|
164
|
+
*/
|
|
165
|
+
export function canManageUser(actor, target) {
|
|
166
|
+
// No self-management through this helper.
|
|
167
|
+
if (actor.id === target.id)
|
|
168
|
+
return false;
|
|
169
|
+
if (actor.role === 'owner') {
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
if (actor.role === 'administrator' || actor.role === 'admin') {
|
|
173
|
+
return target.role === 'manager' || target.role === 'user';
|
|
174
|
+
}
|
|
175
|
+
return false;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Human-readable label for a role. Maps the legacy 'admin' to
|
|
179
|
+
* 'Administrator' so UI never leaks the old value.
|
|
180
|
+
*/
|
|
181
|
+
export function roleLabel(role) {
|
|
182
|
+
switch (role) {
|
|
183
|
+
case 'owner':
|
|
184
|
+
return 'Owner';
|
|
185
|
+
case 'admin':
|
|
186
|
+
case 'administrator':
|
|
187
|
+
return 'Administrator';
|
|
188
|
+
case 'manager':
|
|
189
|
+
return 'Manager';
|
|
190
|
+
case 'user':
|
|
191
|
+
return 'User';
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Canonical role for a given stored value. Collapses 'admin' → 'administrator'
|
|
196
|
+
* so callers don't need to think about the legacy alias.
|
|
197
|
+
*/
|
|
198
|
+
export function canonicalRole(role) {
|
|
199
|
+
return role === 'admin' ? 'administrator' : role;
|
|
200
|
+
}
|
|
201
|
+
//# sourceMappingURL=permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"permissions.js","sourceRoot":"","sources":["../../src/admin/permissions.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @rovela/sdk/admin/server/admin-invite
|
|
3
|
+
*
|
|
4
|
+
* Admin invite token lifecycle: validation, acceptance, and housekeeping.
|
|
5
|
+
*
|
|
6
|
+
* Paired with `user-management.ts::inviteAdmin` which creates the token +
|
|
7
|
+
* sends the email. This file handles the INVITEE's side of the flow: they
|
|
8
|
+
* click the email link, land on `/admin/accept-invite?token=X`, and this
|
|
9
|
+
* module validates + consumes the token.
|
|
10
|
+
*
|
|
11
|
+
* # Failure modes (all graceful — no exceptions leak out)
|
|
12
|
+
*
|
|
13
|
+
* - Token unknown → `{valid: false}` / `INVALID_TOKEN`
|
|
14
|
+
* - Token expired → delete row, return `{valid: false}` with "expired"
|
|
15
|
+
* - Admin deleted → cascaded delete already removed the token;
|
|
16
|
+
* caller will see `{valid: false}`
|
|
17
|
+
* - Admin already accepted → `{valid: false}` with "already accepted"
|
|
18
|
+
* (protects against double-clicks)
|
|
19
|
+
* - Admin was deactivated → same as "already accepted" from UX point of view
|
|
20
|
+
* - Concurrent acceptance → atomic UPDATE returns 0 rows → `INVALID_STATE`
|
|
21
|
+
*
|
|
22
|
+
* # Design notes
|
|
23
|
+
*
|
|
24
|
+
* The structure mirrors `admin-password-reset.ts` from Phase 1 exactly:
|
|
25
|
+
* 1. `validate*` is non-destructive (opportunistically cleans up expired
|
|
26
|
+
* tokens but doesn't touch the admin row).
|
|
27
|
+
* 2. `accept*` is destructive — it updates the password, flips status,
|
|
28
|
+
* and deletes ALL tokens for the admin (both invite + reset tokens,
|
|
29
|
+
* so a stale reset link can't resurrect access).
|
|
30
|
+
* 3. `delete*ForAdmin` helper used by `cancelInvite` / `resendInvite` to
|
|
31
|
+
* wipe stale tokens before issuing a new one.
|
|
32
|
+
* 4. `cleanupExpired` is an optional cron hook.
|
|
33
|
+
*/
|
|
34
|
+
import type { AdminRole } from '../../core/types';
|
|
35
|
+
/**
|
|
36
|
+
* Invite token lifetime: 72 hours. Matches industry standard
|
|
37
|
+
* (Google Workspace, GitHub, Shopify).
|
|
38
|
+
*/
|
|
39
|
+
export declare const INVITE_EXPIRY_MS: number;
|
|
40
|
+
/** Token length — nanoid(32) = ~192 bits of entropy, URL-safe. */
|
|
41
|
+
export declare const INVITE_TOKEN_LENGTH = 32;
|
|
42
|
+
/** Display string for the expiry duration. */
|
|
43
|
+
export declare const INVITE_EXPIRY_HOURS = "72";
|
|
44
|
+
export interface AdminInviteSnapshot {
|
|
45
|
+
id: string;
|
|
46
|
+
email: string;
|
|
47
|
+
name: string;
|
|
48
|
+
role: AdminRole;
|
|
49
|
+
}
|
|
50
|
+
export interface ValidateInviteResult {
|
|
51
|
+
valid: boolean;
|
|
52
|
+
error?: string;
|
|
53
|
+
admin?: AdminInviteSnapshot;
|
|
54
|
+
}
|
|
55
|
+
export interface AcceptInviteResult {
|
|
56
|
+
success: boolean;
|
|
57
|
+
error?: string;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a new invite token for an existing `invited` admin row.
|
|
61
|
+
*
|
|
62
|
+
* The caller is responsible for:
|
|
63
|
+
* - Validating the admin exists and is in `invited` status
|
|
64
|
+
* - Deleting any existing invite tokens for this admin (via
|
|
65
|
+
* `deleteAdminInviteTokens`) before calling this to keep "one active
|
|
66
|
+
* token" semantics
|
|
67
|
+
*
|
|
68
|
+
* @returns The plain-text token that should be embedded in the email link.
|
|
69
|
+
*/
|
|
70
|
+
export declare function createInviteToken(params: {
|
|
71
|
+
adminId: string;
|
|
72
|
+
invitedBy: string;
|
|
73
|
+
}): Promise<{
|
|
74
|
+
token: string;
|
|
75
|
+
expires: Date;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* Validate an invite token without consuming it.
|
|
79
|
+
*
|
|
80
|
+
* Used by the accept-invite page on mount to decide between rendering the
|
|
81
|
+
* password form or an "invalid/expired" error view.
|
|
82
|
+
*
|
|
83
|
+
* Side effect: expired tokens are opportunistically deleted as part of the
|
|
84
|
+
* check. All other failure modes leave the DB untouched.
|
|
85
|
+
*/
|
|
86
|
+
export declare function validateInviteToken(token: string): Promise<ValidateInviteResult>;
|
|
87
|
+
/**
|
|
88
|
+
* Consume an invite token and activate the invited admin.
|
|
89
|
+
*
|
|
90
|
+
* Atomically:
|
|
91
|
+
* 1. Validates the token + admin row.
|
|
92
|
+
* 2. Hashes + stores the new password via the existing
|
|
93
|
+
* `updateAdminPassword` helper.
|
|
94
|
+
* 3. Flips status from 'invited' → 'active' via an atomic guarded UPDATE
|
|
95
|
+
* (if two clicks race, the second one fails with INVALID_STATE).
|
|
96
|
+
* 4. Deletes all invite tokens for this admin (single-use batch).
|
|
97
|
+
* 5. Defensively deletes any stale password reset tokens too — a
|
|
98
|
+
* previously abandoned reset flow shouldn't grant access after the
|
|
99
|
+
* user has taken ownership of the account via accept-invite.
|
|
100
|
+
*/
|
|
101
|
+
export declare function acceptAdminInvite(token: string, newPassword: string): Promise<AcceptInviteResult>;
|
|
102
|
+
/**
|
|
103
|
+
* Delete all invite tokens for a specific admin.
|
|
104
|
+
*
|
|
105
|
+
* Called from:
|
|
106
|
+
* - `user-management.ts::inviteAdmin` — not called; the admin is newly
|
|
107
|
+
* created so there are no tokens to delete
|
|
108
|
+
* - `user-management.ts::resendAdminInvite` — clear stale tokens before
|
|
109
|
+
* creating a new one
|
|
110
|
+
* - `acceptAdminInvite` above — invalidate the used batch
|
|
111
|
+
* - `user-management.ts::cancelAdminInvite` — cascade handles this
|
|
112
|
+
* automatically via FK, but we call explicitly for clarity
|
|
113
|
+
*/
|
|
114
|
+
export declare function deleteAdminInviteTokens(adminId: string): Promise<void>;
|
|
115
|
+
/**
|
|
116
|
+
* Delete all expired invite tokens. Optional hook for a periodic cleanup
|
|
117
|
+
* job. Safe to call anytime — no-op if nothing is expired.
|
|
118
|
+
*
|
|
119
|
+
* @returns Number of tokens deleted
|
|
120
|
+
*/
|
|
121
|
+
export declare function cleanupExpiredInviteTokens(): Promise<number>;
|
|
122
|
+
//# sourceMappingURL=admin-invite.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-invite.d.ts","sourceRoot":"","sources":["../../../src/admin/server/admin-invite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AASH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAMjD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,QAAsB,CAAA;AAEnD,kEAAkE;AAClE,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,8CAA8C;AAC9C,eAAO,MAAM,mBAAmB,OAAO,CAAA;AAMvC,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,SAAS,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,OAAO,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,mBAAmB,CAAA;CAC5B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAMD;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;CAClB,GAAG,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,IAAI,CAAA;CAAE,CAAC,CAa5C;AAMD;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,oBAAoB,CAAC,CA+D/B;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,iBAAiB,CACrC,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,kBAAkB,CAAC,CA8C7B;AAMD;;;;;;;;;;;GAWG;AACH,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAK5E;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAOlE"}
|