import "server-only"; import type { AdminCapability, AdminInventoryAdjustmentCommand, AdminOrderTransitionCommand, AdminProductUpdateCommand, AdminRefundCommand, AdminRole, AdminVariantUpdateCommand, PaymentRefundResult, } from "@salixcommerce/core"; export interface AdminMembership { readonly active: boolean; readonly displayName: string; readonly role: AdminRole; readonly userId: string; } export interface AdminContext extends AdminMembership { readonly capabilities: readonly AdminCapability[]; } export interface AdminDashboard { readonly activity: readonly AdminActivityRecord[]; readonly inventory: readonly AdminInventoryRecord[]; readonly orders: readonly AdminOrderRecord[]; readonly payments: readonly AdminPaymentRecord[]; readonly products: readonly AdminProductRecord[]; readonly refunds: readonly AdminRefundRecord[]; } export interface AdminProductRecord { readonly description: string | null; readonly id: string; readonly name: string; readonly status: "archived" | "draft" | "published"; readonly variants: readonly AdminVariantRecord[]; } export interface AdminVariantRecord { readonly active: boolean; readonly allowBackorder: boolean; readonly currency: string; readonly id: string; readonly name: string; readonly priceMinor: number; } export interface AdminInventoryRecord { readonly id: string; readonly mode: "tracked" | "untracked"; readonly onHand: number; readonly productName: string; readonly reserved: number; readonly variantName: string; } export interface AdminOrderRecord { readonly contactEmail: string; readonly createdAt: string; readonly currency: string; readonly merchandiseSubtotalMinor: number; readonly reference: string; readonly status: "pending_payment" | "paid" | "processing" | "fulfilled" | "cancelled"; readonly trackingCarrier: string | null; readonly trackingNumber: string | null; } export interface AdminPaymentRecord { readonly amountMinor: number; readonly currency: string; readonly orderReference: string; readonly provider: string; readonly providerPaymentReference: string; readonly refundedAmountMinor: number; readonly status: string; } export interface AdminRefundRecord { readonly amountMinor: number; readonly createdAt: string; readonly currency: string; readonly orderReference: string; readonly providerRefundReference: string; readonly reason: string; readonly status: "pending" | "succeeded" | "failed"; } export interface AdminActivityRecord { readonly action: string; readonly createdAt: string; readonly entityId: string; readonly entityType: string; } export type AdminFailureCode = | "ADMIN_UNAVAILABLE" | "FORBIDDEN" | "IDEMPOTENCY_CONFLICT" | "ILLEGAL_ORDER_TRANSITION" | "INVALID_REQUEST" | "NOT_FOUND" | "PAYMENTS_UNAVAILABLE" | "PROVIDER_FAILURE" | "REFUND_EXCEEDS_PAYMENT" | "UNAUTHENTICATED"; export interface AdminFailure { readonly code: AdminFailureCode; readonly message: string; readonly status: 400 | 401 | 403 | 404 | 409 | 500 | 503; } export type AdminResult = { readonly data: T; readonly ok: true } | { readonly error: AdminFailure; readonly ok: false }; export interface AdminRepository { adjustInventory( context: AdminContext, inventoryItemId: string, command: AdminInventoryAdjustmentCommand, requestHash: string, ): Promise>; loadDashboard(context: AdminContext): Promise; loadMembership(userId: string): Promise; loadPayment(providerPaymentReference: string): Promise; recordRefund( context: AdminContext, command: AdminRefundCommand, payment: AdminPaymentRecord, refund: PaymentRefundResult, requestHash: string, ): Promise>; transitionOrder( context: AdminContext, orderReference: string, command: AdminOrderTransitionCommand, requestHash: string, ): Promise>; updateProduct( context: AdminContext, productId: string, command: AdminProductUpdateCommand, requestHash: string, ): Promise>; updateVariant( context: AdminContext, variantId: string, command: AdminVariantUpdateCommand, requestHash: string, ): Promise>; } export function adminFailure( code: AdminFailureCode, message: string, status: AdminFailure["status"], ): AdminFailure { return Object.freeze({ code, message, status }); }