@classytic/commerce-sdk 0.1.0
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.
Potentially problematic release.
This version of @classytic/commerce-sdk might be problematic. Click here for more details.
- package/LICENSE +14 -0
- package/README.md +104 -0
- package/dist/adjustment-DTSLM7AN.js +5 -0
- package/dist/adjustment-DTSLM7AN.js.map +1 -0
- package/dist/analytics/index.d.ts +27 -0
- package/dist/analytics/index.js +6 -0
- package/dist/analytics/index.js.map +1 -0
- package/dist/analytics-DMcD-o8w.d.ts +76 -0
- package/dist/api-factory-B_h4RKBm.d.ts +280 -0
- package/dist/auth/index.d.ts +39 -0
- package/dist/auth/index.js +5 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/catalog/index.d.ts +479 -0
- package/dist/catalog/index.js +9 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/chunk-4ZQK3FFN.js +40 -0
- package/dist/chunk-4ZQK3FFN.js.map +1 -0
- package/dist/chunk-5L6EXDGH.js +465 -0
- package/dist/chunk-5L6EXDGH.js.map +1 -0
- package/dist/chunk-5ZFW3FEI.js +183 -0
- package/dist/chunk-5ZFW3FEI.js.map +1 -0
- package/dist/chunk-66OQAZSL.js +94 -0
- package/dist/chunk-66OQAZSL.js.map +1 -0
- package/dist/chunk-6RYGA6MF.js +123 -0
- package/dist/chunk-6RYGA6MF.js.map +1 -0
- package/dist/chunk-B6MPVOV7.js +328 -0
- package/dist/chunk-B6MPVOV7.js.map +1 -0
- package/dist/chunk-BDA2WSJA.js +148 -0
- package/dist/chunk-BDA2WSJA.js.map +1 -0
- package/dist/chunk-EIVYT3HM.js +126 -0
- package/dist/chunk-EIVYT3HM.js.map +1 -0
- package/dist/chunk-EPQN7ZKZ.js +27 -0
- package/dist/chunk-EPQN7ZKZ.js.map +1 -0
- package/dist/chunk-FA7QFJ2G.js +177 -0
- package/dist/chunk-FA7QFJ2G.js.map +1 -0
- package/dist/chunk-I5TIKUIQ.js +261 -0
- package/dist/chunk-I5TIKUIQ.js.map +1 -0
- package/dist/chunk-ILQUH444.js +135 -0
- package/dist/chunk-ILQUH444.js.map +1 -0
- package/dist/chunk-IXMWZJLV.js +616 -0
- package/dist/chunk-IXMWZJLV.js.map +1 -0
- package/dist/chunk-KZIGRIQG.js +75 -0
- package/dist/chunk-KZIGRIQG.js.map +1 -0
- package/dist/chunk-OF5M6R2S.js +769 -0
- package/dist/chunk-OF5M6R2S.js.map +1 -0
- package/dist/chunk-PYYLHUV6.js +3 -0
- package/dist/chunk-PYYLHUV6.js.map +1 -0
- package/dist/chunk-QO5AGZFP.js +159 -0
- package/dist/chunk-QO5AGZFP.js.map +1 -0
- package/dist/chunk-QUMTBLNE.js +76 -0
- package/dist/chunk-QUMTBLNE.js.map +1 -0
- package/dist/chunk-R5Z7NYLH.js +126 -0
- package/dist/chunk-R5Z7NYLH.js.map +1 -0
- package/dist/chunk-SZYWG5IB.js +75 -0
- package/dist/chunk-SZYWG5IB.js.map +1 -0
- package/dist/chunk-U3XT35GZ.js +202 -0
- package/dist/chunk-U3XT35GZ.js.map +1 -0
- package/dist/chunk-UGELTUIZ.js +830 -0
- package/dist/chunk-UGELTUIZ.js.map +1 -0
- package/dist/chunk-VR36QVX2.js +122 -0
- package/dist/chunk-VR36QVX2.js.map +1 -0
- package/dist/chunk-WUOQK7BO.js +13 -0
- package/dist/chunk-WUOQK7BO.js.map +1 -0
- package/dist/chunk-X6PV5MHG.js +582 -0
- package/dist/chunk-X6PV5MHG.js.map +1 -0
- package/dist/chunk-ZWLMFLLH.js +534 -0
- package/dist/chunk-ZWLMFLLH.js.map +1 -0
- package/dist/content/index.d.ts +309 -0
- package/dist/content/index.js +6 -0
- package/dist/content/index.js.map +1 -0
- package/dist/core/index.d.ts +107 -0
- package/dist/core/index.js +5 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/react.d.ts +107 -0
- package/dist/core/react.js +5 -0
- package/dist/core/react.js.map +1 -0
- package/dist/coupon-CHFcw7cd.d.ts +632 -0
- package/dist/coupon-zGkvO-Xx.d.ts +129 -0
- package/dist/crud.factory-DyKaPHcU.d.ts +181 -0
- package/dist/finance/index.d.ts +81 -0
- package/dist/finance/index.js +5 -0
- package/dist/finance/index.js.map +1 -0
- package/dist/finance-BJdfKRw0.d.ts +135 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/inventory/index.d.ts +512 -0
- package/dist/inventory/index.js +16 -0
- package/dist/inventory/index.js.map +1 -0
- package/dist/inventory-DCiIZh8P.d.ts +742 -0
- package/dist/logistics/index.d.ts +226 -0
- package/dist/logistics/index.js +7 -0
- package/dist/logistics/index.js.map +1 -0
- package/dist/logistics-V8a9lUN3.d.ts +428 -0
- package/dist/media-CNLJK93J.d.ts +721 -0
- package/dist/movement-7MV3ADY5.js +5 -0
- package/dist/movement-7MV3ADY5.js.map +1 -0
- package/dist/payment-BRboLqvU.d.ts +127 -0
- package/dist/payments/index.d.ts +55 -0
- package/dist/payments/index.js +6 -0
- package/dist/payments/index.js.map +1 -0
- package/dist/platform/index.d.ts +645 -0
- package/dist/platform/index.js +8 -0
- package/dist/platform/index.js.map +1 -0
- package/dist/pos-D1jkkFl0.d.ts +885 -0
- package/dist/product-p09zXkXB.d.ts +260 -0
- package/dist/purchase-24BGT2HA.js +5 -0
- package/dist/purchase-24BGT2HA.js.map +1 -0
- package/dist/request-652PS6VR.js +5 -0
- package/dist/request-652PS6VR.js.map +1 -0
- package/dist/sales/index.d.ts +585 -0
- package/dist/sales/index.js +9 -0
- package/dist/sales/index.js.map +1 -0
- package/dist/server.d.ts +120 -0
- package/dist/server.js +27 -0
- package/dist/server.js.map +1 -0
- package/dist/size-guide-DgjzjM5P.d.ts +554 -0
- package/dist/stock-DEApGC-w.d.ts +632 -0
- package/dist/stock-OOUW57VQ.js +5 -0
- package/dist/stock-OOUW57VQ.js.map +1 -0
- package/dist/supplier-OC6JAWV6.js +5 -0
- package/dist/supplier-OC6JAWV6.js.map +1 -0
- package/dist/transaction/index.d.ts +104 -0
- package/dist/transaction/index.js +8 -0
- package/dist/transaction/index.js.map +1 -0
- package/dist/transaction-BTmoHpWh.d.ts +428 -0
- package/dist/transaction-u5oaNuav.d.ts +84 -0
- package/dist/transfer-7SYSH3RG.js +5 -0
- package/dist/transfer-7SYSH3RG.js.map +1 -0
- package/dist/user-data-DdLjAGwO.d.ts +132 -0
- package/package.json +146 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core/api-factory.ts"],"names":[],"mappings":"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","file":"chunk-I5TIKUIQ.js","sourcesContent":["/**\r\n * @classytic/commerce-sdk - API Factory\r\n *\r\n * Base API class that provides standardized CRUD operations.\r\n * Supports direct field queries and bracket syntax: field[operator]=value\r\n */\r\n\r\nimport { handleApiRequest, createQueryString } from \"./api-handler\";\r\n\r\n// ==================== Response Types ====================\r\n\r\n/**\r\n * Base API response wrapper\r\n * All endpoints return { success: boolean, ... }\r\n */\r\nexport interface ApiResponse<T = unknown> {\r\n success: boolean;\r\n data?: T;\r\n message?: string;\r\n}\r\n\r\n/**\r\n * Offset pagination response (page-based)\r\n * Used when: ?page=1&limit=10\r\n */\r\nexport interface OffsetPaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"offset\";\r\n docs: T[];\r\n page: number;\r\n limit: number;\r\n total: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n warning?: string;\r\n}\r\n\r\n/**\r\n * Keyset pagination response (cursor-based)\r\n * Used when: ?after=cursor&limit=10\r\n */\r\nexport interface KeysetPaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"keyset\";\r\n docs: T[];\r\n limit: number;\r\n hasMore: boolean;\r\n next: string | null;\r\n}\r\n\r\n/**\r\n * Aggregate pagination response\r\n * Used for complex aggregation queries\r\n */\r\nexport interface AggregatePaginationResponse<T = unknown> {\r\n success: boolean;\r\n method: \"aggregate\";\r\n docs: T[];\r\n page: number;\r\n limit: number;\r\n total: number;\r\n pages: number;\r\n hasNext: boolean;\r\n hasPrev: boolean;\r\n warning?: string;\r\n}\r\n\r\n/**\r\n * Union type for all paginated responses\r\n */\r\nexport type PaginatedResponse<T = unknown> =\r\n | OffsetPaginationResponse<T>\r\n | KeysetPaginationResponse<T>\r\n | AggregatePaginationResponse<T>;\r\n\r\n/**\r\n * Delete operation response\r\n * Supports both soft delete (default) and hard delete\r\n */\r\nexport interface DeleteResponse {\r\n success: boolean;\r\n deleted: boolean;\r\n /** ID of the deleted record */\r\n id?: string;\r\n /** @deprecated Use `id` instead */\r\n productId?: string;\r\n /** True if soft delete was performed (default behavior) */\r\n soft?: boolean;\r\n /** Legacy message field */\r\n message?: string;\r\n /** Number of records deleted (for bulk operations) */\r\n count?: number;\r\n}\r\n\r\n// ==================== Request Types ====================\r\n\r\n/**\r\n * Sort direction\r\n */\r\nexport type SortDirection = 1 | -1 | \"asc\" | \"desc\";\r\n\r\n/**\r\n * Sort specification\r\n */\r\nexport type SortSpec = Record<string, SortDirection> | string;\r\n\r\n/**\r\n * Filter operators supported by query parser\r\n * Usage: ?field[operator]=value\r\n */\r\nexport type FilterOperator =\r\n | \"eq\" // Equal\r\n | \"ne\" // Not equal\r\n | \"gt\" // Greater than\r\n | \"gte\" // Greater than or equal\r\n | \"lt\" // Less than\r\n | \"lte\" // Less than or equal\r\n | \"in\" // In array\r\n | \"nin\" // Not in array\r\n | \"contains\" // String contains (case-insensitive)\r\n | \"startsWith\" // String starts with\r\n | \"endsWith\" // String ends with\r\n | \"regex\"; // Regex pattern\r\n\r\n/**\r\n * Query parameters for list/search operations\r\n */\r\nexport interface QueryParams {\r\n // Pagination\r\n page?: number;\r\n limit?: number;\r\n after?: string; // Cursor for keyset pagination\r\n\r\n // Sorting\r\n sort?: SortSpec;\r\n\r\n // Filtering - direct equality or bracket operators\r\n [key: string]: unknown;\r\n}\r\n\r\n/**\r\n * Request options\r\n */\r\nexport interface RequestOptions {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n cache?: RequestCache;\r\n revalidate?: number;\r\n tags?: string[];\r\n headerOptions?: Record<string, string>;\r\n responseType?: \"json\" | \"blob\" | \"text\";\r\n}\r\n\r\n// ==================== Base API Configuration ====================\r\n\r\nexport interface BaseApiConfig {\r\n basePath?: string;\r\n defaultParams?: {\r\n limit?: number;\r\n page?: number;\r\n [key: string]: unknown;\r\n };\r\n cache?: RequestCache;\r\n headers?: Record<string, string>;\r\n}\r\n\r\n// ==================== Base API Class ====================\r\n\r\n/**\r\n * Base API class that provides standardized CRUD operations\r\n * Supports direct field queries and bracket syntax: field[operator]=value\r\n *\r\n * @template TDoc - Document type returned by the API\r\n * @template TCreate - Type for create payload (defaults to Partial<TDoc>)\r\n * @template TUpdate - Type for update payload (defaults to Partial<TDoc>)\r\n */\r\nexport class BaseApi<\r\n TDoc = Record<string, unknown>,\r\n TCreate = Partial<TDoc>,\r\n TUpdate = Partial<TDoc>\r\n> {\r\n readonly entity: string;\r\n readonly config: Required<BaseApiConfig>;\r\n readonly baseUrl: string;\r\n\r\n constructor(entity: string, config: BaseApiConfig = {}) {\r\n this.entity = entity;\r\n this.config = {\r\n basePath: config.basePath ?? \"/api/v1\",\r\n defaultParams: {\r\n limit: 10,\r\n page: 1,\r\n ...(config.defaultParams || {}),\r\n },\r\n cache: config.cache ?? \"no-store\",\r\n headers: {\r\n \"Content-Type\": \"application/json\",\r\n ...(config.headers || {}),\r\n },\r\n };\r\n\r\n this.baseUrl = `${this.config.basePath}/${this.entity}`;\r\n }\r\n\r\n /**\r\n * Creates query string from parameters\r\n * Delegates to shared utility from api-handler.ts\r\n */\r\n createQueryString(params: Record<string, unknown> = {}): string {\r\n return createQueryString(params);\r\n }\r\n\r\n /**\r\n * Prepares parameters for API request\r\n * Handles pagination, sorting, and filters\r\n * Note: Critical security filters (organizationId, ownerId) are ALWAYS sent, even if null\r\n */\r\n prepareParams(params: QueryParams = {}): Record<string, unknown> {\r\n const result: Record<string, unknown> = {};\r\n\r\n // Critical security filters that MUST always be sent to backend\r\n const CRITICAL_FILTERS = [\"organizationId\", \"ownerId\"];\r\n\r\n Object.entries(params).forEach(([key, value]) => {\r\n // Critical filters: convert falsy values to null and always include\r\n if (CRITICAL_FILTERS.includes(key)) {\r\n // Convert empty string, undefined, or any falsy value (except 0 and false) to null\r\n result[key] = value || null;\r\n return;\r\n }\r\n\r\n // For all other params: filter out undefined and empty strings\r\n if (value !== undefined && value !== \"\") {\r\n // Handle pagination\r\n if ([\"page\", \"limit\"].includes(key)) {\r\n result[key] = parseInt(String(value)) || (key === \"page\" ? 1 : 10);\r\n }\r\n // Handle arrays with bracket syntax\r\n else if (Array.isArray(value)) {\r\n if (value.length > 1) {\r\n result[`${key}[in]`] = value.join(\",\");\r\n } else if (value.length === 1) {\r\n result[key] = value[0];\r\n }\r\n }\r\n // Pass through null and all other parameters as-is\r\n else {\r\n result[key] = value;\r\n }\r\n }\r\n });\r\n\r\n return result;\r\n }\r\n\r\n /**\r\n * Get all records with pagination and filtering\r\n * Returns offset or keyset pagination based on params\r\n */\r\n async getAll({\r\n token = null,\r\n organizationId = null,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}): Promise<PaginatedResponse<TDoc>> {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Get a single record by ID\r\n */\r\n async getById({\r\n token = null,\r\n organizationId = null,\r\n id,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n id: string;\r\n params?: { select?: string; populate?: string | string[] };\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n const queryString = this.createQueryString(params);\r\n const url = queryString\r\n ? `${this.baseUrl}/${id}?${queryString}`\r\n : `${this.baseUrl}/${id}`;\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\"GET\", url, requestOptions);\r\n }\r\n\r\n /**\r\n * Create a new record\r\n */\r\n async create({\r\n token,\r\n organizationId = null,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n data: TCreate;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n return handleApiRequest(\"POST\", this.baseUrl, {\r\n token,\r\n organizationId,\r\n body: data,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Update an existing record\r\n */\r\n async update({\r\n token,\r\n organizationId = null,\r\n id,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n data: TUpdate;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<ApiResponse<TDoc>> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n return handleApiRequest(\"PATCH\", `${this.baseUrl}/${id}`, {\r\n token,\r\n organizationId,\r\n body: data,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Delete a record\r\n */\r\n async delete({\r\n token,\r\n organizationId = null,\r\n id,\r\n options = {},\r\n }: {\r\n token: string;\r\n organizationId?: string | null;\r\n id: string;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<DeleteResponse> {\r\n if (!id) throw new Error(\"ID is required\");\r\n\r\n return handleApiRequest(\"DELETE\", `${this.baseUrl}/${id}`, {\r\n token,\r\n organizationId,\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Search with custom parameters\r\n * @example\r\n * search({ searchParams: { 'brand[contains]': 'nike' } })\r\n * search({ searchParams: { upc: '123456789' } })\r\n */\r\n async search({\r\n token = null,\r\n organizationId = null,\r\n searchParams = {},\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n searchParams?: Record<string, unknown>;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}): Promise<PaginatedResponse<TDoc>> {\r\n const queryParams = { ...params, ...searchParams };\r\n const processedParams = this.prepareParams(queryParams);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Find records by field with optional operator\r\n * @example\r\n * findBy({ field: 'brand', value: 'nike', operator: 'contains' })\r\n * findBy({ field: 'status', value: ['active', 'pending'], operator: 'in' })\r\n */\r\n async findBy({\r\n token = null,\r\n organizationId = null,\r\n field,\r\n value,\r\n operator,\r\n params = {},\r\n options = {},\r\n }: {\r\n token?: string | null;\r\n organizationId?: string | null;\r\n field: string;\r\n value: unknown;\r\n operator?: FilterOperator;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n }): Promise<PaginatedResponse<TDoc>> {\r\n if (!field || value === undefined) {\r\n throw new Error(\"Field and value are required\");\r\n }\r\n\r\n const queryParams: QueryParams = { ...params };\r\n\r\n if (operator) {\r\n queryParams[`${field}[${operator}]`] = Array.isArray(value)\r\n ? value.join(\",\")\r\n : value;\r\n } else {\r\n queryParams[field] = value;\r\n }\r\n\r\n const processedParams = this.prepareParams(queryParams);\r\n const queryString = this.createQueryString(processedParams);\r\n\r\n const requestOptions: RequestOptions = {\r\n cache: this.config.cache,\r\n ...options,\r\n };\r\n\r\n if (token) requestOptions.token = token;\r\n if (organizationId) requestOptions.organizationId = organizationId;\r\n\r\n return handleApiRequest(\r\n \"GET\",\r\n `${this.baseUrl}?${queryString}`,\r\n requestOptions\r\n );\r\n }\r\n\r\n /**\r\n * Make a custom API request to a sub-endpoint\r\n * @example\r\n * request('POST', `${this.baseUrl}/${id}/action`, { token, data: { ... } })\r\n */\r\n async request<TResponse = unknown>(\r\n method: \"GET\" | \"POST\" | \"PATCH\" | \"PUT\" | \"DELETE\",\r\n endpoint: string,\r\n {\r\n token,\r\n organizationId = null,\r\n data,\r\n params,\r\n options = {},\r\n }: {\r\n token?: string;\r\n organizationId?: string | null;\r\n data?: unknown;\r\n params?: QueryParams;\r\n options?: Omit<RequestOptions, \"token\" | \"organizationId\">;\r\n } = {}\r\n ): Promise<TResponse> {\r\n let url = endpoint;\r\n\r\n if (params) {\r\n const processedParams = this.prepareParams(params);\r\n const queryString = this.createQueryString(processedParams);\r\n url = `${endpoint}?${queryString}`;\r\n }\r\n\r\n return handleApiRequest(method, url, {\r\n token,\r\n organizationId,\r\n body: data,\r\n cache: this.config.cache,\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\n// ==================== Factory Function ====================\r\n\r\n/**\r\n * Factory function to create a typed BaseApi instance\r\n *\r\n * @template TDoc - Document type returned by the API\r\n * @template TCreate - Type for create payload\r\n * @template TUpdate - Type for update payload\r\n *\r\n * @example\r\n * // Simple usage\r\n * const productApi = createCrudApi('products');\r\n *\r\n * // With types\r\n * interface Product { _id: string; name: string; price: number; }\r\n * interface CreateProduct { name: string; price: number; }\r\n * const productApi = createCrudApi<Product, CreateProduct>('products');\r\n *\r\n * // With custom config\r\n * const productApi = createCrudApi('products', { basePath: '/api/v2' });\r\n */\r\nexport function createCrudApi<\r\n TDoc = Record<string, unknown>,\r\n TCreate = Partial<TDoc>,\r\n TUpdate = Partial<TDoc>\r\n>(entity: string, config: BaseApiConfig = {}): BaseApi<TDoc, TCreate, TUpdate> {\r\n return new BaseApi<TDoc, TCreate, TUpdate>(entity, config);\r\n}\r\n\r\n// ==================== Type Helpers ====================\r\n\r\n/**\r\n * Extract document type from paginated response\r\n */\r\nexport type ExtractDoc<T> = T extends PaginatedResponse<infer D> ? D : never;\r\n\r\n/**\r\n * Helper to check if response is offset pagination\r\n */\r\nexport function isOffsetPagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is OffsetPaginationResponse<T> {\r\n return response.method === \"offset\";\r\n}\r\n\r\n/**\r\n * Helper to check if response is keyset pagination\r\n */\r\nexport function isKeysetPagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is KeysetPaginationResponse<T> {\r\n return response.method === \"keyset\";\r\n}\r\n\r\n/**\r\n * Helper to check if response is aggregate pagination\r\n */\r\nexport function isAggregatePagination<T>(\r\n response: PaginatedResponse<T>\r\n): response is AggregatePaginationResponse<T> {\r\n return response.method === \"aggregate\";\r\n}\r\n"]}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { getToastHandler } from './chunk-U3XT35GZ.js';
|
|
2
|
+
import { handleApiRequest } from './chunk-VR36QVX2.js';
|
|
3
|
+
import { useQueryClient, useMutation } from '@tanstack/react-query';
|
|
4
|
+
|
|
5
|
+
// src/payments/api/payment.ts
|
|
6
|
+
var PaymentApi = class {
|
|
7
|
+
constructor() {
|
|
8
|
+
this.baseUrl = "/webhooks/payments";
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Verify a manual payment (Admin/Superadmin only)
|
|
12
|
+
* POST /webhooks/payments/manual/verify
|
|
13
|
+
*
|
|
14
|
+
* Use this when admin confirms a customer's manual payment
|
|
15
|
+
* (bKash, Nagad, bank transfer, cash, etc.)
|
|
16
|
+
*
|
|
17
|
+
* After verification:
|
|
18
|
+
* - Transaction status → 'verified'
|
|
19
|
+
* - Order payment status → 'verified'
|
|
20
|
+
* - Order status → 'confirmed' (if was 'pending')
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* const result = await paymentApi.verifyPayment({
|
|
24
|
+
* token: adminToken,
|
|
25
|
+
* data: {
|
|
26
|
+
* transactionId: '507f1f77bcf86cd799439011',
|
|
27
|
+
* notes: 'Verified bKash payment TrxID: ABC123'
|
|
28
|
+
* }
|
|
29
|
+
* });
|
|
30
|
+
*/
|
|
31
|
+
async verifyPayment({
|
|
32
|
+
token,
|
|
33
|
+
data,
|
|
34
|
+
options = {}
|
|
35
|
+
}) {
|
|
36
|
+
if (!data.transactionId) {
|
|
37
|
+
throw new Error("Transaction ID is required");
|
|
38
|
+
}
|
|
39
|
+
return handleApiRequest("POST", `${this.baseUrl}/manual/verify`, {
|
|
40
|
+
token,
|
|
41
|
+
body: {
|
|
42
|
+
transactionId: data.transactionId,
|
|
43
|
+
...data.notes && { notes: data.notes }
|
|
44
|
+
},
|
|
45
|
+
cache: "no-store",
|
|
46
|
+
...options
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Reject a manual payment (Admin/Superadmin only)
|
|
51
|
+
* POST /webhooks/payments/manual/reject
|
|
52
|
+
*
|
|
53
|
+
* Use this when admin rejects a customer's payment claim
|
|
54
|
+
* (invalid reference, insufficient amount, fraud, etc.)
|
|
55
|
+
*
|
|
56
|
+
* After rejection:
|
|
57
|
+
* - Transaction status → 'failed'
|
|
58
|
+
* - Order payment status → 'failed'
|
|
59
|
+
* - Reason recorded in transaction
|
|
60
|
+
*
|
|
61
|
+
* @example
|
|
62
|
+
* const result = await paymentApi.rejectPayment({
|
|
63
|
+
* token: adminToken,
|
|
64
|
+
* data: {
|
|
65
|
+
* transactionId: '507f1f77bcf86cd799439011',
|
|
66
|
+
* reason: 'Invalid bKash TrxID - payment not found'
|
|
67
|
+
* }
|
|
68
|
+
* });
|
|
69
|
+
*/
|
|
70
|
+
async rejectPayment({
|
|
71
|
+
token,
|
|
72
|
+
data,
|
|
73
|
+
options = {}
|
|
74
|
+
}) {
|
|
75
|
+
if (!data.transactionId) {
|
|
76
|
+
throw new Error("Transaction ID is required");
|
|
77
|
+
}
|
|
78
|
+
if (!data.reason) {
|
|
79
|
+
throw new Error("Rejection reason is required");
|
|
80
|
+
}
|
|
81
|
+
return handleApiRequest("POST", `${this.baseUrl}/manual/reject`, {
|
|
82
|
+
token,
|
|
83
|
+
body: {
|
|
84
|
+
transactionId: data.transactionId,
|
|
85
|
+
reason: data.reason
|
|
86
|
+
},
|
|
87
|
+
cache: "no-store",
|
|
88
|
+
...options
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
var paymentApi = new PaymentApi();
|
|
93
|
+
function usePaymentActions(token) {
|
|
94
|
+
const queryClient = useQueryClient();
|
|
95
|
+
const toast = getToastHandler();
|
|
96
|
+
const verifyMutation = useMutation({
|
|
97
|
+
mutationFn: (data) => paymentApi.verifyPayment({ token, data }),
|
|
98
|
+
onSuccess: () => {
|
|
99
|
+
toast.success("Payment verified successfully");
|
|
100
|
+
queryClient.invalidateQueries({ queryKey: ["orders"] });
|
|
101
|
+
queryClient.invalidateQueries({ queryKey: ["transactions"] });
|
|
102
|
+
},
|
|
103
|
+
onError: (error) => {
|
|
104
|
+
toast.error(error.message || "Failed to verify payment");
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
const rejectMutation = useMutation({
|
|
108
|
+
mutationFn: (data) => paymentApi.rejectPayment({ token, data }),
|
|
109
|
+
onSuccess: () => {
|
|
110
|
+
toast.success("Payment rejected");
|
|
111
|
+
queryClient.invalidateQueries({ queryKey: ["orders"] });
|
|
112
|
+
queryClient.invalidateQueries({ queryKey: ["transactions"] });
|
|
113
|
+
},
|
|
114
|
+
onError: (error) => {
|
|
115
|
+
toast.error(error.message || "Failed to reject payment");
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
return {
|
|
119
|
+
verifyPayment: async (data) => {
|
|
120
|
+
const result = await verifyMutation.mutateAsync(data);
|
|
121
|
+
return result.data;
|
|
122
|
+
},
|
|
123
|
+
isVerifying: verifyMutation.isPending,
|
|
124
|
+
rejectPayment: async (data) => {
|
|
125
|
+
const result = await rejectMutation.mutateAsync(data);
|
|
126
|
+
return result.data;
|
|
127
|
+
},
|
|
128
|
+
isRejecting: rejectMutation.isPending,
|
|
129
|
+
isLoading: verifyMutation.isPending || rejectMutation.isPending
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { PaymentApi, paymentApi, usePaymentActions };
|
|
134
|
+
//# sourceMappingURL=chunk-ILQUH444.js.map
|
|
135
|
+
//# sourceMappingURL=chunk-ILQUH444.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/payments/api/payment.ts","../src/payments/hooks/payment.ts"],"names":[],"mappings":"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","file":"chunk-ILQUH444.js","sourcesContent":["// @/payments/api/payment.ts\r\nimport { handleApiRequest } from \"../../core/api-handler\";\r\nimport type { ApiResponse } from \"../../core/api-factory\";\r\nimport type {\r\n VerificationResult,\r\n RejectResult,\r\n VerifyPaymentPayload,\r\n RejectPaymentPayload,\r\n} from \"../types\";\r\n\r\n// ==================== Request Options ====================\r\n\r\ninterface FetchOptions {\r\n cache?: RequestCache;\r\n revalidate?: number;\r\n tags?: string[];\r\n}\r\n\r\n// ==================== Payment API ====================\r\n\r\n/**\r\n * Payment API for admin payment management\r\n *\r\n * Manual Payment Verification Flow:\r\n * 1. Customer places order → Transaction created with status 'pending'\r\n * 2. Customer pays via bKash/Nagad/bank transfer/cash\r\n * 3. Admin verifies payment via verifyPayment() endpoint\r\n * 4. Backend updates transaction to 'verified'\r\n * 5. Order status auto-updates to 'confirmed', payment status to 'verified'\r\n *\r\n * Endpoints:\r\n * - POST /webhooks/payments/manual/verify - Verify pending payment (superadmin)\r\n * - POST /webhooks/payments/manual/reject - Reject pending payment (superadmin)\r\n */\r\nclass PaymentApi {\r\n private baseUrl = \"/webhooks/payments\";\r\n\r\n /**\r\n * Verify a manual payment (Admin/Superadmin only)\r\n * POST /webhooks/payments/manual/verify\r\n *\r\n * Use this when admin confirms a customer's manual payment\r\n * (bKash, Nagad, bank transfer, cash, etc.)\r\n *\r\n * After verification:\r\n * - Transaction status → 'verified'\r\n * - Order payment status → 'verified'\r\n * - Order status → 'confirmed' (if was 'pending')\r\n *\r\n * @example\r\n * const result = await paymentApi.verifyPayment({\r\n * token: adminToken,\r\n * data: {\r\n * transactionId: '507f1f77bcf86cd799439011',\r\n * notes: 'Verified bKash payment TrxID: ABC123'\r\n * }\r\n * });\r\n */\r\n async verifyPayment({\r\n token,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n data: VerifyPaymentPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<VerificationResult>> {\r\n if (!data.transactionId) {\r\n throw new Error(\"Transaction ID is required\");\r\n }\r\n\r\n return handleApiRequest(\"POST\", `${this.baseUrl}/manual/verify`, {\r\n token,\r\n body: {\r\n transactionId: data.transactionId,\r\n ...(data.notes && { notes: data.notes }),\r\n },\r\n cache: \"no-store\",\r\n ...options,\r\n });\r\n }\r\n\r\n /**\r\n * Reject a manual payment (Admin/Superadmin only)\r\n * POST /webhooks/payments/manual/reject\r\n *\r\n * Use this when admin rejects a customer's payment claim\r\n * (invalid reference, insufficient amount, fraud, etc.)\r\n *\r\n * After rejection:\r\n * - Transaction status → 'failed'\r\n * - Order payment status → 'failed'\r\n * - Reason recorded in transaction\r\n *\r\n * @example\r\n * const result = await paymentApi.rejectPayment({\r\n * token: adminToken,\r\n * data: {\r\n * transactionId: '507f1f77bcf86cd799439011',\r\n * reason: 'Invalid bKash TrxID - payment not found'\r\n * }\r\n * });\r\n */\r\n async rejectPayment({\r\n token,\r\n data,\r\n options = {},\r\n }: {\r\n token: string;\r\n data: RejectPaymentPayload;\r\n options?: FetchOptions;\r\n }): Promise<ApiResponse<RejectResult>> {\r\n if (!data.transactionId) {\r\n throw new Error(\"Transaction ID is required\");\r\n }\r\n if (!data.reason) {\r\n throw new Error(\"Rejection reason is required\");\r\n }\r\n\r\n return handleApiRequest(\"POST\", `${this.baseUrl}/manual/reject`, {\r\n token,\r\n body: {\r\n transactionId: data.transactionId,\r\n reason: data.reason,\r\n },\r\n cache: \"no-store\",\r\n ...options,\r\n });\r\n }\r\n}\r\n\r\n// Create and export singleton instance\r\nexport const paymentApi = new PaymentApi();\r\nexport { PaymentApi };\r\n","\"use client\";\n\nimport { useMutation, useQueryClient } from \"@tanstack/react-query\";\nimport { paymentApi } from \"../api\";\nimport { getToastHandler } from \"../../core/react/mutation.factory\";\nimport type {\n VerificationResult,\n RejectResult,\n VerifyPaymentPayload,\n RejectPaymentPayload,\n} from \"../types\";\n\n// ============================================\n// Types\n// ============================================\n\nexport interface UsePaymentActionsReturn {\n verifyPayment: (data: VerifyPaymentPayload) => Promise<VerificationResult>;\n isVerifying: boolean;\n rejectPayment: (data: RejectPaymentPayload) => Promise<RejectResult>;\n isRejecting: boolean;\n isLoading: boolean;\n}\n\n// Re-export types from types for convenience\nexport type { VerificationResult, RejectResult, VerifyPaymentPayload, RejectPaymentPayload };\n\n// ============================================\n// Hooks\n// ============================================\n\n/**\n * Payment verification actions for admin\n *\n * Manual Payment Verification Flow:\n * 1. Customer places order → Transaction created with status 'pending'\n * 2. Customer pays via bKash/Nagad/bank transfer/cash\n * 3. Admin verifies payment via verifyPayment()\n * 4. Backend updates transaction to 'verified'\n * 5. Order status auto-updates to 'confirmed', payment status to 'verified'\n *\n * @param token - Auth token (admin/superadmin)\n *\n * @example\n * ```tsx\n * function PaymentVerifier({ transaction }) {\n * const { verifyPayment, rejectPayment, isLoading } = usePaymentActions(token);\n *\n * const handleVerify = async () => {\n * await verifyPayment({\n * transactionId: transaction._id,\n * notes: 'Verified bKash payment TrxID: ABC123',\n * });\n * };\n *\n * const handleReject = async () => {\n * await rejectPayment({\n * transactionId: transaction._id,\n * reason: 'Invalid bKash TrxID - payment not found',\n * });\n * };\n *\n * return (\n * <>\n * <Button onClick={handleVerify} disabled={isLoading}>Verify</Button>\n * <Button onClick={handleReject} disabled={isLoading}>Reject</Button>\n * </>\n * );\n * }\n * ```\n */\nexport function usePaymentActions(token: string): UsePaymentActionsReturn {\n const queryClient = useQueryClient();\n const toast = getToastHandler();\n\n const verifyMutation = useMutation({\n mutationFn: (data: VerifyPaymentPayload) => paymentApi.verifyPayment({ token, data }),\n onSuccess: () => {\n toast.success(\"Payment verified successfully\");\n // Invalidate related queries\n queryClient.invalidateQueries({ queryKey: [\"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"transactions\"] });\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to verify payment\");\n },\n });\n\n const rejectMutation = useMutation({\n mutationFn: (data: RejectPaymentPayload) => paymentApi.rejectPayment({ token, data }),\n onSuccess: () => {\n toast.success(\"Payment rejected\");\n // Invalidate related queries\n queryClient.invalidateQueries({ queryKey: [\"orders\"] });\n queryClient.invalidateQueries({ queryKey: [\"transactions\"] });\n },\n onError: (error: Error) => {\n toast.error(error.message || \"Failed to reject payment\");\n },\n });\n\n return {\n verifyPayment: async (data) => {\n const result = await verifyMutation.mutateAsync(data);\n return result.data as VerificationResult;\n },\n isVerifying: verifyMutation.isPending,\n rejectPayment: async (data) => {\n const result = await rejectMutation.mutateAsync(data);\n return result.data as RejectResult;\n },\n isRejecting: rejectMutation.isPending,\n isLoading: verifyMutation.isPending || rejectMutation.isPending,\n };\n}\n"]}
|