better-auth-mp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/DISCLAIMER.md +51 -0
- package/LICENSE +21 -0
- package/README.es.md +233 -0
- package/README.md +233 -0
- package/dist/client-plugin.cjs +13 -0
- package/dist/client-plugin.cjs.map +1 -0
- package/dist/client-plugin.d.cts +15 -0
- package/dist/client-plugin.d.ts +15 -0
- package/dist/client-plugin.js +10 -0
- package/dist/client-plugin.js.map +1 -0
- package/dist/index.cjs +1403 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +574 -0
- package/dist/index.d.ts +574 -0
- package/dist/index.js +1396 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.cjs +121 -0
- package/dist/schemas.cjs.map +1 -0
- package/dist/schemas.d.cts +428 -0
- package/dist/schemas.d.ts +428 -0
- package/dist/schemas.js +108 -0
- package/dist/schemas.js.map +1 -0
- package/dist/types.cjs +195 -0
- package/dist/types.cjs.map +1 -0
- package/dist/types.d.cts +485 -0
- package/dist/types.d.ts +485 -0
- package/dist/types.js +190 -0
- package/dist/types.js.map +1 -0
- package/package.json +77 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas.ts","../src/security/rate-limiter.ts","../src/security/idempotency.ts","../src/security/webhook-verify.ts","../src/security/validation-rules.ts","../src/security/sanitize-metadata.ts","../src/endpoints/preference.ts","../src/endpoints/subscription.ts","../src/endpoints/webhook.ts","../src/index.ts"],"names":["z","store","crypto","createAuthEndpoint","getSessionFromCtx","APIError","generateId","Preference","CreateSubscriptionSchema","CreatePlanSchema","UpdateSubscriptionSchema","CreateSubscriptionWithPlanSchema","PreApproval","PreApprovalPlan","notification","Payment","getPaymentResultType","MercadoPagoConfig"],"mappings":"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","file":"index.cjs","sourcesContent":["import { z } from \"zod\";\n\nexport const PreferenceItemSchema = z.object({\n categoryId: z.string().max(50).optional(),\n currencyId: z.string().length(3),\n description: z.string().max(500).optional(),\n id: z.string().min(1).max(100),\n pictureUrl: z.string().url().optional(),\n quantity: z.number().int().positive().max(10_000),\n title: z.string().min(1).max(250),\n unitPrice: z.number().positive().max(100_000_000),\n});\n\nexport const BackUrlsSchema = z.object({\n failure: z.string().url().optional(),\n pending: z.string().url().optional(),\n success: z.string().url().optional(),\n});\n\nconst RESERVED_METADATA_KEYS = new Set([\n \"userId\",\n \"externalReference\",\n \"preferenceId\",\n \"paymentId\",\n \"subscriptionId\",\n \"status\",\n \"amount\",\n \"currency\",\n]);\n\nconst MetadataValueSchema = z.union([\n z.string().max(1000),\n z.number(),\n z.boolean(),\n]);\n\nexport const MetadataSchema = z\n .record(z.string(), MetadataValueSchema)\n .refine(\n (data) => {\n const keys = Object.keys(data);\n return !keys.some((key) => RESERVED_METADATA_KEYS.has(key));\n },\n {\n message: \"Metadata contains reserved keys\",\n }\n )\n .refine(\n (data) => {\n const jsonString = JSON.stringify(data);\n return jsonString.length <= 5000;\n },\n {\n message: \"Metadata exceeds maximum size (5KB)\",\n }\n );\n\nexport const MercadoPagoPreferenceSchema = z.object({\n backUrls: BackUrlsSchema.optional(),\n items: z.array(PreferenceItemSchema).min(1).max(100),\n metadata: MetadataSchema.optional(),\n});\n\nexport const SubscriptionAutoRecurringSchema = z.object({\n currencyId: z.string().length(3),\n endDate: z.string().datetime().optional(),\n frequency: z.number().int().positive().max(365),\n frequencyType: z.enum([\"days\", \"weeks\", \"months\"]),\n startDate: z.string().datetime().optional(),\n transactionAmount: z.number().positive().max(100_000_000),\n});\n\nexport const CreateSubscriptionSchema = z.object({\n autoRecurring: SubscriptionAutoRecurringSchema,\n backUrl: z.string().url().optional(),\n idempotencyKey: z.string().max(36).optional(),\n metadata: MetadataSchema.optional(),\n payerEmail: z.string().email(),\n reason: z.string().min(1).max(250),\n});\n\nexport const IdentificationSchema = z.object({\n number: z.string().min(1).max(20),\n type: z.string().min(1).max(50),\n});\n\nexport const CreateSubscriptionWithPlanSchema = z.object({\n cardTokenId: z.string().min(1),\n idempotencyKey: z.string().max(36).optional(),\n identification: IdentificationSchema.optional(),\n metadata: MetadataSchema.optional(),\n payerEmail: z.string().email(),\n planId: z.string().min(1),\n});\n\nexport const CreatePlanSchema = z.object({\n autoRecurring: SubscriptionAutoRecurringSchema,\n description: z.string().max(500).optional(),\n metadata: MetadataSchema.optional(),\n name: z.string().min(1).max(100),\n});\n\nexport const MarketplaceFeeSchema = z.object({\n type: z.enum([\"flat\", \"percentage\"]),\n value: z.number().positive().max(100_000_000),\n});\n\nexport const CreatePreferenceWithMarketplaceSchema = z.object({\n backUrls: BackUrlsSchema.optional(),\n idempotencyKey: z.string().max(36).optional(),\n items: z.array(PreferenceItemSchema).min(1).max(100),\n marketplaceFee: MarketplaceFeeSchema.optional(),\n metadata: MetadataSchema.optional(),\n sellerId: z.string().min(1),\n});\n\nexport const UpdateSubscriptionSchema = z.object({\n status: z.enum([\"paused\", \"authorized\"]),\n});\n\nexport type PreferenceItemInput = z.infer<typeof PreferenceItemSchema>;\nexport type BackUrlsInput = z.infer<typeof BackUrlsSchema>;\nexport type MetadataInput = z.infer<typeof MetadataSchema>;\nexport type CreatePreferenceInput = z.infer<typeof MercadoPagoPreferenceSchema>;\nexport type CreateSubscriptionInput = z.infer<typeof CreateSubscriptionSchema>;\nexport type CreateSubscriptionWithPlanInput = z.infer<\n typeof CreateSubscriptionWithPlanSchema\n>;\nexport type CreatePlanInput = z.infer<typeof CreatePlanSchema>;\nexport type UpdateSubscriptionInput = z.infer<typeof UpdateSubscriptionSchema>;\n","// ============================================\n// RATE LIMITER - In-Memory Implementation\n// ============================================\n//\n// Simple in-memory rate limiter for plugin operations.\n// For production, consider using Redis or similar.\n//\n// SECURITY: This is a basic implementation. For production,\n// implement distributed rate limiting with proper storage.\n\ninterface RateLimitEntry {\n count: number;\n resetTime: number;\n}\n\nconst store = new Map<string, RateLimitEntry>();\n\n/**\n * Check if the request should be rate limited\n * @param {string} key - Unique identifier for the request\n * @param {number} max - Maximum requests allowed\n * @param {number} windowMs - Time window in milliseconds\n * @returns {boolean} true if allowed, false if rate limited\n */\nexport function checkRateLimit(\n key: string,\n max: number,\n windowMs: number\n): boolean {\n const now = Date.now();\n const entry = store.get(key);\n\n if (!entry || now > entry.resetTime) {\n // New window\n store.set(key, {\n count: 1,\n resetTime: now + windowMs,\n });\n return true;\n }\n\n if (entry.count >= max) {\n // Rate limited\n return false;\n }\n\n // Increment count\n entry.count += 1;\n return true;\n}\n\n/**\n * Get remaining requests for a key\n */\nexport function getRemainingRequests(key: string, max: number): number {\n const entry = store.get(key);\n if (!entry) return max;\n if (Date.now() > entry.resetTime) return max;\n return Math.max(0, max - entry.count);\n}\n\n/**\n * Get reset time for a key\n */\nexport function getResetTime(key: string): number | null {\n const entry = store.get(key);\n if (!entry) return null;\n if (Date.now() > entry.resetTime) return null;\n return entry.resetTime;\n}\n\n/**\n * Clear rate limit for a key\n */\nexport function clearRateLimit(key: string): void {\n store.delete(key);\n}\n\n/**\n * Clear all rate limits (useful for testing)\n */\nexport function clearAllRateLimits(): void {\n store.clear();\n}\n\n// ============================================\n// EXPORT DEFAULT OBJECT (like the example)\n// ============================================\n\nexport const rateLimiter = {\n check: checkRateLimit,\n clear: clearRateLimit,\n clearAll: clearAllRateLimits,\n getRemaining: getRemainingRequests,\n getResetTime,\n};\n","// ============================================\n// IDEMPOTENCY STORE - In-Memory Implementation\n// ============================================\n//\n// Stores results of expensive operations to prevent duplicate processing.\n// For production, consider using Redis with TTL.\n//\n// SECURITY: This stores sensitive data in memory. Ensure proper\n// cleanup and consider encryption for production use.\n\ninterface IdempotencyEntry<T> {\n value: T;\n expiresAt: number;\n}\n\nconst store = new Map<string, IdempotencyEntry<unknown>>();\n\n// Default TTL: 24 hours\nconst DEFAULT_TTL = 24 * 60 * 60 * 1000;\n\n/**\n * Get a cached result by key\n */\nexport function getIdempotencyKey<T>(key: string): T | null {\n const entry = store.get(key);\n\n if (!entry) {\n return null;\n }\n\n if (Date.now() > entry.expiresAt) {\n // Expired, remove it\n store.delete(key);\n return null;\n }\n\n return entry.value as T;\n}\n\n/**\n * Store a result with key\n */\nexport function setIdempotencyKey<T>(\n key: string,\n value: T,\n ttl: number = DEFAULT_TTL\n): void {\n store.set(key, {\n expiresAt: Date.now() + ttl,\n value,\n });\n}\n\n/**\n * Check if an idempotency key exists and is valid\n */\nexport function hasIdempotencyKey(key: string): boolean {\n return getIdempotencyKey(key) !== null;\n}\n\n/**\n * Delete an idempotency key\n */\nexport function deleteIdempotencyKey(key: string): void {\n store.delete(key);\n}\n\n/**\n * Clear all idempotency keys (useful for testing)\n */\nexport function clearIdempotencyStore(): void {\n store.clear();\n}\n\n/**\n * Cleanup expired entries\n */\nexport function cleanupExpiredEntries(): number {\n const now = Date.now();\n let cleaned = 0;\n\n for (const [key, entry] of store.entries()) {\n if (now > entry.expiresAt) {\n store.delete(key);\n cleaned += 1;\n }\n }\n\n return cleaned;\n}\n\n// ============================================\n// EXPORT DEFAULT OBJECT\n// ============================================\n\nexport const idempotencyStore = {\n cleanup: cleanupExpiredEntries,\n clear: clearIdempotencyStore,\n delete: deleteIdempotencyKey,\n get: getIdempotencyKey,\n has: hasIdempotencyKey,\n set: setIdempotencyKey,\n};\n\n/**\n * Validate idempotency key format\n * Key should be alphanumeric with hyphens, 36 chars max\n */\nexport function validateIdempotencyKey(key: string): boolean {\n if (!key || key.length > 36) {\n return false;\n }\n // Allow alphanumeric, hyphens, underscores\n return /^[a-zA-Z0-9_-]+$/.test(key);\n}\n","// ============================================\n// WEBHOOK SIGNATURE VERIFICATION\n// ============================================\n//\n// Verifies MercadoPago webhook signatures using HMAC-SHA256.\n//\n// SECURITY: This is critical for security. Ensure:\n// - Always verify signatures in production\n// - Use constant-time comparison to prevent timing attacks\n// - Store webhookSecret securely\n\nimport crypto, { createHmac, timingSafeEqual } from \"node:crypto\";\n\ninterface VerifyWebhookSignatureParams {\n /** Signature header from MP */\n xSignature?: string | null;\n /** Request ID header from MP */\n xRequestId?: string | null;\n /** Payment/Subscription ID from notification data */\n dataId: string;\n /** Webhook secret from MP config */\n secret: string;\n}\n\n/**\n * Verify Mercado Pago webhook signature\n * https://www.mercadopago.com/developers/en/docs/subscriptions/additional-content/security/signature\n */\nexport function verifyWebhookSignature(\n params: VerifyWebhookSignatureParams\n): boolean {\n const { xSignature, xRequestId, dataId, secret } = params;\n\n if (!xSignature || !xRequestId) {\n return false;\n }\n\n // Parse x-signature header\n // Format: \"ts=1234567890,v1=hash\"\n const parts = xSignature.split(\",\");\n const ts = parts.find((p) => p.startsWith(\"ts=\"))?.split(\"=\")[1];\n const hash = parts.find((p) => p.startsWith(\"v1=\"))?.split(\"=\")[1];\n\n if (!ts || !hash) {\n return false;\n }\n\n // Build the manifest (exactly as MP does)\n const manifest = `id:${dataId};request-id:${xRequestId};ts:${ts};`;\n\n // Create HMAC SHA256\n const hmac = crypto.createHmac(\"sha256\", secret);\n hmac.update(manifest);\n const expectedHash = hmac.digest(\"hex\");\n\n // Compare hashes (constant-time comparison)\n // Ensure both buffers have the same length before comparing\n const hashBuffer = Buffer.from(hash);\n const expectedBuffer = Buffer.from(expectedHash);\n\n if (hashBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return crypto.timingSafeEqual(hashBuffer, expectedBuffer);\n}\n\n/**\n * Alternative verification using the older v1 format\n * This is kept for backward compatibility\n */\nexport function verifyWebhookSignatureV1(\n dataId: string,\n secret: string,\n signature: string\n): boolean {\n const expectedSignature = createHmac(\"sha256\", secret)\n .update(dataId)\n .digest(\"hex\");\n\n const sigBuffer = Buffer.from(signature, \"hex\");\n const expectedBuffer = Buffer.from(expectedSignature, \"hex\");\n\n if (sigBuffer.length !== expectedBuffer.length) {\n return false;\n }\n\n return timingSafeEqual(sigBuffer, expectedBuffer);\n}\n\n/**\n * Simple signature verification for testing\n * (not secure for production)\n */\nexport function verifyWebhookSignatureSimple(\n dataId: string,\n secret: string,\n signature: string\n): boolean {\n const expectedSignature = createHmac(\"sha256\", secret)\n .update(dataId)\n .digest(\"hex\");\n\n return signature === expectedSignature;\n}\n","// ============================================\n// VALIDATION RULES - Payment Validation\n// ============================================\n//\n// Validation rules for MercadoPago payment operations.\n//\n// SECURITY: These are basic validations. Add more strict\n// validation rules based on your business requirements.\n\n// Supported currency codes by MercadoPago\nconst SUPPORTED_CURRENCIES = [\n \"ARS\",\n \"BRL\",\n \"CLP\",\n \"COP\",\n \"MXN\",\n \"PEN\",\n \"UYU\",\n \"USD\",\n] as const;\n\n// Minimum and maximum payment amounts (in cents)\nconst MIN_AMOUNT = 100;\nconst MAX_AMOUNT = 100_000_000;\n\nexport type SupportedCurrency = (typeof SUPPORTED_CURRENCIES)[number];\n\n/**\n * Validate currency code\n */\nexport function validateCurrency(currency: string): boolean {\n return SUPPORTED_CURRENCIES.includes(currency as SupportedCurrency);\n}\n\n/**\n * Validate payment amount (in cents)\n */\nexport function validateAmount(amount: number): boolean {\n return amount >= MIN_AMOUNT && amount <= MAX_AMOUNT;\n}\n\n/**\n * Validate total payment amount\n */\nexport function validateTotalAmount(amount: number): boolean {\n return validateAmount(amount);\n}\n\n/**\n * Compare expected amount with actual payment amount\n * Allows for small differences due to rounding\n */\nexport function validatePaymentAmount(\n expectedAmount: number,\n actualAmount: number\n): boolean {\n // Allow 1% difference for rounding\n const tolerance = expectedAmount * 0.01;\n return Math.abs(expectedAmount - actualAmount) <= tolerance;\n}\n\n// ============================================\n// EXPORT DEFAULT OBJECT (like the example)\n// ============================================\n\nexport const ValidationRules = {\n amount: validateAmount,\n currency: validateCurrency,\n totalAmount: validateTotalAmount,\n validatePaymentAmount,\n};\n\n// ============================================\n// ADDITIONAL HELPERS\n// ============================================\n\n/**\n * Get supported currencies\n */\nexport function getSupportedCurrencies(): readonly string[] {\n return SUPPORTED_CURRENCIES;\n}\n\n/**\n * Format amount from cents to display\n */\nexport function formatAmount(amount: number, currency: string): string {\n const value = amount / 100;\n return new Intl.NumberFormat(\"es-AR\", {\n currency,\n style: \"currency\",\n }).format(value);\n}\n\n/**\n * Parse amount from display to cents\n */\nexport function parseAmount(value: string): number {\n // Remove currency symbols and spaces\n const cleaned = value.replaceAll(/[^0-9.,]/g, \"\").replace(\",\", \".\");\n const parsed = Number.parseFloat(cleaned);\n return Math.round(parsed * 100);\n}\n","// ============================================\n// METADATA SANITIZATION\n// ============================================\n//\n// Sanitizes metadata to prevent security issues.\n// - Removes reserved keys that could conflict with plugin internals\n// - Validates types\n// - Limits size\n//\n// SECURITY: Critical to prevent metadata injection attacks.\n\n// Reserved keys that cannot be set via user metadata\nconst RESERVED_KEYS = [\n \"userId\",\n \"externalReference\",\n \"preferenceId\",\n \"paymentId\",\n \"subscriptionId\",\n \"status\",\n \"amount\",\n \"currency\",\n \"_plugin_internal\",\n] as const;\n\n// Maximum metadata size (in characters)\nconst MAX_METADATA_SIZE = 5000;\n\n/**\n * Sanitize metadata object\n * Removes reserved keys and validates types\n */\nexport function sanitizeMetadata(\n metadata: Record<string, unknown>\n): Record<string, string> {\n const sanitized: Record<string, string> = {};\n\n for (const [key, value] of Object.entries(metadata)) {\n // Skip reserved keys\n if (RESERVED_KEYS.includes(key as (typeof RESERVED_KEYS)[number])) {\n continue;\n }\n\n // Skip undefined/null values\n if (value === undefined || value === null) {\n continue;\n }\n\n // Convert value to string\n let stringValue: string;\n\n if (typeof value === \"string\") {\n stringValue = value;\n } else if (typeof value === \"number\" || typeof value === \"boolean\") {\n stringValue = String(value);\n } else {\n // JSON stringify objects\n stringValue = JSON.stringify(value);\n }\n\n // Skip empty values\n if (!stringValue || stringValue.trim() === \"\") {\n continue;\n }\n\n sanitized[key] = stringValue;\n }\n\n return sanitized;\n}\n\n/**\n * Check if metadata contains reserved keys\n */\nexport function hasReservedKeys(metadata: Record<string, unknown>): boolean {\n return Object.keys(metadata).some((key) =>\n RESERVED_KEYS.includes(key as (typeof RESERVED_KEYS)[number])\n );\n}\n\n/**\n * Get reserved keys list\n */\nexport function getReservedKeys(): readonly string[] {\n return RESERVED_KEYS;\n}\n\n/**\n * Validate metadata size\n */\nexport function validateMetadataSize(\n metadata: Record<string, unknown>\n): boolean {\n const jsonString = JSON.stringify(metadata);\n return jsonString.length <= MAX_METADATA_SIZE;\n}\n\n/**\n * Get metadata size in characters\n */\nexport function getMetadataSize(metadata: Record<string, unknown>): number {\n return JSON.stringify(metadata).length;\n}\n\n/**\n * Safe JSON parse for metadata\n */\nexport function parseMetadata(\n metadataString: string\n): Record<string, unknown> | null {\n try {\n const parsed = JSON.parse(metadataString);\n if (typeof parsed !== \"object\" || parsed === null) {\n return null;\n }\n return parsed;\n } catch {\n return null;\n }\n}\n","import { generateId } from \"better-auth\";\nimport {\n APIError,\n createAuthEndpoint,\n getSessionFromCtx,\n} from \"better-auth/api\";\nimport { Preference } from \"mercadopago\";\nimport type { MercadoPagoConfig } from \"mercadopago\";\nimport type { PreferenceCreateData } from \"mercadopago/dist/clients/preference/create/types\";\nimport { z } from \"zod\";\n\nimport { MercadoPagoPreferenceSchema } from \"../schemas\";\nimport {\n idempotencyStore,\n rateLimiter,\n sanitizeMetadata,\n ValidationRules,\n validateIdempotencyKey,\n} from \"../security\";\nimport type {\n MercadoPagoPluginOptions,\n PaymentOutput,\n PaginatedPayments,\n PreferenceOutput,\n} from \"../types\";\n\n/**\n * Helper function to get payment result type\n */\nfunction getPaymentResultType(\n mpStatus: string\n): \"success\" | \"pending\" | \"error\" {\n switch (mpStatus) {\n case \"approved\":\n case \"authorized\": {\n return \"success\";\n }\n case \"pending\":\n case \"in_process\": {\n return \"pending\";\n }\n case \"rejected\":\n case \"cancelled\":\n case \"refunded\":\n case \"charged_back\":\n case \"in_mediation\": {\n return \"error\";\n }\n default: {\n return \"pending\";\n }\n }\n}\n\nexport const createPreferenceEndpoints = (\n client: MercadoPagoConfig,\n options: MercadoPagoPluginOptions\n) => ({\n createPayment: createAuthEndpoint(\n \"/mercado-pago/create-payment\",\n {\n body: z.object({\n ...MercadoPagoPreferenceSchema.shape,\n idempotencyKey: z.string().optional(),\n }),\n method: \"POST\",\n },\n async (ctx): Promise<PreferenceOutput> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const rateLimitKey = `payment:create:${session.user.id}`;\n if (!rateLimiter.check(rateLimitKey, 10, 60 * 1000)) {\n throw new APIError(\"TOO_MANY_REQUESTS\", {\n message:\n \"Too many payment creation attempts. Please try again later.\",\n });\n }\n\n const { backUrls, items, metadata, idempotencyKey } = ctx.body;\n\n // Destructure with fallback to empty object if undefined\n const {\n success: successUrl,\n failure: failureUrl,\n pending: pendingUrl,\n } = backUrls || {};\n\n // Use provided URLs or fallback to defaults\n const finalBackUrls = {\n failure:\n failureUrl || `${options.baseUrl}/payments/one-time?status=failure`,\n pending:\n pendingUrl || `${options.baseUrl}/payments/one-time?status=pending`,\n success:\n successUrl || `${options.baseUrl}/payments/one-time?status=success`,\n };\n\n // Validate that at least success URL exists\n if (!finalBackUrls.success) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Missing required backUrl.success\",\n });\n }\n\n if (idempotencyKey) {\n if (!validateIdempotencyKey(idempotencyKey)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid idempotency key format\",\n });\n }\n\n const cachedResult = idempotencyStore.get(idempotencyKey);\n if (cachedResult) {\n return ctx.json(cachedResult) as Promise<PreferenceOutput>;\n }\n }\n\n if (items.some((item) => !ValidationRules.currency(item.currencyId))) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid currency code\",\n });\n }\n\n const sanitizedMetadata = metadata ? sanitizeMetadata(metadata) : {};\n\n const totalAmount = items.reduce(\n (sum, item) => sum + item.unitPrice * item.quantity,\n 0\n );\n\n if (!ValidationRules.amount(totalAmount)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid payment amount\",\n });\n }\n\n const externalReference = generateId();\n\n const preferenceBody: PreferenceCreateData[\"body\"] = {\n // Activar esto solo si el .env tiene un https sino no andara\n auto_return: \"approved\",\n back_urls: finalBackUrls,\n expires: true,\n external_reference: externalReference,\n items: items.map((item) => ({\n currency_id: item.currencyId,\n id: item.id,\n quantity: item.quantity,\n title: item.title,\n unit_price: item.unitPrice,\n })),\n metadata: {\n ...sanitizedMetadata,\n userId: session.user.id,\n },\n };\n\n const preference = await new Preference(client)\n .create({\n body: preferenceBody,\n })\n .catch((error) => {\n console.error(\">>> MP PREFERENCE ERROR:\", error);\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: `MP PREFERENCE ERROR: ${error.message}`,\n });\n });\n\n const payment = await ctx.context.adapter.create({\n data: {\n amount: totalAmount,\n createdAt: new Date(),\n currency: items[0]?.currencyId || \"ARS\",\n externalReference,\n metadata: JSON.stringify({\n ...sanitizedMetadata,\n preferenceId: preference.id,\n }),\n preferenceId: preference.id,\n status: \"pending\",\n updatedAt: new Date(),\n userId: session.user.id,\n },\n model: \"mercadoPagoPayment\",\n });\n\n if (!preference.init_point || !payment.id || !preference.id) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Something went wrong\",\n });\n }\n\n const result: PreferenceOutput = {\n checkoutUrl: preference.init_point,\n paymentId: payment.id,\n preferenceId: preference.id,\n };\n\n if (idempotencyKey) {\n idempotencyStore.set(idempotencyKey, result);\n }\n\n return ctx.json(result);\n }\n ),\n\n getPayment: createAuthEndpoint(\n \"/mercado-pago/get-payment\",\n {\n body: z.object({\n externalReference: z.string(),\n }),\n method: \"POST\",\n },\n async (ctx): Promise<PaymentOutput> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { externalReference } = ctx.body;\n\n const payment = await ctx.context.adapter.findOne({\n model: \"mercadoPagoPayment\",\n where: [\n { field: \"externalReference\", value: externalReference },\n { field: \"userId\", value: session.user.id },\n ],\n });\n\n if (!payment) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Payment not found\",\n });\n }\n\n return ctx.json(payment as PaymentOutput);\n }\n ),\n\n getPayments: createAuthEndpoint(\n \"/mercado-pago/get-payments\",\n {\n body: z.object({\n filters: z\n .object({\n dateCreatedFrom: z.string().optional(),\n dateCreatedTo: z.string().optional(),\n status: z\n .enum([\n \"pending\",\n \"approved\",\n \"authorized\",\n \"in_process\",\n \"in_mediation\",\n \"rejected\",\n \"cancelled\",\n \"refunded\",\n \"charged_back\",\n ])\n .optional(),\n })\n .optional(),\n limit: z.number().min(1).max(100).default(20),\n offset: z.number().min(0).default(0),\n }),\n method: \"POST\",\n },\n async (ctx): Promise<PaginatedPayments> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { filters, limit, offset } = ctx.body;\n\n // Build where conditions\n const whereConditions: { field: string; value: string }[] = [\n { field: \"userId\", value: session.user.id },\n ];\n\n if (filters?.status) {\n whereConditions.push({ field: \"status\", value: filters.status });\n }\n\n // Get total count\n const total = await ctx.context.adapter.count({\n model: \"mercadoPagoPayment\",\n where: whereConditions,\n });\n\n // Get paginated results\n const payments = await ctx.context.adapter.findMany({\n limit,\n model: \"mercadoPagoPayment\",\n offset,\n sortBy: { direction: \"desc\", field: \"createdAt\" },\n where: whereConditions,\n });\n\n return ctx.json({\n limit,\n offset,\n payments: payments as PaymentOutput[],\n total,\n } as PaginatedPayments);\n }\n ),\n});\n\nexport { getPaymentResultType };\n","import { generateId } from \"better-auth\";\nimport {\n APIError,\n createAuthEndpoint,\n getSessionFromCtx,\n} from \"better-auth/api\";\nimport { PreApproval, PreApprovalPlan } from \"mercadopago\";\nimport type { MercadoPagoConfig } from \"mercadopago\";\nimport { z } from \"zod\";\n\nimport {\n idempotencyStore,\n rateLimiter,\n sanitizeMetadata,\n ValidationRules,\n validateIdempotencyKey,\n} from \"../security\";\nimport type {\n MercadoPagoPluginOptions,\n SubscriptionOutput,\n PlanOutput,\n} from \"../types\";\n\n/**\n * Schema for creating a subscription (without plan - pending payment)\n */\nconst CreateSubscriptionSchema = z.object({\n autoRecurring: z.object({\n currencyId: z.string().min(1),\n endDate: z.string().optional(),\n frequency: z.number().min(1),\n frequencyType: z.enum([\"days\", \"weeks\", \"months\"]),\n startDate: z.string().optional(),\n transactionAmount: z.number().min(1),\n }),\n backUrl: z.string().url().optional(),\n idempotencyKey: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n payerEmail: z.string().email(),\n reason: z.string().min(1),\n});\n\n/**\n * Schema for creating a plan\n */\nconst CreatePlanSchema = z.object({\n autoRecurring: z.object({\n currencyId: z.string().min(1),\n frequency: z.number().min(1),\n frequencyType: z.enum([\"days\", \"weeks\", \"months\"]),\n transactionAmount: z.number().min(1),\n }),\n description: z.string().optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n name: z.string().min(1),\n});\n\n/**\n * Schema for updating subscription status\n */\nconst UpdateSubscriptionSchema = z.object({\n status: z.enum([\"paused\", \"authorized\"]),\n subscriptionId: z.string(),\n});\n\n/**\n * Schema for creating a subscription with plan (requires card token)\n */\nconst CreateSubscriptionWithPlanSchema = z.object({\n cardTokenId: z.string().min(1),\n idempotencyKey: z.string().optional(),\n identification: z\n .object({\n number: z.string(),\n type: z.string(),\n })\n .optional(),\n metadata: z.record(z.string(), z.any()).optional(),\n payerEmail: z.string().email(),\n planId: z.string(),\n});\n\n/**\n * Schema for subscription filters\n */\nconst SubscriptionFiltersSchema = z.object({\n planId: z.string().optional(),\n status: z\n .enum([\"pending\", \"authorized\", \"paused\", \"cancelled\", \"expired\", \"unpaid\"])\n .optional(),\n});\n\nexport const createSubscriptionEndpoints = (\n client: MercadoPagoConfig,\n options: MercadoPagoPluginOptions\n) => ({\n cancelSubscription: createAuthEndpoint(\n \"/mercado-pago/cancel-subscription\",\n {\n body: z.object({\n subscriptionId: z.string(),\n }),\n method: \"POST\",\n },\n async (ctx) => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { subscriptionId } = ctx.body;\n\n const subscription = (await ctx.context.adapter.findOne({\n model: \"mercadoPagoSubscription\",\n where: [\n { field: \"mpSubscriptionId\", value: subscriptionId },\n { field: \"userId\", value: session.user.id },\n ],\n })) as { id: string } | null;\n\n if (!subscription) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Subscription not found\",\n });\n }\n\n await new PreApproval(client).update({\n body: {\n status: \"cancelled\",\n },\n id: subscriptionId,\n });\n\n await ctx.context.adapter.update({\n model: \"mercadoPagoSubscription\",\n update: {\n status: \"cancelled\",\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: subscription.id }],\n });\n\n return ctx.json({ success: true });\n }\n ),\n\n createPlan: createAuthEndpoint(\n \"/mercado-pago/create-plan\",\n {\n body: CreatePlanSchema,\n method: \"POST\",\n },\n async (ctx): Promise<PlanOutput> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { name, description, autoRecurring, metadata } = ctx.body;\n\n const sanitizedMetadata = metadata ? sanitizeMetadata(metadata) : {};\n\n const plan = await (\n new PreApprovalPlan(client) as unknown as {\n create: (config: { body: Record<string, unknown> }) => Promise<{\n id: string;\n name?: string;\n url?: string;\n }>;\n }\n ).create({\n body: {\n auto_recurring: {\n currency_id: autoRecurring.currencyId,\n frequency: autoRecurring.frequency,\n frequency_type: autoRecurring.frequencyType,\n transaction_amount: autoRecurring.transactionAmount,\n },\n reason: name,\n },\n });\n\n await ctx.context.adapter.create({\n data: {\n autoRecurringFrequency: autoRecurring.frequency,\n autoRecurringFrequencyType: autoRecurring.frequencyType,\n createdAt: new Date(),\n currencyId: autoRecurring.currencyId,\n description,\n metadata: JSON.stringify(sanitizedMetadata),\n mpPlanId: plan.id,\n name,\n transactionAmount: autoRecurring.transactionAmount,\n updatedAt: new Date(),\n },\n model: \"mercadoPagoPlan\",\n });\n\n const result: PlanOutput = {\n name: plan.name || name,\n planId: plan.id,\n url: plan.url || \"\",\n };\n\n return ctx.json(result);\n }\n ),\n\n createSubscription: createAuthEndpoint(\n \"/mercado-pago/create-subscription\",\n {\n body: CreateSubscriptionSchema,\n method: \"POST\",\n },\n async (ctx): Promise<SubscriptionOutput> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const rateLimitKey = `subscription:create:${session.user.id}`;\n if (!rateLimiter.check(rateLimitKey, 10, 60 * 1000)) {\n throw new APIError(\"TOO_MANY_REQUESTS\", {\n message:\n \"Too many subscription creation attempts. Please try again later.\",\n });\n }\n\n const {\n reason,\n autoRecurring,\n payerEmail,\n backUrl,\n metadata,\n idempotencyKey,\n } = ctx.body;\n\n if (idempotencyKey) {\n if (!validateIdempotencyKey(idempotencyKey)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid idempotency key format\",\n });\n }\n\n const cachedResult = idempotencyStore.get(idempotencyKey);\n if (cachedResult) {\n return ctx.json(cachedResult) as Promise<SubscriptionOutput>;\n }\n }\n\n if (!ValidationRules.currency(autoRecurring.currencyId)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid currency code\",\n });\n }\n\n if (!ValidationRules.amount(autoRecurring.transactionAmount)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid subscription amount\",\n });\n }\n\n const sanitizedMetadata = metadata ? sanitizeMetadata(metadata) : {};\n const externalReference = generateId();\n\n const preApproval = await (\n new PreApproval(client) as unknown as {\n create: (config: {\n body: Record<string, unknown>;\n requestOptions?: Record<string, unknown>;\n }) => Promise<{\n id: string;\n status: string;\n init_point?: string;\n }>;\n }\n ).create({\n body: {\n auto_recurring: {\n currency_id: autoRecurring.currencyId,\n end_date: autoRecurring.endDate,\n frequency: autoRecurring.frequency,\n frequency_type: autoRecurring.frequencyType,\n start_date: autoRecurring.startDate,\n transaction_amount: autoRecurring.transactionAmount,\n },\n back_url:\n backUrl || `${options.baseUrl}/subscriptions?status=pending`,\n payer_email: payerEmail,\n reason,\n status: \"pending\",\n },\n requestOptions: idempotencyKey ? { idempotencyKey } : undefined,\n });\n\n await ctx.context.adapter.create({\n data: {\n autoRecurringFrequency: autoRecurring.frequency,\n autoRecurringFrequencyType: autoRecurring.frequencyType,\n createdAt: new Date(),\n currencyId: autoRecurring.currencyId,\n externalReference,\n metadata: JSON.stringify(sanitizedMetadata),\n mpSubscriptionId: preApproval.id,\n payerEmail,\n reason,\n status: preApproval.status || \"pending\",\n transactionAmount: autoRecurring.transactionAmount,\n updatedAt: new Date(),\n userId: session.user.id,\n },\n model: \"mercadoPagoSubscription\",\n });\n\n if (!preApproval.id || !preApproval.init_point) {\n throw new APIError(\"INTERNAL_SERVER_ERROR\", {\n message: \"Something went wrong\",\n });\n }\n\n const result: SubscriptionOutput = {\n checkoutUrl: preApproval.init_point,\n status: preApproval.status || \"pending\",\n subscriptionId: preApproval.id,\n };\n\n if (idempotencyKey) {\n idempotencyStore.set(idempotencyKey, result);\n }\n\n return ctx.json(result);\n }\n ),\n\n createSubscriptionWithPlan: createAuthEndpoint(\n \"/mercado-pago/create-subscription-with-plan\",\n {\n body: CreateSubscriptionWithPlanSchema,\n method: \"POST\",\n },\n async (ctx): Promise<SubscriptionOutput> => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const rateLimitKey = `subscription:create:${session.user.id}`;\n if (!rateLimiter.check(rateLimitKey, 10, 60 * 1000)) {\n throw new APIError(\"TOO_MANY_REQUESTS\", {\n message:\n \"Too many subscription creation attempts. Please try again later.\",\n });\n }\n\n const {\n planId,\n payerEmail,\n cardTokenId,\n identification,\n metadata,\n idempotencyKey,\n } = ctx.body;\n\n if (idempotencyKey) {\n if (!validateIdempotencyKey(idempotencyKey)) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid idempotency key format\",\n });\n }\n\n const cachedResult = idempotencyStore.get(idempotencyKey);\n if (cachedResult) {\n return ctx.json(cachedResult) as Promise<SubscriptionOutput>;\n }\n }\n\n // Get the plan from DB\n const plan = await ctx.context.adapter.findOne({\n model: \"mercadoPagoPlan\",\n where: [{ field: \"mpPlanId\", value: planId }],\n });\n\n if (!plan) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Plan not found\",\n });\n }\n\n const sanitizedMetadata = metadata ? sanitizeMetadata(metadata) : {};\n const externalReference = generateId();\n\n // Create subscription with plan using card token\n const subscription = await (\n new PreApproval(client) as unknown as {\n create: (config: {\n body: Record<string, unknown>;\n requestOptions?: Record<string, unknown>;\n }) => Promise<{\n id: string;\n status: string;\n init_point?: string;\n }>;\n }\n ).create({\n body: {\n card_token_id: cardTokenId,\n payer_email: payerEmail,\n preapproval_plan_id: planId,\n ...(identification && {\n payer_identification: identification,\n }),\n },\n requestOptions: idempotencyKey ? { idempotencyKey } : undefined,\n });\n\n await ctx.context.adapter.create({\n data: {\n autoRecurringFrequency: (plan as { autoRecurringFrequency?: number })\n .autoRecurringFrequency,\n autoRecurringFrequencyType: (\n plan as { autoRecurringFrequencyType?: string }\n ).autoRecurringFrequencyType,\n createdAt: new Date(),\n currencyId: (plan as { currencyId?: string }).currencyId,\n externalReference,\n metadata: JSON.stringify(sanitizedMetadata),\n mpSubscriptionId: subscription.id,\n payerEmail,\n planId,\n reason: (plan as { name?: string }).name,\n status: subscription.status || \"authorized\",\n transactionAmount: (plan as { transactionAmount?: number })\n .transactionAmount,\n updatedAt: new Date(),\n userId: session.user.id,\n },\n model: \"mercadoPagoSubscription\",\n });\n\n const result: SubscriptionOutput = {\n checkoutUrl: subscription.init_point || \"\",\n status: subscription.status || \"authorized\",\n subscriptionId: subscription.id,\n };\n\n if (idempotencyKey) {\n idempotencyStore.set(idempotencyKey, result);\n }\n\n return ctx.json(result);\n }\n ),\n\n getPlan: createAuthEndpoint(\n \"/mercado-pago/get-plan\",\n {\n body: z.object({\n planId: z.string(),\n }),\n method: \"POST\",\n },\n async (ctx) => {\n const { planId } = ctx.body;\n\n const plan = await ctx.context.adapter.findOne({\n model: \"mercadoPagoPlan\",\n where: [{ field: \"mpPlanId\", value: planId }],\n });\n\n if (!plan) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Plan not found\",\n });\n }\n\n return ctx.json(plan);\n }\n ),\n\n getPlans: createAuthEndpoint(\n \"/mercado-pago/get-plans\",\n {\n body: z.object({\n limit: z.number().min(1).max(100).default(20),\n offset: z.number().min(0).default(0),\n }),\n method: \"POST\",\n },\n async (ctx) => {\n const { limit, offset } = ctx.body;\n\n const total = await ctx.context.adapter.count({\n model: \"mercadoPagoPlan\",\n });\n\n const plans = await ctx.context.adapter.findMany({\n limit,\n model: \"mercadoPagoPlan\",\n offset,\n sortBy: { direction: \"desc\", field: \"createdAt\" },\n });\n\n return ctx.json({\n limit,\n offset,\n plans,\n total,\n });\n }\n ),\n\n getSubscription: createAuthEndpoint(\n \"/mercado-pago/get-subscription\",\n {\n body: z.object({\n subscriptionId: z.string(),\n }),\n method: \"POST\",\n },\n async (ctx) => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { subscriptionId } = ctx.body;\n\n const subscription = (await ctx.context.adapter.findOne({\n model: \"mercadoPagoSubscription\",\n where: [\n { field: \"mpSubscriptionId\", value: subscriptionId },\n { field: \"userId\", value: session.user.id },\n ],\n })) as { id: string } | null;\n\n if (!subscription) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Subscription not found\",\n });\n }\n\n return ctx.json(subscription);\n }\n ),\n\n getSubscriptions: createAuthEndpoint(\n \"/mercado-pago/get-subscriptions\",\n {\n body: z\n .object({\n filters: SubscriptionFiltersSchema.optional(),\n limit: z.number().min(1).max(100).optional(),\n offset: z.number().min(0).optional(),\n })\n .optional(),\n method: \"POST\",\n },\n async (ctx) => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const body = ctx.body || {};\n const { filters, limit = 20, offset = 0 } = body;\n\n const whereConditions: { field: string; value: string }[] = [\n { field: \"userId\", value: session.user.id },\n ];\n\n if (filters?.status) {\n whereConditions.push({ field: \"status\", value: filters.status });\n }\n\n if (filters?.planId) {\n whereConditions.push({ field: \"planId\", value: filters.planId });\n }\n\n const total = await ctx.context.adapter.count({\n model: \"mercadoPagoSubscription\",\n where: whereConditions,\n });\n\n const subscriptions = await ctx.context.adapter.findMany({\n limit,\n model: \"mercadoPagoSubscription\",\n offset,\n sortBy: { direction: \"desc\", field: \"createdAt\" },\n where: whereConditions,\n });\n\n return ctx.json({\n limit,\n offset,\n subscriptions,\n total,\n });\n }\n ),\n\n updateSubscription: createAuthEndpoint(\n \"/mercado-pago/update-subscription\",\n {\n body: UpdateSubscriptionSchema,\n method: \"POST\",\n },\n async (ctx) => {\n const session = await getSessionFromCtx(ctx);\n if (!session) {\n throw new APIError(\"UNAUTHORIZED\");\n }\n\n const { subscriptionId, status } = ctx.body;\n\n const subscription = (await ctx.context.adapter.findOne({\n model: \"mercadoPagoSubscription\",\n where: [\n { field: \"mpSubscriptionId\", value: subscriptionId },\n { field: \"userId\", value: session.user.id },\n ],\n })) as { id: string } | null;\n\n if (!subscription) {\n throw new APIError(\"NOT_FOUND\", {\n message: \"Subscription not found\",\n });\n }\n\n await new PreApproval(client).update({\n body: {\n status: status === \"paused\" ? \"paused\" : \"authorized\",\n },\n id: subscriptionId,\n });\n\n await ctx.context.adapter.update({\n model: \"mercadoPagoSubscription\",\n update: {\n status: status === \"paused\" ? \"paused\" : \"authorized\",\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: subscription.id }],\n });\n\n return ctx.json({ status, success: true });\n }\n ),\n});\n","import { APIError, createAuthEndpoint } from \"better-auth/api\";\nimport { Payment, PreApproval } from \"mercadopago\";\nimport type { MercadoPagoConfig } from \"mercadopago\";\n\nimport {\n rateLimiter,\n validatePaymentAmount,\n verifyWebhookSignature,\n idempotencyStore,\n} from \"../security\";\nimport type {\n MercadoPagoPaymentNotification,\n MercadoPagoPaymentRecord,\n MercadoPagoPluginOptions,\n MercadoPagoSubscriptionRecord,\n} from \"../types\";\n\nexport const createWebhookEndpoint = (\n client: MercadoPagoConfig,\n options: MercadoPagoPluginOptions\n) => ({\n webhook: createAuthEndpoint(\n \"/mercado-pago/webhook\",\n {\n method: \"POST\",\n secured: false,\n },\n async (ctx) => {\n console.log(\">>> MP WEBHOOK\");\n\n const webhookRateLimitKey = \"webhook:global\";\n if (!rateLimiter.check(webhookRateLimitKey, 1000, 60 * 1000)) {\n throw new APIError(\"TOO_MANY_REQUESTS\", {\n message: \"Webhook rate limit exceeded\",\n });\n }\n\n // Get URL params - MercadoPago can send type in body or query params\n const url = ctx.request?.url || \"\";\n const urlParams = new URL(url, \"http://localhost\").searchParams;\n\n // Get notification type from body or query params\n const bodyType = (ctx.body as { type?: string })?.type;\n const queryType = urlParams.get(\"type\");\n const notificationType = bodyType || queryType;\n\n console.log(\">>> MP WEBHOOK notification type:\", notificationType);\n\n // Handle subscription events: subscription_preapproval and subscription_authorized_payment\n if (\n notificationType === \"subscription_preapproval\" ||\n notificationType === \"subscription_authorized_payment\"\n ) {\n let notification: MercadoPagoPaymentNotification;\n try {\n notification = ctx.body;\n } catch {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid JSON payload\",\n });\n }\n\n return await handleSubscriptionWebhook(\n ctx as unknown as {\n context: { adapter: unknown; logger: unknown };\n json: (data: unknown) => unknown;\n },\n notification,\n client,\n options\n );\n }\n\n // Handle payment events - get payment ID from body or query params\n const dataIdFromQuery = urlParams.get(\"data.id\");\n const paymentIdFromBody = (ctx.body as { data?: { id?: string } })?.data\n ?.id;\n const paymentIdParam = dataIdFromQuery || paymentIdFromBody;\n\n if (!paymentIdParam) {\n return ctx.json({ received: true });\n }\n\n let notification: MercadoPagoPaymentNotification;\n try {\n notification = ctx.body;\n } catch {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Invalid JSON payload\",\n });\n }\n\n if (!ctx.request) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Missing request\",\n });\n }\n\n if (options.webhookSecret) {\n const xSignature = ctx.request.headers.get(\"x-signature\");\n const xRequestId = ctx.request.headers.get(\"x-request-id\");\n const dataId = notification.data.id.toString();\n\n console.log(\">>> MP WEBHOOK X-SIGNATURE:\", xSignature);\n console.log(\">>> MP WEBHOOK X-REQUEST-ID:\", xRequestId);\n console.log(\">>> MP WEBHOOK DATA ID:\", dataId);\n\n const isValid = verifyWebhookSignature({\n dataId,\n secret: options.webhookSecret,\n xRequestId,\n xSignature,\n });\n\n if (!isValid) {\n throw new APIError(\"UNAUTHORIZED\", {\n message: \"Invalid webhook signature\",\n });\n }\n }\n\n // Use the payment idempotency key\n const webhookId = `mp:webhook:${notification.type}:${notification.data.id}`;\n if (idempotencyStore.get(webhookId)) {\n return ctx.json({ received: true });\n }\n idempotencyStore.set(webhookId, true, 24 * 60 * 60 * 1000);\n\n try {\n const paymentId = notification.data.id.toString();\n\n const mpPayment = await new Payment(client).get({\n id: paymentId,\n });\n\n const externalRef = mpPayment.external_reference;\n\n if (!externalRef) {\n ctx.context.logger.warn(\"Payment without external_reference\", {\n paymentId,\n });\n return ctx.json({ received: true });\n }\n\n const existingPayment: MercadoPagoPaymentRecord | null =\n await ctx.context.adapter.findOne({\n model: \"mercadoPagoPayment\",\n where: [\n {\n field: \"externalReference\",\n value: externalRef,\n },\n ],\n });\n\n if (!existingPayment) {\n ctx.context.logger.warn(\"Payment not found by external_reference\", {\n externalRef,\n paymentId,\n });\n return ctx.json({ received: true });\n }\n\n if (\n !validatePaymentAmount(\n existingPayment.amount,\n mpPayment.transaction_amount || 0\n )\n ) {\n throw new APIError(\"BAD_REQUEST\", {\n message: \"Payment amount mismatch\",\n });\n }\n\n await ctx.context.adapter.update({\n model: \"mercadoPagoPayment\",\n update: {\n mercadoPagoPaymentId: paymentId,\n paymentMethodId: mpPayment.payment_method_id || undefined,\n paymentTypeId: mpPayment.payment_type_id || undefined,\n status: mpPayment.status,\n statusDetail: mpPayment.status_detail || undefined,\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: existingPayment.id }],\n });\n\n if (options.onPaymentUpdate && mpPayment.status) {\n // Map MP status to payment result type for easier handling\n const paymentResultType = getPaymentResultType(mpPayment.status);\n\n await options.onPaymentUpdate({\n mpPayment,\n payment: existingPayment,\n resultType: paymentResultType,\n status: mpPayment.status,\n statusDetail: mpPayment.status_detail || \"\",\n });\n }\n } catch (error) {\n ctx.context.logger.error(\"Error processing MP webhook\", {\n error,\n notification,\n });\n\n return ctx.json({ received: true });\n }\n\n return ctx.json({ received: true });\n }\n ),\n});\n\n/**\n * Handle subscription_preapproval webhook events\n */\nasync function handleSubscriptionWebhook(\n ctx: {\n context: { adapter: unknown; logger: unknown };\n json: (data: unknown) => unknown;\n },\n notification: MercadoPagoPaymentNotification,\n client: MercadoPagoConfig,\n options: MercadoPagoPluginOptions\n) {\n console.log(\">>> MP SUBSCRIPTION WEBHOOK:\", notification);\n\n // For subscriptions, use only subscriptionId as key\n // We need to process all updates to check if status changed\n const webhookId = `mp:webhook:subscription:${notification.data.id}`;\n console.log(\">>> Subscription webhook idempotency key:\", webhookId);\n\n if (idempotencyStore.get(webhookId)) {\n console.log(\n \">>> Subscription webhook already processed once, checking status anyway...\"\n );\n } else {\n idempotencyStore.set(webhookId, true, 24 * 60 * 60 * 1000);\n }\n\n try {\n const subscriptionId = notification.data.id.toString();\n\n const mpSubscription = await (\n new PreApproval(client) as unknown as {\n get: (config: { id: string }) => Promise<{\n id: string;\n status: string;\n external_reference?: string;\n reason?: string;\n payer_email?: string;\n auto_recurring?: {\n frequency: number;\n frequency_type: string;\n transaction_amount: number;\n currency_id: string;\n };\n }>;\n }\n ).get({ id: subscriptionId });\n\n console.log(\n \">>> MP Subscription status from MP:\",\n mpSubscription.status,\n \"subscriptionId:\",\n subscriptionId\n );\n\n // Buscar la suscripción por mpSubscriptionId\n const existingSubscription: MercadoPagoSubscriptionRecord | null = await (\n ctx.context.adapter as {\n findOne: (config: {\n model: string;\n where: { field: string; value: string }[];\n }) => Promise<{\n id: string;\n externalReference: string;\n userId: string;\n mpSubscriptionId?: string;\n status: string;\n reason?: string;\n payerEmail?: string;\n transactionAmount?: number;\n currencyId?: string;\n createdAt: Date;\n updatedAt: Date;\n } | null>;\n }\n ).findOne({\n model: \"mercadoPagoSubscription\",\n where: [{ field: \"mpSubscriptionId\", value: subscriptionId }],\n });\n\n if (!existingSubscription) {\n console.log(\n \">>> Subscription not found in DB, creating new record with mpSubscriptionId:\",\n subscriptionId\n );\n // Si no existe, creamos la suscripción (para el caso de webhooks que llegan antes de que se guarde localmente)\n // Esto es improbable pero posible en casos de race conditions\n return ctx.json({ received: true });\n }\n\n console.log(\n \">>> Found subscription in DB:\",\n existingSubscription.id,\n \"current status:\",\n existingSubscription.status,\n \"new status:\",\n mpSubscription.status\n );\n\n // Solo actualizamos si el status cambió o si es \"authorized\" (como en la docs)\n if (existingSubscription.status !== mpSubscription.status) {\n // Map MP subscription status to result type\n const subscriptionResultType = getSubscriptionResultType(\n mpSubscription.status\n );\n\n // Update subscription status in database\n await (\n ctx.context.adapter as {\n update: (config: {\n model: string;\n update: Record<string, unknown>;\n where: { field: string; value: string }[];\n }) => Promise<void>;\n }\n ).update({\n model: \"mercadoPagoSubscription\",\n update: {\n status: mpSubscription.status,\n updatedAt: new Date(),\n },\n where: [{ field: \"id\", value: existingSubscription.id }],\n });\n\n console.log(\n `>>> Subscription ${subscriptionId} status updated to: ${mpSubscription.status} (${subscriptionResultType})`\n );\n } else {\n console.log(\n \">>> Subscription status unchanged:\",\n mpSubscription.status,\n \"- no update needed\"\n );\n }\n\n // Call the subscription update callback if provided\n if (options.onSubscriptionUpdate) {\n await options.onSubscriptionUpdate({\n mpSubscription,\n status: mpSubscription.status,\n subscription: existingSubscription,\n });\n }\n } catch (error) {\n (\n ctx.context.logger as {\n error: (msg: string, data: Record<string, unknown>) => void;\n }\n ).error(\"Error processing MP subscription webhook\", {\n error,\n notification,\n });\n }\n\n return ctx.json({ received: true });\n}\n\n/**\n * Maps MercadoPago subscription status to a simplified result type\n */\nfunction getSubscriptionResultType(\n mpStatus: string\n): \"success\" | \"pending\" | \"error\" {\n switch (mpStatus) {\n case \"authorized\": {\n return \"success\";\n }\n case \"pending\": {\n return \"pending\";\n }\n case \"cancelled\":\n case \"expired\":\n case \"unpaid\": {\n return \"error\";\n }\n default: {\n return \"pending\";\n }\n }\n}\n\n/**\n * Maps MercadoPago payment status to a simplified result type\n * for easier handling of the 3 main Checkout Pro states\n */\nfunction getPaymentResultType(\n mpStatus: string\n): \"success\" | \"pending\" | \"error\" {\n switch (mpStatus) {\n case \"approved\":\n case \"authorized\": {\n return \"success\";\n }\n case \"pending\":\n case \"in_process\": {\n return \"pending\";\n }\n case \"rejected\":\n case \"cancelled\":\n case \"refunded\":\n case \"charged_back\":\n case \"in_mediation\": {\n return \"error\";\n }\n default: {\n return \"pending\";\n }\n }\n}\n","import type { BetterAuthPlugin } from \"better-auth\";\nimport { MercadoPagoConfig } from \"mercadopago\";\n\nimport {\n createPreferenceEndpoints,\n getPaymentResultType,\n} from \"./endpoints/preference\";\nimport { createSubscriptionEndpoints } from \"./endpoints/subscription\";\nimport { createWebhookEndpoint } from \"./endpoints/webhook\";\nimport type { MercadoPagoPluginOptions } from \"./types\";\n\nexport { getPaymentResultType };\n\nexport const mercadoPagoPlugin = (options: MercadoPagoPluginOptions) => {\n const client = new MercadoPagoConfig({\n accessToken: options.accessToken,\n });\n\n const preferenceEndpoints = createPreferenceEndpoints(client, options);\n const webhookEndpoints = createWebhookEndpoint(client, options);\n const subscriptionEndpoints = createSubscriptionEndpoints(client, options);\n\n return {\n endpoints: {\n ...preferenceEndpoints,\n ...webhookEndpoints,\n ...subscriptionEndpoints,\n },\n id: \"mercado-pago\",\n schema: {\n mercadoPagoPayment: {\n fields: {\n amount: { required: true, type: \"number\" },\n createdAt: { required: true, type: \"date\" },\n currency: { required: true, type: \"string\" },\n externalReference: {\n required: true,\n type: \"string\",\n unique: true,\n },\n id: { required: true, type: \"string\" },\n mercadoPagoPaymentId: {\n required: false,\n type: \"string\",\n unique: true,\n },\n metadata: { type: \"string\" },\n paymentMethodId: { type: \"string\" },\n paymentTypeId: { type: \"string\" },\n preferenceId: { required: true, type: \"string\" },\n status: { required: true, type: \"string\" },\n statusDetail: { type: \"string\" },\n updatedAt: { required: true, type: \"date\" },\n userId: {\n references: {\n field: \"id\",\n model: \"user\",\n },\n required: true,\n type: \"string\",\n },\n },\n },\n mercadoPagoPlan: {\n fields: {\n autoRecurringFrequency: { required: true, type: \"number\" },\n autoRecurringFrequencyType: { required: true, type: \"string\" },\n createdAt: { required: true, type: \"date\" },\n currencyId: { required: true, type: \"string\" },\n description: { type: \"string\" },\n id: { required: true, type: \"string\" },\n metadata: { type: \"string\" },\n mpPlanId: {\n required: true,\n type: \"string\",\n unique: true,\n },\n name: { required: true, type: \"string\" },\n transactionAmount: { required: true, type: \"number\" },\n updatedAt: { required: true, type: \"date\" },\n },\n },\n mercadoPagoSubscription: {\n fields: {\n autoRecurringFrequency: { type: \"number\" },\n autoRecurringFrequencyType: { type: \"string\" },\n createdAt: { required: true, type: \"date\" },\n currencyId: { type: \"string\" },\n externalReference: {\n required: true,\n type: \"string\",\n unique: true,\n },\n id: { required: true, type: \"string\" },\n metadata: { type: \"string\" },\n mpSubscriptionId: {\n required: false,\n type: \"string\",\n unique: true,\n },\n nextPaymentDate: { type: \"date\" },\n payerEmail: { type: \"string\" },\n planId: { type: \"string\" },\n reason: { type: \"string\" },\n status: { required: true, type: \"string\" },\n transactionAmount: { type: \"number\" },\n updatedAt: { required: true, type: \"date\" },\n userId: {\n references: {\n field: \"id\",\n model: \"user\",\n },\n required: true,\n type: \"string\",\n },\n },\n },\n },\n } satisfies BetterAuthPlugin;\n};\n\nexport type { MercadoPagoPluginOptions };\n"]}
|