@simpleapps-com/augur-server 0.2.10 → 0.2.11

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/index.d.ts CHANGED
@@ -30,6 +30,53 @@ declare function isRedisConnected(): boolean;
30
30
  * ```
31
31
  */
32
32
  declare function sdkCall<TArgs extends unknown[], TResult>(method: (...args: TArgs) => Promise<TResult>, ...args: TArgs): Promise<TResult>;
33
+ /**
34
+ * Discriminated union for safe action results.
35
+ * Same pattern as next-safe-action — callers check `result.ok` to
36
+ * determine success or failure with typed error info.
37
+ */
38
+ type ActionResult<T> = {
39
+ ok: true;
40
+ data: T;
41
+ } | {
42
+ ok: false;
43
+ error: string;
44
+ };
45
+ /**
46
+ * Wraps an async function call with error handling, returning an
47
+ * `ActionResult<T>` instead of throwing.
48
+ *
49
+ * Use this to eliminate try/catch boilerplate in server actions.
50
+ * Reads that go through React Query should NOT use this — let errors
51
+ * propagate so React Query can handle retries and error state.
52
+ *
53
+ * @param fn — The async function to execute
54
+ * @param onError — Optional callback for logging/reporting
55
+ *
56
+ * @example
57
+ * ```ts
58
+ * // Before (boilerplate wrapper):
59
+ * export async function addToCart(cartId: number, items: CartItem[]) {
60
+ * try {
61
+ * return await actions.commerce.addToCart(cartId, items);
62
+ * } catch (error) {
63
+ * console.error("addToCart error:", error);
64
+ * return undefined;
65
+ * }
66
+ * }
67
+ *
68
+ * // After (one-liner):
69
+ * const result = await safeAction(
70
+ * () => actions.commerce.addToCart(cartId, items),
71
+ * );
72
+ * if (result.ok) {
73
+ * // result.data is the response
74
+ * } else {
75
+ * // result.error is the error message
76
+ * }
77
+ * ```
78
+ */
79
+ declare function safeAction<T>(fn: () => Promise<T>, onError?: (error: Error) => void): Promise<ActionResult<T>>;
33
80
 
34
81
  /**
35
82
  * Creates a server-side query client optimised for prefetching.
@@ -66,4 +113,4 @@ declare const getServerQueryClient: () => QueryClient;
66
113
  */
67
114
  declare function withServerCache<T>(prefix: string, redisTtl: number | undefined, methodPath: string, fn: () => Promise<T>, ...keyArgs: unknown[]): Promise<T>;
68
115
 
69
- export { cacheGet, cacheSet, createServerQueryClient, env, getCircuitState, getServerQueryClient, isDev, isProduction, isRedisConnected, isStaging, sdkCall, withServerCache };
116
+ export { type ActionResult, cacheGet, cacheSet, createServerQueryClient, env, getCircuitState, getServerQueryClient, isDev, isProduction, isRedisConnected, isStaging, safeAction, sdkCall, withServerCache };
package/dist/index.js CHANGED
@@ -137,6 +137,16 @@ function isRedisConnected() {
137
137
  async function sdkCall(method, ...args) {
138
138
  return method(...args);
139
139
  }
140
+ async function safeAction(fn, onError) {
141
+ try {
142
+ const data = await fn();
143
+ return { ok: true, data };
144
+ } catch (e) {
145
+ const error = e instanceof Error ? e : new Error(String(e));
146
+ if (onError) onError(error);
147
+ return { ok: false, error: error.message };
148
+ }
149
+ }
140
150
 
141
151
  // src/cache/with-cache.ts
142
152
  function fnv1a(str) {
@@ -2315,6 +2325,7 @@ export {
2315
2325
  isProduction,
2316
2326
  isRedisConnected,
2317
2327
  isStaging,
2328
+ safeAction,
2318
2329
  sdkCall,
2319
2330
  withServerCache
2320
2331
  };
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/environment.ts","../src/cache/redis-client.ts","../src/sdk-call.ts","../src/cache/with-cache.ts","../src/actions/pricing.ts","../src/actions/items.ts","../src/actions/commerce.ts","../src/actions/orders.ts","../src/actions/search.ts","../src/actions/shipping.ts","../src/actions/joomla.ts","../src/actions/legacy.ts","../src/actions/customers.ts","../src/actions/smarty-streets.ts","../src/actions/p21-pim.ts","../src/actions/agr-site.ts","../src/actions/avalara.ts","../src/actions/payments.ts","../src/actions/ups.ts","../src/actions/logistics.ts","../src/actions/nexus.ts","../src/actions/vmi.ts","../src/actions/p21-core.ts","../src/actions/p21-apis.ts","../src/actions/p21-sism.ts","../src/actions/agr-work.ts","../src/actions/agr-info.ts","../src/actions/basecamp2.ts","../src/actions/brand-folder.ts","../src/actions/gregorovich.ts","../src/actions/slack.ts","../src/actions/site.ts"],"sourcesContent":["/**\n * Environment detection that works across server, client, and containers.\n *\n * Priority:\n * 1. DEPLOYMENT_ENV (\"dev\" → staging, \"live\" → production)\n * 2. Server-side NODE_ENV fallback\n * 3. Client-side hostname detection\n */\nfunction getEnvironment(): \"development\" | \"staging\" | \"production\" {\n const deploymentEnv = process.env.DEPLOYMENT_ENV;\n if (deploymentEnv === \"dev\") return \"staging\";\n if (deploymentEnv === \"live\") return \"production\";\n\n if (typeof window === \"undefined\") {\n if (process.env.NODE_ENV === \"development\") return \"development\";\n return \"production\";\n }\n\n const host = window.location.hostname;\n if (host.includes(\"localhost\") || host.includes(\"127.0.0.1\"))\n return \"development\";\n if (host.includes(\"agr-hosting.dev\")) return \"staging\";\n return \"production\";\n}\n\nexport const env = getEnvironment();\nexport const isDev = env === \"development\";\nexport const isStaging = env === \"staging\";\nexport const isProduction = env === \"production\";\n","import type Redis from \"ioredis\";\nimport { isDev, isStaging } from \"../environment\";\n\nconst CIRCUIT_BREAKER_THRESHOLD = 5;\nconst CIRCUIT_BREAKER_RESET_MS = 60_000;\n\ninterface RedisGlobalState {\n client: Redis | null;\n consecutiveFailures: number;\n circuitOpenUntil: number;\n}\n\nconst g = globalThis as unknown as { __redisState?: RedisGlobalState };\nif (!g.__redisState) {\n g.__redisState = {\n client: null,\n consecutiveFailures: 0,\n circuitOpenUntil: 0,\n };\n}\nconst state = g.__redisState;\n\nconst debugEnabled = isDev || isStaging;\n\nfunction log(...args: unknown[]) {\n if (debugEnabled) {\n console.log(\"[Redis]\", ...args);\n }\n}\n\nfunction isCircuitOpen(): boolean {\n if (state.circuitOpenUntil === 0) return false;\n if (Date.now() >= state.circuitOpenUntil) {\n state.circuitOpenUntil = 0;\n state.consecutiveFailures = 0;\n log(\"Circuit breaker reset -- retrying Redis\");\n return false;\n }\n return true;\n}\n\nfunction recordFailure() {\n state.consecutiveFailures++;\n if (state.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n state.circuitOpenUntil = Date.now() + CIRCUIT_BREAKER_RESET_MS;\n log(\n `Circuit breaker OPEN -- skipping Redis for ${CIRCUIT_BREAKER_RESET_MS / 1000}s`,\n );\n }\n}\n\nfunction recordSuccess() {\n state.consecutiveFailures = 0;\n}\n\nfunction getRedisUrl(): string | undefined {\n const containerRedis = process.env.REDIS_SERVERS;\n if (containerRedis) return `redis://${containerRedis}`;\n\n if (isDev) return process.env.REDIS_URL_DEV;\n if (isStaging) return process.env.REDIS_URL_STAGING;\n return process.env.REDIS_URL_PROD;\n}\n\nasync function getClient(): Promise<Redis | null> {\n if (state.client) return state.client;\n\n const url = getRedisUrl();\n if (!url) {\n log(\"No REDIS_URL -- cache disabled\");\n return null;\n }\n\n try {\n // Dynamic import so the built ESM output doesn't use esbuild's __require\n // shim, which breaks in pure ESM environments (Next.js 16 + Turbopack).\n // ioredis is CJS-only; Node wraps its module.exports as { default }.\n const { default: IORedis } = await import(\"ioredis\");\n\n state.client = new IORedis(url, {\n maxRetriesPerRequest: 1,\n connectTimeout: 3000,\n lazyConnect: true,\n enableOfflineQueue: false,\n });\n\n state.client.on(\"error\", (err: Error) => {\n log(\"Connection error:\", err.message);\n recordFailure();\n });\n\n state.client.on(\"connect\", () => log(\"Connected\"));\n\n state.client.connect().catch(() => {\n /* handled by error event */\n });\n\n return state.client;\n } catch {\n log(\"Failed to create client (ioredis not installed?)\");\n return null;\n }\n}\n\nexport async function cacheGet(key: string): Promise<string | null> {\n if (isCircuitOpen()) return null;\n\n const client = await getClient();\n if (!client) return null;\n\n try {\n const value = await client.get(key);\n recordSuccess();\n return value;\n } catch {\n recordFailure();\n return null;\n }\n}\n\nexport async function cacheSet(\n key: string,\n value: string,\n ttlSeconds: number,\n): Promise<void> {\n if (isCircuitOpen()) return;\n\n const client = await getClient();\n if (!client) return;\n\n try {\n await client.setex(key, ttlSeconds, value);\n recordSuccess();\n } catch {\n recordFailure();\n }\n}\n\nexport function getCircuitState(): \"closed\" | \"open\" {\n return isCircuitOpen() ? \"open\" : \"closed\";\n}\n\nexport function isRedisConnected(): boolean {\n return state.client?.status === \"ready\";\n}\n","/**\n * Calls an Augur SDK method, forwarding all arguments with full type safety.\n *\n * With augur-api >= 0.9.6, SDK methods properly declare their `CacheParams`\n * option (including `edgeCache`), so this wrapper preserves both parameter\n * and return-type inference end-to-end.\n *\n * @example\n * ```ts\n * const result = await sdkCall(\n * augurServices.items.invMast.get,\n * invMastUid,\n * { edgeCache: 4 },\n * );\n * ```\n */\nexport async function sdkCall<TArgs extends unknown[], TResult>(\n method: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n): Promise<TResult> {\n return method(...args);\n}\n","import { cacheGet, cacheSet } from \"./redis-client\";\n\n/**\n * FNV-1a 32-bit hash. Same implementation as augur-hooks/cache-helper\n * so cache keys are identical across client and server.\n */\nfunction fnv1a(str: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * JSON.stringify with sorted object keys for deterministic cache keys.\n * Same implementation as augur-hooks/stable-stringify.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return JSON.stringify(value);\n if (typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const entries = keys.map(\n (key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`,\n );\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Server-side cache wrapper using augur-server's Redis client.\n *\n * Uses the same cache key format as augur-hooks' `withCache`:\n * `${prefix}sdk:${methodPath}:${fnv1a(stableStringify(keyArgs))}`\n *\n * This means server-side cached data can be read by client-side hooks\n * (and vice versa) when using the same prefix and method path.\n *\n * @param prefix Cache key prefix (e.g. \"ampro:\"). Empty string if none.\n * @param redisTtl Redis TTL in seconds. 0 or undefined = skip caching.\n * @param methodPath Dot-separated SDK method path (e.g. \"pricing.priceEngine.get\").\n * @param fn The async function to cache.\n * @param keyArgs Values to hash for the cache key.\n */\nexport async function withServerCache<T>(\n prefix: string,\n redisTtl: number | undefined,\n methodPath: string,\n fn: () => Promise<T>,\n ...keyArgs: unknown[]\n): Promise<T> {\n if (!redisTtl) return fn();\n\n const key = `${prefix}sdk:${methodPath}:${fnv1a(stableStringify(keyArgs))}`;\n\n try {\n const cached = await cacheGet(key);\n if (cached != null) return JSON.parse(cached) as T;\n } catch {\n /* Redis read error — fall through to SDK call */\n }\n\n const result = await fn();\n\n try {\n cacheSet(key, JSON.stringify(result), redisTtl).catch(() => {});\n /* v8 ignore next 3 -- defensive guard for non-serializable data */\n } catch {\n /* Non-serializable or write error — skip caching */\n }\n\n return result;\n}\n","import type { TPriceData, TTax, TTaxItem } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by pricing actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface PricingApiClient {\n pricing: {\n priceEngine: {\n get: (params: Record<string, unknown>) => Promise<{ data: TPriceData }>;\n };\n taxEngine: {\n create: (params: Record<string, unknown>) => Promise<{ data: TTax }>;\n };\n };\n}\n\nexport interface PricingActionsConfig {\n /** Default customer ID when none is provided by the caller. */\n defaultCustomerId?: string | number;\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 2 (hours). */\n edgeCache?: number;\n /** Redis TTL for price lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for tax lookups in seconds. Default: 1800 (30 min). */\n taxRedisTtl?: number;\n}\n\nexport interface PricingActions {\n getItemPrice: (\n itemId: string,\n customerId?: string | number,\n quantity?: number,\n ) => Promise<TPriceData>;\n\n batchGetItemPrices: (\n itemIds: string[],\n customerId?: string | number,\n quantity?: number,\n ) => Promise<Record<string, TPriceData>>;\n\n getTaxEstimate: (\n customerId: string | number,\n postalCode: string,\n items: TTaxItem[],\n ) => Promise<TTax>;\n}\n\nfunction resolveCustomerId(\n explicit: string | number | undefined,\n fallback: string | number | undefined,\n): number {\n const raw = explicit ?? fallback;\n const num = Number(raw);\n return num > 0 ? num : 0;\n}\n\n/**\n * Creates server-side pricing actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/pricing-actions.ts\n * import { createPricingActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const pricingActions = createPricingActions(getAugurClient(), {\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const price = await pricingActions.getItemPrice(\"ITEM-1\");\n * const prices = await pricingActions.batchGetItemPrices([\"ITEM-1\", \"ITEM-2\"]);\n * ```\n */\nexport function createPricingActions(\n api: PricingApiClient,\n config: PricingActionsConfig = {},\n): PricingActions {\n const {\n defaultCustomerId,\n cachePrefix = \"\",\n edgeCache = 2,\n redisTtl = 3600,\n taxRedisTtl = 1800,\n } = config;\n\n async function getItemPrice(\n itemId: string,\n customerId?: string | number,\n quantity = 1,\n ): Promise<TPriceData> {\n const custId = resolveCustomerId(customerId, defaultCustomerId);\n const params = { customerId: custId, itemId, quantity, edgeCache };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"pricing.priceEngine.get\",\n async () => {\n const response = await api.pricing.priceEngine.get(params);\n return response.data;\n },\n params,\n );\n }\n\n async function batchGetItemPrices(\n itemIds: string[],\n customerId?: string | number,\n quantity = 1,\n ): Promise<Record<string, TPriceData>> {\n const results = await Promise.all(\n itemIds.map((id) => getItemPrice(id, customerId, quantity)\n .then((data) => [id, data] as const)\n .catch(() => [id, null] as const)),\n );\n\n const out: Record<string, TPriceData> = {};\n for (const [id, data] of results) {\n if (data) out[id] = data;\n }\n return out;\n }\n\n async function getTaxEstimate(\n customerId: string | number,\n postalCode: string,\n items: TTaxItem[],\n ): Promise<TTax> {\n const custId = resolveCustomerId(customerId, defaultCustomerId);\n const params = { customerId: custId, postalCode, items };\n\n return withServerCache(\n cachePrefix,\n taxRedisTtl,\n \"pricing.taxEngine.create\",\n async () => {\n const response = await api.pricing.taxEngine.create(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getItemPrice, batchGetItemPrices, getTaxEstimate };\n}\n","import type {\n TAttribute,\n TCategory,\n TInvMast,\n TInvMastDoc,\n TItemAccessory,\n TStock,\n TStockData,\n} from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by item actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface ItemsApiClient {\n items: {\n categories: {\n get: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TCategory }>;\n lookup: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n items: {\n list: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n attributes: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: { attributes: TAttribute[] } }>;\n };\n };\n invMast: {\n get: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TInvMast }>;\n doc: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TInvMastDoc }>;\n };\n stock: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TStock }>;\n };\n faq: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invSub: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invAccessory: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TItemAccessory[] }>;\n };\n similar: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface ItemActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value for most calls. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like FAQs. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL for most calls in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n /** Sort category children by sequenceNo. Default: true. */\n sortChildren?: boolean;\n}\n\nexport interface ItemActions {\n // Category operations\n itemCategoryLookup: (path: string) => Promise<unknown>;\n getItemCategory: (\n uid: number,\n options?: Record<string, unknown>,\n ) => Promise<TCategory>;\n getCategoryItems: (\n uid: number,\n filters: Record<string, unknown>,\n ) => Promise<unknown>;\n getItemAttributes: (categoryUid: number) => Promise<TAttribute[]>;\n\n // Inventory operations\n getInvMast: (uid: number) => Promise<TInvMast>;\n getInvMastDoc: (params: {\n invMastUid?: number;\n itemId?: string;\n includePricing?: \"Y\" | \"N\";\n }) => Promise<TInvMastDoc>;\n getStock: (invMastUid: number) => Promise<TStockData[]>;\n getStockCompanySummary: (\n invMastUid: number,\n ) => Promise<Record<string, number>>;\n\n // Item extras\n getItemFaqs: (invMastUid: number) => Promise<unknown[]>;\n getItemSubstitutes: (invMastUid: number) => Promise<unknown[]>;\n getItemAccessories: (invMastUid: number) => Promise<TItemAccessory[]>;\n getSimilarItems: (invMastUid: number) => Promise<unknown[]>;\n\n // Batch operations\n batchGetInvMastDocs: (\n params: { invMastUid?: number; itemId?: string }[],\n ) => Promise<Record<string, TInvMastDoc>>;\n batchGetStockData: (\n invMastUids: number[],\n ) => Promise<Record<number, TStockData[]>>;\n}\n\n/**\n * Creates server-side item actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/item-actions.ts\n * import { createItemActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const itemActions = createItemActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const category = await itemActions.getItemCategory(123);\n * const doc = await itemActions.getInvMastDoc({ itemId: \"ITEM-1\" });\n * ```\n */\nexport function createItemActions(\n api: ItemsApiClient,\n config: ItemActionsConfig = {},\n): ItemActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n sortChildren = true,\n } = config;\n\n function sortCategoryChildren<T extends { sequenceNo: number }>(\n children: T[],\n ): T[] {\n if (!sortChildren) return children;\n return [...children].sort((a, b) => a.sequenceNo - b.sequenceNo);\n }\n\n // ---------------------------------------------------------------------------\n // Category operations\n // ---------------------------------------------------------------------------\n\n async function itemCategoryLookup(path: string): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.lookup.get\",\n async () => {\n const response = await api.items.categories.lookup.get({\n path,\n edgeCache,\n });\n return response.data;\n },\n path,\n );\n }\n\n async function getItemCategory(\n uid: number,\n options?: Record<string, unknown>,\n ): Promise<TCategory> {\n const category = await withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.get\",\n async () => {\n const response = await api.items.categories.get(uid, {\n ...options,\n edgeCache,\n });\n return response.data;\n },\n uid,\n options,\n );\n return {\n ...category,\n children: sortCategoryChildren(category.children),\n };\n }\n\n async function getCategoryItems(\n uid: number,\n filters: Record<string, unknown>,\n ): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.items.list\",\n async () => {\n const response = await api.items.categories.items.list({\n ...filters,\n itemCategoryUid: uid,\n edgeCache,\n });\n return response.data;\n },\n uid,\n filters,\n );\n }\n\n async function getItemAttributes(\n categoryUid: number,\n ): Promise<TAttribute[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.attributes.list\",\n async () => {\n const response = await api.items.categories.attributes.list(\n categoryUid,\n { edgeCache },\n );\n return response.data.attributes;\n },\n categoryUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Inventory operations\n // ---------------------------------------------------------------------------\n\n async function getInvMast(uid: number): Promise<TInvMast> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.get\",\n async () => {\n const response = await api.items.invMast.get(uid, { edgeCache: 4 });\n return response.data;\n },\n uid,\n );\n }\n\n async function getInvMastDoc(params: {\n invMastUid?: number;\n itemId?: string;\n includePricing?: \"Y\" | \"N\";\n }): Promise<TInvMastDoc> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.doc.list\",\n async () => {\n const response = await api.items.invMast.doc.list(\n params.invMastUid ?? 0,\n {\n itemId: params.itemId,\n includePricing: params.includePricing,\n edgeCache: 4,\n },\n );\n return response.data;\n },\n params.invMastUid,\n params.itemId,\n params.includePricing,\n );\n }\n\n async function getStock(invMastUid: number): Promise<TStockData[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.stock.list\",\n async () => {\n const response = await api.items.invMast.stock.list(invMastUid, {\n edgeCache,\n });\n return response.data?.stockData;\n },\n invMastUid,\n );\n }\n\n async function getStockCompanySummary(\n invMastUid: number,\n ): Promise<Record<string, number>> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.stock.list.companySummary\",\n async () => {\n const response = await api.items.invMast.stock.list(invMastUid, {\n edgeCache,\n });\n return response.data?.companySummary;\n },\n invMastUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Item extras\n // ---------------------------------------------------------------------------\n\n async function getItemFaqs(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.faq.list\",\n async () => {\n const response = await api.items.invMast.faq.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemSubstitutes(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.invSub.list\",\n async () => {\n const response = await api.items.invMast.invSub.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemAccessories(\n invMastUid: number,\n ): Promise<TItemAccessory[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.invAccessory.list\",\n async () => {\n const response = await api.items.invMast.invAccessory.list(\n invMastUid,\n { edgeCache },\n );\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getSimilarItems(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.similar.list\",\n async () => {\n const response = await api.items.invMast.similar.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Batch operations\n // ---------------------------------------------------------------------------\n\n async function batchGetInvMastDocs(\n params: { invMastUid?: number; itemId?: string }[],\n ): Promise<Record<string, TInvMastDoc>> {\n const results = await Promise.all(\n params.map((p) =>\n getInvMastDoc(p)\n .then((data) => [p.itemId ?? String(p.invMastUid), data] as const)\n .catch(() => [p.itemId ?? String(p.invMastUid), undefined] as const),\n ),\n );\n\n const out: Record<string, TInvMastDoc> = {};\n for (const [key, data] of results) {\n if (data) out[key] = data;\n }\n return out;\n }\n\n async function batchGetStockData(\n invMastUids: number[],\n ): Promise<Record<number, TStockData[]>> {\n const results = await Promise.all(\n invMastUids.map((uid) =>\n getStock(uid)\n .then((data) => [uid, data] as const)\n .catch(() => [uid, undefined] as const),\n ),\n );\n\n const out: Record<number, TStockData[]> = {};\n for (const [uid, data] of results) {\n if (data) out[uid] = data;\n }\n return out;\n }\n\n return {\n itemCategoryLookup,\n getItemCategory,\n getCategoryItems,\n getItemAttributes,\n getInvMast,\n getInvMastDoc,\n getStock,\n getStockCompanySummary,\n getItemFaqs,\n getItemSubstitutes,\n getItemAccessories,\n getSimilarItems,\n batchGetInvMastDocs,\n batchGetStockData,\n };\n}\n","import type { TCartLine, TCartLookUp } from \"@simpleapps-com/augur-utils\";\n\n/**\n * The subset of augur-api used by commerce actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface CommerceApiClient {\n commerce: {\n cartHdr: {\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: TCartLookUp }>;\n };\n alsoBought: {\n get: (\n cartHdrUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n cartLine: {\n get: (cartHdrUid: number) => Promise<{ data: TCartLine[] }>;\n add: {\n create: (\n cartHdrUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n update: {\n create: (\n cartHdrUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n delete: (cartHdrUid: number) => Promise<{ data: unknown }>;\n };\n checkout: {\n create: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface CommerceActionsConfig {\n defaultContactId?: string | number;\n defaultCustomerId?: string | number;\n /** Optional UOM conversion function. E.g. (uom) => uom === \"EA\" ? \"EACH\" : uom */\n convertUnitOfMeasure?: (uom: string) => string;\n}\n\nexport interface CommerceActions {\n cartHdrLookup: (params: {\n userId?: string | number;\n cartToken?: string;\n contactId?: string | number;\n customerId?: string | number;\n }) => Promise<TCartLookUp>;\n\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\n\n addToCart: (\n cartHdrUid: number,\n items: {\n itemId?: string;\n invMastUid?: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ) => Promise<unknown>;\n\n updateCartLines: (\n cartHdrUid: number,\n lines: {\n lineNo: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ) => Promise<unknown>;\n\n deleteCartItems: (cartHdrUid: number) => Promise<void>;\n\n getCartAlsoBought: (cartHdrUid: number) => Promise<unknown[]>;\n\n checkoutOrder: (\n cartHdrUid: number,\n data: Record<string, unknown>,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side commerce actions for cart operations.\n *\n * Unlike pricing actions, commerce actions do NOT use caching because\n * cart operations are real-time and must always reflect current state.\n *\n * @example\n * ```ts\n * // lib/commerce-actions.ts\n * import { createCommerceActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const commerceActions = createCommerceActions(getAugurClient(), {\n * defaultContactId: process.env.NEXT_PUBLIC_DEFAULT_CONTACT_ID,\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * convertUnitOfMeasure: (uom) => uom === \"EA\" ? \"EACH\" : uom,\n * });\n *\n * // In a server action:\n * const cart = await commerceActions.cartHdrLookup({ userId: 123 });\n * const lines = await commerceActions.getCartLines(cart.cartHdrUid);\n * ```\n */\nexport function createCommerceActions(\n api: CommerceApiClient,\n config: CommerceActionsConfig = {},\n): CommerceActions {\n const { defaultContactId, defaultCustomerId, convertUnitOfMeasure } = config;\n\n async function cartHdrLookup(params: {\n userId?: string | number;\n cartToken?: string;\n contactId?: string | number;\n customerId?: string | number;\n }): Promise<TCartLookUp> {\n const lookupParams: Record<string, unknown> = { ...params };\n if (lookupParams.contactId == null && defaultContactId != null) {\n lookupParams.contactId = defaultContactId;\n }\n if (lookupParams.customerId == null && defaultCustomerId != null) {\n lookupParams.customerId = defaultCustomerId;\n }\n const response = await api.commerce.cartHdr.lookup.get(lookupParams);\n return response.data;\n }\n\n async function getCartLines(\n cartHdrUid: number,\n ): Promise<TCartLine[]> {\n const response = await api.commerce.cartLine.get(cartHdrUid);\n return response.data;\n }\n\n async function addToCart(\n cartHdrUid: number,\n items: {\n itemId?: string;\n invMastUid?: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ): Promise<unknown> {\n try {\n const mappedItems = items.map((item) => ({\n ...item,\n unitOfMeasure: convertUnitOfMeasure\n ? convertUnitOfMeasure(item.unitOfMeasure)\n : item.unitOfMeasure,\n }));\n const response = await api.commerce.cartLine.add.create(\n cartHdrUid,\n { items: mappedItems },\n );\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function updateCartLines(\n cartHdrUid: number,\n lines: { lineNo: number; quantity: number; unitOfMeasure: string }[],\n ): Promise<unknown> {\n try {\n const mappedLines = lines.map((line) => ({\n ...line,\n unitOfMeasure: convertUnitOfMeasure\n ? convertUnitOfMeasure(line.unitOfMeasure)\n : line.unitOfMeasure,\n }));\n const response = await api.commerce.cartLine.update.create(\n cartHdrUid,\n { lines: mappedLines },\n );\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function deleteCartItems(cartHdrUid: number): Promise<void> {\n try {\n await api.commerce.cartLine.delete(cartHdrUid);\n } catch {\n // fire and forget — returns void either way\n }\n }\n\n async function getCartAlsoBought(\n cartHdrUid: number,\n ): Promise<unknown[]> {\n const response = await api.commerce.cartHdr.alsoBought.get(cartHdrUid);\n return response.data;\n }\n\n async function checkoutOrder(\n cartHdrUid: number,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.commerce.checkout.create({\n ...data,\n cartHdrUid,\n });\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n cartHdrLookup,\n getCartLines,\n addToCart,\n updateCartLines,\n deleteCartItems,\n getCartAlsoBought,\n checkoutOrder,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by order actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface OrderApiClient {\n orders: {\n oeHdr: {\n doc: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface OrderActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for order doc lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface OrderActions {\n getOrderDoc: (\n orderNo: string,\n zipCode: string,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side order actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/order-actions.ts\n * import { createOrderActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const orderActions = createOrderActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const doc = await orderActions.getOrderDoc(\"12345\", \"90210\");\n * ```\n */\nexport function createOrderActions(\n api: OrderApiClient,\n config: OrderActionsConfig = {},\n): OrderActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getOrderDoc(\n orderNo: string,\n zipCode: string,\n ): Promise<unknown> {\n const params = { orderNo, zipCode, edgeCache };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"orders.oeHdr.doc.get\",\n async () => {\n const response = await api.orders.oeHdr.doc.get(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getOrderDoc };\n}\n","import type { TAttribute, TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/** Shape of the openSearch service used by search actions. */\ninterface OpenSearchService {\n itemSearch: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{ data: { items: TProductItem[]; totalResults: number } }>;\n attributes: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{ data: { attributes: TAttribute[] } }>;\n };\n };\n suggestions: {\n suggest: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{\n data: { data: unknown[]; total: number; totalResults: number };\n }>;\n };\n };\n}\n\n/**\n * The subset of augur-api used by search actions.\n * Accepts both `openSearch` (camelCase) and `opensearch` (lowercase)\n * to match SDK v0.9.x which exposes `api.opensearch`.\n */\nexport type SearchApiClient =\n | { openSearch: OpenSearchService }\n | { opensearch: OpenSearchService };\n\nexport interface SearchActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for search lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Default source fields for item search. Default: \"display_desc\". */\n defaultSourceFields?: string;\n}\n\n/** Paginated response for infinite scroll. */\nexport interface SearchPage {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\nexport interface SearchActions {\n getSearchAttributes: (q: string) => Promise<TAttribute[]>;\n\n getSearchSuggestions: (\n q: string,\n limit?: number,\n offset?: number,\n ) => Promise<{ data: unknown[]; total: number; totalResults: number }>;\n\n itemSearch: (\n filters: {\n q: string;\n limit: number;\n offset: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n ) => Promise<{ items: TProductItem[]; totalResults: number }>;\n\n itemSearchInfinite: (\n filters: {\n q: string;\n limit: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n pageParam?: number,\n ) => Promise<SearchPage>;\n}\n\n/**\n * Creates server-side search actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/search-actions.ts\n * import { createSearchActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const searchActions = createSearchActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const attrs = await searchActions.getSearchAttributes(\"widget\");\n * const results = await searchActions.itemSearch({ q: \"widget\", limit: 20, offset: 0 });\n * ```\n */\n/** Resolve the openSearch service from either casing. */\nfunction getOpenSearch(api: SearchApiClient): OpenSearchService {\n return \"openSearch\" in api ? api.openSearch : api.opensearch;\n}\n\nexport function createSearchActions(\n api: SearchApiClient,\n config: SearchActionsConfig = {},\n): SearchActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n defaultSourceFields = \"display_desc\",\n } = config;\n\n const openSearch = getOpenSearch(api);\n\n async function getSearchAttributes(q: string): Promise<TAttribute[]> {\n const params = { q, edgeCache };\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.attributes.list\",\n async () => {\n const response =\n await openSearch.itemSearch.attributes.list(params);\n return response.data.attributes;\n },\n q,\n );\n }\n\n async function getSearchSuggestions(\n q: string,\n limit?: number,\n offset?: number,\n ): Promise<{ data: unknown[]; total: number; totalResults: number }> {\n const params: Record<string, unknown> = { q, edgeCache };\n if (limit !== undefined) params.size = limit;\n if (offset !== undefined) params.from = offset;\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.suggestions.suggest.list\",\n async () => {\n const response =\n await openSearch.suggestions.suggest.list(params);\n return response.data;\n },\n q,\n );\n }\n\n async function itemSearch(\n filters: {\n q: string;\n limit: number;\n offset: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n ): Promise<{ items: TProductItem[]; totalResults: number }> {\n const params: Record<string, unknown> = {\n q: filters.q,\n searchType: \"query\",\n size: filters.limit,\n from: filters.offset,\n sortBy: filters.sortBy,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: filters.filters?.length\n ? JSON.stringify(filters.filters)\n : undefined,\n sourceFieldsList: defaultSourceFields,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.list\",\n async () => {\n const response = await openSearch.itemSearch.list(params);\n return response.data;\n },\n filters,\n itemCategoryUid,\n );\n }\n\n async function itemSearchInfinite(\n filters: {\n q: string;\n limit: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n pageParam = 0,\n ): Promise<SearchPage> {\n const params: Record<string, unknown> = {\n q: filters.q,\n searchType: \"query\",\n size: filters.limit,\n from: pageParam,\n sortBy: filters.sortBy,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: filters.filters?.length\n ? JSON.stringify(filters.filters)\n : undefined,\n sourceFieldsList: defaultSourceFields,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.list\",\n async () => {\n const response = await openSearch.itemSearch.list(params);\n const { items, totalResults } = response.data;\n const nextOffset = pageParam + filters.limit;\n return {\n data: items,\n total: totalResults,\n nextCursor:\n nextOffset < totalResults ? nextOffset : undefined,\n };\n },\n filters,\n itemCategoryUid,\n pageParam,\n );\n }\n\n return {\n getSearchAttributes,\n getSearchSuggestions,\n itemSearch,\n itemSearchInfinite,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\nexport interface ShippingAddress {\n address1: string;\n city: string;\n state: string;\n postalCode: string;\n country?: string;\n}\n\n/**\n * The subset of augur-api used by shipping actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface ShippingApiClient {\n ups: {\n ratesShop: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface ShippingActionsConfig {\n /** Warehouse/origin address for rate calculations. */\n fromAddress: ShippingAddress;\n /** UPS service codes to filter results. Default: undefined (return all). */\n defaultServiceCodes?: string[];\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for shipping rate lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface ShippingActions {\n getShippingRates: (\n toAddress: ShippingAddress,\n weight: number,\n serviceCodes?: string[],\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side shipping actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/shipping-actions.ts\n * import { createShippingActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const shippingActions = createShippingActions(getAugurClient(), {\n * fromAddress: {\n * address1: \"123 Warehouse Ln\",\n * city: \"Chicago\",\n * state: \"IL\",\n * postalCode: \"60601\",\n * },\n * });\n *\n * // In a server component:\n * const rates = await shippingActions.getShippingRates(\n * { address1: \"456 Main St\", city: \"Denver\", state: \"CO\", postalCode: \"80202\" },\n * 5.0,\n * );\n * ```\n */\nexport function createShippingActions(\n api: ShippingApiClient,\n config: ShippingActionsConfig,\n): ShippingActions {\n const {\n fromAddress,\n defaultServiceCodes,\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getShippingRates(\n toAddress: ShippingAddress,\n weight: number,\n serviceCodes?: string[],\n ): Promise<unknown> {\n const params = {\n fromAddress,\n toAddress: { ...toAddress, country: toAddress.country ?? \"US\" },\n weight,\n serviceCodes: serviceCodes ?? defaultServiceCodes,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"ups.ratesShop.get\",\n async () => {\n const response = await api.ups.ratesShop.get(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getShippingRates };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by Joomla content actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface JoomlaApiClient {\n joomla: {\n content: {\n doc: {\n get: (\n articleId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface JoomlaActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for Joomla lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface JoomlaActions {\n getJoomlaContent: (articleId: number) => Promise<unknown>;\n getJoomlaContentList: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side Joomla content actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/joomla-actions.ts\n * import { createJoomlaActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const joomlaActions = createJoomlaActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const article = await joomlaActions.getJoomlaContent(42);\n * const articles = await joomlaActions.getJoomlaContentList({ catid: 5 });\n * ```\n */\nexport function createJoomlaActions(\n api: JoomlaApiClient,\n config: JoomlaActionsConfig = {},\n): JoomlaActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getJoomlaContent(\n articleId: number,\n ): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"joomla.content.doc.get\",\n async () => {\n const response = await api.joomla.content.doc.get(articleId, {\n edgeCache,\n });\n return response.data;\n },\n articleId,\n );\n }\n\n async function getJoomlaContentList(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"joomla.content.list\",\n async () => {\n const response = await api.joomla.content.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return { getJoomlaContent, getJoomlaContentList };\n}\n","import type { TWebDesc } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by legacy actions.\n * Matches `api.legacy` from the SDK.\n */\nexport interface LegacyApiClient {\n legacy: {\n invMast: {\n webDesc: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TWebDesc[] }>;\n };\n alsoBought: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n tags: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n legacy: {\n state: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface LegacyActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like states. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface LegacyActions {\n getItemWebDesc: (invMastUid: number) => Promise<TWebDesc | undefined>;\n getAlsoBoughtItems: (invMastUid: number) => Promise<unknown[]>;\n getItemTags: (invMastUid: number) => Promise<unknown[]>;\n getStates: (params?: { twoLetterCode?: string }) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side legacy actions with Redis caching and edge cache support.\n *\n * Covers the legacy microservice endpoints used by ecommerce sites:\n * webDesc, alsoBought, tags, and states.\n *\n * @example\n * ```ts\n * import { createLegacyActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const legacyActions = createLegacyActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const webDesc = await legacyActions.getItemWebDesc(12345);\n * const states = await legacyActions.getStates();\n * ```\n */\nexport function createLegacyActions(\n api: LegacyApiClient,\n config: LegacyActionsConfig = {},\n): LegacyActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getItemWebDesc(\n invMastUid: number,\n ): Promise<TWebDesc | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.webDesc.list\",\n async () => {\n const response = await api.legacy.invMast.webDesc.list(invMastUid, {\n edgeCache,\n });\n return response.data[0];\n },\n invMastUid,\n );\n }\n\n async function getAlsoBoughtItems(\n invMastUid: number,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.alsoBought.list\",\n async () => {\n const response = await api.legacy.invMast.alsoBought.list(\n invMastUid,\n { edgeCache },\n );\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemTags(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.tags.list\",\n async () => {\n const response = await api.legacy.invMast.tags.list(invMastUid, {\n edgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getStates(\n params?: { twoLetterCode?: string },\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"legacy.legacy.state.list\",\n async () => {\n const response = await api.legacy.legacy.state.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params?.twoLetterCode,\n );\n }\n\n return {\n getItemWebDesc,\n getAlsoBoughtItems,\n getItemTags,\n getStates,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by customer actions.\n * Matches `api.customers` from the SDK.\n */\nexport interface CustomersApiClient {\n customers: {\n customer: {\n get: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n doc: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n orders: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n shipTo: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n contacts: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface CustomersActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface CustomersActions {\n getCustomer: (customerId: number) => Promise<unknown>;\n customerLookup: (params: Record<string, unknown>) => Promise<unknown[]>;\n getCustomerDoc: (customerId: number) => Promise<unknown>;\n getCustomerOrders: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getContacts: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getShipToAddresses: (customerId: number) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side customer actions with Redis caching and edge cache support.\n *\n * Covers the customers microservice endpoints used by ecommerce sites:\n * customer get, lookup, doc, orders, contacts, and ship-to addresses.\n *\n * @example\n * ```ts\n * import { createCustomersActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const customersActions = createCustomersActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const customer = await customersActions.getCustomer(123);\n * const orders = await customersActions.getCustomerOrders(123);\n * ```\n */\nexport function createCustomersActions(\n api: CustomersApiClient,\n config: CustomersActionsConfig = {},\n): CustomersActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getCustomer(customerId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.get\",\n async () => {\n const response = await api.customers.customer.get(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n async function customerLookup(\n params: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.lookup.get\",\n async () => {\n const response = await api.customers.customer.lookup.get({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCustomerDoc(customerId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.doc.list\",\n async () => {\n const response = await api.customers.customer.doc.list(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n async function getCustomerOrders(\n customerId: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.orders.list\",\n async () => {\n const response = await api.customers.customer.orders.list(customerId, {\n ...params,\n edgeCache,\n });\n return response.data;\n },\n customerId,\n params,\n );\n }\n\n async function getContacts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.contacts.list\",\n async () => {\n const response = await api.customers.contacts.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getShipToAddresses(\n customerId: number,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.shipTo.list\",\n async () => {\n const response = await api.customers.customer.shipTo.list(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n return {\n getCustomer,\n customerLookup,\n getCustomerDoc,\n getCustomerOrders,\n getContacts,\n getShipToAddresses,\n };\n}\n","/**\n * The subset of augur-api used by SmartyStreets actions.\n * Matches `api.smartyStreets` from the SDK.\n */\nexport interface SmartyStreetsApiClient {\n smartyStreets: {\n us: {\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface SmartyStreetsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface SmartyStreetsActions {\n validateAddress: (\n params: Record<string, unknown>,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side SmartyStreets actions for address validation.\n *\n * Note: Address validation is a real-time operation and does NOT use caching.\n * Each call hits the SmartyStreets API directly to ensure up-to-date results.\n *\n * @example\n * ```ts\n * import { createSmartyStreetsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const smartyStreetsActions = createSmartyStreetsActions(getAugurClient());\n *\n * const result = await smartyStreetsActions.validateAddress({\n * address1: \"123 Main St\",\n * city: \"Provo\",\n * state: \"UT\",\n * postalCode: \"84606\",\n * });\n * ```\n */\nexport function createSmartyStreetsActions(\n api: SmartyStreetsApiClient,\n config: SmartyStreetsActionsConfig = {},\n): SmartyStreetsActions {\n // cachePrefix is accepted for interface consistency but unused (no caching)\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function validateAddress(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const response = await api.smartyStreets.us.lookup.get(params);\n return response.data;\n }\n\n return {\n validateAddress,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by P21 PIM actions.\n * Matches `api.p21Pim` from the SDK.\n */\nexport interface P21PimApiClient {\n p21Pim: {\n invMastExt: {\n get: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21PimActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21PimActions {\n getInvMastExt: (invMastUid: number) => Promise<unknown>;\n listInvMastExt: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 PIM actions with Redis caching and edge cache support.\n *\n * Covers the P21 PIM microservice endpoints for extended inventory data\n * including UPC/EAN codes, brand information, and SEO metadata.\n *\n * @example\n * ```ts\n * import { createP21PimActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21PimActions = createP21PimActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const ext = await p21PimActions.getInvMastExt(12345);\n * const list = await p21PimActions.listInvMastExt({ limit: 20 });\n * ```\n */\nexport function createP21PimActions(\n api: P21PimApiClient,\n config: P21PimActionsConfig = {},\n): P21PimActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getInvMastExt(invMastUid: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Pim.invMastExt.get\",\n async () => {\n const response = await api.p21Pim.invMastExt.get(invMastUid, {\n edgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function listInvMastExt(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Pim.invMastExt.list\",\n async () => {\n const response = await api.p21Pim.invMastExt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getInvMastExt,\n listInvMastExt,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by AGR Site actions.\n * Matches `api.agrSite` from the SDK.\n */\nexport interface AgrSiteApiClient {\n agrSite: {\n settings: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n metaFiles: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface AgrSiteActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface AgrSiteActions {\n getSettings: (serviceName?: string) => Promise<unknown[]>;\n getMetaFiles: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side AGR Site actions with Redis caching and edge cache support.\n *\n * Covers the AGR Site microservice endpoints for site configuration settings\n * and meta file management (robots.txt, etc.). Both endpoints use long TTLs\n * since site settings and meta files rarely change.\n *\n * @example\n * ```ts\n * import { createAgrSiteActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrSiteActions = createAgrSiteActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const settings = await agrSiteActions.getSettings(\"my-service\");\n * const metaFiles = await agrSiteActions.getMetaFiles();\n * ```\n */\nexport function createAgrSiteActions(\n api: AgrSiteApiClient,\n config: AgrSiteActionsConfig = {},\n): AgrSiteActions {\n const {\n cachePrefix = \"\",\n longEdgeCache = 8,\n longRedisTtl = 28800,\n } = config;\n\n async function getSettings(serviceName?: string): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrSite.settings.list\",\n async () => {\n const response = await api.agrSite.settings.list({\n ...(serviceName ? { serviceName } : {}),\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n serviceName,\n );\n }\n\n async function getMetaFiles(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrSite.metaFiles.list\",\n async () => {\n const response = await api.agrSite.metaFiles.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getSettings,\n getMetaFiles,\n };\n}\n","/**\n * The subset of augur-api used by Avalara actions.\n * Matches `api.avalara` from the SDK.\n */\nexport interface AvalaraApiClient {\n avalara: {\n rates: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface AvalaraActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface AvalaraActions {\n calculateTax: (data: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side Avalara actions for real-time tax calculation.\n *\n * Note: Tax calculation is a real-time operation and does NOT use caching.\n * Each call hits the Avalara API directly to ensure up-to-date tax rates.\n *\n * @example\n * ```ts\n * import { createAvalaraActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const avalaraActions = createAvalaraActions(getAugurClient());\n *\n * const taxResult = await avalaraActions.calculateTax({\n * lines: [{ amount: 100.00, description: \"Widget\" }],\n * addresses: {\n * shipTo: {\n * line1: \"123 Main St\",\n * city: \"Irvine\",\n * region: \"CA\",\n * country: \"US\",\n * postalCode: \"92602\",\n * },\n * },\n * type: \"SalesOrder\",\n * });\n * ```\n */\nexport function createAvalaraActions(\n api: AvalaraApiClient,\n config: AvalaraActionsConfig = {},\n): AvalaraActions {\n // cachePrefix is accepted for interface consistency but unused (no caching)\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function calculateTax(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n const response = await api.avalara.rates.create(data);\n return response.data;\n }\n\n return {\n calculateTax,\n };\n}\n","/**\n * The subset of augur-api used by payment actions.\n * Matches `api.payments` from the SDK.\n */\nexport interface PaymentsApiClient {\n payments: {\n unified: {\n transactionSetup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n accountQuery: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n surcharge: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n cardInfo: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n billingUpdate: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n validate: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface PaymentsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface PaymentsActions {\n transactionSetup: (params: Record<string, unknown>) => Promise<unknown>;\n accountQuery: (params: Record<string, unknown>) => Promise<unknown>;\n getSurcharge: (params: Record<string, unknown>) => Promise<unknown>;\n cardInfo: (params: Record<string, unknown>) => Promise<unknown>;\n billingUpdate: (params: Record<string, unknown>) => Promise<unknown>;\n validatePayment: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side payment actions.\n *\n * Payment actions do NOT use caching because every call deals with\n * real-time payment processing that must always reflect current state.\n *\n * @example\n * ```ts\n * import { createPaymentsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const paymentsActions = createPaymentsActions(getAugurClient());\n *\n * const setup = await paymentsActions.transactionSetup({ customerId: \"123\" });\n * const account = await paymentsActions.accountQuery({ transactionSetupId: \"abc\" });\n * const surcharge = await paymentsActions.getSurcharge({ amount: 100 });\n * ```\n */\nexport function createPaymentsActions(\n api: PaymentsApiClient,\n config: PaymentsActionsConfig = {},\n): PaymentsActions {\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function transactionSetup(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.transactionSetup.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function accountQuery(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.accountQuery.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getSurcharge(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.surcharge.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function cardInfo(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.cardInfo.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function billingUpdate(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.billingUpdate.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function validatePayment(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.validate.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n transactionSetup,\n accountQuery,\n getSurcharge,\n cardInfo,\n billingUpdate,\n validatePayment,\n };\n}\n","/**\n * The subset of augur-api used by UPS actions.\n * Matches `api.ups` from the SDK.\n */\nexport interface UpsApiClient {\n ups: {\n ratesShop: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface UpsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface UpsActions {\n getRates: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side UPS shipping actions.\n *\n * UPS rate actions do NOT use caching because rate quotes are real-time\n * and must always reflect current carrier pricing.\n *\n * @example\n * ```ts\n * import { createUpsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const upsActions = createUpsActions(getAugurClient());\n *\n * const rates = await upsActions.getRates({\n * fromPostalCode: \"90210\",\n * toPostalCode: \"10001\",\n * weight: 5,\n * });\n * ```\n */\nexport function createUpsActions(\n api: UpsApiClient,\n config: UpsActionsConfig = {},\n): UpsActions {\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function getRates(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.ups.ratesShop.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getRates,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by logistics actions.\n * Matches `api.logistics` from the SDK.\n */\nexport interface LogisticsApiClient {\n logistics: {\n speedship: {\n freight: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n shipvia: {\n rates: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface LogisticsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like ship-via options. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface LogisticsActions {\n getFreightRates: (params: Record<string, unknown>) => Promise<unknown>;\n getShipVia: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side logistics actions with selective Redis caching.\n *\n * Freight rate lookups are real-time and NOT cached.\n * Ship-via carrier options rarely change and ARE cached with long TTL.\n *\n * @example\n * ```ts\n * import { createLogisticsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const logisticsActions = createLogisticsActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const rates = await logisticsActions.getFreightRates({ fromPostalCode: \"90210\" });\n * const carriers = await logisticsActions.getShipVia();\n * ```\n */\nexport function createLogisticsActions(\n api: LogisticsApiClient,\n config: LogisticsActionsConfig = {},\n): LogisticsActions {\n const {\n cachePrefix = \"\",\n longEdgeCache = 8,\n longRedisTtl = 28800,\n } = config;\n\n async function getFreightRates(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.logistics.speedship.freight.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getShipVia(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"logistics.shipvia.rates.list\",\n async () => {\n const response = await api.logistics.shipvia.rates.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n getFreightRates,\n getShipVia,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by nexus actions.\n * Matches `api.nexus` from the SDK.\n */\nexport interface NexusApiClient {\n nexus: {\n binTransfer: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n receiving: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n transfer: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n purchaseOrderReceipt: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transferReceipt: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transferShipping: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface NexusActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface NexusActions {\n createBinTransfer: (data: Record<string, unknown>) => Promise<unknown>;\n createReceiving: (data: Record<string, unknown>) => Promise<unknown>;\n createTransfer: (data: Record<string, unknown>) => Promise<unknown>;\n getPurchaseOrderReceipts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getTransferReceipts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getTransferShipping: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side nexus (warehouse management) actions with selective caching.\n *\n * Write operations (bin transfer, receiving, transfer) do NOT use caching.\n * Read/list operations (receipts, shipping) ARE cached with standard TTL.\n *\n * @example\n * ```ts\n * import { createNexusActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const nexusActions = createNexusActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const transfer = await nexusActions.createBinTransfer({ locationId: 5, transfers: [] });\n * const receipts = await nexusActions.getPurchaseOrderReceipts();\n * ```\n */\nexport function createNexusActions(\n api: NexusApiClient,\n config: NexusActionsConfig = {},\n): NexusActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function createBinTransfer(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.binTransfer.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function createReceiving(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.receiving.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function createTransfer(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.transfer.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getPurchaseOrderReceipts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.purchaseOrderReceipt.list\",\n async () => {\n const response = await api.nexus.purchaseOrderReceipt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getTransferReceipts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.transferReceipt.list\",\n async () => {\n const response = await api.nexus.transferReceipt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getTransferShipping(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.transferShipping.list\",\n async () => {\n const response = await api.nexus.transferShipping.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n createBinTransfer,\n createReceiving,\n createTransfer,\n getPurchaseOrderReceipts,\n getTransferReceipts,\n getTransferShipping,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by VMI actions.\n * Matches `api.vmi` from the SDK.\n */\nexport interface VmiApiClient {\n vmi: {\n warehouse: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n availability: {\n get: (\n warehouseUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n distributors: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n products: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invProfileHdr: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n restockHdr: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n sections: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface VmiActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for short-lived data like availability. Default: 300 (5 min). */\n shortRedisTtl?: number;\n}\n\nexport interface VmiActions {\n getWarehouses: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getWarehouseAvailability: (\n warehouseUid: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getDistributors: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getProducts: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getInventoryProfiles: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getRestockHeaders: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getSections: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side VMI (Vendor Managed Inventory) actions with Redis caching.\n *\n * All VMI read operations are cached. Warehouse availability uses a shorter TTL\n * because inventory levels change more frequently than configuration data.\n *\n * @example\n * ```ts\n * import { createVmiActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const vmiActions = createVmiActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const warehouses = await vmiActions.getWarehouses({ customerId: 12345 });\n * const availability = await vmiActions.getWarehouseAvailability(123);\n * const distributors = await vmiActions.getDistributors({ customerId: 12345 });\n * ```\n */\nexport function createVmiActions(\n api: VmiApiClient,\n config: VmiActionsConfig = {},\n): VmiActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n shortRedisTtl = 300,\n } = config;\n\n async function getWarehouses(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.warehouse.list\",\n async () => {\n const response = await api.vmi.warehouse.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getWarehouseAvailability(\n warehouseUid: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n shortRedisTtl,\n \"vmi.warehouse.availability.get\",\n async () => {\n const response = await api.vmi.warehouse.availability.get(\n warehouseUid,\n { ...params, edgeCache },\n );\n return response.data;\n },\n warehouseUid,\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getDistributors(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.distributors.list\",\n async () => {\n const response = await api.vmi.distributors.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getProducts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.products.list\",\n async () => {\n const response = await api.vmi.products.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getInventoryProfiles(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.invProfileHdr.list\",\n async () => {\n const response = await api.vmi.invProfileHdr.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getRestockHeaders(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.restockHdr.list\",\n async () => {\n const response = await api.vmi.restockHdr.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getSections(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.sections.list\",\n async () => {\n const response = await api.vmi.sections.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n getWarehouses,\n getWarehouseAvailability,\n getDistributors,\n getProducts,\n getInventoryProfiles,\n getRestockHeaders,\n getSections,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-core actions.\n * Matches `api.p21Core` from the SDK.\n */\nexport interface P21CoreApiClient {\n p21Core: {\n address: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n company: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n location: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n paymentTypes: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n cashDrawer: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n codeP21: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21CoreActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface P21CoreActions {\n getAddresses: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCompanies: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCompany: (companyId: number) => Promise<unknown | undefined>;\n getLocations: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getPaymentTypes: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCashDrawers: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCodeP21: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 Core actions with Redis caching and edge cache support.\n *\n * Covers the P21 Core microservice endpoints: addresses, companies,\n * locations, payment types, cash drawers, and P21 codes.\n *\n * @example\n * ```ts\n * import { createP21CoreActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21CoreActions = createP21CoreActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const companies = await p21CoreActions.getCompanies();\n * const company = await p21CoreActions.getCompany(123);\n * ```\n */\nexport function createP21CoreActions(\n api: P21CoreApiClient,\n config: P21CoreActionsConfig = {},\n): P21CoreActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getAddresses(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Core.address.list\",\n async () => {\n const response = await api.p21Core.address.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCompanies(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.company.list\",\n async () => {\n const response = await api.p21Core.company.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCompany(\n companyId: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.company.get\",\n async () => {\n const response = await api.p21Core.company.get({\n companyUid: companyId,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n companyId,\n );\n }\n\n async function getLocations(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.location.list\",\n async () => {\n const response = await api.p21Core.location.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getPaymentTypes(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.paymentTypes.list\",\n async () => {\n const response = await api.p21Core.paymentTypes.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCashDrawers(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Core.cashDrawer.list\",\n async () => {\n const response = await api.p21Core.cashDrawer.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCodeP21(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.codeP21.list\",\n async () => {\n const response = await api.p21Core.codeP21.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getAddresses,\n getCompanies,\n getCompany,\n getLocations,\n getPaymentTypes,\n getCashDrawers,\n getCodeP21,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-apis actions.\n * Matches `api.p21Apis` from the SDK.\n */\nexport interface P21ApisApiClient {\n p21Apis: {\n transCategory: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n defaults: {\n get: (\n categoryUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n transCompany: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transUser: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transWebDisplayType: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n defaults: {\n get: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n entityContacts: {\n refresh: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n entityCustomers: {\n refresh: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface P21ApisActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21ApisActions {\n getCategories: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCategoryDefaults: (categoryId: number) => Promise<unknown | undefined>;\n getCompanies: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getUsers: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getWebDisplayTypes: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getWebDisplayTypeDefaults: (\n id?: number,\n ) => Promise<unknown | undefined>;\n refreshContacts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n refreshCustomers: (\n params?: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side P21 APIs actions with Redis caching and edge cache support.\n *\n * Covers the P21 APIs microservice endpoints: transaction categories,\n * companies, users, web display types, and entity refresh operations.\n *\n * @example\n * ```ts\n * import { createP21ApisActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21ApisActions = createP21ApisActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const categories = await p21ApisActions.getCategories();\n * await p21ApisActions.refreshContacts();\n * ```\n */\nexport function createP21ApisActions(\n api: P21ApisApiClient,\n config: P21ApisActionsConfig = {},\n): P21ApisActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getCategories(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCategory.list\",\n async () => {\n const response = await api.p21Apis.transCategory.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCategoryDefaults(\n categoryId: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCategory.defaults.get\",\n async () => {\n const response = await api.p21Apis.transCategory.defaults.get(\n categoryId,\n { edgeCache },\n );\n return response.data;\n },\n categoryId,\n );\n }\n\n async function getCompanies(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCompany.list\",\n async () => {\n const response = await api.p21Apis.transCompany.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getUsers(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transUser.list\",\n async () => {\n const response = await api.p21Apis.transUser.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getWebDisplayTypes(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transWebDisplayType.list\",\n async () => {\n const response = await api.p21Apis.transWebDisplayType.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getWebDisplayTypeDefaults(\n id?: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transWebDisplayType.defaults.get\",\n async () => {\n const response = await api.p21Apis.transWebDisplayType.defaults.get({\n id,\n edgeCache,\n });\n return response.data;\n },\n id,\n );\n }\n\n async function refreshContacts(\n params?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response =\n await api.p21Apis.entityContacts.refresh.create(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function refreshCustomers(\n params?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response =\n await api.p21Apis.entityCustomers.refresh.create(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getCategories,\n getCategoryDefaults,\n getCompanies,\n getUsers,\n getWebDisplayTypes,\n getWebDisplayTypeDefaults,\n refreshContacts,\n refreshCustomers,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-sism actions.\n * Matches `api.p21Sism` from the SDK.\n */\nexport interface P21SismApiClient {\n p21Sism: {\n import: {\n recent: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n get: (importUid: string) => Promise<{ data: unknown }>;\n };\n impOeLine: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n scheduledImportMaster: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21SismActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21SismActions {\n getRecentImports: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getImport: (importId: string) => Promise<unknown | undefined>;\n getImportLines: (\n importId: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getScheduledImports: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 SISM actions with Redis caching and edge cache support.\n *\n * Covers the P21 SISM (System Integration & Storage Management) endpoints:\n * imports, import lines, and scheduled import masters.\n *\n * @example\n * ```ts\n * import { createP21SismActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21SismActions = createP21SismActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const recentImports = await p21SismActions.getRecentImports({ hours: 24 });\n * const importDetail = await p21SismActions.getImport(\"12345\");\n * ```\n */\nexport function createP21SismActions(\n api: P21SismApiClient,\n config: P21SismActionsConfig = {},\n): P21SismActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getRecentImports(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.import.recent.list\",\n async () => {\n const response = await api.p21Sism.import.recent.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getImport(\n importId: string,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.import.get\",\n async () => {\n const response = await api.p21Sism.import.get(importId);\n return response.data;\n },\n importId,\n );\n }\n\n async function getImportLines(\n importId: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.impOeLine.list\",\n async () => {\n const response = await api.p21Sism.impOeLine.list({\n ...params,\n importUid: importId,\n edgeCache,\n });\n return response.data;\n },\n importId,\n params,\n );\n }\n\n async function getScheduledImports(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.scheduledImportMaster.list\",\n async () => {\n const response = await api.p21Sism.scheduledImportMaster.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getRecentImports,\n getImport,\n getImportLines,\n getScheduledImports,\n };\n}\n","/**\n * The subset of augur-api used by agr-work actions.\n * Matches `api.agrWork` from the SDK.\n */\nexport interface AgrWorkApiClient {\n agrWork: {\n healthCheck: {\n get: () => Promise<{ data: string }>;\n };\n ping: {\n get: () => Promise<{ data: string }>;\n };\n };\n}\n\nexport interface AgrWorkActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface AgrWorkActions {\n healthCheck: () => Promise<string | undefined>;\n ping: () => Promise<string | undefined>;\n}\n\n/**\n * Creates server-side AGR Work actions for health monitoring and connectivity.\n *\n * Covers the AGR Work microservice endpoints: healthCheck and ping.\n * These are real-time operations and do not use caching.\n *\n * @example\n * ```ts\n * import { createAgrWorkActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrWorkActions = createAgrWorkActions(getAugurClient());\n *\n * const health = await agrWorkActions.healthCheck();\n * const pong = await agrWorkActions.ping();\n * ```\n */\nexport function createAgrWorkActions(\n api: AgrWorkApiClient,\n _config: AgrWorkActionsConfig = {},\n): AgrWorkActions {\n async function healthCheck(): Promise<string | undefined> {\n try {\n const response = await api.agrWork.healthCheck.get();\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function ping(): Promise<string | undefined> {\n try {\n const response = await api.agrWork.ping.get();\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n healthCheck,\n ping,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by agr-info actions.\n * Matches `api.agrInfo` from the SDK.\n */\nexport interface AgrInfoApiClient {\n agrInfo: {\n context: {\n get: (\n siteId: string,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n rubrics: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n microservices: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n akasha: {\n generate: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n joomla: {\n generate: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface AgrInfoActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface AgrInfoActions {\n getContext: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getRubrics: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getMicroservices: (params?: Record<string, unknown>) => Promise<unknown[]>;\n generateAkasha: (data?: Record<string, unknown>) => Promise<unknown | undefined>;\n generateJoomla: (data?: Record<string, unknown>) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side AGR Info actions with Redis caching and edge cache support.\n *\n * Covers the AGR Info microservice endpoints: context, rubrics,\n * microservices, and AI generation (akasha/joomla).\n *\n * @example\n * ```ts\n * import { createAgrInfoActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrInfoActions = createAgrInfoActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const rubrics = await agrInfoActions.getRubrics();\n * const result = await agrInfoActions.generateAkasha({ prompt: \"Hello\" });\n * ```\n */\nexport function createAgrInfoActions(\n api: AgrInfoApiClient,\n config: AgrInfoActionsConfig = {},\n): AgrInfoActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getContext(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"agrInfo.context.list\",\n async () => {\n const siteId = (params?.siteId as string) ?? \"\";\n const response = await api.agrInfo.context.get(siteId, {\n ...params,\n edgeCache,\n });\n return Array.isArray(response.data) ? response.data : [response.data];\n },\n params,\n );\n }\n\n async function getRubrics(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"agrInfo.rubrics.list\",\n async () => {\n const response = await api.agrInfo.rubrics.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getMicroservices(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrInfo.microservices.list\",\n async () => {\n const response = await api.agrInfo.microservices.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function generateAkasha(\n data?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.agrInfo.akasha.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function generateJoomla(\n data?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.agrInfo.joomla.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getContext,\n getRubrics,\n getMicroservices,\n generateAkasha,\n generateJoomla,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by basecamp2 actions.\n * Matches `api.basecamp2` from the SDK.\n */\nexport interface Basecamp2ApiClient {\n basecamp2: {\n todos: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n todoId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n todosSummary: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n comments: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n people: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n projects: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n events: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n metrics: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n todolists: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface Basecamp2ActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like people. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface Basecamp2Actions {\n getTodos: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getTodo: (todoId: number) => Promise<unknown>;\n getTodosSummary: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getComments: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getPeople: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getProjects: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getEvents: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getMetrics: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getTodolists: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side basecamp2 actions with Redis caching and edge cache support.\n *\n * Covers the Basecamp2 project management endpoints: todos, todo summaries,\n * comments, people, projects, events, metrics, and todolists.\n *\n * @example\n * ```ts\n * import { createBasecamp2Actions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const basecamp2Actions = createBasecamp2Actions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const todos = await basecamp2Actions.getTodos();\n * const people = await basecamp2Actions.getPeople();\n * ```\n */\nexport function createBasecamp2Actions(\n api: Basecamp2ApiClient,\n config: Basecamp2ActionsConfig = {},\n): Basecamp2Actions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getTodos(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todos.list\",\n async () => {\n const response = await api.basecamp2.todos.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getTodo(todoId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todos.get\",\n async () => {\n const response = await api.basecamp2.todos.get(todoId, { edgeCache });\n return response.data;\n },\n todoId,\n );\n }\n\n async function getTodosSummary(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todosSummary.list\",\n async () => {\n const response = await api.basecamp2.todosSummary.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getComments(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.comments.list\",\n async () => {\n const response = await api.basecamp2.comments.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getPeople(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"basecamp2.people.list\",\n async () => {\n const response = await api.basecamp2.people.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getProjects(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.projects.list\",\n async () => {\n const response = await api.basecamp2.projects.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getEvents(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.events.list\",\n async () => {\n const response = await api.basecamp2.events.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getMetrics(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.metrics.list\",\n async () => {\n const response = await api.basecamp2.metrics.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getTodolists(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todolists.list\",\n async () => {\n const response = await api.basecamp2.todolists.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getTodos,\n getTodo,\n getTodosSummary,\n getComments,\n getPeople,\n getProjects,\n getEvents,\n getMetrics,\n getTodolists,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by brand-folder actions.\n * Matches `api.brandFolder` from the SDK.\n */\nexport interface BrandFolderApiClient {\n brandFolder: {\n categories: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n categoryId: string,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n focus: {\n create: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface BrandFolderActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface BrandFolderActions {\n getCategories: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCategory: (categoryId: string) => Promise<unknown>;\n createFocus: (\n categoryId: string,\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side brand-folder actions with Redis caching and edge cache support.\n *\n * Covers the Brand Folder service endpoints: category listing, category detail,\n * and category focus creation.\n *\n * @example\n * ```ts\n * import { createBrandFolderActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const brandFolderActions = createBrandFolderActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const categories = await brandFolderActions.getCategories();\n * const category = await brandFolderActions.getCategory(\"cat-123\");\n * const focus = await brandFolderActions.createFocus(\"cat-123\", { focusLevel: \"primary\" });\n * ```\n */\nexport function createBrandFolderActions(\n api: BrandFolderApiClient,\n config: BrandFolderActionsConfig = {},\n): BrandFolderActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getCategories(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"brandFolder.categories.list\",\n async () => {\n const response = await api.brandFolder.categories.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCategory(categoryId: string): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"brandFolder.categories.get\",\n async () => {\n const response = await api.brandFolder.categories.get(categoryId, {\n edgeCache,\n });\n return response.data;\n },\n categoryId,\n );\n }\n\n async function createFocus(\n categoryId: string,\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.brandFolder.categories.focus.create({\n ...data,\n categoryId,\n });\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getCategories,\n getCategory,\n createFocus,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by gregorovich actions.\n * Matches `api.gregorovich` from the SDK.\n */\nexport interface GregorovichApiClient {\n gregorovich: {\n chatGpt: {\n ask: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n documents: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n ollama: {\n generate: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface GregorovichActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface GregorovichActions {\n askChatGpt: (params: Record<string, unknown>) => Promise<unknown | undefined>;\n getDocuments: (params?: Record<string, unknown>) => Promise<unknown[]>;\n createDocument: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n generateOllama: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side gregorovich actions with Redis caching and edge cache support.\n *\n * Covers the Gregorovich AI service endpoints: ChatGPT ask, document listing,\n * document creation, and Ollama generation.\n *\n * @example\n * ```ts\n * import { createGregorovichActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const gregorovichActions = createGregorovichActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const answer = await gregorovichActions.askChatGpt({ question: \"What is AI?\" });\n * const docs = await gregorovichActions.getDocuments();\n * ```\n */\nexport function createGregorovichActions(\n api: GregorovichApiClient,\n config: GregorovichActionsConfig = {},\n): GregorovichActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function askChatGpt(\n params: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.chatGpt.ask.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getDocuments(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"gregorovich.documents.list\",\n async () => {\n const response = await api.gregorovich.documents.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function createDocument(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.documents.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function generateOllama(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.ollama.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n askChatGpt,\n getDocuments,\n createDocument,\n generateOllama,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by slack actions.\n * Matches `api.slack` from the SDK.\n */\nexport interface SlackApiClient {\n slack: {\n webHook: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface SlackActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface SlackActions {\n sendWebhook: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n getWebhooks: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side slack actions with Redis caching and edge cache support.\n *\n * Covers the Slack integration endpoints: webhook sending and webhook listing.\n *\n * @example\n * ```ts\n * import { createSlackActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const slackActions = createSlackActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const result = await slackActions.sendWebhook({ text: \"Hello!\" });\n * const webhooks = await slackActions.getWebhooks();\n * ```\n */\nexport function createSlackActions(\n api: SlackApiClient,\n config: SlackActionsConfig = {},\n): SlackActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function sendWebhook(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.slack.webHook.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getWebhooks(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"slack.webHook.list\",\n async () => {\n const response = await api.slack.webHook.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n sendWebhook,\n getWebhooks,\n };\n}\n","import { createPricingActions } from \"./pricing\";\nimport type { PricingApiClient, PricingActions } from \"./pricing\";\nimport { createItemActions } from \"./items\";\nimport type { ItemsApiClient, ItemActions } from \"./items\";\nimport { createCommerceActions } from \"./commerce\";\nimport type { CommerceApiClient, CommerceActions } from \"./commerce\";\nimport { createSearchActions } from \"./search\";\nimport type { SearchApiClient, SearchActions } from \"./search\";\nimport { createOrderActions } from \"./orders\";\nimport type { OrderApiClient, OrderActions } from \"./orders\";\nimport { createShippingActions } from \"./shipping\";\nimport type {\n ShippingAddress,\n ShippingApiClient,\n ShippingActionsConfig,\n ShippingActions,\n} from \"./shipping\";\nimport { createJoomlaActions } from \"./joomla\";\nimport type { JoomlaApiClient, JoomlaActions } from \"./joomla\";\nimport { createLegacyActions } from \"./legacy\";\nimport type { LegacyApiClient, LegacyActions } from \"./legacy\";\nimport { createCustomersActions } from \"./customers\";\nimport type { CustomersApiClient, CustomersActions } from \"./customers\";\nimport { createSmartyStreetsActions } from \"./smarty-streets\";\nimport type {\n SmartyStreetsApiClient,\n SmartyStreetsActions,\n} from \"./smarty-streets\";\nimport { createP21PimActions } from \"./p21-pim\";\nimport type { P21PimApiClient, P21PimActions } from \"./p21-pim\";\nimport { createAgrSiteActions } from \"./agr-site\";\nimport type { AgrSiteApiClient, AgrSiteActions } from \"./agr-site\";\nimport { createAvalaraActions } from \"./avalara\";\nimport type { AvalaraApiClient, AvalaraActions } from \"./avalara\";\nimport { createPaymentsActions } from \"./payments\";\nimport type { PaymentsApiClient, PaymentsActions } from \"./payments\";\nimport { createUpsActions } from \"./ups\";\nimport type { UpsApiClient, UpsActions } from \"./ups\";\nimport { createLogisticsActions } from \"./logistics\";\nimport type { LogisticsApiClient, LogisticsActions } from \"./logistics\";\nimport { createNexusActions } from \"./nexus\";\nimport type { NexusApiClient, NexusActions } from \"./nexus\";\nimport { createVmiActions } from \"./vmi\";\nimport type { VmiApiClient, VmiActions } from \"./vmi\";\nimport { createP21CoreActions } from \"./p21-core\";\nimport type { P21CoreApiClient, P21CoreActions } from \"./p21-core\";\nimport { createP21ApisActions } from \"./p21-apis\";\nimport type { P21ApisApiClient, P21ApisActions } from \"./p21-apis\";\nimport { createP21SismActions } from \"./p21-sism\";\nimport type { P21SismApiClient, P21SismActions } from \"./p21-sism\";\nimport { createAgrWorkActions } from \"./agr-work\";\nimport type { AgrWorkApiClient, AgrWorkActions } from \"./agr-work\";\nimport { createAgrInfoActions } from \"./agr-info\";\nimport type { AgrInfoApiClient, AgrInfoActions } from \"./agr-info\";\nimport { createBasecamp2Actions } from \"./basecamp2\";\nimport type { Basecamp2ApiClient, Basecamp2Actions } from \"./basecamp2\";\nimport { createBrandFolderActions } from \"./brand-folder\";\nimport type { BrandFolderApiClient, BrandFolderActions } from \"./brand-folder\";\nimport { createGregorovichActions } from \"./gregorovich\";\nimport type { GregorovichApiClient, GregorovichActions } from \"./gregorovich\";\nimport { createSlackActions } from \"./slack\";\nimport type { SlackApiClient, SlackActions } from \"./slack\";\n\nexport { type ShippingAddress } from \"./shipping\";\n\nexport interface SiteActionsConfig {\n /** Cache key prefix shared across all services (e.g. \"ampro:\") */\n cachePrefix?: string;\n /** Default edge cache TTL in seconds */\n edgeCache?: number;\n /** Default Redis TTL in seconds */\n redisTtl?: number;\n /** Long-lived edge cache TTL for rarely-changing data */\n longEdgeCache?: number;\n /** Long-lived Redis TTL for rarely-changing data */\n longRedisTtl?: number;\n\n /** Default contact ID for commerce operations */\n defaultContactId?: string | number;\n /** Default customer ID for pricing and commerce */\n defaultCustomerId?: string | number;\n /** UOM conversion function for commerce (e.g. \"EA\" → \"EACH\") */\n convertUnitOfMeasure?: (uom: string) => string;\n\n /** Pricing-specific overrides */\n pricing?: { taxRedisTtl?: number };\n /** Items-specific overrides */\n items?: { sortChildren?: boolean };\n /** Search-specific overrides */\n search?: { defaultSourceFields?: string };\n /** Shipping config — fromAddress is required for shipping to work */\n shipping?: {\n fromAddress: ShippingAddress;\n defaultServiceCodes?: string[];\n };\n /** VMI-specific overrides */\n vmi?: { shortRedisTtl?: number };\n}\n\nexport interface SiteActions {\n pricing: PricingActions;\n items: ItemActions;\n commerce: CommerceActions;\n search: SearchActions;\n orders: OrderActions;\n shipping: ShippingActions;\n joomla: JoomlaActions;\n legacy: LegacyActions;\n customers: CustomersActions;\n smartyStreets: SmartyStreetsActions;\n p21Pim: P21PimActions;\n agrSite: AgrSiteActions;\n avalara: AvalaraActions;\n payments: PaymentsActions;\n ups: UpsActions;\n logistics: LogisticsActions;\n nexus: NexusActions;\n vmi: VmiActions;\n p21Core: P21CoreActions;\n p21Apis: P21ApisActions;\n p21Sism: P21SismActions;\n agrWork: AgrWorkActions;\n agrInfo: AgrInfoActions;\n basecamp2: Basecamp2Actions;\n brandFolder: BrandFolderActions;\n gregorovich: GregorovichActions;\n slack: SlackActions;\n}\n\n/**\n * Creates a unified site actions object with all service factories.\n *\n * Shared config (cachePrefix, edgeCache, redisTtl, etc.) is passed to all\n * services automatically. Per-service overrides are available for services\n * with additional configuration.\n *\n * @example\n * ```ts\n * import { createSiteActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const actions = createSiteActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * defaultContactId: process.env.NEXT_PUBLIC_DEFAULT_CONTACT_ID,\n * convertUnitOfMeasure: (uom) => uom === \"EA\" ? \"EACH\" : uom,\n * items: { sortChildren: true },\n * shipping: {\n * fromAddress: { address1: \"123 Main\", city: \"Provo\", state: \"UT\", postalCode: \"84606\" },\n * defaultServiceCodes: [\"03\"],\n * },\n * });\n *\n * // Usage:\n * const price = await actions.pricing.getItemPrice(\"ITEM-1\");\n * const doc = await actions.items.getInvMastDoc(\"ITEM-1\");\n * const cart = await actions.commerce.cartHdrLookup({ userId: 123 });\n * ```\n */\nexport function createSiteActions<TApi extends object>(\n api: TApi,\n config: SiteActionsConfig = {},\n): SiteActions {\n const {\n cachePrefix,\n edgeCache,\n redisTtl,\n longEdgeCache,\n longRedisTtl,\n defaultContactId,\n defaultCustomerId,\n convertUnitOfMeasure,\n } = config;\n\n const cache = { cachePrefix, edgeCache, redisTtl };\n const longCache = { ...cache, longEdgeCache, longRedisTtl };\n\n function castApi<T>(): T {\n return api as unknown as T;\n }\n\n /** Creates a memoized getter — factory is called once on first access. */\n function lazy<T>(fn: () => T): { get(): T } {\n let instance: T | undefined;\n return {\n get() {\n if (instance === undefined) instance = fn();\n return instance;\n },\n };\n }\n\n const pricing = lazy(() =>\n createPricingActions(castApi<PricingApiClient>(), {\n ...cache,\n defaultCustomerId,\n ...config.pricing,\n }),\n );\n const items = lazy(() =>\n createItemActions(castApi<ItemsApiClient>(), {\n ...longCache,\n ...config.items,\n }),\n );\n const commerce = lazy(() =>\n createCommerceActions(castApi<CommerceApiClient>(), {\n defaultContactId,\n defaultCustomerId,\n convertUnitOfMeasure,\n }),\n );\n const search = lazy(() =>\n createSearchActions(castApi<SearchApiClient>(), {\n ...cache,\n ...config.search,\n }),\n );\n const orders = lazy(() =>\n createOrderActions(castApi<OrderApiClient>(), cache),\n );\n const shipping = lazy(() =>\n createShippingActions(\n castApi<ShippingApiClient>(),\n { ...cache, ...config.shipping } as ShippingActionsConfig,\n ),\n );\n const joomla = lazy(() =>\n createJoomlaActions(castApi<JoomlaApiClient>(), cache),\n );\n const legacy = lazy(() =>\n createLegacyActions(castApi<LegacyApiClient>(), longCache),\n );\n const customers = lazy(() =>\n createCustomersActions(castApi<CustomersApiClient>(), cache),\n );\n const smartyStreets = lazy(() =>\n createSmartyStreetsActions(castApi<SmartyStreetsApiClient>(), {\n cachePrefix,\n }),\n );\n const p21Pim = lazy(() =>\n createP21PimActions(castApi<P21PimApiClient>(), cache),\n );\n const agrSite = lazy(() =>\n createAgrSiteActions(castApi<AgrSiteApiClient>(), {\n cachePrefix,\n longEdgeCache,\n longRedisTtl,\n }),\n );\n const avalara = lazy(() =>\n createAvalaraActions(castApi<AvalaraApiClient>(), { cachePrefix }),\n );\n const payments = lazy(() =>\n createPaymentsActions(castApi<PaymentsApiClient>(), { cachePrefix }),\n );\n const ups = lazy(() =>\n createUpsActions(castApi<UpsApiClient>(), { cachePrefix }),\n );\n const logistics = lazy(() =>\n createLogisticsActions(castApi<LogisticsApiClient>(), longCache),\n );\n const nexus = lazy(() =>\n createNexusActions(castApi<NexusApiClient>(), cache),\n );\n const vmi = lazy(() =>\n createVmiActions(castApi<VmiApiClient>(), { ...cache, ...config.vmi }),\n );\n const p21Core = lazy(() =>\n createP21CoreActions(castApi<P21CoreApiClient>(), longCache),\n );\n const p21Apis = lazy(() =>\n createP21ApisActions(castApi<P21ApisApiClient>(), cache),\n );\n const p21Sism = lazy(() =>\n createP21SismActions(castApi<P21SismApiClient>(), cache),\n );\n const agrWork = lazy(() =>\n createAgrWorkActions(castApi<AgrWorkApiClient>(), { cachePrefix }),\n );\n const agrInfo = lazy(() =>\n createAgrInfoActions(castApi<AgrInfoApiClient>(), longCache),\n );\n const basecamp2 = lazy(() =>\n createBasecamp2Actions(castApi<Basecamp2ApiClient>(), longCache),\n );\n const brandFolder = lazy(() =>\n createBrandFolderActions(castApi<BrandFolderApiClient>(), cache),\n );\n const gregorovich = lazy(() =>\n createGregorovichActions(castApi<GregorovichApiClient>(), cache),\n );\n const slack = lazy(() =>\n createSlackActions(castApi<SlackApiClient>(), cache),\n );\n\n return {\n get pricing() { return pricing.get(); },\n get items() { return items.get(); },\n get commerce() { return commerce.get(); },\n get search() { return search.get(); },\n get orders() { return orders.get(); },\n get shipping() { return shipping.get(); },\n get joomla() { return joomla.get(); },\n get legacy() { return legacy.get(); },\n get customers() { return customers.get(); },\n get smartyStreets() { return smartyStreets.get(); },\n get p21Pim() { return p21Pim.get(); },\n get agrSite() { return agrSite.get(); },\n get avalara() { return avalara.get(); },\n get payments() { return payments.get(); },\n get ups() { return ups.get(); },\n get logistics() { return logistics.get(); },\n get nexus() { return nexus.get(); },\n get vmi() { return vmi.get(); },\n get p21Core() { return p21Core.get(); },\n get p21Apis() { return p21Apis.get(); },\n get p21Sism() { return p21Sism.get(); },\n get agrWork() { return agrWork.get(); },\n get agrInfo() { return agrInfo.get(); },\n get basecamp2() { return basecamp2.get(); },\n get brandFolder() { return brandFolder.get(); },\n get gregorovich() { return gregorovich.get(); },\n get slack() { return slack.get(); },\n };\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/environment.ts","../src/cache/redis-client.ts","../src/sdk-call.ts","../src/cache/with-cache.ts","../src/actions/pricing.ts","../src/actions/items.ts","../src/actions/commerce.ts","../src/actions/orders.ts","../src/actions/search.ts","../src/actions/shipping.ts","../src/actions/joomla.ts","../src/actions/legacy.ts","../src/actions/customers.ts","../src/actions/smarty-streets.ts","../src/actions/p21-pim.ts","../src/actions/agr-site.ts","../src/actions/avalara.ts","../src/actions/payments.ts","../src/actions/ups.ts","../src/actions/logistics.ts","../src/actions/nexus.ts","../src/actions/vmi.ts","../src/actions/p21-core.ts","../src/actions/p21-apis.ts","../src/actions/p21-sism.ts","../src/actions/agr-work.ts","../src/actions/agr-info.ts","../src/actions/basecamp2.ts","../src/actions/brand-folder.ts","../src/actions/gregorovich.ts","../src/actions/slack.ts","../src/actions/site.ts"],"sourcesContent":["/**\n * Environment detection that works across server, client, and containers.\n *\n * Priority:\n * 1. DEPLOYMENT_ENV (\"dev\" → staging, \"live\" → production)\n * 2. Server-side NODE_ENV fallback\n * 3. Client-side hostname detection\n */\nfunction getEnvironment(): \"development\" | \"staging\" | \"production\" {\n const deploymentEnv = process.env.DEPLOYMENT_ENV;\n if (deploymentEnv === \"dev\") return \"staging\";\n if (deploymentEnv === \"live\") return \"production\";\n\n if (typeof window === \"undefined\") {\n if (process.env.NODE_ENV === \"development\") return \"development\";\n return \"production\";\n }\n\n const host = window.location.hostname;\n if (host.includes(\"localhost\") || host.includes(\"127.0.0.1\"))\n return \"development\";\n if (host.includes(\"agr-hosting.dev\")) return \"staging\";\n return \"production\";\n}\n\nexport const env = getEnvironment();\nexport const isDev = env === \"development\";\nexport const isStaging = env === \"staging\";\nexport const isProduction = env === \"production\";\n","import type Redis from \"ioredis\";\nimport { isDev, isStaging } from \"../environment\";\n\nconst CIRCUIT_BREAKER_THRESHOLD = 5;\nconst CIRCUIT_BREAKER_RESET_MS = 60_000;\n\ninterface RedisGlobalState {\n client: Redis | null;\n consecutiveFailures: number;\n circuitOpenUntil: number;\n}\n\nconst g = globalThis as unknown as { __redisState?: RedisGlobalState };\nif (!g.__redisState) {\n g.__redisState = {\n client: null,\n consecutiveFailures: 0,\n circuitOpenUntil: 0,\n };\n}\nconst state = g.__redisState;\n\nconst debugEnabled = isDev || isStaging;\n\nfunction log(...args: unknown[]) {\n if (debugEnabled) {\n console.log(\"[Redis]\", ...args);\n }\n}\n\nfunction isCircuitOpen(): boolean {\n if (state.circuitOpenUntil === 0) return false;\n if (Date.now() >= state.circuitOpenUntil) {\n state.circuitOpenUntil = 0;\n state.consecutiveFailures = 0;\n log(\"Circuit breaker reset -- retrying Redis\");\n return false;\n }\n return true;\n}\n\nfunction recordFailure() {\n state.consecutiveFailures++;\n if (state.consecutiveFailures >= CIRCUIT_BREAKER_THRESHOLD) {\n state.circuitOpenUntil = Date.now() + CIRCUIT_BREAKER_RESET_MS;\n log(\n `Circuit breaker OPEN -- skipping Redis for ${CIRCUIT_BREAKER_RESET_MS / 1000}s`,\n );\n }\n}\n\nfunction recordSuccess() {\n state.consecutiveFailures = 0;\n}\n\nfunction getRedisUrl(): string | undefined {\n const containerRedis = process.env.REDIS_SERVERS;\n if (containerRedis) return `redis://${containerRedis}`;\n\n if (isDev) return process.env.REDIS_URL_DEV;\n if (isStaging) return process.env.REDIS_URL_STAGING;\n return process.env.REDIS_URL_PROD;\n}\n\nasync function getClient(): Promise<Redis | null> {\n if (state.client) return state.client;\n\n const url = getRedisUrl();\n if (!url) {\n log(\"No REDIS_URL -- cache disabled\");\n return null;\n }\n\n try {\n // Dynamic import so the built ESM output doesn't use esbuild's __require\n // shim, which breaks in pure ESM environments (Next.js 16 + Turbopack).\n // ioredis is CJS-only; Node wraps its module.exports as { default }.\n const { default: IORedis } = await import(\"ioredis\");\n\n state.client = new IORedis(url, {\n maxRetriesPerRequest: 1,\n connectTimeout: 3000,\n lazyConnect: true,\n enableOfflineQueue: false,\n });\n\n state.client.on(\"error\", (err: Error) => {\n log(\"Connection error:\", err.message);\n recordFailure();\n });\n\n state.client.on(\"connect\", () => log(\"Connected\"));\n\n state.client.connect().catch(() => {\n /* handled by error event */\n });\n\n return state.client;\n } catch {\n log(\"Failed to create client (ioredis not installed?)\");\n return null;\n }\n}\n\nexport async function cacheGet(key: string): Promise<string | null> {\n if (isCircuitOpen()) return null;\n\n const client = await getClient();\n if (!client) return null;\n\n try {\n const value = await client.get(key);\n recordSuccess();\n return value;\n } catch {\n recordFailure();\n return null;\n }\n}\n\nexport async function cacheSet(\n key: string,\n value: string,\n ttlSeconds: number,\n): Promise<void> {\n if (isCircuitOpen()) return;\n\n const client = await getClient();\n if (!client) return;\n\n try {\n await client.setex(key, ttlSeconds, value);\n recordSuccess();\n } catch {\n recordFailure();\n }\n}\n\nexport function getCircuitState(): \"closed\" | \"open\" {\n return isCircuitOpen() ? \"open\" : \"closed\";\n}\n\nexport function isRedisConnected(): boolean {\n return state.client?.status === \"ready\";\n}\n","/**\n * Calls an Augur SDK method, forwarding all arguments with full type safety.\n *\n * With augur-api >= 0.9.6, SDK methods properly declare their `CacheParams`\n * option (including `edgeCache`), so this wrapper preserves both parameter\n * and return-type inference end-to-end.\n *\n * @example\n * ```ts\n * const result = await sdkCall(\n * augurServices.items.invMast.get,\n * invMastUid,\n * { edgeCache: 4 },\n * );\n * ```\n */\nexport async function sdkCall<TArgs extends unknown[], TResult>(\n method: (...args: TArgs) => Promise<TResult>,\n ...args: TArgs\n): Promise<TResult> {\n return method(...args);\n}\n\n/**\n * Discriminated union for safe action results.\n * Same pattern as next-safe-action — callers check `result.ok` to\n * determine success or failure with typed error info.\n */\nexport type ActionResult<T> =\n | { ok: true; data: T }\n | { ok: false; error: string };\n\n/**\n * Wraps an async function call with error handling, returning an\n * `ActionResult<T>` instead of throwing.\n *\n * Use this to eliminate try/catch boilerplate in server actions.\n * Reads that go through React Query should NOT use this — let errors\n * propagate so React Query can handle retries and error state.\n *\n * @param fn — The async function to execute\n * @param onError — Optional callback for logging/reporting\n *\n * @example\n * ```ts\n * // Before (boilerplate wrapper):\n * export async function addToCart(cartId: number, items: CartItem[]) {\n * try {\n * return await actions.commerce.addToCart(cartId, items);\n * } catch (error) {\n * console.error(\"addToCart error:\", error);\n * return undefined;\n * }\n * }\n *\n * // After (one-liner):\n * const result = await safeAction(\n * () => actions.commerce.addToCart(cartId, items),\n * );\n * if (result.ok) {\n * // result.data is the response\n * } else {\n * // result.error is the error message\n * }\n * ```\n */\nexport async function safeAction<T>(\n fn: () => Promise<T>,\n onError?: (error: Error) => void,\n): Promise<ActionResult<T>> {\n try {\n const data = await fn();\n return { ok: true, data };\n } catch (e) {\n const error = e instanceof Error ? e : new Error(String(e));\n if (onError) onError(error);\n return { ok: false, error: error.message };\n }\n}\n","import { cacheGet, cacheSet } from \"./redis-client\";\n\n/**\n * FNV-1a 32-bit hash. Same implementation as augur-hooks/cache-helper\n * so cache keys are identical across client and server.\n */\nfunction fnv1a(str: string): string {\n let h = 0x811c9dc5;\n for (let i = 0; i < str.length; i++) {\n h ^= str.charCodeAt(i);\n h = Math.imul(h, 0x01000193);\n }\n return (h >>> 0).toString(16).padStart(8, \"0\");\n}\n\n/**\n * JSON.stringify with sorted object keys for deterministic cache keys.\n * Same implementation as augur-hooks/stable-stringify.\n */\nfunction stableStringify(value: unknown): string {\n if (value === null || value === undefined) return JSON.stringify(value);\n if (typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map(stableStringify).join(\",\")}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n const entries = keys.map(\n (key) => `${JSON.stringify(key)}:${stableStringify(obj[key])}`,\n );\n return `{${entries.join(\",\")}}`;\n}\n\n/**\n * Server-side cache wrapper using augur-server's Redis client.\n *\n * Uses the same cache key format as augur-hooks' `withCache`:\n * `${prefix}sdk:${methodPath}:${fnv1a(stableStringify(keyArgs))}`\n *\n * This means server-side cached data can be read by client-side hooks\n * (and vice versa) when using the same prefix and method path.\n *\n * @param prefix Cache key prefix (e.g. \"ampro:\"). Empty string if none.\n * @param redisTtl Redis TTL in seconds. 0 or undefined = skip caching.\n * @param methodPath Dot-separated SDK method path (e.g. \"pricing.priceEngine.get\").\n * @param fn The async function to cache.\n * @param keyArgs Values to hash for the cache key.\n */\nexport async function withServerCache<T>(\n prefix: string,\n redisTtl: number | undefined,\n methodPath: string,\n fn: () => Promise<T>,\n ...keyArgs: unknown[]\n): Promise<T> {\n if (!redisTtl) return fn();\n\n const key = `${prefix}sdk:${methodPath}:${fnv1a(stableStringify(keyArgs))}`;\n\n try {\n const cached = await cacheGet(key);\n if (cached != null) return JSON.parse(cached) as T;\n } catch {\n /* Redis read error — fall through to SDK call */\n }\n\n const result = await fn();\n\n try {\n cacheSet(key, JSON.stringify(result), redisTtl).catch(() => {});\n /* v8 ignore next 3 -- defensive guard for non-serializable data */\n } catch {\n /* Non-serializable or write error — skip caching */\n }\n\n return result;\n}\n","import type { TPriceData, TTax, TTaxItem } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by pricing actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface PricingApiClient {\n pricing: {\n priceEngine: {\n get: (params: Record<string, unknown>) => Promise<{ data: TPriceData }>;\n };\n taxEngine: {\n create: (params: Record<string, unknown>) => Promise<{ data: TTax }>;\n };\n };\n}\n\nexport interface PricingActionsConfig {\n /** Default customer ID when none is provided by the caller. */\n defaultCustomerId?: string | number;\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 2 (hours). */\n edgeCache?: number;\n /** Redis TTL for price lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for tax lookups in seconds. Default: 1800 (30 min). */\n taxRedisTtl?: number;\n}\n\nexport interface PricingActions {\n getItemPrice: (\n itemId: string,\n customerId?: string | number,\n quantity?: number,\n ) => Promise<TPriceData>;\n\n batchGetItemPrices: (\n itemIds: string[],\n customerId?: string | number,\n quantity?: number,\n ) => Promise<Record<string, TPriceData>>;\n\n getTaxEstimate: (\n customerId: string | number,\n postalCode: string,\n items: TTaxItem[],\n ) => Promise<TTax>;\n}\n\nfunction resolveCustomerId(\n explicit: string | number | undefined,\n fallback: string | number | undefined,\n): number {\n const raw = explicit ?? fallback;\n const num = Number(raw);\n return num > 0 ? num : 0;\n}\n\n/**\n * Creates server-side pricing actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/pricing-actions.ts\n * import { createPricingActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const pricingActions = createPricingActions(getAugurClient(), {\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const price = await pricingActions.getItemPrice(\"ITEM-1\");\n * const prices = await pricingActions.batchGetItemPrices([\"ITEM-1\", \"ITEM-2\"]);\n * ```\n */\nexport function createPricingActions(\n api: PricingApiClient,\n config: PricingActionsConfig = {},\n): PricingActions {\n const {\n defaultCustomerId,\n cachePrefix = \"\",\n edgeCache = 2,\n redisTtl = 3600,\n taxRedisTtl = 1800,\n } = config;\n\n async function getItemPrice(\n itemId: string,\n customerId?: string | number,\n quantity = 1,\n ): Promise<TPriceData> {\n const custId = resolveCustomerId(customerId, defaultCustomerId);\n const params = { customerId: custId, itemId, quantity, edgeCache };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"pricing.priceEngine.get\",\n async () => {\n const response = await api.pricing.priceEngine.get(params);\n return response.data;\n },\n params,\n );\n }\n\n async function batchGetItemPrices(\n itemIds: string[],\n customerId?: string | number,\n quantity = 1,\n ): Promise<Record<string, TPriceData>> {\n const results = await Promise.all(\n itemIds.map((id) => getItemPrice(id, customerId, quantity)\n .then((data) => [id, data] as const)\n .catch(() => [id, null] as const)),\n );\n\n const out: Record<string, TPriceData> = {};\n for (const [id, data] of results) {\n if (data) out[id] = data;\n }\n return out;\n }\n\n async function getTaxEstimate(\n customerId: string | number,\n postalCode: string,\n items: TTaxItem[],\n ): Promise<TTax> {\n const custId = resolveCustomerId(customerId, defaultCustomerId);\n const params = { customerId: custId, postalCode, items };\n\n return withServerCache(\n cachePrefix,\n taxRedisTtl,\n \"pricing.taxEngine.create\",\n async () => {\n const response = await api.pricing.taxEngine.create(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getItemPrice, batchGetItemPrices, getTaxEstimate };\n}\n","import type {\n TAttribute,\n TCategory,\n TInvMast,\n TInvMastDoc,\n TItemAccessory,\n TStock,\n TStockData,\n} from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by item actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface ItemsApiClient {\n items: {\n categories: {\n get: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TCategory }>;\n lookup: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n items: {\n list: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n attributes: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: { attributes: TAttribute[] } }>;\n };\n };\n invMast: {\n get: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TInvMast }>;\n doc: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TInvMastDoc }>;\n };\n stock: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TStock }>;\n };\n faq: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invSub: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invAccessory: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TItemAccessory[] }>;\n };\n similar: {\n list: (\n uid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface ItemActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value for most calls. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like FAQs. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL for most calls in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n /** Sort category children by sequenceNo. Default: true. */\n sortChildren?: boolean;\n}\n\nexport interface ItemActions {\n // Category operations\n itemCategoryLookup: (path: string) => Promise<unknown>;\n getItemCategory: (\n uid: number,\n options?: Record<string, unknown>,\n ) => Promise<TCategory>;\n getCategoryItems: (\n uid: number,\n filters: Record<string, unknown>,\n ) => Promise<unknown>;\n getItemAttributes: (categoryUid: number) => Promise<TAttribute[]>;\n\n // Inventory operations\n getInvMast: (uid: number) => Promise<TInvMast>;\n getInvMastDoc: (params: {\n invMastUid?: number;\n itemId?: string;\n includePricing?: \"Y\" | \"N\";\n }) => Promise<TInvMastDoc>;\n getStock: (invMastUid: number) => Promise<TStockData[]>;\n getStockCompanySummary: (\n invMastUid: number,\n ) => Promise<Record<string, number>>;\n\n // Item extras\n getItemFaqs: (invMastUid: number) => Promise<unknown[]>;\n getItemSubstitutes: (invMastUid: number) => Promise<unknown[]>;\n getItemAccessories: (invMastUid: number) => Promise<TItemAccessory[]>;\n getSimilarItems: (invMastUid: number) => Promise<unknown[]>;\n\n // Batch operations\n batchGetInvMastDocs: (\n params: { invMastUid?: number; itemId?: string }[],\n ) => Promise<Record<string, TInvMastDoc>>;\n batchGetStockData: (\n invMastUids: number[],\n ) => Promise<Record<number, TStockData[]>>;\n}\n\n/**\n * Creates server-side item actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/item-actions.ts\n * import { createItemActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const itemActions = createItemActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const category = await itemActions.getItemCategory(123);\n * const doc = await itemActions.getInvMastDoc({ itemId: \"ITEM-1\" });\n * ```\n */\nexport function createItemActions(\n api: ItemsApiClient,\n config: ItemActionsConfig = {},\n): ItemActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n sortChildren = true,\n } = config;\n\n function sortCategoryChildren<T extends { sequenceNo: number }>(\n children: T[],\n ): T[] {\n if (!sortChildren) return children;\n return [...children].sort((a, b) => a.sequenceNo - b.sequenceNo);\n }\n\n // ---------------------------------------------------------------------------\n // Category operations\n // ---------------------------------------------------------------------------\n\n async function itemCategoryLookup(path: string): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.lookup.get\",\n async () => {\n const response = await api.items.categories.lookup.get({\n path,\n edgeCache,\n });\n return response.data;\n },\n path,\n );\n }\n\n async function getItemCategory(\n uid: number,\n options?: Record<string, unknown>,\n ): Promise<TCategory> {\n const category = await withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.get\",\n async () => {\n const response = await api.items.categories.get(uid, {\n ...options,\n edgeCache,\n });\n return response.data;\n },\n uid,\n options,\n );\n return {\n ...category,\n children: sortCategoryChildren(category.children),\n };\n }\n\n async function getCategoryItems(\n uid: number,\n filters: Record<string, unknown>,\n ): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.items.list\",\n async () => {\n const response = await api.items.categories.items.list({\n ...filters,\n itemCategoryUid: uid,\n edgeCache,\n });\n return response.data;\n },\n uid,\n filters,\n );\n }\n\n async function getItemAttributes(\n categoryUid: number,\n ): Promise<TAttribute[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.categories.attributes.list\",\n async () => {\n const response = await api.items.categories.attributes.list(\n categoryUid,\n { edgeCache },\n );\n return response.data.attributes;\n },\n categoryUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Inventory operations\n // ---------------------------------------------------------------------------\n\n async function getInvMast(uid: number): Promise<TInvMast> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.get\",\n async () => {\n const response = await api.items.invMast.get(uid, { edgeCache: 4 });\n return response.data;\n },\n uid,\n );\n }\n\n async function getInvMastDoc(params: {\n invMastUid?: number;\n itemId?: string;\n includePricing?: \"Y\" | \"N\";\n }): Promise<TInvMastDoc> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.doc.list\",\n async () => {\n const response = await api.items.invMast.doc.list(\n params.invMastUid ?? 0,\n {\n itemId: params.itemId,\n includePricing: params.includePricing,\n edgeCache: 4,\n },\n );\n return response.data;\n },\n params.invMastUid,\n params.itemId,\n params.includePricing,\n );\n }\n\n async function getStock(invMastUid: number): Promise<TStockData[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.stock.list\",\n async () => {\n const response = await api.items.invMast.stock.list(invMastUid, {\n edgeCache,\n });\n return response.data?.stockData;\n },\n invMastUid,\n );\n }\n\n async function getStockCompanySummary(\n invMastUid: number,\n ): Promise<Record<string, number>> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.stock.list.companySummary\",\n async () => {\n const response = await api.items.invMast.stock.list(invMastUid, {\n edgeCache,\n });\n return response.data?.companySummary;\n },\n invMastUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Item extras\n // ---------------------------------------------------------------------------\n\n async function getItemFaqs(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.faq.list\",\n async () => {\n const response = await api.items.invMast.faq.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemSubstitutes(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.invSub.list\",\n async () => {\n const response = await api.items.invMast.invSub.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemAccessories(\n invMastUid: number,\n ): Promise<TItemAccessory[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"items.invMast.invAccessory.list\",\n async () => {\n const response = await api.items.invMast.invAccessory.list(\n invMastUid,\n { edgeCache },\n );\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getSimilarItems(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"items.invMast.similar.list\",\n async () => {\n const response = await api.items.invMast.similar.list(invMastUid, {\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n // ---------------------------------------------------------------------------\n // Batch operations\n // ---------------------------------------------------------------------------\n\n async function batchGetInvMastDocs(\n params: { invMastUid?: number; itemId?: string }[],\n ): Promise<Record<string, TInvMastDoc>> {\n const results = await Promise.all(\n params.map((p) =>\n getInvMastDoc(p)\n .then((data) => [p.itemId ?? String(p.invMastUid), data] as const)\n .catch(() => [p.itemId ?? String(p.invMastUid), undefined] as const),\n ),\n );\n\n const out: Record<string, TInvMastDoc> = {};\n for (const [key, data] of results) {\n if (data) out[key] = data;\n }\n return out;\n }\n\n async function batchGetStockData(\n invMastUids: number[],\n ): Promise<Record<number, TStockData[]>> {\n const results = await Promise.all(\n invMastUids.map((uid) =>\n getStock(uid)\n .then((data) => [uid, data] as const)\n .catch(() => [uid, undefined] as const),\n ),\n );\n\n const out: Record<number, TStockData[]> = {};\n for (const [uid, data] of results) {\n if (data) out[uid] = data;\n }\n return out;\n }\n\n return {\n itemCategoryLookup,\n getItemCategory,\n getCategoryItems,\n getItemAttributes,\n getInvMast,\n getInvMastDoc,\n getStock,\n getStockCompanySummary,\n getItemFaqs,\n getItemSubstitutes,\n getItemAccessories,\n getSimilarItems,\n batchGetInvMastDocs,\n batchGetStockData,\n };\n}\n","import type { TCartLine, TCartLookUp } from \"@simpleapps-com/augur-utils\";\n\n/**\n * The subset of augur-api used by commerce actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface CommerceApiClient {\n commerce: {\n cartHdr: {\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: TCartLookUp }>;\n };\n alsoBought: {\n get: (\n cartHdrUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n cartLine: {\n get: (cartHdrUid: number) => Promise<{ data: TCartLine[] }>;\n add: {\n create: (\n cartHdrUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n update: {\n create: (\n cartHdrUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n delete: (cartHdrUid: number) => Promise<{ data: unknown }>;\n };\n checkout: {\n create: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface CommerceActionsConfig {\n defaultContactId?: string | number;\n defaultCustomerId?: string | number;\n /** Optional UOM conversion function. E.g. (uom) => uom === \"EA\" ? \"EACH\" : uom */\n convertUnitOfMeasure?: (uom: string) => string;\n}\n\nexport interface CommerceActions {\n cartHdrLookup: (params: {\n userId?: string | number;\n cartToken?: string;\n contactId?: string | number;\n customerId?: string | number;\n }) => Promise<TCartLookUp>;\n\n getCartLines: (cartHdrUid: number) => Promise<TCartLine[]>;\n\n addToCart: (\n cartHdrUid: number,\n items: {\n itemId?: string;\n invMastUid?: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ) => Promise<unknown>;\n\n updateCartLines: (\n cartHdrUid: number,\n lines: {\n lineNo: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ) => Promise<unknown>;\n\n deleteCartItems: (cartHdrUid: number) => Promise<void>;\n\n getCartAlsoBought: (cartHdrUid: number) => Promise<unknown[]>;\n\n checkoutOrder: (\n cartHdrUid: number,\n data: Record<string, unknown>,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side commerce actions for cart operations.\n *\n * Unlike pricing actions, commerce actions do NOT use caching because\n * cart operations are real-time and must always reflect current state.\n *\n * @example\n * ```ts\n * // lib/commerce-actions.ts\n * import { createCommerceActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const commerceActions = createCommerceActions(getAugurClient(), {\n * defaultContactId: process.env.NEXT_PUBLIC_DEFAULT_CONTACT_ID,\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * convertUnitOfMeasure: (uom) => uom === \"EA\" ? \"EACH\" : uom,\n * });\n *\n * // In a server action:\n * const cart = await commerceActions.cartHdrLookup({ userId: 123 });\n * const lines = await commerceActions.getCartLines(cart.cartHdrUid);\n * ```\n */\nexport function createCommerceActions(\n api: CommerceApiClient,\n config: CommerceActionsConfig = {},\n): CommerceActions {\n const { defaultContactId, defaultCustomerId, convertUnitOfMeasure } = config;\n\n async function cartHdrLookup(params: {\n userId?: string | number;\n cartToken?: string;\n contactId?: string | number;\n customerId?: string | number;\n }): Promise<TCartLookUp> {\n const lookupParams: Record<string, unknown> = { ...params };\n if (lookupParams.contactId == null && defaultContactId != null) {\n lookupParams.contactId = defaultContactId;\n }\n if (lookupParams.customerId == null && defaultCustomerId != null) {\n lookupParams.customerId = defaultCustomerId;\n }\n const response = await api.commerce.cartHdr.lookup.get(lookupParams);\n return response.data;\n }\n\n async function getCartLines(\n cartHdrUid: number,\n ): Promise<TCartLine[]> {\n const response = await api.commerce.cartLine.get(cartHdrUid);\n return response.data;\n }\n\n async function addToCart(\n cartHdrUid: number,\n items: {\n itemId?: string;\n invMastUid?: number;\n quantity: number;\n unitOfMeasure: string;\n }[],\n ): Promise<unknown> {\n try {\n const mappedItems = items.map((item) => ({\n ...item,\n unitOfMeasure: convertUnitOfMeasure\n ? convertUnitOfMeasure(item.unitOfMeasure)\n : item.unitOfMeasure,\n }));\n const response = await api.commerce.cartLine.add.create(\n cartHdrUid,\n { items: mappedItems },\n );\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function updateCartLines(\n cartHdrUid: number,\n lines: { lineNo: number; quantity: number; unitOfMeasure: string }[],\n ): Promise<unknown> {\n try {\n const mappedLines = lines.map((line) => ({\n ...line,\n unitOfMeasure: convertUnitOfMeasure\n ? convertUnitOfMeasure(line.unitOfMeasure)\n : line.unitOfMeasure,\n }));\n const response = await api.commerce.cartLine.update.create(\n cartHdrUid,\n { lines: mappedLines },\n );\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function deleteCartItems(cartHdrUid: number): Promise<void> {\n try {\n await api.commerce.cartLine.delete(cartHdrUid);\n } catch {\n // fire and forget — returns void either way\n }\n }\n\n async function getCartAlsoBought(\n cartHdrUid: number,\n ): Promise<unknown[]> {\n const response = await api.commerce.cartHdr.alsoBought.get(cartHdrUid);\n return response.data;\n }\n\n async function checkoutOrder(\n cartHdrUid: number,\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.commerce.checkout.create({\n ...data,\n cartHdrUid,\n });\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n cartHdrLookup,\n getCartLines,\n addToCart,\n updateCartLines,\n deleteCartItems,\n getCartAlsoBought,\n checkoutOrder,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by order actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface OrderApiClient {\n orders: {\n oeHdr: {\n doc: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface OrderActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for order doc lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface OrderActions {\n getOrderDoc: (\n orderNo: string,\n zipCode: string,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side order actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/order-actions.ts\n * import { createOrderActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const orderActions = createOrderActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const doc = await orderActions.getOrderDoc(\"12345\", \"90210\");\n * ```\n */\nexport function createOrderActions(\n api: OrderApiClient,\n config: OrderActionsConfig = {},\n): OrderActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getOrderDoc(\n orderNo: string,\n zipCode: string,\n ): Promise<unknown> {\n const params = { orderNo, zipCode, edgeCache };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"orders.oeHdr.doc.get\",\n async () => {\n const response = await api.orders.oeHdr.doc.get(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getOrderDoc };\n}\n","import type { TAttribute, TProductItem } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/** Shape of the openSearch service used by search actions. */\ninterface OpenSearchService {\n itemSearch: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{ data: { items: TProductItem[]; totalResults: number } }>;\n attributes: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{ data: { attributes: TAttribute[] } }>;\n };\n };\n suggestions: {\n suggest: {\n list: (\n params: Record<string, unknown>,\n ) => Promise<{\n data: { data: unknown[]; total: number; totalResults: number };\n }>;\n };\n };\n}\n\n/**\n * The subset of augur-api used by search actions.\n * Accepts both `openSearch` (camelCase) and `opensearch` (lowercase)\n * to match SDK v0.9.x which exposes `api.opensearch`.\n */\nexport type SearchApiClient =\n | { openSearch: OpenSearchService }\n | { opensearch: OpenSearchService };\n\nexport interface SearchActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for search lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Default source fields for item search. Default: \"display_desc\". */\n defaultSourceFields?: string;\n}\n\n/** Paginated response for infinite scroll. */\nexport interface SearchPage {\n data: TProductItem[];\n total: number;\n nextCursor?: number;\n}\n\nexport interface SearchActions {\n getSearchAttributes: (q: string) => Promise<TAttribute[]>;\n\n getSearchSuggestions: (\n q: string,\n limit?: number,\n offset?: number,\n ) => Promise<{ data: unknown[]; total: number; totalResults: number }>;\n\n itemSearch: (\n filters: {\n q: string;\n limit: number;\n offset: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n ) => Promise<{ items: TProductItem[]; totalResults: number }>;\n\n itemSearchInfinite: (\n filters: {\n q: string;\n limit: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n pageParam?: number,\n ) => Promise<SearchPage>;\n}\n\n/**\n * Creates server-side search actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/search-actions.ts\n * import { createSearchActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const searchActions = createSearchActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const attrs = await searchActions.getSearchAttributes(\"widget\");\n * const results = await searchActions.itemSearch({ q: \"widget\", limit: 20, offset: 0 });\n * ```\n */\n/** Resolve the openSearch service from either casing. */\nfunction getOpenSearch(api: SearchApiClient): OpenSearchService {\n return \"openSearch\" in api ? api.openSearch : api.opensearch;\n}\n\nexport function createSearchActions(\n api: SearchApiClient,\n config: SearchActionsConfig = {},\n): SearchActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n defaultSourceFields = \"display_desc\",\n } = config;\n\n const openSearch = getOpenSearch(api);\n\n async function getSearchAttributes(q: string): Promise<TAttribute[]> {\n const params = { q, edgeCache };\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.attributes.list\",\n async () => {\n const response =\n await openSearch.itemSearch.attributes.list(params);\n return response.data.attributes;\n },\n q,\n );\n }\n\n async function getSearchSuggestions(\n q: string,\n limit?: number,\n offset?: number,\n ): Promise<{ data: unknown[]; total: number; totalResults: number }> {\n const params: Record<string, unknown> = { q, edgeCache };\n if (limit !== undefined) params.size = limit;\n if (offset !== undefined) params.from = offset;\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.suggestions.suggest.list\",\n async () => {\n const response =\n await openSearch.suggestions.suggest.list(params);\n return response.data;\n },\n q,\n );\n }\n\n async function itemSearch(\n filters: {\n q: string;\n limit: number;\n offset: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n ): Promise<{ items: TProductItem[]; totalResults: number }> {\n const params: Record<string, unknown> = {\n q: filters.q,\n searchType: \"query\",\n size: filters.limit,\n from: filters.offset,\n sortBy: filters.sortBy,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: filters.filters?.length\n ? JSON.stringify(filters.filters)\n : undefined,\n sourceFieldsList: defaultSourceFields,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.list\",\n async () => {\n const response = await openSearch.itemSearch.list(params);\n return response.data;\n },\n filters,\n itemCategoryUid,\n );\n }\n\n async function itemSearchInfinite(\n filters: {\n q: string;\n limit: number;\n sortBy?: string;\n filters?: [string, string][];\n },\n itemCategoryUid?: number | string,\n pageParam = 0,\n ): Promise<SearchPage> {\n const params: Record<string, unknown> = {\n q: filters.q,\n searchType: \"query\",\n size: filters.limit,\n from: pageParam,\n sortBy: filters.sortBy,\n classId5List: itemCategoryUid\n ? String(itemCategoryUid)\n : undefined,\n filters: filters.filters?.length\n ? JSON.stringify(filters.filters)\n : undefined,\n sourceFieldsList: defaultSourceFields,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"openSearch.itemSearch.list\",\n async () => {\n const response = await openSearch.itemSearch.list(params);\n const { items, totalResults } = response.data;\n const nextOffset = pageParam + filters.limit;\n return {\n data: items,\n total: totalResults,\n nextCursor:\n nextOffset < totalResults ? nextOffset : undefined,\n };\n },\n filters,\n itemCategoryUid,\n pageParam,\n );\n }\n\n return {\n getSearchAttributes,\n getSearchSuggestions,\n itemSearch,\n itemSearchInfinite,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\nexport interface ShippingAddress {\n address1: string;\n city: string;\n state: string;\n postalCode: string;\n country?: string;\n}\n\n/**\n * The subset of augur-api used by shipping actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface ShippingApiClient {\n ups: {\n ratesShop: {\n get: (params: Record<string, unknown>) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface ShippingActionsConfig {\n /** Warehouse/origin address for rate calculations. */\n fromAddress: ShippingAddress;\n /** UPS service codes to filter results. Default: undefined (return all). */\n defaultServiceCodes?: string[];\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for shipping rate lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface ShippingActions {\n getShippingRates: (\n toAddress: ShippingAddress,\n weight: number,\n serviceCodes?: string[],\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side shipping actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/shipping-actions.ts\n * import { createShippingActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const shippingActions = createShippingActions(getAugurClient(), {\n * fromAddress: {\n * address1: \"123 Warehouse Ln\",\n * city: \"Chicago\",\n * state: \"IL\",\n * postalCode: \"60601\",\n * },\n * });\n *\n * // In a server component:\n * const rates = await shippingActions.getShippingRates(\n * { address1: \"456 Main St\", city: \"Denver\", state: \"CO\", postalCode: \"80202\" },\n * 5.0,\n * );\n * ```\n */\nexport function createShippingActions(\n api: ShippingApiClient,\n config: ShippingActionsConfig,\n): ShippingActions {\n const {\n fromAddress,\n defaultServiceCodes,\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getShippingRates(\n toAddress: ShippingAddress,\n weight: number,\n serviceCodes?: string[],\n ): Promise<unknown> {\n const params = {\n fromAddress,\n toAddress: { ...toAddress, country: toAddress.country ?? \"US\" },\n weight,\n serviceCodes: serviceCodes ?? defaultServiceCodes,\n edgeCache,\n };\n\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"ups.ratesShop.get\",\n async () => {\n const response = await api.ups.ratesShop.get(params);\n return response.data;\n },\n params,\n );\n }\n\n return { getShippingRates };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by Joomla content actions.\n * Avoids importing the full SDK type so augur-server stays lightweight.\n */\nexport interface JoomlaApiClient {\n joomla: {\n content: {\n doc: {\n get: (\n articleId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface JoomlaActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL for Joomla lookups in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface JoomlaActions {\n getJoomlaContent: (articleId: number) => Promise<unknown>;\n getJoomlaContentList: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side Joomla content actions with Redis caching and edge cache support.\n *\n * Uses `withServerCache` which produces cache keys compatible with augur-hooks'\n * `withCache`, so server-prefetched data is shared with client-side hooks.\n *\n * @example\n * ```ts\n * // lib/joomla-actions.ts\n * import { createJoomlaActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const joomlaActions = createJoomlaActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * // In a server component:\n * const article = await joomlaActions.getJoomlaContent(42);\n * const articles = await joomlaActions.getJoomlaContentList({ catid: 5 });\n * ```\n */\nexport function createJoomlaActions(\n api: JoomlaApiClient,\n config: JoomlaActionsConfig = {},\n): JoomlaActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getJoomlaContent(\n articleId: number,\n ): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"joomla.content.doc.get\",\n async () => {\n const response = await api.joomla.content.doc.get(articleId, {\n edgeCache,\n });\n return response.data;\n },\n articleId,\n );\n }\n\n async function getJoomlaContentList(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"joomla.content.list\",\n async () => {\n const response = await api.joomla.content.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return { getJoomlaContent, getJoomlaContentList };\n}\n","import type { TWebDesc } from \"@simpleapps-com/augur-utils\";\nimport { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by legacy actions.\n * Matches `api.legacy` from the SDK.\n */\nexport interface LegacyApiClient {\n legacy: {\n invMast: {\n webDesc: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: TWebDesc[] }>;\n };\n alsoBought: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n tags: {\n list: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n legacy: {\n state: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface LegacyActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like states. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface LegacyActions {\n getItemWebDesc: (invMastUid: number) => Promise<TWebDesc | undefined>;\n getAlsoBoughtItems: (invMastUid: number) => Promise<unknown[]>;\n getItemTags: (invMastUid: number) => Promise<unknown[]>;\n getStates: (params?: { twoLetterCode?: string }) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side legacy actions with Redis caching and edge cache support.\n *\n * Covers the legacy microservice endpoints used by ecommerce sites:\n * webDesc, alsoBought, tags, and states.\n *\n * @example\n * ```ts\n * import { createLegacyActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const legacyActions = createLegacyActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const webDesc = await legacyActions.getItemWebDesc(12345);\n * const states = await legacyActions.getStates();\n * ```\n */\nexport function createLegacyActions(\n api: LegacyApiClient,\n config: LegacyActionsConfig = {},\n): LegacyActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getItemWebDesc(\n invMastUid: number,\n ): Promise<TWebDesc | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.webDesc.list\",\n async () => {\n const response = await api.legacy.invMast.webDesc.list(invMastUid, {\n edgeCache,\n });\n return response.data[0];\n },\n invMastUid,\n );\n }\n\n async function getAlsoBoughtItems(\n invMastUid: number,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.alsoBought.list\",\n async () => {\n const response = await api.legacy.invMast.alsoBought.list(\n invMastUid,\n { edgeCache },\n );\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getItemTags(invMastUid: number): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"legacy.invMast.tags.list\",\n async () => {\n const response = await api.legacy.invMast.tags.list(invMastUid, {\n edgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function getStates(\n params?: { twoLetterCode?: string },\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"legacy.legacy.state.list\",\n async () => {\n const response = await api.legacy.legacy.state.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params?.twoLetterCode,\n );\n }\n\n return {\n getItemWebDesc,\n getAlsoBoughtItems,\n getItemTags,\n getStates,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by customer actions.\n * Matches `api.customers` from the SDK.\n */\nexport interface CustomersApiClient {\n customers: {\n customer: {\n get: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n doc: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n orders: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n shipTo: {\n list: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n contacts: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface CustomersActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface CustomersActions {\n getCustomer: (customerId: number) => Promise<unknown>;\n customerLookup: (params: Record<string, unknown>) => Promise<unknown[]>;\n getCustomerDoc: (customerId: number) => Promise<unknown>;\n getCustomerOrders: (\n customerId: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getContacts: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getShipToAddresses: (customerId: number) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side customer actions with Redis caching and edge cache support.\n *\n * Covers the customers microservice endpoints used by ecommerce sites:\n * customer get, lookup, doc, orders, contacts, and ship-to addresses.\n *\n * @example\n * ```ts\n * import { createCustomersActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const customersActions = createCustomersActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const customer = await customersActions.getCustomer(123);\n * const orders = await customersActions.getCustomerOrders(123);\n * ```\n */\nexport function createCustomersActions(\n api: CustomersApiClient,\n config: CustomersActionsConfig = {},\n): CustomersActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getCustomer(customerId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.get\",\n async () => {\n const response = await api.customers.customer.get(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n async function customerLookup(\n params: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.lookup.get\",\n async () => {\n const response = await api.customers.customer.lookup.get({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCustomerDoc(customerId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.doc.list\",\n async () => {\n const response = await api.customers.customer.doc.list(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n async function getCustomerOrders(\n customerId: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.orders.list\",\n async () => {\n const response = await api.customers.customer.orders.list(customerId, {\n ...params,\n edgeCache,\n });\n return response.data;\n },\n customerId,\n params,\n );\n }\n\n async function getContacts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.contacts.list\",\n async () => {\n const response = await api.customers.contacts.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getShipToAddresses(\n customerId: number,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"customers.customer.shipTo.list\",\n async () => {\n const response = await api.customers.customer.shipTo.list(customerId, {\n edgeCache,\n });\n return response.data;\n },\n customerId,\n );\n }\n\n return {\n getCustomer,\n customerLookup,\n getCustomerDoc,\n getCustomerOrders,\n getContacts,\n getShipToAddresses,\n };\n}\n","/**\n * The subset of augur-api used by SmartyStreets actions.\n * Matches `api.smartyStreets` from the SDK.\n */\nexport interface SmartyStreetsApiClient {\n smartyStreets: {\n us: {\n lookup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface SmartyStreetsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface SmartyStreetsActions {\n validateAddress: (\n params: Record<string, unknown>,\n ) => Promise<unknown>;\n}\n\n/**\n * Creates server-side SmartyStreets actions for address validation.\n *\n * Note: Address validation is a real-time operation and does NOT use caching.\n * Each call hits the SmartyStreets API directly to ensure up-to-date results.\n *\n * @example\n * ```ts\n * import { createSmartyStreetsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const smartyStreetsActions = createSmartyStreetsActions(getAugurClient());\n *\n * const result = await smartyStreetsActions.validateAddress({\n * address1: \"123 Main St\",\n * city: \"Provo\",\n * state: \"UT\",\n * postalCode: \"84606\",\n * });\n * ```\n */\nexport function createSmartyStreetsActions(\n api: SmartyStreetsApiClient,\n config: SmartyStreetsActionsConfig = {},\n): SmartyStreetsActions {\n // cachePrefix is accepted for interface consistency but unused (no caching)\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function validateAddress(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n const response = await api.smartyStreets.us.lookup.get(params);\n return response.data;\n }\n\n return {\n validateAddress,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by P21 PIM actions.\n * Matches `api.p21Pim` from the SDK.\n */\nexport interface P21PimApiClient {\n p21Pim: {\n invMastExt: {\n get: (\n invMastUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21PimActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21PimActions {\n getInvMastExt: (invMastUid: number) => Promise<unknown>;\n listInvMastExt: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 PIM actions with Redis caching and edge cache support.\n *\n * Covers the P21 PIM microservice endpoints for extended inventory data\n * including UPC/EAN codes, brand information, and SEO metadata.\n *\n * @example\n * ```ts\n * import { createP21PimActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21PimActions = createP21PimActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const ext = await p21PimActions.getInvMastExt(12345);\n * const list = await p21PimActions.listInvMastExt({ limit: 20 });\n * ```\n */\nexport function createP21PimActions(\n api: P21PimApiClient,\n config: P21PimActionsConfig = {},\n): P21PimActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getInvMastExt(invMastUid: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Pim.invMastExt.get\",\n async () => {\n const response = await api.p21Pim.invMastExt.get(invMastUid, {\n edgeCache,\n });\n return response.data;\n },\n invMastUid,\n );\n }\n\n async function listInvMastExt(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Pim.invMastExt.list\",\n async () => {\n const response = await api.p21Pim.invMastExt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getInvMastExt,\n listInvMastExt,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by AGR Site actions.\n * Matches `api.agrSite` from the SDK.\n */\nexport interface AgrSiteApiClient {\n agrSite: {\n settings: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n metaFiles: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface AgrSiteActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface AgrSiteActions {\n getSettings: (serviceName?: string) => Promise<unknown[]>;\n getMetaFiles: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side AGR Site actions with Redis caching and edge cache support.\n *\n * Covers the AGR Site microservice endpoints for site configuration settings\n * and meta file management (robots.txt, etc.). Both endpoints use long TTLs\n * since site settings and meta files rarely change.\n *\n * @example\n * ```ts\n * import { createAgrSiteActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrSiteActions = createAgrSiteActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const settings = await agrSiteActions.getSettings(\"my-service\");\n * const metaFiles = await agrSiteActions.getMetaFiles();\n * ```\n */\nexport function createAgrSiteActions(\n api: AgrSiteApiClient,\n config: AgrSiteActionsConfig = {},\n): AgrSiteActions {\n const {\n cachePrefix = \"\",\n longEdgeCache = 8,\n longRedisTtl = 28800,\n } = config;\n\n async function getSettings(serviceName?: string): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrSite.settings.list\",\n async () => {\n const response = await api.agrSite.settings.list({\n ...(serviceName ? { serviceName } : {}),\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n serviceName,\n );\n }\n\n async function getMetaFiles(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrSite.metaFiles.list\",\n async () => {\n const response = await api.agrSite.metaFiles.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getSettings,\n getMetaFiles,\n };\n}\n","/**\n * The subset of augur-api used by Avalara actions.\n * Matches `api.avalara` from the SDK.\n */\nexport interface AvalaraApiClient {\n avalara: {\n rates: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface AvalaraActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface AvalaraActions {\n calculateTax: (data: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side Avalara actions for real-time tax calculation.\n *\n * Note: Tax calculation is a real-time operation and does NOT use caching.\n * Each call hits the Avalara API directly to ensure up-to-date tax rates.\n *\n * @example\n * ```ts\n * import { createAvalaraActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const avalaraActions = createAvalaraActions(getAugurClient());\n *\n * const taxResult = await avalaraActions.calculateTax({\n * lines: [{ amount: 100.00, description: \"Widget\" }],\n * addresses: {\n * shipTo: {\n * line1: \"123 Main St\",\n * city: \"Irvine\",\n * region: \"CA\",\n * country: \"US\",\n * postalCode: \"92602\",\n * },\n * },\n * type: \"SalesOrder\",\n * });\n * ```\n */\nexport function createAvalaraActions(\n api: AvalaraApiClient,\n config: AvalaraActionsConfig = {},\n): AvalaraActions {\n // cachePrefix is accepted for interface consistency but unused (no caching)\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function calculateTax(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n const response = await api.avalara.rates.create(data);\n return response.data;\n }\n\n return {\n calculateTax,\n };\n}\n","/**\n * The subset of augur-api used by payment actions.\n * Matches `api.payments` from the SDK.\n */\nexport interface PaymentsApiClient {\n payments: {\n unified: {\n transactionSetup: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n accountQuery: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n surcharge: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n cardInfo: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n billingUpdate: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n validate: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface PaymentsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface PaymentsActions {\n transactionSetup: (params: Record<string, unknown>) => Promise<unknown>;\n accountQuery: (params: Record<string, unknown>) => Promise<unknown>;\n getSurcharge: (params: Record<string, unknown>) => Promise<unknown>;\n cardInfo: (params: Record<string, unknown>) => Promise<unknown>;\n billingUpdate: (params: Record<string, unknown>) => Promise<unknown>;\n validatePayment: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side payment actions.\n *\n * Payment actions do NOT use caching because every call deals with\n * real-time payment processing that must always reflect current state.\n *\n * @example\n * ```ts\n * import { createPaymentsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const paymentsActions = createPaymentsActions(getAugurClient());\n *\n * const setup = await paymentsActions.transactionSetup({ customerId: \"123\" });\n * const account = await paymentsActions.accountQuery({ transactionSetupId: \"abc\" });\n * const surcharge = await paymentsActions.getSurcharge({ amount: 100 });\n * ```\n */\nexport function createPaymentsActions(\n api: PaymentsApiClient,\n config: PaymentsActionsConfig = {},\n): PaymentsActions {\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function transactionSetup(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.transactionSetup.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function accountQuery(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.accountQuery.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getSurcharge(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.surcharge.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function cardInfo(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.cardInfo.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function billingUpdate(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.billingUpdate.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function validatePayment(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.payments.unified.validate.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n transactionSetup,\n accountQuery,\n getSurcharge,\n cardInfo,\n billingUpdate,\n validatePayment,\n };\n}\n","/**\n * The subset of augur-api used by UPS actions.\n * Matches `api.ups` from the SDK.\n */\nexport interface UpsApiClient {\n ups: {\n ratesShop: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n}\n\nexport interface UpsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface UpsActions {\n getRates: (params: Record<string, unknown>) => Promise<unknown>;\n}\n\n/**\n * Creates server-side UPS shipping actions.\n *\n * UPS rate actions do NOT use caching because rate quotes are real-time\n * and must always reflect current carrier pricing.\n *\n * @example\n * ```ts\n * import { createUpsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const upsActions = createUpsActions(getAugurClient());\n *\n * const rates = await upsActions.getRates({\n * fromPostalCode: \"90210\",\n * toPostalCode: \"10001\",\n * weight: 5,\n * });\n * ```\n */\nexport function createUpsActions(\n api: UpsApiClient,\n config: UpsActionsConfig = {},\n): UpsActions {\n const { cachePrefix: _cachePrefix = \"\" } = config;\n\n async function getRates(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.ups.ratesShop.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getRates,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by logistics actions.\n * Matches `api.logistics` from the SDK.\n */\nexport interface LogisticsApiClient {\n logistics: {\n speedship: {\n freight: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n shipvia: {\n rates: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n };\n}\n\nexport interface LogisticsActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like ship-via options. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface LogisticsActions {\n getFreightRates: (params: Record<string, unknown>) => Promise<unknown>;\n getShipVia: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side logistics actions with selective Redis caching.\n *\n * Freight rate lookups are real-time and NOT cached.\n * Ship-via carrier options rarely change and ARE cached with long TTL.\n *\n * @example\n * ```ts\n * import { createLogisticsActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const logisticsActions = createLogisticsActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const rates = await logisticsActions.getFreightRates({ fromPostalCode: \"90210\" });\n * const carriers = await logisticsActions.getShipVia();\n * ```\n */\nexport function createLogisticsActions(\n api: LogisticsApiClient,\n config: LogisticsActionsConfig = {},\n): LogisticsActions {\n const {\n cachePrefix = \"\",\n longEdgeCache = 8,\n longRedisTtl = 28800,\n } = config;\n\n async function getFreightRates(\n params: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.logistics.speedship.freight.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getShipVia(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"logistics.shipvia.rates.list\",\n async () => {\n const response = await api.logistics.shipvia.rates.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n getFreightRates,\n getShipVia,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by nexus actions.\n * Matches `api.nexus` from the SDK.\n */\nexport interface NexusApiClient {\n nexus: {\n binTransfer: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n receiving: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n transfer: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n purchaseOrderReceipt: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transferReceipt: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transferShipping: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface NexusActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface NexusActions {\n createBinTransfer: (data: Record<string, unknown>) => Promise<unknown>;\n createReceiving: (data: Record<string, unknown>) => Promise<unknown>;\n createTransfer: (data: Record<string, unknown>) => Promise<unknown>;\n getPurchaseOrderReceipts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getTransferReceipts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getTransferShipping: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side nexus (warehouse management) actions with selective caching.\n *\n * Write operations (bin transfer, receiving, transfer) do NOT use caching.\n * Read/list operations (receipts, shipping) ARE cached with standard TTL.\n *\n * @example\n * ```ts\n * import { createNexusActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const nexusActions = createNexusActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const transfer = await nexusActions.createBinTransfer({ locationId: 5, transfers: [] });\n * const receipts = await nexusActions.getPurchaseOrderReceipts();\n * ```\n */\nexport function createNexusActions(\n api: NexusApiClient,\n config: NexusActionsConfig = {},\n): NexusActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function createBinTransfer(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.binTransfer.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function createReceiving(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.receiving.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function createTransfer(\n data: Record<string, unknown>,\n ): Promise<unknown> {\n try {\n const response = await api.nexus.transfer.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getPurchaseOrderReceipts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.purchaseOrderReceipt.list\",\n async () => {\n const response = await api.nexus.purchaseOrderReceipt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getTransferReceipts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.transferReceipt.list\",\n async () => {\n const response = await api.nexus.transferReceipt.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getTransferShipping(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"nexus.transferShipping.list\",\n async () => {\n const response = await api.nexus.transferShipping.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n createBinTransfer,\n createReceiving,\n createTransfer,\n getPurchaseOrderReceipts,\n getTransferReceipts,\n getTransferShipping,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by VMI actions.\n * Matches `api.vmi` from the SDK.\n */\nexport interface VmiApiClient {\n vmi: {\n warehouse: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n availability: {\n get: (\n warehouseUid: number,\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n distributors: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n products: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n invProfileHdr: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n restockHdr: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n sections: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface VmiActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for short-lived data like availability. Default: 300 (5 min). */\n shortRedisTtl?: number;\n}\n\nexport interface VmiActions {\n getWarehouses: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getWarehouseAvailability: (\n warehouseUid: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getDistributors: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getProducts: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getInventoryProfiles: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getRestockHeaders: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getSections: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side VMI (Vendor Managed Inventory) actions with Redis caching.\n *\n * All VMI read operations are cached. Warehouse availability uses a shorter TTL\n * because inventory levels change more frequently than configuration data.\n *\n * @example\n * ```ts\n * import { createVmiActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const vmiActions = createVmiActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const warehouses = await vmiActions.getWarehouses({ customerId: 12345 });\n * const availability = await vmiActions.getWarehouseAvailability(123);\n * const distributors = await vmiActions.getDistributors({ customerId: 12345 });\n * ```\n */\nexport function createVmiActions(\n api: VmiApiClient,\n config: VmiActionsConfig = {},\n): VmiActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n shortRedisTtl = 300,\n } = config;\n\n async function getWarehouses(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.warehouse.list\",\n async () => {\n const response = await api.vmi.warehouse.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getWarehouseAvailability(\n warehouseUid: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n shortRedisTtl,\n \"vmi.warehouse.availability.get\",\n async () => {\n const response = await api.vmi.warehouse.availability.get(\n warehouseUid,\n { ...params, edgeCache },\n );\n return response.data;\n },\n warehouseUid,\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getDistributors(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.distributors.list\",\n async () => {\n const response = await api.vmi.distributors.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getProducts(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.products.list\",\n async () => {\n const response = await api.vmi.products.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getInventoryProfiles(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.invProfileHdr.list\",\n async () => {\n const response = await api.vmi.invProfileHdr.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getRestockHeaders(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.restockHdr.list\",\n async () => {\n const response = await api.vmi.restockHdr.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n async function getSections(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"vmi.sections.list\",\n async () => {\n const response = await api.vmi.sections.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params ? JSON.stringify(params) : undefined,\n );\n }\n\n return {\n getWarehouses,\n getWarehouseAvailability,\n getDistributors,\n getProducts,\n getInventoryProfiles,\n getRestockHeaders,\n getSections,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-core actions.\n * Matches `api.p21Core` from the SDK.\n */\nexport interface P21CoreApiClient {\n p21Core: {\n address: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n company: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n location: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n paymentTypes: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n cashDrawer: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n codeP21: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21CoreActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface P21CoreActions {\n getAddresses: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCompanies: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCompany: (companyId: number) => Promise<unknown | undefined>;\n getLocations: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getPaymentTypes: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCashDrawers: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCodeP21: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 Core actions with Redis caching and edge cache support.\n *\n * Covers the P21 Core microservice endpoints: addresses, companies,\n * locations, payment types, cash drawers, and P21 codes.\n *\n * @example\n * ```ts\n * import { createP21CoreActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21CoreActions = createP21CoreActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const companies = await p21CoreActions.getCompanies();\n * const company = await p21CoreActions.getCompany(123);\n * ```\n */\nexport function createP21CoreActions(\n api: P21CoreApiClient,\n config: P21CoreActionsConfig = {},\n): P21CoreActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getAddresses(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Core.address.list\",\n async () => {\n const response = await api.p21Core.address.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCompanies(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.company.list\",\n async () => {\n const response = await api.p21Core.company.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCompany(\n companyId: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.company.get\",\n async () => {\n const response = await api.p21Core.company.get({\n companyUid: companyId,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n companyId,\n );\n }\n\n async function getLocations(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.location.list\",\n async () => {\n const response = await api.p21Core.location.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getPaymentTypes(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.paymentTypes.list\",\n async () => {\n const response = await api.p21Core.paymentTypes.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCashDrawers(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Core.cashDrawer.list\",\n async () => {\n const response = await api.p21Core.cashDrawer.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCodeP21(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"p21Core.codeP21.list\",\n async () => {\n const response = await api.p21Core.codeP21.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getAddresses,\n getCompanies,\n getCompany,\n getLocations,\n getPaymentTypes,\n getCashDrawers,\n getCodeP21,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-apis actions.\n * Matches `api.p21Apis` from the SDK.\n */\nexport interface P21ApisApiClient {\n p21Apis: {\n transCategory: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n defaults: {\n get: (\n categoryUid: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n transCompany: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transUser: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n transWebDisplayType: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n defaults: {\n get: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n entityContacts: {\n refresh: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n entityCustomers: {\n refresh: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface P21ApisActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21ApisActions {\n getCategories: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCategoryDefaults: (categoryId: number) => Promise<unknown | undefined>;\n getCompanies: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getUsers: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getWebDisplayTypes: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getWebDisplayTypeDefaults: (\n id?: number,\n ) => Promise<unknown | undefined>;\n refreshContacts: (\n params?: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n refreshCustomers: (\n params?: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side P21 APIs actions with Redis caching and edge cache support.\n *\n * Covers the P21 APIs microservice endpoints: transaction categories,\n * companies, users, web display types, and entity refresh operations.\n *\n * @example\n * ```ts\n * import { createP21ApisActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21ApisActions = createP21ApisActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const categories = await p21ApisActions.getCategories();\n * await p21ApisActions.refreshContacts();\n * ```\n */\nexport function createP21ApisActions(\n api: P21ApisApiClient,\n config: P21ApisActionsConfig = {},\n): P21ApisActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getCategories(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCategory.list\",\n async () => {\n const response = await api.p21Apis.transCategory.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCategoryDefaults(\n categoryId: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCategory.defaults.get\",\n async () => {\n const response = await api.p21Apis.transCategory.defaults.get(\n categoryId,\n { edgeCache },\n );\n return response.data;\n },\n categoryId,\n );\n }\n\n async function getCompanies(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transCompany.list\",\n async () => {\n const response = await api.p21Apis.transCompany.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getUsers(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transUser.list\",\n async () => {\n const response = await api.p21Apis.transUser.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getWebDisplayTypes(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transWebDisplayType.list\",\n async () => {\n const response = await api.p21Apis.transWebDisplayType.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getWebDisplayTypeDefaults(\n id?: number,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Apis.transWebDisplayType.defaults.get\",\n async () => {\n const response = await api.p21Apis.transWebDisplayType.defaults.get({\n id,\n edgeCache,\n });\n return response.data;\n },\n id,\n );\n }\n\n async function refreshContacts(\n params?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response =\n await api.p21Apis.entityContacts.refresh.create(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function refreshCustomers(\n params?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response =\n await api.p21Apis.entityCustomers.refresh.create(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getCategories,\n getCategoryDefaults,\n getCompanies,\n getUsers,\n getWebDisplayTypes,\n getWebDisplayTypeDefaults,\n refreshContacts,\n refreshCustomers,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by p21-sism actions.\n * Matches `api.p21Sism` from the SDK.\n */\nexport interface P21SismApiClient {\n p21Sism: {\n import: {\n recent: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n get: (importUid: string) => Promise<{ data: unknown }>;\n };\n impOeLine: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n scheduledImportMaster: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface P21SismActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface P21SismActions {\n getRecentImports: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getImport: (importId: string) => Promise<unknown | undefined>;\n getImportLines: (\n importId: number,\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n getScheduledImports: (\n params?: Record<string, unknown>,\n ) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side P21 SISM actions with Redis caching and edge cache support.\n *\n * Covers the P21 SISM (System Integration & Storage Management) endpoints:\n * imports, import lines, and scheduled import masters.\n *\n * @example\n * ```ts\n * import { createP21SismActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const p21SismActions = createP21SismActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const recentImports = await p21SismActions.getRecentImports({ hours: 24 });\n * const importDetail = await p21SismActions.getImport(\"12345\");\n * ```\n */\nexport function createP21SismActions(\n api: P21SismApiClient,\n config: P21SismActionsConfig = {},\n): P21SismActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n redisTtl = 3600,\n } = config;\n\n async function getRecentImports(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.import.recent.list\",\n async () => {\n const response = await api.p21Sism.import.recent.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getImport(\n importId: string,\n ): Promise<unknown | undefined> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.import.get\",\n async () => {\n const response = await api.p21Sism.import.get(importId);\n return response.data;\n },\n importId,\n );\n }\n\n async function getImportLines(\n importId: number,\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.impOeLine.list\",\n async () => {\n const response = await api.p21Sism.impOeLine.list({\n ...params,\n importUid: importId,\n edgeCache,\n });\n return response.data;\n },\n importId,\n params,\n );\n }\n\n async function getScheduledImports(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"p21Sism.scheduledImportMaster.list\",\n async () => {\n const response = await api.p21Sism.scheduledImportMaster.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getRecentImports,\n getImport,\n getImportLines,\n getScheduledImports,\n };\n}\n","/**\n * The subset of augur-api used by agr-work actions.\n * Matches `api.agrWork` from the SDK.\n */\nexport interface AgrWorkApiClient {\n agrWork: {\n healthCheck: {\n get: () => Promise<{ data: string }>;\n };\n ping: {\n get: () => Promise<{ data: string }>;\n };\n };\n}\n\nexport interface AgrWorkActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n}\n\nexport interface AgrWorkActions {\n healthCheck: () => Promise<string | undefined>;\n ping: () => Promise<string | undefined>;\n}\n\n/**\n * Creates server-side AGR Work actions for health monitoring and connectivity.\n *\n * Covers the AGR Work microservice endpoints: healthCheck and ping.\n * These are real-time operations and do not use caching.\n *\n * @example\n * ```ts\n * import { createAgrWorkActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrWorkActions = createAgrWorkActions(getAugurClient());\n *\n * const health = await agrWorkActions.healthCheck();\n * const pong = await agrWorkActions.ping();\n * ```\n */\nexport function createAgrWorkActions(\n api: AgrWorkApiClient,\n _config: AgrWorkActionsConfig = {},\n): AgrWorkActions {\n async function healthCheck(): Promise<string | undefined> {\n try {\n const response = await api.agrWork.healthCheck.get();\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function ping(): Promise<string | undefined> {\n try {\n const response = await api.agrWork.ping.get();\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n healthCheck,\n ping,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by agr-info actions.\n * Matches `api.agrInfo` from the SDK.\n */\nexport interface AgrInfoApiClient {\n agrInfo: {\n context: {\n get: (\n siteId: string,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n rubrics: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n microservices: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n akasha: {\n generate: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n joomla: {\n generate: {\n create: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface AgrInfoActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface AgrInfoActions {\n getContext: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getRubrics: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getMicroservices: (params?: Record<string, unknown>) => Promise<unknown[]>;\n generateAkasha: (data?: Record<string, unknown>) => Promise<unknown | undefined>;\n generateJoomla: (data?: Record<string, unknown>) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side AGR Info actions with Redis caching and edge cache support.\n *\n * Covers the AGR Info microservice endpoints: context, rubrics,\n * microservices, and AI generation (akasha/joomla).\n *\n * @example\n * ```ts\n * import { createAgrInfoActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const agrInfoActions = createAgrInfoActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const rubrics = await agrInfoActions.getRubrics();\n * const result = await agrInfoActions.generateAkasha({ prompt: \"Hello\" });\n * ```\n */\nexport function createAgrInfoActions(\n api: AgrInfoApiClient,\n config: AgrInfoActionsConfig = {},\n): AgrInfoActions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getContext(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"agrInfo.context.list\",\n async () => {\n const siteId = (params?.siteId as string) ?? \"\";\n const response = await api.agrInfo.context.get(siteId, {\n ...params,\n edgeCache,\n });\n return Array.isArray(response.data) ? response.data : [response.data];\n },\n params,\n );\n }\n\n async function getRubrics(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"agrInfo.rubrics.list\",\n async () => {\n const response = await api.agrInfo.rubrics.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getMicroservices(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"agrInfo.microservices.list\",\n async () => {\n const response = await api.agrInfo.microservices.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function generateAkasha(\n data?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.agrInfo.akasha.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function generateJoomla(\n data?: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.agrInfo.joomla.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getContext,\n getRubrics,\n getMicroservices,\n generateAkasha,\n generateJoomla,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by basecamp2 actions.\n * Matches `api.basecamp2` from the SDK.\n */\nexport interface Basecamp2ApiClient {\n basecamp2: {\n todos: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n todoId: number,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n todosSummary: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n comments: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n people: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n projects: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n events: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n metrics: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n todolists: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface Basecamp2ActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** CDN edge cache for rarely-changing data like people. Default: 8 (hours). */\n longEdgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n /** Redis TTL for rarely-changing data in seconds. Default: 28800 (8 hours). */\n longRedisTtl?: number;\n}\n\nexport interface Basecamp2Actions {\n getTodos: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getTodo: (todoId: number) => Promise<unknown>;\n getTodosSummary: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getComments: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getPeople: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getProjects: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getEvents: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getMetrics: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getTodolists: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side basecamp2 actions with Redis caching and edge cache support.\n *\n * Covers the Basecamp2 project management endpoints: todos, todo summaries,\n * comments, people, projects, events, metrics, and todolists.\n *\n * @example\n * ```ts\n * import { createBasecamp2Actions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const basecamp2Actions = createBasecamp2Actions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const todos = await basecamp2Actions.getTodos();\n * const people = await basecamp2Actions.getPeople();\n * ```\n */\nexport function createBasecamp2Actions(\n api: Basecamp2ApiClient,\n config: Basecamp2ActionsConfig = {},\n): Basecamp2Actions {\n const {\n cachePrefix = \"\",\n edgeCache = 1,\n longEdgeCache = 8,\n redisTtl = 3600,\n longRedisTtl = 28800,\n } = config;\n\n async function getTodos(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todos.list\",\n async () => {\n const response = await api.basecamp2.todos.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getTodo(todoId: number): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todos.get\",\n async () => {\n const response = await api.basecamp2.todos.get(todoId, { edgeCache });\n return response.data;\n },\n todoId,\n );\n }\n\n async function getTodosSummary(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todosSummary.list\",\n async () => {\n const response = await api.basecamp2.todosSummary.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getComments(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.comments.list\",\n async () => {\n const response = await api.basecamp2.comments.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getPeople(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n longRedisTtl,\n \"basecamp2.people.list\",\n async () => {\n const response = await api.basecamp2.people.list({\n ...params,\n edgeCache: longEdgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getProjects(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.projects.list\",\n async () => {\n const response = await api.basecamp2.projects.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getEvents(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.events.list\",\n async () => {\n const response = await api.basecamp2.events.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getMetrics(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.metrics.list\",\n async () => {\n const response = await api.basecamp2.metrics.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getTodolists(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"basecamp2.todolists.list\",\n async () => {\n const response = await api.basecamp2.todolists.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n getTodos,\n getTodo,\n getTodosSummary,\n getComments,\n getPeople,\n getProjects,\n getEvents,\n getMetrics,\n getTodolists,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by brand-folder actions.\n * Matches `api.brandFolder` from the SDK.\n */\nexport interface BrandFolderApiClient {\n brandFolder: {\n categories: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n get: (\n categoryId: string,\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n focus: {\n create: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface BrandFolderActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface BrandFolderActions {\n getCategories: (params?: Record<string, unknown>) => Promise<unknown[]>;\n getCategory: (categoryId: string) => Promise<unknown>;\n createFocus: (\n categoryId: string,\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side brand-folder actions with Redis caching and edge cache support.\n *\n * Covers the Brand Folder service endpoints: category listing, category detail,\n * and category focus creation.\n *\n * @example\n * ```ts\n * import { createBrandFolderActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const brandFolderActions = createBrandFolderActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const categories = await brandFolderActions.getCategories();\n * const category = await brandFolderActions.getCategory(\"cat-123\");\n * const focus = await brandFolderActions.createFocus(\"cat-123\", { focusLevel: \"primary\" });\n * ```\n */\nexport function createBrandFolderActions(\n api: BrandFolderApiClient,\n config: BrandFolderActionsConfig = {},\n): BrandFolderActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function getCategories(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"brandFolder.categories.list\",\n async () => {\n const response = await api.brandFolder.categories.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function getCategory(categoryId: string): Promise<unknown> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"brandFolder.categories.get\",\n async () => {\n const response = await api.brandFolder.categories.get(categoryId, {\n edgeCache,\n });\n return response.data;\n },\n categoryId,\n );\n }\n\n async function createFocus(\n categoryId: string,\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.brandFolder.categories.focus.create({\n ...data,\n categoryId,\n });\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n getCategories,\n getCategory,\n createFocus,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by gregorovich actions.\n * Matches `api.gregorovich` from the SDK.\n */\nexport interface GregorovichApiClient {\n gregorovich: {\n chatGpt: {\n ask: {\n get: (\n params: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n documents: {\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n ollama: {\n generate: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n };\n };\n };\n}\n\nexport interface GregorovichActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface GregorovichActions {\n askChatGpt: (params: Record<string, unknown>) => Promise<unknown | undefined>;\n getDocuments: (params?: Record<string, unknown>) => Promise<unknown[]>;\n createDocument: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n generateOllama: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n}\n\n/**\n * Creates server-side gregorovich actions with Redis caching and edge cache support.\n *\n * Covers the Gregorovich AI service endpoints: ChatGPT ask, document listing,\n * document creation, and Ollama generation.\n *\n * @example\n * ```ts\n * import { createGregorovichActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const gregorovichActions = createGregorovichActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const answer = await gregorovichActions.askChatGpt({ question: \"What is AI?\" });\n * const docs = await gregorovichActions.getDocuments();\n * ```\n */\nexport function createGregorovichActions(\n api: GregorovichApiClient,\n config: GregorovichActionsConfig = {},\n): GregorovichActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function askChatGpt(\n params: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.chatGpt.ask.get(params);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getDocuments(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"gregorovich.documents.list\",\n async () => {\n const response = await api.gregorovich.documents.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n async function createDocument(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.documents.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function generateOllama(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.gregorovich.ollama.generate.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n return {\n askChatGpt,\n getDocuments,\n createDocument,\n generateOllama,\n };\n}\n","import { withServerCache } from \"../cache/with-cache\";\n\n/**\n * The subset of augur-api used by slack actions.\n * Matches `api.slack` from the SDK.\n */\nexport interface SlackApiClient {\n slack: {\n webHook: {\n create: (\n data: Record<string, unknown>,\n ) => Promise<{ data: unknown }>;\n list: (\n params?: Record<string, unknown>,\n ) => Promise<{ data: unknown[] }>;\n };\n };\n}\n\nexport interface SlackActionsConfig {\n /** Cache key prefix (e.g. \"ampro:\"). Default: \"\". */\n cachePrefix?: string;\n /** CDN edge cache value passed to SDK. Default: 1 (hour). */\n edgeCache?: number;\n /** Redis TTL in seconds. Default: 3600 (1 hour). */\n redisTtl?: number;\n}\n\nexport interface SlackActions {\n sendWebhook: (\n data: Record<string, unknown>,\n ) => Promise<unknown | undefined>;\n getWebhooks: (params?: Record<string, unknown>) => Promise<unknown[]>;\n}\n\n/**\n * Creates server-side slack actions with Redis caching and edge cache support.\n *\n * Covers the Slack integration endpoints: webhook sending and webhook listing.\n *\n * @example\n * ```ts\n * import { createSlackActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const slackActions = createSlackActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * });\n *\n * const result = await slackActions.sendWebhook({ text: \"Hello!\" });\n * const webhooks = await slackActions.getWebhooks();\n * ```\n */\nexport function createSlackActions(\n api: SlackApiClient,\n config: SlackActionsConfig = {},\n): SlackActions {\n const { cachePrefix = \"\", edgeCache = 1, redisTtl = 3600 } = config;\n\n async function sendWebhook(\n data: Record<string, unknown>,\n ): Promise<unknown | undefined> {\n try {\n const response = await api.slack.webHook.create(data);\n return response.data;\n } catch {\n return undefined;\n }\n }\n\n async function getWebhooks(\n params?: Record<string, unknown>,\n ): Promise<unknown[]> {\n return withServerCache(\n cachePrefix,\n redisTtl,\n \"slack.webHook.list\",\n async () => {\n const response = await api.slack.webHook.list({\n ...params,\n edgeCache,\n });\n return response.data;\n },\n params,\n );\n }\n\n return {\n sendWebhook,\n getWebhooks,\n };\n}\n","import { createPricingActions } from \"./pricing\";\nimport type { PricingApiClient, PricingActions } from \"./pricing\";\nimport { createItemActions } from \"./items\";\nimport type { ItemsApiClient, ItemActions } from \"./items\";\nimport { createCommerceActions } from \"./commerce\";\nimport type { CommerceApiClient, CommerceActions } from \"./commerce\";\nimport { createSearchActions } from \"./search\";\nimport type { SearchApiClient, SearchActions } from \"./search\";\nimport { createOrderActions } from \"./orders\";\nimport type { OrderApiClient, OrderActions } from \"./orders\";\nimport { createShippingActions } from \"./shipping\";\nimport type {\n ShippingAddress,\n ShippingApiClient,\n ShippingActionsConfig,\n ShippingActions,\n} from \"./shipping\";\nimport { createJoomlaActions } from \"./joomla\";\nimport type { JoomlaApiClient, JoomlaActions } from \"./joomla\";\nimport { createLegacyActions } from \"./legacy\";\nimport type { LegacyApiClient, LegacyActions } from \"./legacy\";\nimport { createCustomersActions } from \"./customers\";\nimport type { CustomersApiClient, CustomersActions } from \"./customers\";\nimport { createSmartyStreetsActions } from \"./smarty-streets\";\nimport type {\n SmartyStreetsApiClient,\n SmartyStreetsActions,\n} from \"./smarty-streets\";\nimport { createP21PimActions } from \"./p21-pim\";\nimport type { P21PimApiClient, P21PimActions } from \"./p21-pim\";\nimport { createAgrSiteActions } from \"./agr-site\";\nimport type { AgrSiteApiClient, AgrSiteActions } from \"./agr-site\";\nimport { createAvalaraActions } from \"./avalara\";\nimport type { AvalaraApiClient, AvalaraActions } from \"./avalara\";\nimport { createPaymentsActions } from \"./payments\";\nimport type { PaymentsApiClient, PaymentsActions } from \"./payments\";\nimport { createUpsActions } from \"./ups\";\nimport type { UpsApiClient, UpsActions } from \"./ups\";\nimport { createLogisticsActions } from \"./logistics\";\nimport type { LogisticsApiClient, LogisticsActions } from \"./logistics\";\nimport { createNexusActions } from \"./nexus\";\nimport type { NexusApiClient, NexusActions } from \"./nexus\";\nimport { createVmiActions } from \"./vmi\";\nimport type { VmiApiClient, VmiActions } from \"./vmi\";\nimport { createP21CoreActions } from \"./p21-core\";\nimport type { P21CoreApiClient, P21CoreActions } from \"./p21-core\";\nimport { createP21ApisActions } from \"./p21-apis\";\nimport type { P21ApisApiClient, P21ApisActions } from \"./p21-apis\";\nimport { createP21SismActions } from \"./p21-sism\";\nimport type { P21SismApiClient, P21SismActions } from \"./p21-sism\";\nimport { createAgrWorkActions } from \"./agr-work\";\nimport type { AgrWorkApiClient, AgrWorkActions } from \"./agr-work\";\nimport { createAgrInfoActions } from \"./agr-info\";\nimport type { AgrInfoApiClient, AgrInfoActions } from \"./agr-info\";\nimport { createBasecamp2Actions } from \"./basecamp2\";\nimport type { Basecamp2ApiClient, Basecamp2Actions } from \"./basecamp2\";\nimport { createBrandFolderActions } from \"./brand-folder\";\nimport type { BrandFolderApiClient, BrandFolderActions } from \"./brand-folder\";\nimport { createGregorovichActions } from \"./gregorovich\";\nimport type { GregorovichApiClient, GregorovichActions } from \"./gregorovich\";\nimport { createSlackActions } from \"./slack\";\nimport type { SlackApiClient, SlackActions } from \"./slack\";\n\nexport { type ShippingAddress } from \"./shipping\";\n\nexport interface SiteActionsConfig {\n /** Cache key prefix shared across all services (e.g. \"ampro:\") */\n cachePrefix?: string;\n /** Default edge cache TTL in seconds */\n edgeCache?: number;\n /** Default Redis TTL in seconds */\n redisTtl?: number;\n /** Long-lived edge cache TTL for rarely-changing data */\n longEdgeCache?: number;\n /** Long-lived Redis TTL for rarely-changing data */\n longRedisTtl?: number;\n\n /** Default contact ID for commerce operations */\n defaultContactId?: string | number;\n /** Default customer ID for pricing and commerce */\n defaultCustomerId?: string | number;\n /** UOM conversion function for commerce (e.g. \"EA\" → \"EACH\") */\n convertUnitOfMeasure?: (uom: string) => string;\n\n /** Pricing-specific overrides */\n pricing?: { taxRedisTtl?: number };\n /** Items-specific overrides */\n items?: { sortChildren?: boolean };\n /** Search-specific overrides */\n search?: { defaultSourceFields?: string };\n /** Shipping config — fromAddress is required for shipping to work */\n shipping?: {\n fromAddress: ShippingAddress;\n defaultServiceCodes?: string[];\n };\n /** VMI-specific overrides */\n vmi?: { shortRedisTtl?: number };\n}\n\nexport interface SiteActions {\n pricing: PricingActions;\n items: ItemActions;\n commerce: CommerceActions;\n search: SearchActions;\n orders: OrderActions;\n shipping: ShippingActions;\n joomla: JoomlaActions;\n legacy: LegacyActions;\n customers: CustomersActions;\n smartyStreets: SmartyStreetsActions;\n p21Pim: P21PimActions;\n agrSite: AgrSiteActions;\n avalara: AvalaraActions;\n payments: PaymentsActions;\n ups: UpsActions;\n logistics: LogisticsActions;\n nexus: NexusActions;\n vmi: VmiActions;\n p21Core: P21CoreActions;\n p21Apis: P21ApisActions;\n p21Sism: P21SismActions;\n agrWork: AgrWorkActions;\n agrInfo: AgrInfoActions;\n basecamp2: Basecamp2Actions;\n brandFolder: BrandFolderActions;\n gregorovich: GregorovichActions;\n slack: SlackActions;\n}\n\n/**\n * Creates a unified site actions object with all service factories.\n *\n * Shared config (cachePrefix, edgeCache, redisTtl, etc.) is passed to all\n * services automatically. Per-service overrides are available for services\n * with additional configuration.\n *\n * @example\n * ```ts\n * import { createSiteActions } from \"@simpleapps-com/augur-server\";\n * import { getAugurClient } from \"./augur-client\";\n *\n * export const actions = createSiteActions(getAugurClient(), {\n * cachePrefix: \"ampro:\",\n * defaultCustomerId: process.env.NEXT_PUBLIC_DEFAULT_CUSTOMER_ID,\n * defaultContactId: process.env.NEXT_PUBLIC_DEFAULT_CONTACT_ID,\n * convertUnitOfMeasure: (uom) => uom === \"EA\" ? \"EACH\" : uom,\n * items: { sortChildren: true },\n * shipping: {\n * fromAddress: { address1: \"123 Main\", city: \"Provo\", state: \"UT\", postalCode: \"84606\" },\n * defaultServiceCodes: [\"03\"],\n * },\n * });\n *\n * // Usage:\n * const price = await actions.pricing.getItemPrice(\"ITEM-1\");\n * const doc = await actions.items.getInvMastDoc(\"ITEM-1\");\n * const cart = await actions.commerce.cartHdrLookup({ userId: 123 });\n * ```\n */\nexport function createSiteActions<TApi extends object>(\n api: TApi,\n config: SiteActionsConfig = {},\n): SiteActions {\n const {\n cachePrefix,\n edgeCache,\n redisTtl,\n longEdgeCache,\n longRedisTtl,\n defaultContactId,\n defaultCustomerId,\n convertUnitOfMeasure,\n } = config;\n\n const cache = { cachePrefix, edgeCache, redisTtl };\n const longCache = { ...cache, longEdgeCache, longRedisTtl };\n\n function castApi<T>(): T {\n return api as unknown as T;\n }\n\n /** Creates a memoized getter — factory is called once on first access. */\n function lazy<T>(fn: () => T): { get(): T } {\n let instance: T | undefined;\n return {\n get() {\n if (instance === undefined) instance = fn();\n return instance;\n },\n };\n }\n\n const pricing = lazy(() =>\n createPricingActions(castApi<PricingApiClient>(), {\n ...cache,\n defaultCustomerId,\n ...config.pricing,\n }),\n );\n const items = lazy(() =>\n createItemActions(castApi<ItemsApiClient>(), {\n ...longCache,\n ...config.items,\n }),\n );\n const commerce = lazy(() =>\n createCommerceActions(castApi<CommerceApiClient>(), {\n defaultContactId,\n defaultCustomerId,\n convertUnitOfMeasure,\n }),\n );\n const search = lazy(() =>\n createSearchActions(castApi<SearchApiClient>(), {\n ...cache,\n ...config.search,\n }),\n );\n const orders = lazy(() =>\n createOrderActions(castApi<OrderApiClient>(), cache),\n );\n const shipping = lazy(() =>\n createShippingActions(\n castApi<ShippingApiClient>(),\n { ...cache, ...config.shipping } as ShippingActionsConfig,\n ),\n );\n const joomla = lazy(() =>\n createJoomlaActions(castApi<JoomlaApiClient>(), cache),\n );\n const legacy = lazy(() =>\n createLegacyActions(castApi<LegacyApiClient>(), longCache),\n );\n const customers = lazy(() =>\n createCustomersActions(castApi<CustomersApiClient>(), cache),\n );\n const smartyStreets = lazy(() =>\n createSmartyStreetsActions(castApi<SmartyStreetsApiClient>(), {\n cachePrefix,\n }),\n );\n const p21Pim = lazy(() =>\n createP21PimActions(castApi<P21PimApiClient>(), cache),\n );\n const agrSite = lazy(() =>\n createAgrSiteActions(castApi<AgrSiteApiClient>(), {\n cachePrefix,\n longEdgeCache,\n longRedisTtl,\n }),\n );\n const avalara = lazy(() =>\n createAvalaraActions(castApi<AvalaraApiClient>(), { cachePrefix }),\n );\n const payments = lazy(() =>\n createPaymentsActions(castApi<PaymentsApiClient>(), { cachePrefix }),\n );\n const ups = lazy(() =>\n createUpsActions(castApi<UpsApiClient>(), { cachePrefix }),\n );\n const logistics = lazy(() =>\n createLogisticsActions(castApi<LogisticsApiClient>(), longCache),\n );\n const nexus = lazy(() =>\n createNexusActions(castApi<NexusApiClient>(), cache),\n );\n const vmi = lazy(() =>\n createVmiActions(castApi<VmiApiClient>(), { ...cache, ...config.vmi }),\n );\n const p21Core = lazy(() =>\n createP21CoreActions(castApi<P21CoreApiClient>(), longCache),\n );\n const p21Apis = lazy(() =>\n createP21ApisActions(castApi<P21ApisApiClient>(), cache),\n );\n const p21Sism = lazy(() =>\n createP21SismActions(castApi<P21SismApiClient>(), cache),\n );\n const agrWork = lazy(() =>\n createAgrWorkActions(castApi<AgrWorkApiClient>(), { cachePrefix }),\n );\n const agrInfo = lazy(() =>\n createAgrInfoActions(castApi<AgrInfoApiClient>(), longCache),\n );\n const basecamp2 = lazy(() =>\n createBasecamp2Actions(castApi<Basecamp2ApiClient>(), longCache),\n );\n const brandFolder = lazy(() =>\n createBrandFolderActions(castApi<BrandFolderApiClient>(), cache),\n );\n const gregorovich = lazy(() =>\n createGregorovichActions(castApi<GregorovichApiClient>(), cache),\n );\n const slack = lazy(() =>\n createSlackActions(castApi<SlackApiClient>(), cache),\n );\n\n return {\n get pricing() { return pricing.get(); },\n get items() { return items.get(); },\n get commerce() { return commerce.get(); },\n get search() { return search.get(); },\n get orders() { return orders.get(); },\n get shipping() { return shipping.get(); },\n get joomla() { return joomla.get(); },\n get legacy() { return legacy.get(); },\n get customers() { return customers.get(); },\n get smartyStreets() { return smartyStreets.get(); },\n get p21Pim() { return p21Pim.get(); },\n get agrSite() { return agrSite.get(); },\n get avalara() { return avalara.get(); },\n get payments() { return payments.get(); },\n get ups() { return ups.get(); },\n get logistics() { return logistics.get(); },\n get nexus() { return nexus.get(); },\n get vmi() { return vmi.get(); },\n get p21Core() { return p21Core.get(); },\n get p21Apis() { return p21Apis.get(); },\n get p21Sism() { return p21Sism.get(); },\n get agrWork() { return agrWork.get(); },\n get agrInfo() { return agrInfo.get(); },\n get basecamp2() { return basecamp2.get(); },\n get brandFolder() { return brandFolder.get(); },\n get gregorovich() { return gregorovich.get(); },\n get slack() { return slack.get(); },\n };\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simpleapps-com/augur-server",
3
- "version": "0.2.10",
3
+ "version": "0.2.11",
4
4
  "description": "Server-side utilities for Augur ecommerce sites (Redis caching, SDK helpers, auth)",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -41,7 +41,7 @@
41
41
  ],
42
42
  "dependencies": {
43
43
  "valibot": "^1.0.0",
44
- "@simpleapps-com/augur-utils": "0.2.10"
44
+ "@simpleapps-com/augur-utils": "0.2.11"
45
45
  },
46
46
  "peerDependencies": {
47
47
  "@simpleapps-com/augur-api": "^0.9.6",
@@ -50,7 +50,7 @@
50
50
  "next": ">=16.0.0",
51
51
  "next-auth": "5.0.0-beta.30",
52
52
  "react": "^19.0.0",
53
- "@simpleapps-com/augur-hooks": "0.2.10"
53
+ "@simpleapps-com/augur-hooks": "0.2.11"
54
54
  },
55
55
  "peerDependenciesMeta": {
56
56
  "ioredis": {
@@ -73,7 +73,7 @@
73
73
  "tsup": "^8.5.0",
74
74
  "vitest": "^3.2.0",
75
75
  "@augur-packages/tsconfig": "0.0.0",
76
- "@simpleapps-com/augur-hooks": "0.2.10"
76
+ "@simpleapps-com/augur-hooks": "0.2.11"
77
77
  },
78
78
  "scripts": {
79
79
  "build": "tsup",