@pakento/cms-sdk 4.0.10 → 4.0.12

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.js CHANGED
@@ -44,7 +44,7 @@ var import_crypto = require("crypto");
44
44
  var CacheService = class {
45
45
  constructor(defaultTTL, apiKey) {
46
46
  this.defaultTTL = defaultTTL;
47
- this.apiKeyHash = (0, import_crypto.createHash)("sha256").update(apiKey).digest("hex").substring(0, 8);
47
+ this.apiKeyHash = apiKey;
48
48
  if (process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN) {
49
49
  this.redis = new import_redis.Redis({
50
50
  url: process.env.UPSTASH_REDIS_REST_URL,
@@ -170,6 +170,7 @@ var CacheService = class {
170
170
  }
171
171
  async hasCache(functionName, params = {}) {
172
172
  if (!this.redis) {
173
+ console.warn("[PakentoSDK] Redis no configurado");
173
174
  return false;
174
175
  }
175
176
  try {
@@ -206,6 +207,7 @@ var CacheService = class {
206
207
  }
207
208
  async clearCache(functionName, params = {}) {
208
209
  if (!this.redis) {
210
+ console.warn("[PakentoSDK] Redis no configurado");
209
211
  return false;
210
212
  }
211
213
  try {
@@ -220,6 +222,7 @@ var CacheService = class {
220
222
  }
221
223
  async clearAllCache() {
222
224
  if (!this.redis) {
225
+ console.warn("[PakentoSDK] Redis no configurado");
223
226
  return false;
224
227
  }
225
228
  try {
@@ -238,6 +241,7 @@ var CacheService = class {
238
241
  }
239
242
  async getCacheInfo(functionName, params = {}) {
240
243
  if (!this.redis) {
244
+ console.warn("[PakentoSDK] Redis no configurado");
241
245
  return {
242
246
  exists: false,
243
247
  key: this.buildCacheKey(functionName, params)
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\nexport { CacheService } from \"./services/cache\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["axios","config"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["// Services\nexport { pakentoCMSAPI } from \"./services/api\";\nexport { CacheService } from \"./services/cache\";\n\n// Types\nexport type {\n // Base types\n Item,\n ItemImage,\n Category,\n Brand,\n Entity,\n\n // GraphQL Where conditions\n WhereEquals,\n ItemsWhere,\n CategoriesWhere,\n\n // API Parameters\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n\n // Raw API Response types\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n EntityRawResponse,\n\n // API Response types with error handling\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n} from \"./types\";\n","import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = apiKey;\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["axios","config"]}
package/dist/index.mjs CHANGED
@@ -7,7 +7,7 @@ import { createHash } from "crypto";
7
7
  var CacheService = class {
8
8
  constructor(defaultTTL, apiKey) {
9
9
  this.defaultTTL = defaultTTL;
10
- this.apiKeyHash = createHash("sha256").update(apiKey).digest("hex").substring(0, 8);
10
+ this.apiKeyHash = apiKey;
11
11
  if (process.env.UPSTASH_REDIS_REST_URL && process.env.UPSTASH_REDIS_REST_TOKEN) {
12
12
  this.redis = new Redis({
13
13
  url: process.env.UPSTASH_REDIS_REST_URL,
@@ -133,6 +133,7 @@ var CacheService = class {
133
133
  }
134
134
  async hasCache(functionName, params = {}) {
135
135
  if (!this.redis) {
136
+ console.warn("[PakentoSDK] Redis no configurado");
136
137
  return false;
137
138
  }
138
139
  try {
@@ -169,6 +170,7 @@ var CacheService = class {
169
170
  }
170
171
  async clearCache(functionName, params = {}) {
171
172
  if (!this.redis) {
173
+ console.warn("[PakentoSDK] Redis no configurado");
172
174
  return false;
173
175
  }
174
176
  try {
@@ -183,6 +185,7 @@ var CacheService = class {
183
185
  }
184
186
  async clearAllCache() {
185
187
  if (!this.redis) {
188
+ console.warn("[PakentoSDK] Redis no configurado");
186
189
  return false;
187
190
  }
188
191
  try {
@@ -201,6 +204,7 @@ var CacheService = class {
201
204
  }
202
205
  async getCacheInfo(functionName, params = {}) {
203
206
  if (!this.redis) {
207
+ console.warn("[PakentoSDK] Redis no configurado");
204
208
  return {
205
209
  exists: false,
206
210
  key: this.buildCacheKey(functionName, params)
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = createHash(\"sha256\")\n .update(apiKey)\n .digest(\"hex\")\n .substring(0, 8);\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["config"]}
1
+ {"version":3,"sources":["../src/services/api.ts","../src/services/cache.ts"],"sourcesContent":["import axios, { AxiosInstance, AxiosError } from \"axios\";\nimport type {\n GetItemsParams,\n GetCategoriesParams,\n GetBrandsParams,\n GetEntityParams,\n CreateEcommerceOrderParams,\n SendContactUsEmailParams,\n CustomGraphQLParams,\n ItemsApiResponse,\n CategoriesApiResponse,\n BrandsApiResponse,\n EntityApiResponse,\n CreateEcommerceOrderResponse,\n SendContactUsEmailResponse,\n CustomGraphQLResponse,\n ItemsRawResponse,\n CategoriesRawResponse,\n BrandsRawResponse,\n ItemsWhere,\n} from \"../types\";\n\nimport { CacheService } from \"./cache\";\nimport { z } from \"zod\";\n\nclass PakentoCMSAPI {\n private client: AxiosInstance;\n private cache: CacheService;\n private defaultTTL: number = 86400;\n private baseURL: string;\n private apiKey: string;\n\n constructor(config?: { cacheTTL?: number }) {\n this.baseURL = process.env.PAKENTO_CMS_BASE_URL || \"\";\n this.apiKey = process.env.PAKENTO_API_KEY || \"\";\n\n if (config?.cacheTTL && typeof config.cacheTTL === \"number\") {\n this.defaultTTL = config.cacheTTL;\n }\n\n this.cache = new CacheService(this.defaultTTL, this.apiKey);\n\n this.client = axios.create({\n baseURL: this.baseURL,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `users API-Key ${this.apiKey}`,\n },\n });\n\n // Interceptor para imprimir las URLs de las llamadas a la API\n this.client.interceptors.request.use(\n (config) => {\n const fullUrl = `${config.baseURL}${config.url}`;\n console.log(`🌐 API Call: ${config.method?.toUpperCase()} ${fullUrl}`);\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n }\n\n // Centralized error handler\n private handleApiError(error: unknown, context: string): string {\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n const responseMessage = error.response?.data?.message;\n if (status === 401) return \"API Key inválida o expirada\";\n if (status === 404) return `${context} no encontrado`;\n if (status && status >= 500) return \"Error del servidor CMS\";\n return (\n responseMessage || `Error de conexión en ${context}: ${error.message}`\n );\n } else if (error instanceof z.ZodError) {\n return `Validación fallida: ${error.issues\n .map((e: { message: string }) => e.message)\n .join(\", \")}`;\n } else if (error instanceof Error) {\n return error.message;\n }\n return \"Error desconocido\";\n }\n\n // Generic GraphQL fetcher\n private async fetchGraphQL<T>(\n query: string,\n variables: any,\n extractData: (responseData: any) => T\n ): Promise<{ data: T | null; error: boolean; errorMessage: string | null }> {\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query,\n variables,\n });\n\n if (response.data.errors) {\n const errorMessage = `GraphQL Error: ${response.data.errors[0].message}`;\n return { data: null, error: true, errorMessage };\n }\n\n const data = extractData(response.data.data);\n return { data, error: false, errorMessage: null };\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"GraphQL query\");\n return { data: null, error: true, errorMessage };\n }\n }\n\n async getItems(params: GetItemsParams = {}): Promise<ItemsApiResponse> {\n // Zod schema for validation\n const itemsSchema = z.object({\n where: z\n .object({\n item_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n item_super_category_id: z\n .object({ equals: z.string().optional() })\n .optional(),\n brand_id: z.object({ equals: z.string().optional() }).optional(),\n id: z.object({ equals: z.string().optional() }).optional(),\n })\n .optional(),\n onlyOffers: z.boolean().optional(),\n onlyEcommerce: z.boolean().optional(),\n limit: z.number().optional(),\n page: z.number().optional(),\n search: z.string().optional(),\n sort: z.string().optional(),\n minPrice: z.number().optional(),\n maxPrice: z.number().optional(),\n skipCache: z.boolean().optional(),\n cacheTTL: z.number().optional(),\n });\n\n const validatedParams = itemsSchema.safeParse(params);\n if (!validatedParams.success) {\n const errorMessage = this.handleApiError(\n validatedParams.error,\n \"getItems validation\"\n );\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n const { skipCache = false, cacheTTL, ...rest } = validatedParams.data;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceItems\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchItemsFromAPI(rest as GetItemsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchItemsFromAPI(\n params: GetItemsParams = {}\n ): Promise<ItemsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Use generic fetchGraphQL\n const query = `\n query GetEcommerceItems(\n $where: EcommerceItemsWhere\n $onlyOffers: Boolean\n $onlyEcommerce: Boolean\n $limit: Int\n $page: Int\n $search: String\n $sort: String\n $minPrice: Float\n $maxPrice: Float\n ) {\n GetEcommerceItems(\n where: $where\n onlyOffers: $onlyOffers\n onlyEcommerce: $onlyEcommerce\n limit: $limit\n page: $page\n search: $search\n sort: $sort\n minPrice: $minPrice\n maxPrice: $maxPrice\n ) {\n totalDocs\n totalPages\n prevPage\n nextPage\n docs {\n id\n name\n featured\n old_price\n currency_prefix\n description\n price_text\n price\n brand_id\n brand_name\n cover_image_url\n cover_image_thumbnail_url\n item_category_name\n item_category_id\n images {\n alt\n url\n thumbnail_url\n }\n }\n }\n }\n `;\n\n // Construir variables (similar to before)\n const whereConditions: ItemsWhere = {};\n if (params.where?.item_category_id?.equals) {\n whereConditions.item_category_id = {\n equals: params.where.item_category_id.equals,\n };\n }\n\n if (params.where?.item_super_category_id?.equals) {\n whereConditions.item_super_category_id = {\n equals: params.where.item_super_category_id.equals,\n };\n }\n\n if (params.where?.brand_id?.equals) {\n whereConditions.brand_id = { equals: params.where.brand_id.equals };\n }\n\n if (params.where?.id?.equals) {\n whereConditions.id = { equals: params.where.id.equals };\n }\n\n const variables = {\n ...params,\n where:\n Object.keys(whereConditions).length > 0 ? whereConditions : undefined,\n };\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<ItemsRawResponse>(\n query,\n variables,\n (responseData) => responseData.GetEcommerceItems\n );\n\n if (error) {\n return {\n data: null,\n items: [],\n totalDocs: 0,\n totalPages: 0,\n prevPage: null,\n nextPage: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data,\n items: data!.docs,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n prevPage: data!.prevPage,\n nextPage: data!.nextPage,\n error: false,\n errorMessage: null,\n };\n }\n\n async getCategories(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n const {\n skipCache = false,\n cacheTTL,\n ...rest\n } = params as GetCategoriesParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceCategories\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchCategoriesFromAPI(rest as GetCategoriesParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchCategoriesFromAPI(\n params: GetCategoriesParams = {}\n ): Promise<CategoriesApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceCategories(\n $where: EcommerceCategoriesWhere\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceCategories(\n where: $where\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n image_url\n }\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<CategoriesRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceCategories\n );\n\n if (error) {\n return {\n data: null,\n categories: [],\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!.docs,\n categories: data!.docs,\n error: false,\n errorMessage: null,\n };\n }\n\n async getBrands(params: GetBrandsParams = {}): Promise<BrandsApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetBrandsParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEcommerceBrands\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchBrandsFromAPI(rest as GetBrandsParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchBrandsFromAPI(\n params: GetBrandsParams = {}\n ): Promise<BrandsApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEcommerceBrands(\n $limit: Int\n $page: Int\n $sort: String\n ) {\n GetEcommerceBrands(\n limit: $limit\n page: $page\n sort: $sort\n ) {\n docs {\n id\n name\n description\n items_count\n image_url\n image_thumbnail_url\n image_alt\n }\n hasNextPage\n hasPrevPage\n limit\n nextPage\n offset\n page\n pagingCounter\n prevPage\n totalDocs\n totalPages\n }\n }\n `;\n\n const { data, error, errorMessage } =\n await this.fetchGraphQL<BrandsRawResponse>(\n query,\n params,\n (responseData) => responseData.GetEcommerceBrands\n );\n\n if (error) {\n return {\n data: null,\n brands: [],\n hasNextPage: false,\n hasPrevPage: false,\n limit: 0,\n nextPage: 0,\n offset: 0,\n page: 0,\n pagingCounter: 0,\n prevPage: 0,\n totalDocs: 0,\n totalPages: 0,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n brands: data!.docs,\n hasNextPage: data!.hasNextPage,\n hasPrevPage: data!.hasPrevPage,\n limit: data!.limit,\n nextPage: data!.nextPage,\n offset: data!.offset,\n page: data!.page,\n pagingCounter: data!.pagingCounter,\n prevPage: data!.prevPage,\n totalDocs: data!.totalDocs,\n totalPages: data!.totalPages,\n error: false,\n errorMessage: null,\n };\n }\n\n async getEntity(params: GetEntityParams = {}): Promise<EntityApiResponse> {\n const { skipCache = false, cacheTTL, ...rest } = params as GetEntityParams;\n const cacheKey = this.cache.buildCacheKey(\"GetEntity\", rest);\n return this.cache.getCachedOrFetch(\n cacheKey,\n () => this.fetchEntityFromAPI(rest as GetEntityParams),\n cacheTTL,\n skipCache\n );\n }\n\n private async fetchEntityFromAPI(\n params: GetEntityParams = {}\n ): Promise<EntityApiResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const query = `\n query GetEntity {\n GetEntity {\n id\n tin\n name\n web\n address\n country\n city\n currency_id\n currency_name\n currency_prefix\n currency_suffix\n logo_url\n logo_alt\n logo_thumbnail_url\n logo_sizes_thumbnail_filename\n logo_filename\n logo_width\n logo_height\n logo_2_url\n logo_2_alt\n logo_2_thumbnail_url\n logo_2_sizes_thumbnail_filename\n logo_2_filename\n logo_2_width\n logo_2_height\n featured_image_url\n featured_image_alt\n featured_image_thumbnail_url\n featured_image_sizes_thumbnail_filename\n featured_image_filename\n featured_image_width\n featured_image_height\n }\n }\n `;\n\n const { data, error, errorMessage } = await this.fetchGraphQL<any>(\n query,\n params,\n (responseData) => responseData.GetEntity\n );\n\n if (error) {\n return {\n data: null,\n entity: null,\n error: true,\n errorMessage,\n };\n }\n\n return {\n data: data!,\n entity: data!,\n error: false,\n errorMessage: null,\n };\n }\n\n async createEcommerceOrder(\n params: CreateEcommerceOrderParams\n ): Promise<CreateEcommerceOrderResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message: \"SDK no configurado\",\n error: true,\n errorMessage: \"SDK no configurado\",\n };\n }\n\n const orderSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n phone: z.string().optional(),\n notes: z.string().optional(),\n tin: z.string().optional(),\n items: z\n .array(\n z.object({\n id: z.number().positive(),\n quantity: z.number().positive(),\n })\n )\n .min(1),\n delivery_address: z.string().optional(),\n delivery_instructions: z.string().optional(),\n payment_method: z.enum([\"cash\", \"transfer\"]).optional(),\n });\n\n const validated = orderSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"createEcommerceOrder validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/orders/create-ecommerce-order\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Orden creada exitosamente\",\n order_id: response.data.order_id,\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage = response.data.message || \"Error al crear la orden\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"createEcommerceOrder\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n async executeCustomQuery<T>(\n params: CustomGraphQLParams<T>\n ): Promise<CustomGraphQLResponse<T>> {\n // Validar configuración antes de continuar\n if (!this.baseURL || !this.apiKey) {\n return {\n data: null as T,\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n // Validar que se proporcione un query\n if (\n !params.query ||\n typeof params.query !== \"string\" ||\n params.query.trim() === \"\"\n ) {\n return {\n data: null as T,\n error: true,\n errorMessage: \"Se requiere un query GraphQL válido.\",\n };\n }\n\n try {\n const response = await this.client.post(\"/api/graphql\", {\n query: params.query,\n variables: params.variables || {},\n });\n\n // Si hay errores de GraphQL, los incluimos en la respuesta pero no como error fatal\n if (response.data.errors && response.data.errors.length > 0) {\n return {\n data: response.data.data || (null as T),\n errors: response.data.errors,\n error: true,\n errorMessage: `GraphQL Errors: ${response.data.errors\n .map((err: unknown) => (err as Error).message)\n .join(\", \")}`,\n };\n }\n\n return {\n data: response.data.data,\n error: false,\n errorMessage: null,\n };\n } catch (error) {\n let errorMessage = \"Error desconocido\";\n\n if (error instanceof AxiosError) {\n const status = error.response?.status;\n if (status === 401) {\n errorMessage = \"API Key inválida o expirada\";\n } else if (status === 404) {\n errorMessage = \"Endpoint GraphQL no encontrado\";\n } else if (status === 400) {\n errorMessage = \"Query GraphQL inválido o malformado\";\n } else if (status && status >= 500) {\n errorMessage = \"Error del servidor CMS\";\n } else {\n errorMessage = `Error de conexión: ${error.message}`;\n }\n } else if (error instanceof Error) {\n errorMessage = error.message;\n }\n\n return {\n data: null as T,\n error: true,\n errorMessage,\n };\n }\n }\n\n async sendContactUsEmail(\n params: SendContactUsEmailParams\n ): Promise<SendContactUsEmailResponse> {\n if (!this.baseURL || !this.apiKey) {\n return {\n message:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n error: true,\n errorMessage:\n \"SDK no configurado: PAKENTO_CMS_BASE_URL o PAKENTO_API_KEY faltantes.\",\n };\n }\n\n const contactUsSchema = z.object({\n name: z.string().min(1),\n email: z.string().email(),\n subject: z.string().optional(),\n message: z.string().min(1),\n });\n\n const validated = contactUsSchema.safeParse(params);\n if (!validated.success) {\n const errorMessage = this.handleApiError(\n validated.error,\n \"sendContactUsEmail validation\"\n );\n return { message: errorMessage, error: true, errorMessage };\n }\n\n try {\n const response = await this.client.post(\n \"/api/entities/send-contact-us-email\",\n validated.data\n );\n\n if (response.status === 200) {\n return {\n message: response.data.message || \"Mensaje enviado exitosamente\",\n error: false,\n errorMessage: null,\n };\n } else {\n const errorMessage =\n response.data.message || \"Error al enviar el mensaje\";\n return { message: errorMessage, error: true, errorMessage };\n }\n } catch (error) {\n const errorMessage = this.handleApiError(error, \"sendContactUsEmail\");\n return { message: errorMessage, error: true, errorMessage };\n }\n }\n\n /**\n * Verifica si existe cache para una función y parámetros específicos\n */\n async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.hasCache(functionName, params);\n }\n\n /**\n * Obtiene la key de cache para una función y parámetros específicos\n */\n getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.cache.getCacheKey(functionName, params);\n }\n\n /**\n * Limpia el cache para una función y parámetros específicos\n */\n async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n return this.cache.clearCache(functionName, params);\n }\n\n /**\n * Limpia todo el cache relacionado con este API Key\n */\n async clearAllCache(): Promise<boolean> {\n return this.cache.clearAllCache();\n }\n\n /**\n * Obtiene información del cache (útil para debugging)\n */\n async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n return this.cache.getCacheInfo(functionName, params);\n }\n\n /**\n * Limpia un cache específico que pueda estar corrupto\n */\n async clearCorruptedCache(\n functionName: string, \n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n const key = this.cache.getCacheKey(functionName, params);\n return this.cache.clearCorruptedCache(key);\n }\n}\n\nexport const pakentoCMSAPI = new PakentoCMSAPI();\n","import { Redis } from \"@upstash/redis\";\nimport { createHash } from \"crypto\";\n\nexport class CacheService {\n private redis?: Redis;\n private defaultTTL: number;\n private apiKeyHash: string;\n\n constructor(defaultTTL: number, apiKey: string) {\n this.defaultTTL = defaultTTL;\n this.apiKeyHash = apiKey;\n\n if (\n process.env.UPSTASH_REDIS_REST_URL &&\n process.env.UPSTASH_REDIS_REST_TOKEN\n ) {\n this.redis = new Redis({\n url: process.env.UPSTASH_REDIS_REST_URL,\n token: process.env.UPSTASH_REDIS_REST_TOKEN,\n });\n }\n }\n\n private generateParamsHash(params: Record<string, unknown>): string {\n const sortedParams = Object.keys(params)\n .sort()\n .reduce((acc, key) => {\n acc[key] = params[key];\n return acc;\n }, {} as Record<string, unknown>);\n\n const paramsString = JSON.stringify(sortedParams);\n return createHash(\"sha256\")\n .update(paramsString)\n .digest(\"hex\")\n .substring(0, 16);\n }\n\n public buildCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n const paramsHash = this.generateParamsHash(params);\n return `pakento:${this.apiKeyHash}:${functionName}:${paramsHash}`;\n }\n\n private safeJsonParse<T>(data: unknown): T | null {\n try {\n // Si data ya es un objeto/array y no un string, lo retornamos directamente\n if (typeof data === \"object\" && data !== null) {\n return data as T;\n }\n\n // Si es un string, intentamos parsearlo\n if (typeof data === \"string\") {\n return JSON.parse(data) as T;\n }\n\n // Si es otro tipo primitivo, lo retornamos tal como está\n return data as T;\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en safeJsonParse:\", error);\n console.warn(\"[PakentoSDK] Datos que causaron error:\", {\n type: typeof data,\n isArray: Array.isArray(data),\n data: data,\n });\n return null;\n }\n }\n\n private serializeForCache(value: unknown): string {\n try {\n // Crear un wrapper con metadata para verificar integridad\n const cacheData = {\n __pakento_cache_version: \"1.0\",\n __pakento_timestamp: Date.now(),\n data: value,\n };\n return JSON.stringify(cacheData);\n } catch (error) {\n console.warn(\"[PakentoSDK] Error en serializeForCache:\", error);\n // Fallback a serialización simple\n return JSON.stringify(value);\n }\n }\n\n public async getCachedOrFetch<T>(\n key: string,\n fetcher: () => Promise<T>,\n ttl?: number,\n skipCache: boolean = false\n ): Promise<T> {\n if (!this.redis || skipCache) {\n console.log(\n `[PakentoSDK] ${\n !this.redis ? \"Redis no configurado\" : \"Saltando cache\"\n } - llamando a API`\n );\n return fetcher();\n }\n\n try {\n console.log(`[PakentoSDK] Buscando en cache: ${key}`);\n const cached = await this.redis.get(key);\n\n if (cached !== null && cached !== undefined) {\n console.log(`[PakentoSDK] ✅ Cache hit para: ${key}`);\n\n try {\n const parsed = this.safeJsonParse(cached);\n\n if (parsed !== null) {\n // Verificar si es el nuevo formato con metadata\n if (\n typeof parsed === \"object\" &&\n parsed !== null &&\n \"__pakento_cache_version\" in parsed &&\n \"data\" in parsed\n ) {\n console.log(\n `[PakentoSDK] ✅ Cache con metadata válido para: ${key}`\n );\n return (parsed as any).data as T;\n }\n // Formato legacy sin metadata\n else {\n console.log(`[PakentoSDK] ✅ Cache legacy válido para: ${key}`);\n return parsed as T;\n }\n } else {\n console.warn(`[PakentoSDK] ⚠️ Error parseando cache para: ${key}`);\n console.warn(`[PakentoSDK] Datos raw del cache:`, {\n type: typeof cached,\n value: cached,\n });\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(\n `[PakentoSDK] Error limpiando cache corrupto: ${err}`\n )\n );\n }\n } catch (parseError) {\n console.warn(\n `[PakentoSDK] ⚠️ Excepción parseando cache para: ${key}:`,\n parseError\n );\n // Limpiar cache corrupto de manera asíncrona\n this.clearCorruptedCache(key).catch((err) =>\n console.warn(`[PakentoSDK] Error limpiando cache corrupto: ${err}`)\n );\n }\n } else {\n console.log(`[PakentoSDK] ❌ Cache miss para: ${key}`);\n }\n } catch (err) {\n console.warn(\"[PakentoSDK] Error leyendo cache Redis\", err);\n }\n\n console.log(`[PakentoSDK] Llamando a API para: ${key}`);\n const result = await fetcher();\n\n try {\n const serializedData = this.serializeForCache(result);\n await this.redis.set(key, serializedData, {\n ex: ttl ?? this.defaultTTL,\n });\n console.log(\n `[PakentoSDK] ✅ Guardado en cache: ${key} (TTL: ${\n ttl ?? this.defaultTTL\n }s)`\n );\n } catch (err) {\n console.warn(\"[PakentoSDK] Error escribiendo cache Redis\", err);\n console.warn(\"[PakentoSDK] Detalles del error:\", {\n error: err,\n key: key,\n resultType: typeof result,\n resultSize: JSON.stringify(result).length,\n });\n }\n\n return result;\n }\n\n public async hasCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const cached = await this.redis.get(key);\n\n if (cached === null || cached === undefined) {\n return false;\n }\n\n // Verificar que el cache se puede parsear correctamente\n const parsed = this.safeJsonParse(cached);\n return parsed !== null;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error verificando cache\", err);\n return false;\n }\n }\n\n /**\n * Limpia un cache específico si está corrupto\n */\n public async clearCorruptedCache(key: string): Promise<boolean> {\n if (!this.redis) {\n return false;\n }\n\n try {\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache corrupto limpiado: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache corrupto\", err);\n return false;\n }\n }\n\n public getCacheKey(\n functionName: string,\n params: Record<string, unknown> = {}\n ): string {\n return this.buildCacheKey(functionName, params);\n }\n\n public async clearCache(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n await this.redis.del(key);\n console.log(`[PakentoSDK] ✅ Cache limpiado para: ${key}`);\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando cache\", err);\n return false;\n }\n }\n\n public async clearAllCache(): Promise<boolean> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return false;\n }\n\n try {\n console.log(`[PakentoSDK] limpiando cache para ${this.apiKeyHash}`);\n const pattern = `pakento:${this.apiKeyHash}:*`;\n const keys = await this.redis.keys(pattern);\n\n if (keys.length > 0) {\n await this.redis.del(...keys);\n console.log(`[PakentoSDK] ✅ Cache limpiado para ${keys.length} keys`);\n }\n\n return true;\n } catch (err) {\n console.warn(\"[PakentoSDK] Error limpiando todo el cache\", err);\n return false;\n }\n }\n\n public async getCacheInfo(\n functionName: string,\n params: Record<string, unknown> = {}\n ): Promise<{\n exists: boolean;\n key: string;\n ttl?: number;\n }> {\n if (!this.redis) {\n console.warn(\"[PakentoSDK] Redis no configurado\");\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n\n try {\n const key = this.buildCacheKey(functionName, params);\n const exists = await this.redis.exists(key);\n const ttl = exists ? await this.redis.ttl(key) : undefined;\n\n return {\n exists: exists === 1,\n key,\n ttl: ttl === -1 ? undefined : ttl,\n };\n } catch (err) {\n console.warn(\"[PakentoSDK] Error obteniendo info del cache\", err);\n return {\n exists: false,\n key: this.buildCacheKey(functionName, params),\n };\n }\n }\n}\n"],"mappings":"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","names":["config"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pakento/cms-sdk",
3
- "version": "4.0.10",
3
+ "version": "4.0.12",
4
4
  "description": "SDK para conectar tiendas en línea con Pakento CMS",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",