@infuro/cms-core 1.0.7 → 1.0.8

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugins/email/email-service.ts","../src/plugins/payment/stripe.ts","../src/plugins/payment/razorpay.ts","../src/index.ts","../src/plugins/registry.ts","../src/plugins/erp/erp-auth.ts","../src/plugins/erp/erp-submission.ts","../src/plugins/erp/index.ts","../src/plugins/email/index.ts","../src/plugins/analytics/analytics-service.ts","../src/plugins/analytics/index.ts","../src/plugins/sms/index.ts","../src/plugins/payment/index.ts","../src/plugins/storage/s3.ts","../src/plugins/storage/local.ts","../src/lib/utils.ts","../src/entities/user.entity.ts","../src/entities/user-group.entity.ts","../src/entities/permission.entity.ts","../src/entities/password-reset-token.entity.ts","../src/entities/blog.entity.ts","../src/entities/category.entity.ts","../src/entities/seo.entity.ts","../src/entities/comment.entity.ts","../src/entities/tag.entity.ts","../src/entities/contact.entity.ts","../src/entities/form-submission.entity.ts","../src/entities/form.entity.ts","../src/entities/form-field.entity.ts","../src/entities/address.entity.ts","../src/entities/order.entity.ts","../src/entities/payment.entity.ts","../src/entities/config.entity.ts","../src/entities/media.entity.ts","../src/entities/page.entity.ts","../src/entities/product-category.entity.ts","../src/entities/collection.entity.ts","../src/entities/brand.entity.ts","../src/entities/product.entity.ts","../src/entities/attribute.entity.ts","../src/entities/product-attribute.entity.ts","../src/entities/tax.entity.ts","../src/entities/product-tax.entity.ts","../src/entities/order-item.entity.ts","../src/entities/index.ts","../src/auth/helpers.ts","../src/auth/middleware.ts","../src/auth/nextauth-options.ts","../src/api/crud.ts","../src/api/auth-handlers.ts","../src/api/cms-handlers.ts","../src/api/cms-api-handler.ts","../src/admin/config.ts"],"sourcesContent":["import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';\nimport nodemailer from 'nodemailer';\n\nexport interface EmailPluginConfig {\n type: 'AWS' | 'SMTP' | 'GMAIL' | 'SENDGRID';\n user?: string;\n password?: string;\n from: string;\n to: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport interface EmailData {\n subject: string;\n html: string;\n text?: string;\n to?: string;\n from?: string;\n}\n\nexport interface EmailServiceInterface {\n send(emailData: EmailData): Promise<boolean>;\n}\n\nexport class EmailService implements EmailServiceInterface {\n private config: EmailPluginConfig;\n private sesClient?: SESClient;\n private transporter?: nodemailer.Transporter;\n\n constructor(config: EmailPluginConfig) {\n this.config = config;\n if (config.type === 'AWS') {\n if (!config.region || !config.accessKeyId || !config.secretAccessKey) {\n throw new Error('AWS SES configuration incomplete');\n }\n this.sesClient = new SESClient({\n region: config.region,\n credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey },\n });\n } else if (config.type === 'SMTP' || config.type === 'GMAIL') {\n if (!config.user || !config.password) throw new Error('SMTP configuration incomplete');\n this.transporter = nodemailer.createTransport({\n host: config.type === 'GMAIL' ? 'smtp.gmail.com' : undefined,\n port: 587,\n secure: false,\n auth: { user: config.user, pass: config.password },\n });\n } else {\n throw new Error(`Unsupported email type: ${config.type}`);\n }\n }\n\n async send(emailData: EmailData): Promise<boolean> {\n try {\n if (this.config.type === 'AWS' && this.sesClient) {\n await this.sesClient.send(\n new SendEmailCommand({\n Source: emailData.from || this.config.from,\n Destination: { ToAddresses: [emailData.to || this.config.to] },\n Message: {\n Subject: { Data: emailData.subject, Charset: 'UTF-8' },\n Body: {\n Html: { Data: emailData.html, Charset: 'UTF-8' },\n ...(emailData.text && { Text: { Data: emailData.text, Charset: 'UTF-8' } }),\n },\n },\n })\n );\n return true;\n }\n if ((this.config.type === 'SMTP' || this.config.type === 'GMAIL') && this.transporter) {\n await this.transporter.sendMail({\n from: emailData.from || this.config.from,\n to: emailData.to || this.config.to,\n subject: emailData.subject,\n html: emailData.html,\n text: emailData.text,\n });\n return true;\n }\n return false;\n } catch (error) {\n console.error('Email sending failed:', error);\n return false;\n }\n }\n}\n\nexport const emailTemplates = {\n formSubmission: (data: { formName: string; contactName: string; contactEmail: string; formData: unknown }) => ({\n subject: `New Form Submission: ${data.formName}`,\n html: `<h2>New Form Submission</h2><p><strong>Form:</strong> ${data.formName}</p><p><strong>Contact:</strong> ${data.contactName} (${data.contactEmail})</p><pre>${JSON.stringify(data.formData, null, 2)}</pre>`,\n text: `New Form Submission\\nForm: ${data.formName}\\nContact: ${data.contactName} (${data.contactEmail})\\n${JSON.stringify(data.formData, null, 2)}`,\n }),\n contactSubmission: (data: { name: string; email: string; phone?: string; message?: string }) => ({\n subject: `New Contact Form Submission from ${data.name}`,\n html: `<h2>New Contact Form Submission</h2><p><strong>Name:</strong> ${data.name}</p><p><strong>Email:</strong> ${data.email}</p>${data.phone ? `<p><strong>Phone:</strong> ${data.phone}</p>` : ''}${data.message ? `<p><strong>Message:</strong></p><p>${data.message}</p>` : ''}`,\n text: `New Contact Form Submission\\nName: ${data.name}\\nEmail: ${data.email}\\n${data.phone ? `Phone: ${data.phone}\\n` : ''}${data.message ? `Message: ${data.message}` : ''}`,\n }),\n passwordReset: (data: { resetLink: string }) => ({\n subject: 'Reset your password',\n html: `<h2>Reset your password</h2><p>Click the link below to set a new password. This link expires in 1 hour.</p><p><a href=\"${data.resetLink}\">${data.resetLink}</a></p>`,\n text: `Reset your password: ${data.resetLink}\\n\\nThis link expires in 1 hour.`,\n }),\n};\n","import Stripe from 'stripe';\nimport type { PaymentServiceInterface, PaymentIntent } from './index';\n\nexport interface StripeServiceConfig {\n secretKey: string;\n webhookSecret?: string;\n}\n\nexport class StripePaymentService implements PaymentServiceInterface {\n private stripe: Stripe;\n private webhookSecret?: string;\n\n constructor(config: StripeServiceConfig) {\n this.stripe = new Stripe(config.secretKey, { apiVersion: '2024-06-20' });\n this.webhookSecret = config.webhookSecret;\n }\n\n async createPaymentIntent(\n amount: number,\n currency: string,\n metadata?: Record<string, string>\n ): Promise<PaymentIntent> {\n const intent = await this.stripe.paymentIntents.create({\n amount: Math.round(amount * 100),\n currency: currency.toLowerCase(),\n metadata,\n });\n\n return {\n id: intent.id,\n clientSecret: intent.client_secret || '',\n amount,\n currency,\n status: intent.status,\n };\n }\n\n async capturePayment(paymentId: string, amount?: number): Promise<boolean> {\n try {\n await this.stripe.paymentIntents.capture(paymentId, {\n amount_to_capture: amount ? Math.round(amount * 100) : undefined,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean {\n if (!this.webhookSecret) return false;\n try {\n this.stripe.webhooks.constructEvent(payload, signature, this.webhookSecret);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import Razorpay from 'razorpay';\nimport crypto from 'crypto';\nimport type { PaymentServiceInterface, PaymentIntent } from './index';\n\nexport interface RazorpayServiceConfig {\n keyId: string;\n keySecret: string;\n webhookSecret?: string;\n}\n\nexport class RazorpayPaymentService implements PaymentServiceInterface {\n private razorpay: Razorpay;\n private keySecret: string;\n private webhookSecret?: string;\n\n constructor(config: RazorpayServiceConfig) {\n this.razorpay = new Razorpay({\n key_id: config.keyId,\n key_secret: config.keySecret,\n });\n this.keySecret = config.keySecret;\n this.webhookSecret = config.webhookSecret;\n }\n\n async createPaymentIntent(\n amount: number,\n currency: string,\n metadata?: Record<string, string>\n ): Promise<PaymentIntent> {\n const order = await this.razorpay.orders.create({\n amount: Math.round(amount * 100),\n currency: currency.toUpperCase(),\n notes: metadata,\n });\n\n return {\n id: order.id,\n clientSecret: order.id,\n amount,\n currency,\n status: order.status,\n };\n }\n\n async capturePayment(paymentId: string, amount?: number): Promise<boolean> {\n try {\n await this.razorpay.payments.capture(paymentId, amount ? Math.round(amount * 100) : 0, 'INR');\n return true;\n } catch {\n return false;\n }\n }\n\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean {\n const secret = this.webhookSecret || this.keySecret;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(typeof payload === 'string' ? payload : payload.toString('utf8'))\n .digest('hex');\n return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));\n }\n}\n","export * from './plugins/types';\nexport * from './plugins/registry';\nexport { erpPlugin } from './plugins/erp';\nexport type { ERPPluginConfig, ERPPluginInstance } from './plugins/erp';\nexport { emailPlugin, EmailService, emailTemplates } from './plugins/email';\nexport type { EmailPluginConfig, EmailData, EmailServiceInterface } from './plugins/email';\nexport { analyticsPlugin } from './plugins/analytics';\nexport type { AnalyticsPluginConfig } from './plugins/analytics';\nexport { smsPlugin } from './plugins/sms';\nexport { paymentPlugin } from './plugins/payment';\nexport type { PaymentPluginConfig, PaymentServiceInterface, PaymentIntent } from './plugins/payment';\nexport { s3StoragePlugin, localStoragePlugin } from './plugins/storage';\nexport type { StorageService, S3StoragePluginConfig, LocalStoragePluginConfig } from './plugins/storage';\nexport * from './lib';\nexport * from './entities';\nexport * from './auth';\nexport * from './api';\nexport { DEFAULT_ADMIN_NAV } from './admin/config';\nexport type { AdminNavItem } from './admin/config';\n","import type { CmsPlugin, PluginContext } from './types';\n\nexport interface CreateCmsAppOptions {\n dataSource: unknown;\n config?: Record<string, string>;\n plugins?: CmsPlugin[];\n logger?: PluginContext['logger'];\n}\n\nconst noopLogger: PluginContext['logger'] = {\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\nexport interface CmsApp {\n dataSource: unknown;\n getPlugin<T = unknown>(name: string): T | undefined;\n}\n\nexport async function createCmsApp(options: CreateCmsAppOptions): Promise<CmsApp> {\n const { dataSource, config = {}, plugins = [], logger = noopLogger } = options;\n const context: PluginContext = { dataSource, config, logger };\n const registry = new Map<string, unknown>();\n\n for (const plugin of plugins) {\n try {\n const instance = await plugin.init(context);\n registry.set(plugin.name, instance !== undefined ? instance : plugin);\n } catch (err) {\n logger.warn(`Plugin \"${plugin.name}\" failed to init: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n return {\n dataSource,\n getPlugin<T>(name: string): T | undefined {\n return registry.get(name) as T | undefined;\n },\n };\n}\n","interface ERPAuthCredentials {\n clientId: string;\n clientSecret: string;\n tenantId: string;\n}\n\ninterface ERPAuthToken {\n access_token: string;\n token_type: string;\n expires_in: number;\n expires_at?: number;\n}\n\nexport class ERPAuthService {\n private baseUrl: string;\n private credentials: ERPAuthCredentials;\n private token: ERPAuthToken | null = null;\n\n constructor(config: { baseUrl?: string; clientId: string; clientSecret: string; tenantId: string }) {\n this.baseUrl = config.baseUrl || 'https://uat.infuroerp.com';\n this.credentials = {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n tenantId: config.tenantId,\n };\n }\n\n async authenticate(): Promise<ERPAuthToken> {\n const authUrl = `${this.baseUrl}/api/auth/account/app-login`;\n const authPayload = {\n clientId: this.credentials.clientId,\n clientSecret: this.credentials.clientSecret,\n tenantId: this.credentials.tenantId,\n };\n\n const response = await fetch(authUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(authPayload),\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`Authentication failed: ${response.status} - ${errorData}`);\n }\n\n const tokenData = await response.json();\n const actualToken =\n tokenData.access_token ||\n tokenData.token ||\n tokenData.accessToken ||\n tokenData.jwt ||\n tokenData.bearer_token ||\n tokenData.auth_token;\n\n if (!actualToken) {\n throw new Error('No access token found in authentication response');\n }\n\n const expiresIn = tokenData.expires_in || tokenData.expiresIn || 3600;\n const expiresAt = Date.now() + expiresIn * 1000;\n const token: ERPAuthToken = {\n access_token: actualToken,\n token_type: tokenData.token_type || tokenData.tokenType || 'Bearer',\n expires_in: expiresIn,\n expires_at: expiresAt,\n };\n this.token = token;\n return token;\n }\n\n async getValidToken(): Promise<string> {\n if (this.token && this.token.expires_at && Date.now() < this.token.expires_at) {\n return this.token.access_token;\n }\n const newToken = await this.authenticate();\n return newToken.access_token;\n }\n\n async makeAuthenticatedRequest(url: string, options: RequestInit = {}): Promise<Response> {\n const token = await this.getValidToken();\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...options.headers,\n };\n return fetch(url, { ...options, headers });\n }\n}\n","import type { ERPAuthService } from './erp-auth';\n\nexport interface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n phone?: string;\n industry?: string;\n message?: string;\n}\n\ninterface ExternalContactPayload {\n contact: string;\n type: string;\n status: string;\n tag_ids: string[];\n company_id: null;\n first_name: string;\n last_name: string;\n email: string;\n phone: string;\n country: string;\n}\n\ninterface ExternalOpportunityPayload {\n contact_id: string;\n name: string;\n description: string;\n createdAt: string;\n pipeline_id: string;\n pipeline_stage_id: string;\n amount: number | null;\n expected_close_date: string;\n actual_close_date: string;\n owner: string | null;\n}\n\nexport interface ERPSubmissionResult {\n success: boolean;\n contactId: string;\n opportunityId?: string;\n error?: string;\n}\n\nexport class ERPSubmissionService {\n private baseUrl: string;\n private pipelineId: string;\n private pipelineStageId: string;\n private auth: ERPAuthService;\n\n constructor(config: {\n baseUrl?: string;\n pipelineId: string;\n pipelineStageId: string;\n auth: ERPAuthService;\n }) {\n this.baseUrl = config.baseUrl || 'https://uat.infuroerp.com';\n this.pipelineId = config.pipelineId;\n this.pipelineStageId = config.pipelineStageId;\n this.auth = config.auth;\n }\n\n async submitContact(formData: ContactFormData): Promise<ERPSubmissionResult> {\n try {\n if (!formData.firstName || !formData.lastName || !formData.email) {\n throw new Error('Missing required fields: First name, last name, and email are required');\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(formData.email)) {\n throw new Error('Invalid email format');\n }\n\n const contactPayload: ExternalContactPayload = {\n contact: `${formData.firstName} ${formData.lastName}`,\n type: 'Individual',\n status: 'Active',\n tag_ids: [],\n company_id: null,\n first_name: formData.firstName,\n last_name: formData.lastName,\n email: formData.email,\n phone: formData.phone || '',\n country: '',\n };\n\n const contactApiUrl = `${this.baseUrl}/api/crm/contacts`;\n const contactResponse = await this.auth.makeAuthenticatedRequest(contactApiUrl, {\n method: 'POST',\n body: JSON.stringify(contactPayload),\n });\n\n if (!contactResponse.ok) {\n const errorData = await contactResponse.text();\n throw new Error(`Failed to submit contact: ${contactResponse.status} - ${errorData}`);\n }\n\n const contactData = await contactResponse.json();\n const contactId = contactData.id || contactData.data?.id;\n if (!contactId) {\n throw new Error('No contact ID returned from API');\n }\n\n let opportunityId: string | undefined;\n if (this.pipelineId && this.pipelineStageId) {\n const currentDate = new Date().toISOString();\n const opportunityPayload: ExternalOpportunityPayload = {\n contact_id: contactId,\n name: `${formData.industry || 'General'} Inquiry - ${formData.firstName} ${formData.lastName}`,\n description: formData.message || 'Inquiry from website contact form',\n createdAt: currentDate,\n pipeline_id: this.pipelineId,\n pipeline_stage_id: this.pipelineStageId,\n amount: null,\n expected_close_date: currentDate,\n actual_close_date: currentDate,\n owner: null,\n };\n const opportunityApiUrl = `${this.baseUrl}/api/crm/opportunities`;\n const opportunityResponse = await this.auth.makeAuthenticatedRequest(opportunityApiUrl, {\n method: 'POST',\n body: JSON.stringify(opportunityPayload),\n });\n if (opportunityResponse.ok) {\n const opportunityData = await opportunityResponse.json();\n opportunityId = opportunityData.id || opportunityData.data?.id;\n }\n }\n\n return { success: true, contactId, opportunityId };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to submit to ERP';\n return { success: false, contactId: '', error: message };\n }\n }\n\n extractContactData(formData: Record<string, unknown>, formFields: { id: string | number; type: string; label: string }[]): ContactFormData | null {\n const contactData: ContactFormData = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n industry: '',\n message: '',\n };\n let hasEmail = false;\n\n for (const field of formFields) {\n const fieldValue = formData[field.id.toString()];\n if (fieldValue == null) continue;\n const label = field.label.toLowerCase();\n const value = String(fieldValue).trim();\n\n if (field.type === 'email') {\n contactData.email = value;\n hasEmail = true;\n } else if (field.type === 'phone') {\n contactData.phone = value;\n } else if (field.type === 'text' || field.type === 'textarea') {\n if (label.includes('first name') || label.includes('firstname')) {\n contactData.firstName = value;\n } else if (label.includes('last name') || label.includes('lastname')) {\n contactData.lastName = value;\n } else if (label.includes('name') && !contactData.firstName) {\n const nameParts = value.split(' ');\n if (nameParts.length >= 2) {\n contactData.firstName = nameParts[0];\n contactData.lastName = nameParts.slice(1).join(' ');\n } else {\n contactData.firstName = value;\n }\n } else if (label.includes('industry')) {\n contactData.industry = value;\n } else if (label.includes('message') || label.includes('comment') || label.includes('description') || label.includes('inquiry')) {\n contactData.message = value;\n }\n }\n }\n\n if (!hasEmail && !contactData.firstName) return null;\n if (!contactData.firstName && contactData.email) {\n contactData.firstName = contactData.email.split('@')[0];\n contactData.lastName = '';\n }\n return contactData;\n }\n}\n","import type { CmsPlugin } from '../types';\nimport { ERPAuthService } from './erp-auth';\nimport { ERPSubmissionService } from './erp-submission';\n\nexport interface ERPPluginConfig {\n baseUrl?: string;\n clientId: string;\n clientSecret: string;\n tenantId: string;\n pipelineId?: string;\n pipelineStageId?: string;\n}\n\nexport interface ERPPluginInstance {\n auth: ERPAuthService;\n submission: ERPSubmissionService;\n}\n\nexport function erpPlugin(config: ERPPluginConfig): CmsPlugin<ERPPluginInstance> {\n return {\n name: 'erp',\n version: '1.0.0',\n async init(context) {\n const baseUrl = config.baseUrl || context.config.ERP_API_BASE_URL || 'https://uat.infuroerp.com';\n const clientId = config.clientId || context.config.CLIENT_ID || '';\n const clientSecret = config.clientSecret || context.config.CLIENT_SECRET || '';\n const tenantId = config.tenantId || context.config.TENANT_ID || '';\n const pipelineId = config.pipelineId || context.config.PIPELINE_ID || '';\n const pipelineStageId = config.pipelineStageId || context.config.PIPELINE_STAGE_ID || '';\n\n const auth = new ERPAuthService({\n baseUrl,\n clientId,\n clientSecret,\n tenantId,\n });\n const submission = new ERPSubmissionService({\n baseUrl,\n pipelineId,\n pipelineStageId,\n auth,\n });\n return { auth, submission };\n },\n };\n}\n\nexport { ERPAuthService, ERPSubmissionService };\nexport type { ContactFormData, ERPSubmissionResult } from './erp-submission';\n","import type { CmsPlugin } from '../types';\nimport { EmailService } from './email-service';\n\nexport interface EmailPluginConfig {\n type: 'AWS' | 'SMTP' | 'GMAIL' | 'SENDGRID';\n user?: string;\n password?: string;\n from: string;\n to: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport function emailPlugin(config: EmailPluginConfig): CmsPlugin<EmailService> {\n return {\n name: 'email',\n version: '1.0.0',\n async init(context) {\n const from = config.from || context.config.SMTP_FROM || 'no-reply@example.com';\n const to = config.to || context.config.SMTP_TO || 'info@example.com';\n const type = (config.type || context.config.SMTP_TYPE) as EmailPluginConfig['type'] || 'SMTP';\n const merged: EmailPluginConfig = {\n ...config,\n from,\n to,\n type,\n user: config.user ?? context.config.SMTP_USER,\n password: config.password ?? context.config.SMTP_PASSWORD,\n region: config.region ?? context.config.AWS_REGION,\n accessKeyId: config.accessKeyId ?? context.config.AWS_ACCESS_KEY_ID,\n secretAccessKey: config.secretAccessKey ?? context.config.AWS_SECRET_ACCESS_KEY,\n };\n if (type === 'AWS' && (!merged.region || !merged.accessKeyId || !merged.secretAccessKey)) {\n context.logger.warn('Email plugin skipped: AWS SES configuration incomplete');\n return undefined;\n }\n if ((type === 'SMTP' || type === 'GMAIL') && (!merged.user || !merged.password)) {\n context.logger.warn('Email plugin skipped: SMTP credentials not configured');\n return undefined;\n }\n return new EmailService(merged);\n },\n };\n}\n\nexport { EmailService, emailTemplates } from './email-service';\nexport type { EmailData, EmailPluginConfig as EmailConfig, EmailServiceInterface } from './email-service';\n","import { google } from 'googleapis';\n\nexport interface AnalyticsData {\n visitors: number;\n pageViews: number;\n bounceRate: number;\n avgSessionDuration: number;\n topPages: Array<{ page: string; views: number }>;\n trafficSources: Array<{ source: string; sessions: number }>;\n geographicData: Array<{ country: string; sessions: number }>;\n dailyUsers: Array<{ date: string; users: number }>;\n}\n\nexport interface AnalyticsPluginConfig {\n privateKey: string;\n clientEmail: string;\n viewId: string;\n}\n\nexport class AnalyticsService {\n private analytics: ReturnType<typeof google.analyticsdata>;\n private viewId: string;\n\n constructor(config: AnalyticsPluginConfig) {\n const privateKey = config.privateKey.replace(/\\\\n/g, '\\n');\n const auth = new google.auth.JWT({\n email: config.clientEmail,\n key: privateKey,\n scopes: ['https://www.googleapis.com/auth/analytics.readonly'],\n });\n this.analytics = google.analyticsdata({ version: 'v1beta', auth });\n this.viewId = config.viewId;\n }\n\n async getAnalyticsData(days = 30): Promise<AnalyticsData> {\n const endDate = new Date();\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - days);\n\n const [visitors, pageViews, bounceRate, sessionDuration, topPages, trafficSources, geographicData, dailyUsers] =\n await Promise.all([\n this.getVisitors(startDate, endDate),\n this.getPageViews(startDate, endDate),\n this.getBounceRate(startDate, endDate),\n this.getAvgSessionDuration(startDate, endDate),\n this.getTopPages(startDate, endDate),\n this.getTrafficSources(startDate, endDate),\n this.getGeographicData(startDate, endDate),\n this.getDailyUsers(startDate, endDate),\n ]);\n\n return {\n visitors,\n pageViews,\n bounceRate,\n avgSessionDuration: sessionDuration,\n topPages,\n trafficSources,\n geographicData,\n dailyUsers,\n };\n }\n\n private async runReport(requestBody: Record<string, unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await (this.analytics.properties.runReport as any)({\n property: `properties/${this.viewId}`,\n requestBody,\n });\n return response?.data as { rows?: Array<{ dimensionValues: { value: string }[]; metricValues: { value: string }[] }> };\n }\n\n private async getVisitors(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'totalUsers' }],\n });\n return parseInt(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getPageViews(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'screenPageViews' }],\n });\n return parseInt(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getBounceRate(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'bounceRate' }],\n });\n return parseFloat(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getAvgSessionDuration(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'averageSessionDuration' }],\n });\n return parseFloat(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getTopPages(startDate: Date, endDate: Date): Promise<Array<{ page: string; views: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'pagePath' }],\n metrics: [{ name: 'screenPageViews' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ page: row.dimensionValues[0].value, views: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getTrafficSources(\n startDate: Date,\n endDate: Date\n ): Promise<Array<{ source: string; sessions: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'sessionSource' }],\n metrics: [{ name: 'sessions' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ source: row.dimensionValues[0].value, sessions: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getGeographicData(\n startDate: Date,\n endDate: Date\n ): Promise<Array<{ country: string; sessions: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'country' }],\n metrics: [{ name: 'sessions' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ country: row.dimensionValues[0].value, sessions: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getDailyUsers(startDate: Date, endDate: Date): Promise<Array<{ date: string; users: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'date' }],\n metrics: [{ name: 'totalUsers' }],\n orderBys: [{ dimension: { dimensionName: 'date' } }],\n });\n return (\n data.rows?.map((row) => {\n const dateStr = row.dimensionValues[0].value;\n return { date: `${dateStr.substring(4, 6)}/${dateStr.substring(6, 8)}`, users: parseInt(row.metricValues[0].value) };\n }) || []\n );\n }\n}\n","import type { CmsPlugin } from '../types';\nimport { AnalyticsService } from './analytics-service';\n\nexport interface AnalyticsPluginConfig {\n privateKey?: string;\n clientEmail?: string;\n viewId?: string;\n}\n\nexport function analyticsPlugin(config: AnalyticsPluginConfig = {}): CmsPlugin<AnalyticsService> {\n return {\n name: 'analytics',\n version: '1.0.0',\n async init(context) {\n const privateKey = config.privateKey ?? context.config.GOOGLE_ANALYTICS_PRIVATE_KEY;\n const clientEmail = config.clientEmail ?? context.config.GOOGLE_ANALYTICS_CLIENT_EMAIL;\n const viewId = config.viewId ?? context.config.GOOGLE_ANALYTICS_VIEW_ID ?? '';\n if (!privateKey || !clientEmail || !viewId) {\n throw new Error('Google Analytics credentials not configured');\n }\n return new AnalyticsService({ privateKey, clientEmail, viewId });\n },\n };\n}\n\nexport { AnalyticsService } from './analytics-service';\nexport type { AnalyticsData } from './analytics-service';\n","import type { CmsPlugin } from '../types';\n\n/** Provider-agnostic SMS interface. Implementations (Twilio, AWS SNS, etc.) can be added later. */\nexport interface SmsServiceInterface {\n send(to: string, message: string): Promise<boolean>;\n}\n\nexport interface SmsPluginConfig {\n provider?: string;\n [key: string]: string | undefined;\n}\n\n/** Stub SMS plugin - no implementation yet. Register and implement in app or extend core later. */\nexport function smsPlugin(_config: SmsPluginConfig = {}): CmsPlugin<SmsServiceInterface | null> {\n return {\n name: 'sms',\n version: '1.0.0',\n async init() {\n return null;\n },\n };\n}\n","import type { CmsPlugin, PluginContext } from '../types';\n\nexport interface PaymentIntent {\n id: string;\n clientSecret: string;\n amount: number;\n currency: string;\n status: string;\n}\n\nexport interface PaymentServiceInterface {\n createPaymentIntent(amount: number, currency: string, metadata?: Record<string, string>): Promise<PaymentIntent>;\n capturePayment(paymentId: string, amount?: number): Promise<boolean>;\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean;\n}\n\nexport interface StripeConfig {\n provider: 'stripe';\n secretKey: string;\n webhookSecret?: string;\n}\n\nexport interface RazorpayConfig {\n provider: 'razorpay';\n keyId: string;\n keySecret: string;\n webhookSecret?: string;\n}\n\nexport type PaymentPluginConfig = StripeConfig | RazorpayConfig;\n\nexport function paymentPlugin(config: PaymentPluginConfig): CmsPlugin<PaymentServiceInterface | undefined> {\n return {\n name: 'payment',\n version: '1.0.0',\n async init(context: PluginContext) {\n if (config.provider === 'stripe') {\n const { StripePaymentService } = await import('./stripe');\n const secretKey = config.secretKey || context.config.STRIPE_SECRET_KEY;\n if (!secretKey) {\n context.logger.warn('Payment plugin skipped: Stripe secret key not configured');\n return undefined;\n }\n return new StripePaymentService({\n secretKey,\n webhookSecret: config.webhookSecret || context.config.STRIPE_WEBHOOK_SECRET,\n });\n }\n\n if (config.provider === 'razorpay') {\n const { RazorpayPaymentService } = await import('./razorpay');\n const keyId = config.keyId || context.config.RAZORPAY_KEY_ID;\n const keySecret = config.keySecret || context.config.RAZORPAY_KEY_SECRET;\n if (!keyId || !keySecret) {\n context.logger.warn('Payment plugin skipped: Razorpay credentials not configured');\n return undefined;\n }\n return new RazorpayPaymentService({\n keyId,\n keySecret,\n webhookSecret: config.webhookSecret || context.config.RAZORPAY_WEBHOOK_SECRET,\n });\n }\n\n context.logger.warn(`Payment plugin skipped: unknown provider \"${(config as { provider: string }).provider}\"`);\n return undefined;\n },\n };\n}\n","import type { CmsPlugin } from '../types';\nimport type { StorageService } from './types';\n\nexport interface S3StoragePluginConfig {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n bucket: string;\n baseUrl?: string;\n prefix?: string;\n}\n\nfunction getS3Storage(config: S3StoragePluginConfig): StorageService {\n const prefix = (config.prefix ?? 'uploads').replace(/\\/$/, '');\n const keyPrefix = prefix ? `${prefix}/` : '';\n\n return {\n async upload(buffer: Buffer, key: string, contentType: string): Promise<string> {\n const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3');\n const client = new S3Client({\n region: config.region,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n });\n const fullKey = keyPrefix + key.replace(/^\\/+/, '');\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: fullKey,\n Body: buffer,\n ContentType: contentType,\n })\n );\n if (config.baseUrl) {\n return `${config.baseUrl.replace(/\\/$/, '')}/${fullKey}`;\n }\n return `https://s3.${config.region}.amazonaws.com/${config.bucket}/${fullKey}`;\n },\n };\n}\n\nexport function s3StoragePlugin(\n config: Partial<S3StoragePluginConfig> & { bucket: string }\n): CmsPlugin<StorageService> {\n return {\n name: 'storage',\n version: '1.0.0',\n async init(context) {\n const region = config.region ?? context.config.AWS_REGION ?? '';\n const accessKeyId = config.accessKeyId ?? context.config.AWS_ACCESS_KEY_ID ?? '';\n const secretAccessKey = config.secretAccessKey ?? context.config.AWS_SECRET_ACCESS_KEY ?? '';\n const bucket = config.bucket ?? context.config.AWS_BUCKET_NAME ?? '';\n const baseUrl = config.baseUrl ?? context.config.S3_MEDIA_URL ?? context.config.S3_CUSTOM_DOMAIN;\n const resolvedBaseUrl =\n typeof baseUrl === 'string' && baseUrl\n ? baseUrl.startsWith('http')\n ? baseUrl\n : `https://${baseUrl}`\n : undefined;\n if (!region || !accessKeyId || !secretAccessKey || !bucket) {\n throw new Error('S3 storage plugin: missing region, accessKeyId, secretAccessKey or bucket');\n }\n return getS3Storage({\n region,\n accessKeyId,\n secretAccessKey,\n bucket,\n baseUrl: resolvedBaseUrl,\n prefix: config.prefix ?? 'uploads',\n });\n },\n };\n}\n","import type { CmsPlugin } from '../types';\nimport type { StorageService } from './types';\n\nexport interface LocalStoragePluginConfig {\n /** Directory relative to process.cwd() (e.g. \"public/uploads\"). */\n dir?: string;\n /** Public URL prefix for returned URLs (e.g. \"\" for \"/uploads/...\"). */\n publicPath?: string;\n}\n\nfunction getLocalStorage(config: LocalStoragePluginConfig): StorageService {\n const dir = (config.dir ?? 'public/uploads').replace(/\\/$/, '');\n const publicPath =\n config.publicPath ??\n (dir === 'public/uploads' ? '/uploads' : `/${dir.replace(/^\\/+/, '').replace(/\\\\/g, '/')}`);\n\n return {\n async upload(buffer: Buffer, key: string, _contentType: string): Promise<string> {\n const fs = await import('fs/promises');\n const path = await import('path');\n const normalizedKey = key.replace(/^\\/+/, '').replace(/\\.\\./g, '');\n const fileName = normalizedKey.replace(/^uploads\\//, '');\n const fullDir = path.join(process.cwd(), dir);\n await fs.mkdir(fullDir, { recursive: true });\n const filePath = path.join(fullDir, fileName);\n const fileDir = path.dirname(filePath);\n await fs.mkdir(fileDir, { recursive: true });\n await fs.writeFile(filePath, buffer);\n return `${publicPath.replace(/\\/$/, '')}/${fileName}`;\n },\n };\n}\n\nexport function localStoragePlugin(config: LocalStoragePluginConfig = {}): CmsPlugin<StorageService> {\n return {\n name: 'storage',\n version: '1.0.0',\n async init(context) {\n const dir = config.dir ?? context.config.UPLOAD_DIR ?? 'public/uploads';\n return getLocalStorage({ ...config, dir });\n },\n };\n}\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function validateSlug(slug: string): boolean {\n const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n return slugRegex.test(slug) && slug.length >= 3 && slug.length <= 50;\n}\n\nexport function formatDate(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function formatDateTime(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatDateOnly(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength).trim() + '...';\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { UserGroup } from './user-group.entity';\n\n@Entity('users')\nexport class User {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n email: string;\n\n @Column('varchar', { nullable: true })\n password: string | null;\n\n @Column('boolean', { default: false })\n blocked: boolean;\n\n @Column('int', { nullable: true })\n groupId: number | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => UserGroup, (g) => g.users, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'groupId' })\n group: UserGroup | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { Permission } from './permission.entity';\nimport { User } from './user.entity';\n\n@Entity('user_groups')\nexport class UserGroup {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => Permission, (p) => p.group)\n permissions: Permission[];\n\n @OneToMany(() => User, (u) => u.group)\n users: User[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { UserGroup } from './user-group.entity';\n\n@Entity('permissions')\nexport class Permission {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n groupId: number;\n\n @Column('varchar')\n entity: string;\n\n @Column('boolean', { default: false })\n canCreate: boolean;\n\n @Column('boolean', { default: false })\n canRead: boolean;\n\n @Column('boolean', { default: false })\n canUpdate: boolean;\n\n @Column('boolean', { default: false })\n canDelete: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => UserGroup, (g) => g.permissions, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'groupId' })\n group: UserGroup;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('password_reset_tokens')\nexport class PasswordResetToken {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n email: string;\n\n @Column('varchar', { unique: true })\n token: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n expiresAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n}\n","import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n OneToMany,\n ManyToMany,\n JoinTable,\n JoinColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\nimport { Category } from './category.entity';\nimport { Seo } from './seo.entity';\nimport { Comment } from './comment.entity';\nimport { Tag } from './tag.entity';\n\n@Entity('blogs')\nexport class Blog {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n title: string;\n\n @Column('text')\n content: string;\n\n @Column('varchar', { nullable: true })\n coverImage: string | null;\n\n @Column('int')\n authorId: number;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @ManyToOne(() => User, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'authorId' })\n author: User;\n\n @ManyToOne(() => Category, (c) => c.blogs, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: Category | null;\n\n @ManyToOne(() => Seo, (s) => s.blogs, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @OneToMany(() => Comment, (c) => c.blog)\n comments: Comment[];\n\n @ManyToMany(() => Tag, (t) => t.blogs)\n @JoinTable({\n name: 'blog_tags',\n joinColumn: { name: 'blogId', referencedColumnName: 'id' },\n inverseJoinColumn: { name: 'tagId', referencedColumnName: 'id' },\n })\n tags: Tag[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport type { Blog } from './blog.entity';\n\n@Entity('categories')\nexport class Category {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany('Blog', 'category')\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { Blog } from './blog.entity';\n\n@Entity('seos')\nexport class Seo {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { nullable: true })\n title: string | null;\n\n @Column('varchar', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n keywords: string | null;\n\n @Column('varchar', { nullable: true })\n ogTitle: string | null;\n\n @Column('varchar', { nullable: true })\n ogDescription: string | null;\n\n @Column('varchar', { nullable: true })\n ogImage: string | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => Blog, (blog) => blog.seo)\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { User } from './user.entity';\nimport { Blog } from './blog.entity';\n\n@Entity('comments')\nexport class Comment {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('text')\n content: string;\n\n @Column('int')\n blogId: number;\n\n @Column('int')\n authorId: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => User, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'authorId' })\n author: User;\n\n @ManyToOne(() => Blog, (b) => b.comments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'blogId' })\n blog: Blog;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';\nimport { Blog } from './blog.entity';\n\n@Entity('tags')\nexport class Tag {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToMany(() => Blog, (blog) => blog.tags)\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { FormSubmission } from './form-submission.entity';\nimport { Address } from './address.entity';\nimport { Order } from './order.entity';\nimport { Payment } from './payment.entity';\n\n@Entity('contacts')\nexport class Contact {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n email: string;\n\n @Column('varchar', { nullable: true })\n phone: string | null;\n\n @Column('varchar', { nullable: true })\n type: string | null;\n\n @Column('varchar', { nullable: true })\n company: string | null;\n\n @Column('varchar', { nullable: true })\n taxId: string | null;\n\n @Column('text', { nullable: true })\n notes: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => FormSubmission, (fs) => fs.contact)\n form_submissions: FormSubmission[];\n\n @OneToMany(() => Address, (a) => a.contact)\n addresses: Address[];\n\n @OneToMany(() => Order, (o) => o.contact)\n orders: Order[];\n\n @OneToMany(() => Payment, (p) => p.contact)\n payments: Payment[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Form } from './form.entity';\nimport { Contact } from './contact.entity';\n\n@Entity('form_submissions')\nexport class FormSubmission {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n formId: number;\n\n @Column('int', { nullable: true })\n contactId: number | null;\n\n @Column('jsonb')\n data: Record<string, unknown>;\n\n @Column('varchar', { nullable: true })\n ipAddress: string | null;\n\n @Column('varchar', { nullable: true })\n userAgent: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Form, (f) => f.submissions, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'formId' })\n form: Form;\n\n @ManyToOne(() => Contact, (c) => c.form_submissions, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { FormField } from './form-field.entity';\nimport { FormSubmission } from './form-submission.entity';\n\n@Entity('forms')\nexport class Form {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n campaign: string | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => FormField, (f) => f.form)\n fields: FormField[];\n\n @OneToMany(() => FormSubmission, (s) => s.form)\n submissions: FormSubmission[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Form } from './form.entity';\n\n@Entity('form_fields')\nexport class FormField {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n formId: number;\n\n @Column('varchar')\n label: string;\n\n @Column('varchar')\n type: string;\n\n @Column('varchar', { nullable: true })\n placeholder: string | null;\n\n @Column('varchar', { nullable: true })\n options: string | null;\n\n @Column('boolean', { default: false })\n required: boolean;\n\n @Column('varchar', { nullable: true })\n validation: string | null;\n\n @Column('int')\n order: number;\n\n @Column('int', { default: 1 })\n groupId: number;\n\n @Column('int', { default: 12 })\n columnWidth: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Form, (f) => f.fields, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'formId' })\n form: Form;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Contact } from './contact.entity';\n\n@Entity('addresses')\nexport class Address {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n contactId: number;\n\n @Column('varchar', { nullable: true })\n tag: string | null;\n\n @Column('varchar', { nullable: true })\n line1: string | null;\n\n @Column('varchar', { nullable: true })\n line2: string | null;\n\n @Column('varchar', { nullable: true })\n city: string | null;\n\n @Column('varchar', { nullable: true })\n state: string | null;\n\n @Column('varchar', { nullable: true })\n postalCode: string | null;\n\n @Column('varchar', { nullable: true })\n country: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Contact, (c) => c.addresses, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { Contact } from './contact.entity';\nimport { Address } from './address.entity';\nimport type { OrderItem } from './order-item.entity';\nimport type { Payment } from './payment.entity';\n\n@Entity('orders')\nexport class Order {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n orderNumber: string;\n\n @Column('int')\n contactId: number;\n\n @Column('int', { nullable: true })\n billingAddressId: number | null;\n\n @Column('int', { nullable: true })\n shippingAddressId: number | null;\n\n @Column('varchar', { default: 'pending' })\n status: 'pending' | 'confirmed' | 'processing' | 'completed' | 'cancelled';\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n subtotal: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n tax: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n discount: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n total: number;\n\n @Column('varchar', { default: 'INR' })\n currency: string;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Contact, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact;\n\n @ManyToOne(() => Address, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'billingAddressId' })\n billingAddress: Address | null;\n\n @ManyToOne(() => Address, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'shippingAddressId' })\n shippingAddress: Address | null;\n\n @OneToMany('OrderItem', 'order')\n items: OrderItem[];\n\n @OneToMany('Payment', 'order')\n payments: Payment[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Order } from './order.entity';\nimport { Contact } from './contact.entity';\n\n@Entity('payments')\nexport class Payment {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n orderId: number;\n\n @Column('int', { nullable: true })\n contactId: number | null;\n\n @Column('decimal', { precision: 12, scale: 2 })\n amount: number;\n\n @Column('varchar', { default: 'INR' })\n currency: string;\n\n @Column('varchar', { default: 'pending' })\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'refunded';\n\n @Column('varchar', { nullable: true })\n method: string | null;\n\n @Column('varchar', { nullable: true })\n externalReference: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', nullable: true })\n paidAt: Date | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Order, (o) => o.payments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'orderId' })\n order: Order;\n\n @ManyToOne(() => Contact, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, Unique } from 'typeorm';\n\n@Entity('configs')\n@Unique(['settings', 'key'])\nexport class Config {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n settings: string;\n\n @Column('varchar')\n key: string;\n\n @Column('varchar')\n value: string;\n\n @Column('varchar', { default: 'private' })\n type: 'public' | 'private';\n\n @Column('boolean', { default: false })\n encrypted: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('media')\nexport class Media {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n filename: string;\n\n @Column('varchar')\n url: string;\n\n @Column('varchar')\n mimeType: string;\n\n @Column('int', { default: 0 })\n size: number;\n\n @Column('varchar', { nullable: true })\n alt: string | null;\n\n @Column('boolean', { default: false })\n isPublic: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Seo } from './seo.entity';\n\n@Entity('pages')\nexport class Page {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n title: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column({ type: 'jsonb', default: {} })\n content: object;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column('varchar', { default: 'default' })\n theme: string;\n\n @Column('int', { nullable: true })\n parentId: number | null;\n\n @ManyToOne(() => Page, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'parentId' })\n parent: Page | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport type { Product } from './product.entity';\nimport type { Collection } from './collection.entity';\n\n@Entity('product_categories')\nexport class ProductCategory {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('int', { nullable: true })\n parentId: number | null;\n\n @Column('varchar', { nullable: true })\n image: string | null;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.children, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'parentId' })\n parent: ProductCategory | null;\n\n @OneToMany(() => ProductCategory, (c) => c.parent)\n children: ProductCategory[];\n\n @OneToMany('Product', 'category')\n products: Product[];\n\n @OneToMany('Collection', 'category')\n collections: Collection[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { ProductCategory } from './product-category.entity';\nimport { Brand } from './brand.entity';\nimport { Seo } from './seo.entity';\nimport type { Product } from './product.entity';\n\n@Entity('collections')\nexport class Collection {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('int', { nullable: true })\n brandId: number | null;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n image: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.collections, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: ProductCategory | null;\n\n @ManyToOne(() => Brand, (b) => b.collections, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'brandId' })\n brand: Brand | null;\n\n @OneToMany('Product', 'collection')\n products: Product[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany, ManyToOne, JoinColumn } from 'typeorm';\nimport { Seo } from './seo.entity';\nimport type { Product } from './product.entity';\nimport type { Collection } from './collection.entity';\n\n@Entity('brands')\nexport class Brand {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('varchar', { nullable: true })\n logo: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @OneToMany('Product', 'brand')\n products: Product[];\n\n @OneToMany('Collection', 'brand')\n collections: Collection[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { Collection } from './collection.entity';\nimport { Brand } from './brand.entity';\nimport { ProductCategory } from './product-category.entity';\nimport { Seo } from './seo.entity';\nimport type { ProductAttribute } from './product-attribute.entity';\nimport type { ProductTax } from './product-tax.entity';\n\n@Entity('products')\nexport class Product {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int', { nullable: true })\n collectionId: number | null;\n\n @Column('int', { nullable: true })\n brandId: number | null;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('varchar', { nullable: true })\n sku: string | null;\n\n @Column('varchar', { unique: true, nullable: true })\n slug: string | null;\n\n @Column('varchar', { nullable: true })\n name: string | null;\n\n @Column('decimal', { precision: 12, scale: 2 })\n price: number;\n\n @Column('decimal', { precision: 12, scale: 2, nullable: true })\n compareAtPrice: number | null;\n\n @Column('int', { default: 0 })\n quantity: number;\n\n @Column('varchar', { default: 'draft' })\n status: 'draft' | 'available' | 'reserved' | 'sold';\n\n @Column('boolean', { default: false })\n featured: boolean;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @ManyToOne(() => Collection, (c) => c.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'collectionId' })\n collection: Collection | null;\n\n @ManyToOne(() => Brand, (b) => b.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'brandId' })\n brand: Brand | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: ProductCategory | null;\n\n @OneToMany('ProductAttribute', 'product')\n attributes: ProductAttribute[];\n\n @OneToMany('ProductTax', 'product')\n taxes: ProductTax[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('attributes')\nexport class Attribute {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('varchar', { default: 'text' })\n type: 'text' | 'number' | 'select' | 'boolean';\n\n @Column('jsonb', { nullable: true })\n options: string[] | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Product } from './product.entity';\nimport { Attribute } from './attribute.entity';\n\n@Entity('product_attributes')\nexport class ProductAttribute {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n productId: number;\n\n @Column('int')\n attributeId: number;\n\n @Column('varchar')\n value: string;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Product, (p) => p.attributes, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n\n @ManyToOne(() => Attribute, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'attributeId' })\n attribute: Attribute;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('taxes')\nexport class Tax {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('decimal', { precision: 5, scale: 2 })\n rate: number;\n\n @Column('boolean', { default: false })\n isDefault: boolean;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Product } from './product.entity';\nimport { Tax } from './tax.entity';\n\n@Entity('product_taxes')\nexport class ProductTax {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n productId: number;\n\n @Column('int')\n taxId: number;\n\n @Column('decimal', { precision: 5, scale: 2, nullable: true })\n rate: number | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Product, (p) => p.taxes, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n\n @ManyToOne(() => Tax, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'taxId' })\n tax: Tax;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Order } from './order.entity';\nimport { Product } from './product.entity';\n\n@Entity('order_items')\nexport class OrderItem {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n orderId: number;\n\n @Column('int')\n productId: number;\n\n @Column('int', { default: 1 })\n quantity: number;\n\n @Column('decimal', { precision: 12, scale: 2 })\n unitPrice: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n tax: number;\n\n @Column('decimal', { precision: 12, scale: 2 })\n total: number;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Order, (o) => o.items, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'orderId' })\n order: Order;\n\n @ManyToOne(() => Product, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n}\n","import type { EntityTarget } from 'typeorm';\nimport { User } from './user.entity';\nimport { PasswordResetToken } from './password-reset-token.entity';\nimport { UserGroup } from './user-group.entity';\nimport { Permission } from './permission.entity';\nimport { Blog } from './blog.entity';\nimport { Tag } from './tag.entity';\nimport { Category } from './category.entity';\nimport { Comment } from './comment.entity';\nimport { Contact } from './contact.entity';\nimport { Address } from './address.entity';\nimport { Form } from './form.entity';\nimport { FormField } from './form-field.entity';\nimport { FormSubmission } from './form-submission.entity';\nimport { Seo } from './seo.entity';\nimport { Config } from './config.entity';\nimport { Media } from './media.entity';\nimport { Page } from './page.entity';\nimport { ProductCategory } from './product-category.entity';\nimport { Collection } from './collection.entity';\nimport { Product } from './product.entity';\nimport { Attribute } from './attribute.entity';\nimport { ProductAttribute } from './product-attribute.entity';\nimport { Tax } from './tax.entity';\nimport { ProductTax } from './product-tax.entity';\nimport { Order } from './order.entity';\nimport { OrderItem } from './order-item.entity';\nimport { Payment } from './payment.entity';\nimport { Brand } from './brand.entity';\n\nexport {\n User,\n PasswordResetToken,\n UserGroup,\n Permission,\n Blog,\n Tag,\n Category,\n Comment,\n Contact,\n Form,\n FormField,\n FormSubmission,\n Seo,\n Config,\n Media,\n Page,\n ProductCategory,\n Collection,\n Product,\n Attribute,\n ProductAttribute,\n Tax,\n ProductTax,\n Order,\n OrderItem,\n Payment,\n Brand,\n};\n\n/** Map API resource segment (e.g. \"blogs\", \"form_submissions\") to entity. Used by CRUD handler. */\nexport const CMS_ENTITY_MAP: Record<string, EntityTarget<import('typeorm').ObjectLiteral>> = {\n users: User,\n password_reset_tokens: PasswordResetToken,\n user_groups: UserGroup,\n permissions: Permission,\n blogs: Blog,\n tags: Tag,\n categories: Category,\n comments: Comment,\n contacts: Contact,\n addresses: Address,\n forms: Form,\n form_fields: FormField,\n form_submissions: FormSubmission,\n seos: Seo,\n configs: Config,\n media: Media,\n pages: Page,\n product_categories: ProductCategory,\n collections: Collection,\n products: Product,\n attributes: Attribute,\n product_attributes: ProductAttribute,\n taxes: Tax,\n product_taxes: ProductTax,\n orders: Order,\n order_items: OrderItem,\n payments: Payment,\n brands: Brand,\n};\n","export interface SessionUser {\n id?: string;\n email?: string | null;\n name?: string | null;\n groupId?: number;\n permissions?: string[];\n}\n\nexport type GetSession = () => Promise<{ user?: SessionUser } | null>;\n\nexport const OPEN_ENDPOINTS: Array<Record<string, string[]>> = [\n { '/api/contacts': ['POST'] },\n { '/api/form-submissions': ['POST'] },\n { '/api/blogs': ['GET'] },\n];\n\nexport const PERMISSION_REQUIRED_ENDPOINTS: Record<string, string[]> = {};\n\nexport function isOpenEndpoint(pathname: string): boolean {\n return OPEN_ENDPOINTS.some((endpoint) => pathname.startsWith(Object.keys(endpoint)[0]));\n}\n\nexport function getRequiredPermission(pathname: string): string[] | null {\n return null;\n}\n\nexport function isPublicMethod(pathname: string, method: string): boolean {\n for (const endpoint of OPEN_ENDPOINTS) {\n const key = Object.keys(endpoint)[0];\n if (pathname.startsWith(key) && endpoint[key].includes(method)) return true;\n }\n return false;\n}\n\nexport interface AuthHelpers {\n requireAuth(req: Request): Promise<Response | null>;\n requirePermission(req: Request, permission: string): Promise<Response | null>;\n getAuthenticatedUser(): Promise<SessionUser | null>;\n}\n\nexport function createAuthHelpers(getSession: GetSession, NextResponse: { json: (body: unknown, init?: { status?: number }) => Response }): AuthHelpers {\n return {\n async requireAuth() {\n const session = await getSession();\n if (!session?.user?.email) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n }\n return null;\n },\n async requirePermission() {\n const session = await getSession();\n if (!session?.user?.email) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n }\n return null;\n },\n async getAuthenticatedUser() {\n const session = await getSession();\n return session?.user ?? null;\n },\n };\n}\n","export interface CmsMiddlewareConfig {\n publicAdminPaths?: string[];\n publicApiPaths?: string[];\n /** path -> allowed methods */\n publicApiMethods?: Record<string, string[]>;\n signInPath?: string;\n getSessionToken?: (request: { cookies: { get: (name: string) => { value?: string } | undefined } }) => string | undefined;\n}\n\n/** Default public API paths (no auth). Sites should extend this with their own routes. */\nexport const defaultPublicApiMethods: Record<string, string[]> = {\n '/api/contacts': ['POST'],\n '/api/form-submissions': ['POST'],\n '/api/blogs': ['GET'],\n '/api/forms': ['GET'],\n '/api/auth': ['GET', 'POST'],\n '/api/health': ['GET'],\n '/api/users/forgot-password': ['POST'],\n '/api/users/set-password': ['POST'],\n '/api/users/invite': ['POST'],\n};\n\nfunction defaultGetSessionToken(request: { cookies: { get: (name: string) => { value?: string } | undefined } }): string | undefined {\n return (\n request.cookies.get('__Secure-next-auth.session-token')?.value ??\n request.cookies.get('next-auth.session-token')?.value\n );\n}\n\nfunction isPublicMethod(pathname: string, method: string, publicApiMethods: Record<string, string[]>): boolean {\n for (const [endpoint, methods] of Object.entries(publicApiMethods)) {\n if (pathname.startsWith(endpoint) && methods.includes(method)) return true;\n }\n return false;\n}\n\n/**\n * Returns middleware logic. Use from Next.js middleware:\n * import { createCmsMiddleware } from '@infuro/cms-core';\n * export const middleware = createCmsMiddleware({ ... });\n * export const config = { matcher: ['/admin/:path*', '/api/:path*'] };\n */\nexport function createCmsMiddleware(config: CmsMiddlewareConfig = {}) {\n const {\n publicAdminPaths = ['/admin/signin', '/admin/forgot-password', '/admin/reset-password', '/admin/invite'],\n publicApiMethods = defaultPublicApiMethods,\n signInPath = '/admin/signin',\n getSessionToken = defaultGetSessionToken,\n } = config;\n\n return function cmsMiddleware(request: {\n nextUrl: { pathname: string };\n url: string;\n method: string;\n cookies: { get: (name: string) => { value?: string } | undefined };\n }): { type: 'next' } | { type: 'redirect'; url: string } | { type: 'json'; status: number; body: unknown } {\n const pathname = request.nextUrl.pathname;\n const method = request.method;\n\n if (publicAdminPaths.some((p) => pathname === p || pathname.startsWith(p + '/'))) {\n return { type: 'next' };\n }\n\n if (pathname.startsWith('/admin')) {\n const token = getSessionToken(request);\n if (!token) {\n return { type: 'redirect', url: new URL(signInPath, request.url).toString() };\n }\n }\n\n if (pathname.startsWith('/api')) {\n if (isPublicMethod(pathname, method, publicApiMethods)) {\n return { type: 'next' };\n }\n const token = getSessionToken(request);\n if (!token) {\n return { type: 'json', status: 401, body: { error: 'Unauthorized' } };\n }\n }\n\n return { type: 'next' };\n };\n}\n","/**\n * Build NextAuth options for credentials auth. App can extend/override via extend().\n */\nimport type { NextAuthOptions } from 'next-auth';\nimport _CredentialsProvider from 'next-auth/providers/credentials';\nconst CredentialsProvider = (_CredentialsProvider as unknown as { default: typeof _CredentialsProvider }).default ?? _CredentialsProvider;\n\nexport interface NextAuthUser {\n id: number;\n email: string;\n name: string | null;\n password: string | null;\n blocked?: boolean;\n deleted?: boolean;\n groupId?: number | null;\n group?: { permissions?: unknown[] };\n}\n\nexport interface NextAuthOptionsConfig {\n /** Resolve user by email (e.g. from TypeORM). Return null if not found. */\n getUserByEmail: (email: string) => Promise<NextAuthUser | null>;\n comparePassword: (plain: string, hash: string) => Promise<boolean>;\n signInPage?: string;\n secret?: string;\n extend?: (options: NextAuthOptions) => NextAuthOptions;\n}\n\nexport function getNextAuthOptions(config: NextAuthOptionsConfig): NextAuthOptions {\n const { getUserByEmail, comparePassword, signInPage = '/admin/signin', secret, extend } = config;\n\n const options: NextAuthOptions = {\n secret: secret ?? process.env.NEXTAUTH_SECRET,\n providers: [\n CredentialsProvider({\n name: 'credentials',\n credentials: {\n email: { label: 'Email', type: 'email' },\n password: { label: 'Password', type: 'password' },\n },\n async authorize(credentials) {\n if (!credentials?.email || !credentials?.password) return null;\n try {\n const user = await getUserByEmail(credentials.email);\n if (!user || user.blocked || (user as { deleted?: boolean }).deleted || !user.password) return null;\n const valid = await comparePassword(credentials.password, user.password);\n if (!valid) return null;\n return {\n id: user.id.toString(),\n email: user.email,\n name: user.name,\n groupId: user.groupId ?? undefined,\n permissions: ['admin'],\n };\n } catch {\n return null;\n }\n },\n }),\n ],\n session: { strategy: 'jwt' },\n pages: { signIn: signInPage },\n cookies: {\n sessionToken: {\n name: process.env.NEXTAUTH_URL?.startsWith('https')\n ? '__Secure-next-auth.session-token'\n : 'next-auth.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n secure: process.env.NEXTAUTH_URL?.startsWith('https') ?? false,\n },\n },\n },\n callbacks: {\n async jwt({ token, user }) {\n if (user) {\n (token as Record<string, unknown>).id = user.id;\n (token as Record<string, unknown>).groupId = (user as { groupId?: number }).groupId;\n (token as Record<string, unknown>).permissions = (user as { permissions?: string[] }).permissions;\n }\n return token;\n },\n async session({ session, token }) {\n if (session.user) {\n (session.user as Record<string, unknown>).id = (token as Record<string, unknown>).id;\n (session.user as Record<string, unknown>).groupId = (token as Record<string, unknown>).groupId;\n (session.user as Record<string, unknown>).permissions = (token as Record<string, unknown>).permissions;\n }\n return session;\n },\n },\n };\n\n return extend ? extend(options) : options;\n}\n","import type { DataSource } from 'typeorm';\nimport { ILike, Like, MoreThan } from 'typeorm';\nimport type { Repository } from 'typeorm';\n\nexport type EntityMap = Record<string, import('typeorm').EntityTarget<import('typeorm').ObjectLiteral>>;\n\nexport interface CrudHandlerOptions {\n requireAuth: (req: Request) => Promise<Response | null>;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nconst DATE_COLUMN_TYPES = new Set([\n 'date', 'datetime', 'datetime2', 'timestamp', 'timestamptz', 'timetz', 'smalldatetime', 'timestamp with time zone', 'timestamp without time zone',\n]);\n\nconst TIMESTAMP_PROP_NAMES = new Set(['createdAt', 'updatedAt', 'deletedAt']);\n\nfunction isInvalidDateValue(v: unknown): boolean {\n if (v === '' || v == null) return true;\n if (typeof v === 'string') return isNaN(Date.parse(v)) || /NaN|Invalid/i.test(v);\n if (v instanceof Date) return isNaN(v.getTime());\n return false;\n}\n\n/** Strip empty/invalid values for boolean, number, and date columns so DB defaults apply. */\nfunction sanitizeBodyForEntity(repo: Repository<import('typeorm').ObjectLiteral>, body: Record<string, unknown>): void {\n const meta = repo.metadata;\n for (const col of meta.columns) {\n if (!(col.propertyName in body)) continue;\n const v = body[col.propertyName];\n const t = typeof col.type === 'string' ? col.type : (col.type as Function)?.name ?? '';\n const isBoolean = t === 'boolean' || t === 'bool' || col.type === Boolean;\n const isNumber = ['int', 'integer', 'int2', 'int4', 'int8', 'smallint', 'bigint', 'number', 'Number'].includes(t) || col.type === Number;\n const isDate = DATE_COLUMN_TYPES.has(t) || col.type === Date || TIMESTAMP_PROP_NAMES.has(col.propertyName);\n if (v === '' && (isBoolean || isNumber)) {\n delete body[col.propertyName];\n } else if (isDate && isInvalidDateValue(v)) {\n delete body[col.propertyName];\n }\n }\n}\n\nexport function createCrudHandler(\n dataSource: DataSource,\n entityMap: EntityMap,\n options: CrudHandlerOptions\n) {\n const { requireAuth, json } = options;\n\n return {\n async GET(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const { searchParams } = new URL(req.url);\n const page = Number(searchParams.get('page')) || 1;\n const limit = Math.min(Number(searchParams.get('limit')) || 10, 100);\n const skip = (page - 1) * limit;\n const sortFieldRaw = searchParams.get('sortField') || 'createdAt';\n const sortOrder = searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const search = searchParams.get('search');\n\n // Orders list: include contact + itemsSummary; search (order# + customer), status, date, paymentRef\n if (resource === 'orders') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'orderNumber', 'contactId', 'status', 'total', 'currency', 'createdAt', 'updatedAt'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderOrders = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const statusFilter = searchParams.get('status')?.trim();\n const dateFrom = searchParams.get('dateFrom')?.trim();\n const dateTo = searchParams.get('dateTo')?.trim();\n const paymentRef = searchParams.get('paymentRef')?.trim();\n\n let orderIdsFromPayment: number[] | null = null;\n if (paymentRef && entityMap['payments']) {\n const paymentRepo = dataSource.getRepository(entityMap['payments']);\n const payments = await paymentRepo\n .createQueryBuilder('p')\n .select('p.orderId')\n .where('p.externalReference = :ref', { ref: paymentRef })\n .orWhere(\"p.metadata->>'razorpayPaymentId' = :ref\", { ref: paymentRef })\n .getRawMany<{ orderId: number }>();\n orderIdsFromPayment = payments.map((r) => r.orderId);\n if (orderIdsFromPayment.length === 0) {\n return json({ total: 0, page, limit, totalPages: 0, data: [] });\n }\n }\n\n const qb = repo\n .createQueryBuilder('order')\n .leftJoinAndSelect('order.contact', 'contact')\n .leftJoinAndSelect('order.items', 'items')\n .leftJoinAndSelect('items.product', 'product')\n .leftJoinAndSelect('product.collection', 'collection')\n .orderBy(`order.${sortField}`, sortOrderOrders)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere(\n '(order.orderNumber ILIKE :term OR contact.name ILIKE :term OR contact.email ILIKE :term)',\n { term }\n );\n }\n if (statusFilter) qb.andWhere('order.status = :status', { status: statusFilter });\n if (dateFrom) qb.andWhere('order.createdAt >= :dateFrom', { dateFrom: new Date(dateFrom + 'T00:00:00.000Z') });\n if (dateTo) qb.andWhere('order.createdAt <= :dateTo', { dateTo: new Date(dateTo + 'T23:59:59.999Z') });\n if (orderIdsFromPayment && orderIdsFromPayment.length) qb.andWhere('order.id IN (:...orderIds)', { orderIds: orderIdsFromPayment });\n\n const [rows, total] = await qb.getManyAndCount();\n const data = (rows as Record<string, unknown>[]).map((order: Record<string, unknown>) => {\n const contact = order.contact as Record<string, unknown> | undefined;\n const items = (order.items as Array<{ product?: { name?: string; collection?: { name?: string } }; quantity: number }>) ?? [];\n const itemsSummary = items\n .map((i) => {\n const label = i.product?.collection?.name ?? i.product?.name ?? 'Product';\n return `${label} × ${i.quantity}`;\n })\n .join(', ') || '—';\n return {\n ...order,\n contact: contact ? { id: contact.id, name: contact.name, email: contact.email, phone: contact.phone } : null,\n itemsSummary,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Payments list: include order + contact; search (customer), status, date, method, orderNumber\n if (resource === 'payments') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'orderId', 'amount', 'currency', 'status', 'method', 'paidAt', 'createdAt', 'updatedAt'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderPayments = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const statusFilter = searchParams.get('status')?.trim();\n const dateFrom = searchParams.get('dateFrom')?.trim();\n const dateTo = searchParams.get('dateTo')?.trim();\n const methodFilter = searchParams.get('method')?.trim();\n const orderNumberParam = searchParams.get('orderNumber')?.trim();\n\n const qb = repo\n .createQueryBuilder('payment')\n .leftJoinAndSelect('payment.order', 'ord')\n .leftJoinAndSelect('ord.contact', 'orderContact')\n .leftJoinAndSelect('payment.contact', 'contact')\n .orderBy(`payment.${sortField}`, sortOrderPayments)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere(\n '(orderContact.name ILIKE :term OR orderContact.email ILIKE :term OR contact.name ILIKE :term OR contact.email ILIKE :term)',\n { term }\n );\n }\n if (statusFilter) qb.andWhere('payment.status = :status', { status: statusFilter });\n if (dateFrom) qb.andWhere('payment.createdAt >= :dateFrom', { dateFrom: new Date(dateFrom + 'T00:00:00.000Z') });\n if (dateTo) qb.andWhere('payment.createdAt <= :dateTo', { dateTo: new Date(dateTo + 'T23:59:59.999Z') });\n if (methodFilter) qb.andWhere('payment.method = :method', { method: methodFilter });\n if (orderNumberParam) qb.andWhere('ord.orderNumber ILIKE :orderNumber', { orderNumber: `%${orderNumberParam}%` });\n\n const [rows, total] = await qb.getManyAndCount();\n const data = (rows as Record<string, unknown>[]).map((payment: Record<string, unknown>) => {\n const order = payment.order as Record<string, unknown> | undefined;\n const orderContact = order?.contact as Record<string, unknown> | undefined;\n const contact = payment.contact as Record<string, unknown> | undefined;\n const customer = orderContact ?? contact;\n return {\n ...payment,\n order: order ? { id: order.id, orderNumber: order.orderNumber, contact: orderContact ? { name: orderContact.name, email: orderContact.email } : null } : null,\n contact: customer ? { id: customer.id, name: customer.name, email: customer.email } : null,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Products list: status and inventory filters\n if (resource === 'products') {\n const repo = dataSource.getRepository(entity);\n const statusFilter = searchParams.get('status')?.trim();\n const inventory = searchParams.get('inventory')?.trim();\n const productWhere: Record<string, unknown> = {};\n if (statusFilter) productWhere.status = statusFilter;\n if (inventory === 'in_stock') productWhere.quantity = MoreThan(0);\n if (inventory === 'out_of_stock') productWhere.quantity = 0;\n if (search && typeof search === 'string' && search.trim()) {\n productWhere.name = ILike(`%${search.trim()}%`);\n }\n const [data, total] = await repo.findAndCount({\n where: Object.keys(productWhere).length ? productWhere : undefined,\n skip,\n take: limit,\n order: { [sortFieldRaw]: sortOrder },\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Contacts list: filters (type, orderId), optional includeSummary (orderCount, totalPaid)\n if (resource === 'contacts') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'name', 'email', 'createdAt', 'type'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderContacts = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const typeFilter = searchParams.get('type')?.trim();\n const orderIdParam = searchParams.get('orderId')?.trim();\n const includeSummary = searchParams.get('includeSummary') === '1';\n\n const qb = repo\n .createQueryBuilder('contact')\n .orderBy(`contact.${sortField}`, sortOrderContacts)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere('(contact.name ILIKE :term OR contact.email ILIKE :term OR contact.phone ILIKE :term)', { term });\n }\n if (typeFilter) qb.andWhere('contact.type = :type', { type: typeFilter });\n if (orderIdParam) {\n const orderId = Number(orderIdParam);\n if (!Number.isNaN(orderId)) {\n qb.andWhere('contact.id IN (SELECT \"contactId\" FROM orders WHERE id = :orderId)', { orderId });\n }\n }\n\n if (includeSummary && entityMap['orders'] && entityMap['payments']) {\n qb.loadRelationCountAndMap('contact._orderCount', 'contact.orders');\n const [rows, total] = await qb.getManyAndCount();\n const contactIds = (rows as { id: number }[]).map((c) => c.id);\n const paymentRepo = dataSource.getRepository(entityMap['payments']);\n const paidByContact = await paymentRepo\n .createQueryBuilder('p')\n .select('p.contactId', 'contactId')\n .addSelect('COALESCE(SUM(CAST(p.amount AS DECIMAL)), 0)', 'total')\n .where('p.contactId IN (:...ids)', { ids: contactIds.length ? contactIds : [0] })\n .andWhere('p.status = :status', { status: 'completed' })\n .groupBy('p.contactId')\n .getRawMany<{ contactId: number; total: string }>();\n const totalPaidMap = new Map<number, number>(paidByContact.map((r) => [r.contactId, Number(r.total)]));\n const data = (rows as Record<string, unknown>[]).map((c) => {\n const { _orderCount, ...rest } = c as { _orderCount?: number; id: number };\n return {\n ...rest,\n orderCount: _orderCount ?? 0,\n totalPaid: totalPaidMap.get((rest as { id: number }).id) ?? 0,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n const [data, total] = await qb.getManyAndCount();\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n const repo = dataSource.getRepository(entity);\n const typeFilter = searchParams.get('type');\n let where: Record<string, unknown>[] | Record<string, unknown> = {};\n if (resource === 'media') {\n const mediaWhere: Record<string, unknown> = {};\n if (search) mediaWhere.filename = ILike(`%${search}%`);\n if (typeFilter) mediaWhere.mimeType = Like(`${typeFilter}/%`);\n where = Object.keys(mediaWhere).length > 0 ? mediaWhere : {};\n } else if (search) {\n where = [{ name: ILike(`%${search}%`) }, { title: ILike(`%${search}%`) }];\n }\n const [data, total] = await repo.findAndCount({\n skip,\n take: limit,\n order: { [sortFieldRaw]: sortOrder },\n where,\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n },\n\n async POST(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const body = await req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return json({ error: 'Invalid request payload' }, { status: 400 });\n }\n const repo = dataSource.getRepository(entity);\n sanitizeBodyForEntity(repo, body as Record<string, unknown>);\n const created = await repo.save(repo.create(body as object));\n return json(created, { status: 201 });\n },\n\n async GET_METADATA(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const repo = dataSource.getRepository(entity);\n const meta = repo.metadata;\n\n // Collect unique column names from indices\n const uniqueFromIndices = new Set<string>();\n for (const idx of meta.indices) {\n if (idx.isUnique && idx.columns.length === 1) {\n uniqueFromIndices.add(idx.columns[0].propertyName);\n }\n }\n for (const uniq of meta.uniques) {\n if (uniq.columns.length === 1) {\n uniqueFromIndices.add(uniq.columns[0].propertyName);\n }\n }\n\n const columns = meta.columns.map((col) => ({\n name: col.propertyName,\n type: typeof col.type === 'string' ? col.type : (col.type as { name?: string })?.name ?? 'unknown',\n nullable: col.isNullable,\n isUnique: uniqueFromIndices.has(col.propertyName),\n isPrimary: col.isPrimary,\n default: col.default,\n }));\n\n const uniqueColumns = [...uniqueFromIndices];\n\n return json({ columns, uniqueColumns });\n },\n\n async BULK_POST(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const body = await req.json();\n const { records, upsertKey = 'id' } = body as { records: object[]; upsertKey?: string };\n\n if (!Array.isArray(records) || records.length === 0) {\n return json({ error: 'Records array is required' }, { status: 400 });\n }\n\n const repo = dataSource.getRepository(entity);\n\n // Sanitize each record\n for (const record of records) {\n sanitizeBodyForEntity(repo, record as Record<string, unknown>);\n }\n\n try {\n const result = await repo.upsert(records, {\n conflictPaths: [upsertKey],\n skipUpdateIfNoValuesChanged: true,\n });\n return json({\n success: true,\n imported: result.identifiers.length,\n identifiers: result.identifiers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Bulk import failed';\n return json({ error: message }, { status: 400 });\n }\n },\n\n async GET_EXPORT(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n\n const { searchParams } = new URL(req.url);\n const format = searchParams.get('format') || 'csv';\n\n const repo = dataSource.getRepository(entity);\n const meta = repo.metadata;\n\n // Check if entity has 'deleted' column\n const hasDeleted = meta.columns.some((c) => c.propertyName === 'deleted');\n const where = hasDeleted ? { deleted: false } : {};\n\n const data = await repo.find({ where });\n\n // Get exportable columns (exclude soft-delete related)\n const excludeCols = new Set(['deletedAt', 'deletedBy', 'deleted']);\n const columns = meta.columns\n .filter((c) => !excludeCols.has(c.propertyName))\n .map((c) => c.propertyName);\n\n if (format === 'json') {\n return json(data);\n }\n\n // CSV format\n const escapeCSV = (val: unknown): string => {\n if (val === null || val === undefined) return '';\n const str = typeof val === 'object' ? JSON.stringify(val) : String(val);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n const header = columns.join(',');\n const rows = data.map((row) =>\n columns.map((col) => escapeCSV((row as Record<string, unknown>)[col])).join(',')\n );\n const csv = [header, ...rows].join('\\n');\n\n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv; charset=utf-8',\n 'Content-Disposition': `attachment; filename=\"${resource}.csv\"`,\n },\n });\n },\n };\n}\n\nexport function createCrudByIdHandler(\n dataSource: DataSource,\n entityMap: EntityMap,\n options: CrudHandlerOptions\n) {\n const { requireAuth, json } = options;\n\n return {\n async GET(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const repo = dataSource.getRepository(entity);\n\n if (resource === 'orders') {\n const order = await repo.findOne({\n where: { id: Number(id) },\n relations: ['contact', 'billingAddress', 'shippingAddress', 'items', 'items.product', 'items.product.collection', 'payments'],\n });\n if (!order) return json({ message: 'Not found' }, { status: 404 });\n return json(order);\n }\n\n if (resource === 'contacts') {\n const contact = await repo.findOne({\n where: { id: Number(id) },\n relations: ['form_submissions', 'form_submissions.form', 'orders', 'payments', 'addresses'],\n });\n if (!contact) return json({ message: 'Not found' }, { status: 404 });\n const orders = (contact as { orders?: { total?: unknown; createdAt?: string }[] }).orders ?? [];\n const payments = (contact as { payments?: { status: string; amount?: number }[] }).payments ?? [];\n const totalPaid = payments\n .filter((p) => p.status === 'completed')\n .reduce((sum, p) => sum + Number(p.amount ?? 0), 0);\n const lastOrderAt =\n orders.length > 0\n ? orders.reduce((latest, o) => {\n const t = o.createdAt ? new Date(o.createdAt).getTime() : 0;\n return t > latest ? t : latest;\n }, 0)\n : null;\n return json({\n ...contact,\n summary: {\n totalOrders: orders.length,\n totalPaid,\n lastOrderAt: lastOrderAt ? new Date(lastOrderAt).toISOString() : null,\n },\n });\n }\n\n if (resource === 'payments') {\n const payment = await repo.findOne({\n where: { id: Number(id) },\n relations: ['order', 'order.contact', 'contact'],\n });\n if (!payment) return json({ message: 'Not found' }, { status: 404 });\n return json(payment);\n }\n\n const item = await repo.findOne({ where: { id: Number(id) } });\n return item ? json(item) : json({ message: 'Not found' }, { status: 404 });\n },\n\n async PUT(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const body = await req.json();\n const repo = dataSource.getRepository(entity);\n if (body && typeof body === 'object') sanitizeBodyForEntity(repo, body as Record<string, unknown>);\n await repo.update(Number(id), body as object);\n const updated = await repo.findOne({ where: { id: Number(id) } });\n return updated ? json(updated) : json({ message: 'Not found' }, { status: 404 });\n },\n\n async DELETE(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const repo = dataSource.getRepository(entity);\n const result = await repo.delete(Number(id));\n if (result.affected === 0) return json({ message: 'Not found' }, { status: 404 });\n return json({ message: 'Deleted successfully' }, { status: 200 });\n },\n };\n}\n","/**\n * Auth API handler factories. Inject dataSource + entityMap, sendEmail, hash/compare; optional hooks to customize.\n */\nimport type { DataSource } from 'typeorm';\nimport type { EntityMap } from './crud';\n\nexport interface AuthHandlersConfig {\n json: (body: unknown, init?: { status?: number }) => Response;\n baseUrl: string;\n hashPassword: (plain: string) => Promise<string>;\n comparePassword: (plain: string, hash: string) => Promise<boolean>;\n}\n\nexport interface ForgotPasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n sendEmail?: (opts: { to: string; subject: string; html: string; text?: string }) => Promise<void>;\n resetExpiryHours?: number;\n afterCreateToken?: (email: string, resetLink: string) => Promise<void>;\n}\n\nexport function createForgotPasswordHandler(config: ForgotPasswordConfig) {\n const { dataSource, entityMap, json, baseUrl, sendEmail, resetExpiryHours = 1, afterCreateToken } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { email?: string };\n const email = typeof body?.email === 'string' ? body.email.trim().toLowerCase() : '';\n if (!email) return json({ error: 'Email is required' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email }, select: ['email'] });\n const msg = 'If an account exists with this email, you will receive a reset link shortly.';\n if (!user) return json({ message: msg }, { status: 200 });\n\n const crypto = await import('crypto');\n const token = crypto.randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + (resetExpiryHours * 60 * 60 * 1000));\n const tokenRepo = dataSource.getRepository(entityMap.password_reset_tokens);\n await tokenRepo.save(tokenRepo.create({ email: user.email, token, expiresAt }));\n const resetLink = `${baseUrl}/admin/reset-password?token=${token}`;\n\n if (sendEmail) await sendEmail({ to: user.email, subject: 'Password reset', html: `<a href=\"${resetLink}\">Reset password</a>`, text: resetLink });\n if (afterCreateToken) await afterCreateToken(user.email, resetLink);\n return json({ message: msg }, { status: 200 });\n } catch (err) {\n return json({ error: 'Something went wrong. Please try again.' }, { status: 500 });\n }\n };\n}\n\nexport interface SetPasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n minPasswordLength?: number;\n beforeUpdate?: (email: string, userId: number) => Promise<void>;\n}\n\nexport function createSetPasswordHandler(config: SetPasswordConfig) {\n const { dataSource, entityMap, json, hashPassword, minPasswordLength = 6, beforeUpdate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { token?: string; newPassword?: string };\n const { token, newPassword } = body;\n if (!token || !newPassword) return json({ error: 'Token and new password are required' }, { status: 400 });\n if (newPassword.length < minPasswordLength) return json({ error: 'Password must be at least 6 characters' }, { status: 400 });\n\n const tokenRepo = dataSource.getRepository(entityMap.password_reset_tokens);\n const record = await tokenRepo.findOne({ where: { token } });\n if (!record || record.expiresAt < new Date()) return json({ error: 'Invalid or expired reset link. Please request a new one.' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email: record.email }, select: ['id'] });\n if (!user) return json({ error: 'User not found' }, { status: 400 });\n\n if (beforeUpdate) await beforeUpdate(record.email, user.id);\n const hashedPassword = await hashPassword(newPassword);\n await userRepo.update(user.id, { password: hashedPassword, updatedAt: new Date() });\n await tokenRepo.delete({ email: record.email });\n return json({ message: 'Password updated successfully. You can now sign in.' });\n } catch {\n return json({ error: 'Something went wrong. Please try again.' }, { status: 500 });\n }\n };\n}\n\nexport interface InviteAcceptConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n beforeActivate?: (email: string, userId: number) => Promise<void>;\n}\n\n/** Decode invite token (base64 email) and set password + unblock user */\nexport function createInviteAcceptHandler(config: InviteAcceptConfig) {\n const { dataSource, entityMap, json, hashPassword, beforeActivate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { token?: string; password?: string };\n const { token, password } = body;\n if (!token || !password) return json({ error: 'Missing required fields: token, password' }, { status: 400 });\n\n let email: string;\n try {\n email = Buffer.from(token, 'base64').toString('utf8');\n } catch {\n return json({ error: 'Invalid or expired invite token' }, { status: 400 });\n }\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email }, select: ['id', 'blocked'] });\n if (!user) return json({ error: 'User not found' }, { status: 400 });\n if (!user.blocked) return json({ error: 'User is already active' }, { status: 400 });\n\n if (beforeActivate) await beforeActivate(email, user.id);\n const hashedPassword = await hashPassword(password);\n await userRepo.update(user.id, { password: hashedPassword, blocked: false });\n return json({ message: 'User account activated successfully' }, { status: 200 });\n } catch (err) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface ChangePasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n getSession: () => Promise<{ user?: { email?: string | null } } | null>;\n minPasswordLength?: number;\n beforeUpdate?: (email: string) => Promise<void>;\n}\n\nexport function createChangePasswordHandler(config: ChangePasswordConfig) {\n const { dataSource, entityMap, json, comparePassword, hashPassword, getSession, minPasswordLength = 6, beforeUpdate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n\n const body = await request.json().catch(() => ({})) as { currentPassword?: string; newPassword?: string };\n const { currentPassword, newPassword } = body;\n if (!currentPassword || !newPassword) return json({ error: 'Current password and new password are required' }, { status: 400 });\n if (newPassword.length < minPasswordLength) return json({ error: 'New password must be at least 6 characters long' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email: session.user.email }, select: ['password'] });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n if (!user.password) return json({ error: 'Current password is incorrect' }, { status: 400 });\n const valid = await comparePassword(currentPassword, user.password);\n if (!valid) return json({ error: 'Current password is incorrect' }, { status: 400 });\n\n if (beforeUpdate) await beforeUpdate(session.user.email);\n const hashedPassword = await hashPassword(newPassword);\n await userRepo.update({ email: session.user.email }, { password: hashedPassword, updatedAt: new Date() });\n return json({ message: 'Password updated successfully' });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface UserAuthApiConfig\n extends ForgotPasswordConfig,\n Omit<SetPasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>,\n Omit<InviteAcceptConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>,\n Omit<ChangePasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword' | 'beforeUpdate' | 'getSession'> {\n getSession?: () => Promise<{ user?: { email?: string | null } } | null>;\n beforeChangePasswordUpdate?: (email: string) => Promise<void>;\n}\n\nconst USER_AUTH_PATHS = ['forgot-password', 'invite', 'set-password', 'reset-password'] as const;\n\n/**\n * Single router for all user-auth APIs. Mount in the app once.\n * Use when you have no users/[id] route (else Next.js gives [id] precedence and \"forgot-password\" would match as id).\n * Path is the segment after the mount (e.g. \"forgot-password\"). Returns 404 for unknown paths.\n */\nexport function createUserAuthApiRouter(config: UserAuthApiConfig) {\n const forgot = createForgotPasswordHandler(config);\n const setPass = createSetPasswordHandler(config);\n const invite = createInviteAcceptHandler(config);\n const changePass = config.getSession\n ? createChangePasswordHandler({\n ...config,\n getSession: config.getSession,\n beforeUpdate: config.beforeChangePasswordUpdate,\n })\n : null;\n\n return {\n async POST(req: Request, pathname: string): Promise<Response> {\n const path = pathname.replace(/\\/$/, '');\n if (!USER_AUTH_PATHS.includes(path as (typeof USER_AUTH_PATHS)[number])) {\n return config.json({ error: 'Not found' }, { status: 404 });\n }\n if (path === 'forgot-password') return forgot(req);\n if (path === 'set-password') return setPass(req);\n if (path === 'invite') return invite(req);\n if (path === 'reset-password' && changePass) return changePass(req);\n return config.json({ error: 'Not found' }, { status: 404 });\n },\n };\n}\n","/**\n * CMS API handlers: dashboard, analytics, upload, blog/form by slug, users (list/create/get/update/delete/regenerate-invite/avatar/profile).\n * All accept injectable deps; upload supports S3 or local.\n */\nimport type { DataSource } from 'typeorm';\nimport { MoreThanOrEqual, ILike } from 'typeorm';\nimport type { EntityMap } from './crud';\n\nexport interface CmsHandlersBase {\n json: (body: unknown, init?: { status?: number }) => Response;\n requireAuth: (req: Request) => Promise<Response | null>;\n}\n\nexport interface DashboardStatsConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n requirePermission?: (req: Request, permission: string) => Promise<Response | null>;\n}\n\nexport function createDashboardStatsHandler(config: DashboardStatsConfig) {\n const { dataSource, entityMap, json, requireAuth, requirePermission } = config;\n return async function GET(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n if (requirePermission) {\n const permErr = await requirePermission(req, 'view_dashboard');\n if (permErr) return permErr;\n }\n try {\n const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);\n const repo = (name: string) => entityMap[name] ? dataSource.getRepository(entityMap[name]) : undefined;\n const [contactsCount, formsCount, formSubmissionsCount, usersCount, blogsCount, recentContacts, recentSubmissions] = await Promise.all([\n repo('contacts')?.count() ?? 0,\n repo('forms')?.count({ where: { deleted: false } }) ?? 0,\n repo('form_submissions')?.count() ?? 0,\n repo('users')?.count({ where: { deleted: false } }) ?? 0,\n repo('blogs')?.count({ where: { deleted: false } }) ?? 0,\n repo('contacts')?.count({ where: { createdAt: MoreThanOrEqual(sevenDaysAgo) } }) ?? 0,\n repo('form_submissions')?.count({ where: { createdAt: MoreThanOrEqual(sevenDaysAgo) } }) ?? 0,\n ]);\n return json({\n contacts: { total: contactsCount, recent: recentContacts },\n forms: { total: formsCount, submissions: formSubmissionsCount, recentSubmissions },\n users: usersCount,\n blogs: blogsCount,\n });\n } catch (err) {\n return json({ error: 'Failed to fetch dashboard stats' }, { status: 500 });\n }\n };\n}\n\nexport interface AnalyticsHandlerConfig extends CmsHandlersBase {\n getAnalyticsData?: (days: number) => Promise<unknown>;\n getPropertyId?: () => ({ currentViewId?: string; [k: string]: unknown });\n getPermissions?: () => ({ serviceAccountEmail?: string; currentViewId?: string; [k: string]: unknown });\n}\n\nexport function createAnalyticsHandlers(config: AnalyticsHandlerConfig) {\n const { json, getAnalyticsData, getPropertyId, getPermissions } = config;\n return {\n async GET(req: Request): Promise<Response> {\n if (!getAnalyticsData) return json({ error: 'Analytics not configured' }, { status: 404 });\n try {\n const url = new URL(req.url);\n const days = parseInt(url.searchParams.get('days') || '30', 10);\n const data = await getAnalyticsData(days);\n return json(data);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : '';\n if (msg.includes('authentication credential')) return json({ error: 'Google Analytics authentication failed.' }, { status: 401 });\n if (msg.includes('sufficient permissions')) return json({ error: 'Service account does not have access.' }, { status: 403 });\n return json({ error: 'Failed to fetch analytics data' }, { status: 500 });\n }\n },\n propertyId: async (): Promise<Response> => {\n const payload = getPropertyId ? getPropertyId() : { currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID };\n return json({ message: 'Property ID Information', ...payload });\n },\n permissions: async (): Promise<Response> => {\n const payload = getPermissions ? getPermissions() : {\n serviceAccountEmail: process.env.GOOGLE_ANALYTICS_CLIENT_EMAIL,\n currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID,\n };\n return json({ message: 'Permission Troubleshooting Guide', ...payload });\n },\n };\n}\n\nimport type { StorageService } from '../plugins/storage';\n\nexport type { StorageService };\n\nexport interface UploadHandlerConfig extends CmsHandlersBase {\n /** Storage plugin instance or getter (e.g. () => getCms().then(c => c.getPlugin('storage'))). If not set, uses local fallback. */\n storage?: StorageService | (() => StorageService | undefined) | (() => Promise<StorageService | undefined>);\n /** Fallback when storage not set: dir relative to cwd (e.g. \"public/uploads\") */\n localUploadDir?: string;\n allowedTypes?: string[];\n maxSizeBytes?: number;\n}\n\nexport function createUploadHandler(config: UploadHandlerConfig) {\n const { json, requireAuth, storage, localUploadDir = 'public/uploads', allowedTypes, maxSizeBytes = 10 * 1024 * 1024 } = config;\n const allowed = allowedTypes ?? ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'application/pdf', 'text/plain'];\n return async function POST(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formData = await req.formData();\n const file = formData.get('file') as File | null;\n if (!file) return json({ error: 'No file uploaded' }, { status: 400 });\n if (!allowed.includes(file.type)) return json({ error: 'File type not allowed' }, { status: 400 });\n if (file.size > maxSizeBytes) return json({ error: 'File size exceeds limit' }, { status: 400 });\n const buffer = Buffer.from(await file.arrayBuffer());\n const fileName = `${Date.now()}-${file.name}`;\n const contentType = file.type || 'application/octet-stream';\n const raw = typeof storage === 'function' ? storage() : storage;\n const storageService = raw instanceof Promise ? await raw : raw;\n if (storageService) {\n const fileUrl = await storageService.upload(buffer, `uploads/${fileName}`, contentType);\n return json({ filePath: fileUrl });\n }\n const fs = await import('fs/promises');\n const path = await import('path');\n const dir = path.join(process.cwd(), localUploadDir);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, fileName);\n await fs.writeFile(filePath, buffer);\n return json({ filePath: `/${localUploadDir.replace(/^\\/+/, '').replace(/\\\\/g, '/')}/${fileName}` });\n } catch (err) {\n return json({ error: 'File upload failed' }, { status: 500 });\n }\n };\n}\n\nexport interface BlogBySlugConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\nexport function createBlogBySlugHandler(config: BlogBySlugConfig) {\n const { dataSource, entityMap, json } = config;\n return async function GET(_req: Request, slug: string): Promise<Response> {\n try {\n const blogRepo = dataSource.getRepository(entityMap.blogs);\n const blog = await blogRepo.findOne({\n where: { slug, published: true },\n relations: ['author', 'category', 'tags', 'seo'],\n });\n if (!blog) return json({ error: 'Blog not found' }, { status: 404 });\n return json(blog);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormBySlugConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\nexport function createFormBySlugHandler(config: FormBySlugConfig) {\n const { dataSource, entityMap, json } = config;\n return async function GET(_req: Request, slug: string): Promise<Response> {\n try {\n const formRepo = dataSource.getRepository(entityMap.forms);\n const form = await formRepo.findOne({\n where: { slug, published: true, deleted: false },\n relations: ['fields'],\n order: { fields: { order: 'ASC' } },\n });\n if (!form) return json({ error: 'Form not found' }, { status: 404 });\n const out = form as { fields?: unknown[] };\n if (Array.isArray(out.fields)) out.fields = out.fields.filter((f) => !(f as { deleted?: boolean }).deleted);\n return json(form);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormSaveHandlersConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\n/** Normalize a field from payload for DB: only include columns that exist on form_fields. */\nfunction normalizeFieldRow(f: Record<string, unknown>, formId: number): Record<string, unknown> {\n const order = typeof f.order === 'number' ? f.order : Number(f.order) || 0;\n const groupId = typeof f.groupId === 'number' ? f.groupId : Number(f.groupId) || 1;\n const columnWidth = typeof f.columnWidth === 'number' ? f.columnWidth : Number(f.columnWidth) || 12;\n return {\n formId,\n label: f.label != null ? String(f.label) : '',\n type: f.type != null ? String(f.type) : 'text',\n placeholder: f.placeholder != null ? String(f.placeholder) : null,\n options: f.options != null ? (typeof f.options === 'string' ? f.options : JSON.stringify(f.options)) : null,\n required: Boolean(f.required),\n validation: f.validation != null ? (typeof f.validation === 'string' ? f.validation : JSON.stringify(f.validation)) : null,\n order,\n groupId,\n columnWidth,\n };\n}\n\nexport function createFormSaveHandlers(config: FormSaveHandlersConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n const formRepo = () => dataSource.getRepository(entityMap.forms);\n const fieldRepo = () => dataSource.getRepository(entityMap.form_fields);\n\n return {\n async GET(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formId = Number(id);\n if (!Number.isInteger(formId) || formId <= 0) return json({ error: 'Invalid form id' }, { status: 400 });\n const form = await formRepo().findOne({\n where: { id: formId },\n relations: ['fields'],\n order: { fields: { order: 'ASC' } },\n });\n if (!form) return json({ message: 'Not found' }, { status: 404 });\n const out = form as { fields?: { deleted?: boolean }[] };\n if (Array.isArray(out.fields)) out.fields = out.fields.filter((f) => !f.deleted);\n return json(form);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async POST(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid request payload' }, { status: 400 });\n const fields = Array.isArray(body.fields) ? body.fields : [];\n const { fields: _f, ...formRow } = body;\n const form = await formRepo().save(formRepo().create(formRow as object));\n for (let i = 0; i < fields.length; i++) {\n const row = normalizeFieldRow(fields[i] as Record<string, unknown>, form.id);\n (row as Record<string, unknown>).order = i + 1;\n await fieldRepo().save(fieldRepo().create(row as object));\n }\n const saved = await formRepo().findOne({ where: { id: form.id }, relations: ['fields'], order: { fields: { order: 'ASC' } } });\n return json(saved ?? form, { status: 201 });\n } catch (e) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async PUT(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formId = Number(id);\n if (!Number.isInteger(formId) || formId <= 0) return json({ error: 'Invalid form id' }, { status: 400 });\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid request payload' }, { status: 400 });\n const existing = await formRepo().findOne({ where: { id: formId } });\n if (!existing) return json({ message: 'Not found' }, { status: 404 });\n const fields = Array.isArray(body.fields) ? body.fields : [];\n const formRow: Record<string, unknown> = {};\n for (const key of ['name', 'description', 'campaign', 'slug', 'published']) {\n if (body[key] !== undefined) formRow[key] = body[key];\n }\n if (Object.keys(formRow).length > 0) await formRepo().update(formId, formRow as object);\n await fieldRepo().delete({ formId });\n for (let i = 0; i < fields.length; i++) {\n const row = normalizeFieldRow(fields[i] as Record<string, unknown>, formId);\n (row as Record<string, unknown>).order = i + 1;\n await fieldRepo().save(fieldRepo().create(row as object));\n }\n const saved = await formRepo().findOne({ where: { id: formId }, relations: ['fields'], order: { fields: { order: 'ASC' } } });\n return saved ? json(saved) : json({ message: 'Not found' }, { status: 404 });\n } catch (e) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n };\n}\n\nexport interface FormSubmissionHandlerConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nexport interface FormSubmissionGetByIdConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nexport function createFormSubmissionGetByIdHandler(config: FormSubmissionGetByIdConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n return async function GET(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const submissionId = Number(id);\n if (!Number.isInteger(submissionId) || submissionId <= 0) return json({ error: 'Invalid id' }, { status: 400 });\n const repo = dataSource.getRepository(entityMap.form_submissions);\n const submission = await repo.findOne({\n where: { id: submissionId },\n relations: ['form', 'contact'],\n });\n if (!submission) return json({ message: 'Not found' }, { status: 404 });\n const form = submission as { form?: { id: number; fields?: unknown[] } };\n if (form.form?.id) {\n const formRepo = dataSource.getRepository(entityMap.forms);\n const formWithFields = await formRepo.findOne({\n where: { id: form.form.id },\n relations: ['fields'],\n order: { fields: { order: 'ASC' as const } },\n });\n if (formWithFields) (submission as { form?: unknown }).form = formWithFields;\n }\n return json(submission);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormSubmissionListConfig extends FormSubmissionGetByIdConfig {}\n\nexport function createFormSubmissionListHandler(config: FormSubmissionListConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n return async function GET(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const repo = dataSource.getRepository(entityMap.form_submissions);\n const { searchParams } = new URL(req.url);\n const page = Number(searchParams.get('page')) || 1;\n const limit = Math.min(100, Number(searchParams.get('limit')) || 10);\n const skip = (page - 1) * limit;\n const sortField = searchParams.get('sortField') || 'createdAt';\n const sortOrder = searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const [data, total] = await repo.findAndCount({\n skip,\n take: limit,\n order: { [sortField]: sortOrder },\n relations: ['form', 'contact'],\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nfunction pickContactFromSubmission(\n fields: { id: number; type: string; label: string }[],\n data: Record<string, unknown>\n): { name: string; email: string; phone: string | null } | null {\n let email: string | null = null;\n let name: string | null = null;\n let phone: string | null = null;\n for (const f of fields) {\n const val = data[String(f.id)];\n if (val == null || val === '') continue;\n const str = String(val).trim();\n if (f.type === 'email' || (f.label && f.label.toLowerCase().includes('email'))) {\n if (str && !email) email = str;\n } else if (f.type === 'phone' || (f.label && f.label.toLowerCase().includes('phone'))) {\n if (str && !phone) phone = str;\n } else if (f.label && f.label.toLowerCase().includes('name') && (f.type === 'text' || !f.type)) {\n if (str && !name) name = str;\n }\n }\n if (!email) return null;\n return { name: name || email, email, phone: phone || null };\n}\n\nexport function createFormSubmissionHandler(config: FormSubmissionHandlerConfig) {\n const { dataSource, entityMap, json } = config;\n return async function POST(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') {\n return json({ error: 'Invalid request payload' }, { status: 400 });\n }\n const formId = typeof body.formId === 'number' ? body.formId : Number(body.formId);\n if (!Number.isInteger(formId) || formId <= 0) {\n return json({ error: 'formId is required and must be a positive integer' }, { status: 400 });\n }\n const data = body.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n return json({ error: 'data is required and must be an object' }, { status: 400 });\n }\n const formRepo = dataSource.getRepository(entityMap.forms);\n const form = await formRepo.findOne({\n where: { id: formId, published: true, deleted: false },\n relations: ['fields'],\n });\n if (!form) {\n return json({ error: 'Form not found' }, { status: 404 });\n }\n const fields = (form as { fields?: { id: number; type: string; label: string; deleted?: boolean }[] }).fields ?? [];\n const activeFields = fields.filter((f) => !f.deleted);\n\n let contactId: number | null =\n body.contactId != null && body.contactId !== ''\n ? (typeof body.contactId === 'number' ? body.contactId : Number(body.contactId))\n : null;\n\n if (!contactId) {\n const contactData = pickContactFromSubmission(activeFields, data as Record<string, unknown>);\n if (contactData) {\n const contactRepo = dataSource.getRepository(entityMap.contacts);\n let contact = await contactRepo.findOne({ where: { email: contactData.email } });\n if (!contact) {\n contact = await contactRepo.save(\n contactRepo.create({\n name: contactData.name,\n email: contactData.email,\n phone: contactData.phone,\n })\n );\n }\n contactId = contact.id;\n }\n }\n\n const ipAddress = (req.headers.get('x-forwarded-for') ?? req.headers.get('x-real-ip') ?? null) as string | null;\n const userAgent = req.headers.get('user-agent') ?? null;\n const submissionRepo = dataSource.getRepository(entityMap.form_submissions);\n const created = await submissionRepo.save(\n submissionRepo.create({\n formId,\n contactId: Number.isInteger(contactId) ? contactId : null,\n data: data as Record<string, unknown>,\n ipAddress: ipAddress?.slice(0, 255) ?? null,\n userAgent: userAgent?.slice(0, 500) ?? null,\n })\n );\n return json(created, { status: 201 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface UsersApiConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n baseUrl: string;\n}\n\nexport function createUsersApiHandlers(config: UsersApiConfig) {\n const { dataSource, entityMap, json, requireAuth, baseUrl } = config;\n const userRepo = () => dataSource.getRepository(entityMap.users);\n return {\n async list(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const url = new URL(req.url);\n const page = Math.max(1, parseInt(url.searchParams.get('page') || '1', 10));\n const limit = Math.min(100, parseInt(url.searchParams.get('limit') || '10', 10));\n const skip = (page - 1) * limit;\n const sortField = url.searchParams.get('sortField') || 'createdAt';\n const sortOrder = url.searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const search = url.searchParams.get('search');\n const where = search ? [{ name: ILike(`%${search}%`) }, { email: ILike(`%${search}%`) }] : {};\n const [data, total] = await userRepo().findAndCount({\n skip,\n take: limit,\n order: { [sortField]: sortOrder },\n where,\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async create(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = await req.json() as Record<string, unknown>;\n if (!body?.name || !body?.email) return json({ error: 'Name and email are required' }, { status: 400 });\n const existing = await userRepo().findOne({ where: { email: body.email as string } });\n if (existing) return json({ error: 'User with this email already exists' }, { status: 400 });\n const newUser = await userRepo().save(\n userRepo().create({ name: body.name, email: body.email, password: null, blocked: true, groupId: (body.groupId as number) ?? null })\n );\n const emailToken = Buffer.from(newUser.email).toString('base64');\n const inviteLink = `${baseUrl}/admin/invite?token=${emailToken}`;\n return json({ message: 'User created successfully (blocked until password is set)', user: newUser, inviteLink }, { status: 201 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async getById(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const user = await userRepo().findOne({\n where: { id: parseInt(id, 10) },\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n return json(user);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async update(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = await req.json() as Record<string, unknown>;\n const { password: _p, ...safe } = body;\n await userRepo().update(parseInt(id, 10), safe as object);\n const updated = await userRepo().findOne({\n where: { id: parseInt(id, 10) },\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n return updated ? json(updated) : json({ error: 'Not found' }, { status: 404 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async delete(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const r = await userRepo().delete(parseInt(id, 10));\n if (r.affected === 0) return json({ error: 'User not found' }, { status: 404 });\n return json({ message: 'User deleted successfully' });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async regenerateInvite(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const user = await userRepo().findOne({ where: { id: parseInt(id, 10) }, select: ['email'] });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n const emailToken = Buffer.from(user.email).toString('base64');\n const inviteLink = `${baseUrl}/admin/invite?token=${emailToken}`;\n return json({ message: 'New invite link generated successfully', inviteLink });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n };\n}\n\nexport interface UserAvatarConfig extends CmsHandlersBase {\n getSession: () => Promise<{ user?: { email?: string | null } } | null>;\n /** Save avatar (buffer, fileName) => publicUrl. Default: local public/uploads/avatars */\n saveAvatar?: (buffer: Buffer, fileName: string) => Promise<string>;\n}\n\nexport function createUserAvatarHandler(config: UserAvatarConfig) {\n const { json, getSession, saveAvatar } = config;\n return async function POST(req: Request): Promise<Response> {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n try {\n const formData = await req.formData();\n const file = formData.get('avatar') as File | null;\n if (!file) return json({ error: 'No file uploaded' }, { status: 400 });\n if (!file.type.startsWith('image/')) return json({ error: 'File must be an image' }, { status: 400 });\n if (file.size > 5 * 1024 * 1024) return json({ error: 'File size must be less than 5MB' }, { status: 400 });\n const buffer = Buffer.from(await file.arrayBuffer());\n const ext = file.name.split('.').pop() || 'jpg';\n const fileName = `avatar_${session.user.email}_${Date.now()}.${ext}`;\n const avatarUrl = saveAvatar\n ? await saveAvatar(buffer, fileName)\n : await (async () => {\n const fs = await import('fs/promises');\n const path = await import('path');\n const dir = path.join(process.cwd(), 'public', 'uploads', 'avatars');\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, fileName), buffer);\n return `/uploads/avatars/${fileName}`;\n })();\n return json({ message: 'Avatar uploaded successfully', avatarUrl });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface UserProfileConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n getSession: () => Promise<{ user?: { email?: string | null; name?: string | null } } | null>;\n}\n\nexport function createUserProfileHandler(config: UserProfileConfig) {\n const { dataSource, entityMap, json, getSession } = config;\n return async function PUT(req: Request): Promise<Response> {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n try {\n const body = await req.json() as { name?: string };\n if (!body?.name) return json({ error: 'Name is required' }, { status: 400 });\n const userRepo = dataSource.getRepository(entityMap.users);\n await userRepo.update({ email: session.user.email }, { name: body.name, updatedAt: new Date() });\n const updated = await userRepo.findOne({ where: { email: session.user.email }, select: ['id', 'name', 'email'] });\n if (!updated) return json({ error: 'Not found' }, { status: 404 });\n return json({ message: 'Profile updated successfully', user: { id: updated.id, name: updated.name, email: updated.email } });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface SettingsApiConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n encryptionKey?: string;\n /** Groups in this list are readable without auth (GET returns all keys for the group). */\n publicGetGroups?: string[];\n}\n\nfunction simpleEncrypt(text: string, key: string): string {\n const buf = Buffer.from(text, 'utf8');\n const keyBuf = Buffer.from(key.padEnd(32, '0').slice(0, 32), 'utf8');\n const out = Buffer.alloc(buf.length);\n for (let i = 0; i < buf.length; i++) out[i] = buf[i] ^ keyBuf[i % keyBuf.length];\n return out.toString('base64');\n}\n\nfunction simpleDecrypt(encoded: string, key: string): string {\n const buf = Buffer.from(encoded, 'base64');\n const keyBuf = Buffer.from(key.padEnd(32, '0').slice(0, 32), 'utf8');\n const out = Buffer.alloc(buf.length);\n for (let i = 0; i < buf.length; i++) out[i] = buf[i] ^ keyBuf[i % keyBuf.length];\n return out.toString('utf8');\n}\n\nexport function createSettingsApiHandlers(config: SettingsApiConfig) {\n const { dataSource, entityMap, json, requireAuth, encryptionKey, publicGetGroups } = config;\n const configRepo = () => dataSource.getRepository(entityMap.configs);\n\n return {\n async GET(req: Request, group: string): Promise<Response> {\n const isPublicGroup = publicGetGroups?.includes(group);\n const authErr = isPublicGroup ? null : await requireAuth(req);\n const isAuthed = !authErr;\n\n try {\n const where: Record<string, unknown> = { settings: group, deleted: false };\n if (!isAuthed && !isPublicGroup) where.type = 'public';\n\n const rows = await configRepo().find({ where });\n const result: Record<string, unknown> = {};\n for (const row of rows) {\n const r = row as { key: string; value: string; encrypted?: boolean; type?: string };\n let val = r.value;\n if (r.encrypted && encryptionKey) {\n try { val = simpleDecrypt(val, encryptionKey); } catch { /* return raw if decrypt fails */ }\n }\n result[r.key] = val;\n }\n return json(result);\n } catch {\n return json({ error: 'Failed to fetch settings' }, { status: 500 });\n }\n },\n\n async PUT(req: Request, group: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n\n try {\n const body = await req.json() as Record<string, { value: string; type?: 'public' | 'private'; encrypted?: boolean }>;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid payload' }, { status: 400 });\n\n const repo = configRepo();\n for (const [key, entry] of Object.entries(body)) {\n const val = typeof entry === 'string' ? entry : entry.value;\n const type = (typeof entry === 'object' && entry.type) || 'private';\n const encrypted = !!(typeof entry === 'object' && entry.encrypted);\n\n let storedValue = val;\n if (encrypted && encryptionKey) {\n storedValue = simpleEncrypt(val, encryptionKey);\n }\n\n const existing = await repo.findOne({ where: { settings: group, key } });\n if (existing) {\n await repo.update(existing.id, { value: storedValue, type, encrypted, updatedAt: new Date() } as object);\n } else {\n await repo.save(repo.create({ settings: group, key, value: storedValue, type, encrypted } as object));\n }\n }\n return json({ message: 'Settings saved' });\n } catch {\n return json({ error: 'Failed to save settings' }, { status: 500 });\n }\n },\n };\n}\n","/**\n * Single CMS API handler: dashboard, analytics, upload, blog/form by slug, users API, user auth, CRUD. Mount once (e.g. app/api/[[...path]]/route.ts).\n */\nimport type { DataSource } from 'typeorm';\nimport { createCrudHandler, createCrudByIdHandler } from './crud';\nimport type { CrudHandlerOptions, EntityMap } from './crud';\nimport { createUserAuthApiRouter } from './auth-handlers';\nimport type { UserAuthApiConfig } from './auth-handlers';\nimport {\n createDashboardStatsHandler,\n createAnalyticsHandlers,\n createUploadHandler,\n createBlogBySlugHandler,\n createFormBySlugHandler,\n createFormSaveHandlers,\n createFormSubmissionHandler,\n createFormSubmissionGetByIdHandler,\n createFormSubmissionListHandler,\n createUsersApiHandlers,\n createUserAvatarHandler,\n createUserProfileHandler,\n createSettingsApiHandlers,\n} from './cms-handlers';\nimport type {\n DashboardStatsConfig,\n AnalyticsHandlerConfig,\n UploadHandlerConfig,\n BlogBySlugConfig,\n FormBySlugConfig,\n FormSaveHandlersConfig,\n FormSubmissionHandlerConfig,\n FormSubmissionGetByIdConfig,\n UsersApiConfig,\n UserAvatarConfig,\n UserProfileConfig,\n SettingsApiConfig,\n} from './cms-handlers';\n\n/** CMS instance with getPlugin; when provided, analytics and userAuth.sendEmail can be resolved from plugins when not passed. */\nexport type CmsGetter = () => Promise<{ getPlugin: (name: string) => unknown }>;\n\nexport interface CmsApiHandlerConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n requireAuth: (req: Request) => Promise<Response | null>;\n json: (body: unknown, init?: { status?: number }) => Response;\n pathToModel?: (segment: string) => string;\n crudResources?: string[];\n /** When set, analytics and userAuth.sendEmail can be derived from getPlugin('analytics') and getPlugin('email') when not provided. */\n getCms?: CmsGetter;\n userAuth?: UserAuthApiConfig;\n /** GET /api/dashboard/stats */\n dashboard?: DashboardStatsConfig;\n /** GET /api/analytics. If omitted and getCms is set, uses getCms().getPlugin('analytics'). */\n analytics?: AnalyticsHandlerConfig;\n /** POST /api/upload (S3 or local) */\n upload?: UploadHandlerConfig;\n /** GET /api/blogs/slug/:slug (public) */\n blogBySlug?: BlogBySlugConfig;\n /** GET /api/forms/slug/:slug (public) */\n formBySlug?: FormBySlugConfig;\n /** POST/PUT /api/forms (save form + fields; when set, overrides CRUD for forms) */\n formSave?: FormSaveHandlersConfig;\n /** POST /api/form-submissions (public, no auth) */\n formSubmission?: FormSubmissionHandlerConfig;\n /** GET /api/form-submissions/:id (auth) with form + contact relations */\n formSubmissionGetById?: FormSubmissionGetByIdConfig;\n /** GET/POST /api/users, GET/PUT/DELETE /api/users/:id, POST /api/users/:id/regenerate-invite */\n usersApi?: UsersApiConfig;\n /** POST /api/users/avatar */\n userAvatar?: UserAvatarConfig;\n /** PUT /api/users/profile */\n userProfile?: UserProfileConfig;\n /** GET/PUT /api/settings/:group */\n settings?: SettingsApiConfig;\n}\n\nconst DEFAULT_EXCLUDE = new Set(['users', 'password_reset_tokens', 'user_groups', 'permissions', 'comments', 'form_fields', 'configs']);\n\nexport function createCmsApiHandler(config: CmsApiHandlerConfig) {\n const {\n dataSource,\n entityMap,\n pathToModel = (s) => s,\n crudResources = Object.keys(entityMap).filter((k) => !DEFAULT_EXCLUDE.has(k)),\n getCms,\n userAuth: userAuthConfig,\n dashboard,\n analytics: analyticsConfig,\n upload,\n blogBySlug,\n formBySlug,\n formSave: formSaveConfig,\n formSubmission: formSubmissionConfig,\n formSubmissionGetById: formSubmissionGetByIdConfig,\n usersApi,\n userAvatar,\n userProfile,\n settings: settingsConfig,\n } = config;\n\n const analytics: AnalyticsHandlerConfig | undefined =\n analyticsConfig ??\n (getCms\n ? {\n json: config.json,\n requireAuth: async () => null,\n getAnalyticsData: async (days) => {\n const cms = await getCms();\n const a = cms.getPlugin('analytics') as { getAnalyticsData?: (days: number) => Promise<unknown> } | undefined;\n if (!a?.getAnalyticsData) throw new Error('Analytics not configured');\n return a.getAnalyticsData(days);\n },\n getPropertyId: () => ({ currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID }),\n getPermissions: () => ({\n serviceAccountEmail: process.env.GOOGLE_ANALYTICS_CLIENT_EMAIL,\n currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID,\n }),\n }\n : undefined);\n\n const userAuth: UserAuthApiConfig | undefined =\n userAuthConfig && getCms && userAuthConfig.sendEmail === undefined\n ? {\n ...userAuthConfig,\n sendEmail: async (opts) => {\n const cms = await getCms();\n const email = cms.getPlugin('email') as { send: (data: { subject: string; html: string; text?: string; to?: string }) => Promise<boolean> } | undefined;\n if (!email?.send) return;\n const { emailTemplates } = await import('../plugins/email/email-service');\n const { subject, html, text } = emailTemplates.passwordReset({ resetLink: opts.text || opts.html });\n await email.send({ subject, html, text, to: opts.to });\n },\n }\n : userAuthConfig;\n\n const crudOpts: CrudHandlerOptions = { requireAuth: config.requireAuth, json: config.json };\n const crud = createCrudHandler(dataSource, entityMap, crudOpts);\n const crudById = createCrudByIdHandler(dataSource, entityMap, crudOpts);\n const userAuthRouter = userAuth ? createUserAuthApiRouter(userAuth) : null;\n\n const dashboardGet = dashboard ? createDashboardStatsHandler(dashboard) : null;\n const analyticsHandlers = analytics ? createAnalyticsHandlers(analytics) : null;\n const uploadPost = upload ? createUploadHandler(upload) : null;\n const blogBySlugGet = blogBySlug ? createBlogBySlugHandler(blogBySlug) : null;\n const formBySlugGet = formBySlug ? createFormBySlugHandler(formBySlug) : null;\n const formSaveHandlers = formSaveConfig ? createFormSaveHandlers(formSaveConfig) : null;\n const formSubmissionPost = formSubmissionConfig ? createFormSubmissionHandler(formSubmissionConfig) : null;\n const formSubmissionGetById = formSubmissionGetByIdConfig ? createFormSubmissionGetByIdHandler(formSubmissionGetByIdConfig) : null;\n const formSubmissionList = formSubmissionGetByIdConfig ? createFormSubmissionListHandler(formSubmissionGetByIdConfig) : null;\n const usersHandlers = usersApi ? createUsersApiHandlers(usersApi) : null;\n const avatarPost = userAvatar ? createUserAvatarHandler(userAvatar) : null;\n const profilePut = userProfile ? createUserProfileHandler(userProfile) : null;\n const settingsHandlers = settingsConfig ? createSettingsApiHandlers(settingsConfig) : null;\n\n function resolveResource(segment: string): string {\n const model = pathToModel(segment);\n return crudResources.includes(model) ? model : segment;\n }\n\n return {\n async handle(method: string, path: string[], req: Request): Promise<Response> {\n // Dashboard: [\"dashboard\", \"stats\"]\n if (path[0] === 'dashboard' && path[1] === 'stats' && path.length === 2 && method === 'GET' && dashboardGet) {\n return dashboardGet(req);\n }\n // Analytics: [\"analytics\"], [\"analytics\", \"property-id\"], [\"analytics\", \"permissions\"]\n if (path[0] === 'analytics' && analyticsHandlers) {\n if (path.length === 1 && method === 'GET') return analyticsHandlers.GET(req);\n if (path.length === 2 && path[1] === 'property-id' && method === 'GET') return analyticsHandlers.propertyId();\n if (path.length === 2 && path[1] === 'permissions' && method === 'GET') return analyticsHandlers.permissions();\n }\n // Upload: [\"upload\"]\n if (path[0] === 'upload' && path.length === 1 && method === 'POST' && uploadPost) return uploadPost(req);\n // Blog by slug: [\"blogs\", \"slug\", slug] (public)\n if (path[0] === 'blogs' && path[1] === 'slug' && path.length === 3 && method === 'GET' && blogBySlugGet) {\n return blogBySlugGet(req, path[2]);\n }\n // Form by slug: [\"forms\", \"slug\", slug] (public)\n if (path[0] === 'forms' && path[1] === 'slug' && path.length === 3 && method === 'GET' && formBySlugGet) {\n return formBySlugGet(req, path[2]);\n }\n // Form submission: [\"form-submissions\"] GET (auth, list with relations) or POST (public); [\"form-submissions\", id] GET (auth, with relations)\n if (path[0] === 'form-submissions') {\n if (path.length === 1) {\n if (method === 'GET' && formSubmissionList) return formSubmissionList(req);\n if (method === 'POST' && formSubmissionPost) return formSubmissionPost(req);\n }\n if (path.length === 2 && method === 'GET' && formSubmissionGetById) return formSubmissionGetById(req, path[1]);\n }\n // Form save: [\"forms\"] POST; [\"forms\", id] GET (with fields) or PUT/PATCH (saves form + fields)\n if (path[0] === 'forms' && formSaveHandlers) {\n if (path.length === 1 && method === 'POST') return formSaveHandlers.POST(req);\n if (path.length === 2) {\n if (method === 'GET') return formSaveHandlers.GET(req, path[1]);\n if (method === 'PUT' || method === 'PATCH') return formSaveHandlers.PUT(req, path[1]);\n }\n }\n // Users API\n if (path[0] === 'users' && usersHandlers) {\n if (path.length === 1) {\n if (method === 'GET') return usersHandlers.list(req);\n if (method === 'POST') return usersHandlers.create(req);\n }\n if (path.length === 2) {\n if (path[1] === 'avatar' && method === 'POST' && avatarPost) return avatarPost(req);\n if (path[1] === 'profile' && method === 'PUT' && profilePut) return profilePut(req);\n // users/:id\n const id = path[1];\n if (method === 'GET') return usersHandlers.getById(req, id);\n if (method === 'PUT' || method === 'PATCH') return usersHandlers.update(req, id);\n if (method === 'DELETE') return usersHandlers.delete(req, id);\n }\n if (path.length === 3 && path[2] === 'regenerate-invite' && method === 'POST') {\n return usersHandlers.regenerateInvite(req, path[1]);\n }\n }\n // User auth: [\"users\", \"forgot-password\"] etc.\n if (path[0] === 'users' && path.length === 2 && userAuthRouter && method === 'POST') {\n return userAuthRouter.POST(req, path[1]);\n }\n // Settings: [\"settings\", group]\n if (path[0] === 'settings' && path.length === 2 && settingsHandlers) {\n if (method === 'GET') return settingsHandlers.GET(req, path[1]);\n if (method === 'PUT') return settingsHandlers.PUT(req, path[1]);\n }\n\n // CRUD: [\"blogs\"] or [\"blogs\", \"123\"]\n if (path.length === 0) return config.json({ error: 'Not found' }, { status: 404 });\n const resource = resolveResource(path[0]);\n if (!crudResources.includes(resource)) return config.json({ error: 'Invalid resource' }, { status: 400 });\n\n // Bulk operations: [\"products\", \"metadata\"], [\"products\", \"bulk\"], [\"products\", \"export\"]\n if (path.length === 2) {\n if (path[1] === 'metadata' && method === 'GET') {\n return crud.GET_METADATA(req, resource);\n }\n if (path[1] === 'bulk' && method === 'POST') {\n return crud.BULK_POST(req, resource);\n }\n if (path[1] === 'export' && method === 'GET') {\n return crud.GET_EXPORT(req, resource);\n }\n }\n\n if (path.length === 1) {\n if (method === 'GET') return crud.GET(req, resource);\n if (method === 'POST') return crud.POST(req, resource);\n return config.json({ error: 'Method not allowed' }, { status: 405 });\n }\n if (path.length === 2) {\n const id = path[1];\n if (method === 'GET') return crudById.GET(req, resource, id);\n if (method === 'PUT' || method === 'PATCH') return crudById.PUT(req, resource, id);\n if (method === 'DELETE') return crudById.DELETE(req, resource, id);\n return config.json({ error: 'Method not allowed' }, { status: 405 });\n }\n return config.json({ error: 'Not found' }, { status: 404 });\n },\n };\n}\n","export interface AdminNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport const DEFAULT_ADMIN_NAV: AdminNavItem[] = [\n { href: '/admin/dashboard', label: 'Dashboard' },\n { href: '/admin/contacts', label: 'Contacts' },\n { href: '/admin/blogs', label: 'Blogs' },\n { href: '/admin/users', label: 'Users' },\n { href: '/admin/forms', label: 'Forms' },\n { href: '/admin/submissions', label: 'Submissions' },\n { href: '/admin/pages', label: 'Pages' },\n];\n"],"mappings":"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","names":["nodemailer","Stripe","Razorpay","crypto","StripePaymentService","RazorpayPaymentService","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","isPublicMethod","_CredentialsProvider","import_typeorm","repo","total","data","typeFilter","crypto","import_typeorm","emailTemplates"]}
1
+ {"version":3,"sources":["../src/plugins/email/email-service.ts","../src/plugins/payment/stripe.ts","../src/plugins/payment/razorpay.ts","../src/index.ts","../src/plugins/registry.ts","../src/plugins/erp/erp-auth.ts","../src/plugins/erp/erp-submission.ts","../src/plugins/erp/index.ts","../src/plugins/email/index.ts","../src/plugins/analytics/analytics-service.ts","../src/plugins/analytics/index.ts","../src/plugins/sms/index.ts","../src/plugins/payment/index.ts","../src/plugins/storage/s3.ts","../src/plugins/storage/local.ts","../src/plugins/llm/llm-service.ts","../src/plugins/llm/index.ts","../src/lib/utils.ts","../src/entities/user.entity.ts","../src/entities/user-group.entity.ts","../src/entities/permission.entity.ts","../src/entities/password-reset-token.entity.ts","../src/entities/blog.entity.ts","../src/entities/category.entity.ts","../src/entities/seo.entity.ts","../src/entities/comment.entity.ts","../src/entities/tag.entity.ts","../src/entities/contact.entity.ts","../src/entities/form-submission.entity.ts","../src/entities/form.entity.ts","../src/entities/form-field.entity.ts","../src/entities/address.entity.ts","../src/entities/order.entity.ts","../src/entities/payment.entity.ts","../src/entities/chat-conversation.entity.ts","../src/entities/chat-message.entity.ts","../src/entities/config.entity.ts","../src/entities/media.entity.ts","../src/entities/page.entity.ts","../src/entities/product-category.entity.ts","../src/entities/collection.entity.ts","../src/entities/brand.entity.ts","../src/entities/product.entity.ts","../src/entities/attribute.entity.ts","../src/entities/product-attribute.entity.ts","../src/entities/tax.entity.ts","../src/entities/product-tax.entity.ts","../src/entities/order-item.entity.ts","../src/entities/knowledge-base-document.entity.ts","../src/entities/knowledge-base-chunk.entity.ts","../src/entities/index.ts","../src/auth/helpers.ts","../src/auth/middleware.ts","../src/auth/nextauth-options.ts","../src/api/crud.ts","../src/api/auth-handlers.ts","../src/api/cms-handlers.ts","../src/api/cms-api-handler.ts","../src/admin/config.ts"],"sourcesContent":["import { SESClient, SendEmailCommand } from '@aws-sdk/client-ses';\nimport nodemailer from 'nodemailer';\n\nexport interface EmailPluginConfig {\n type: 'AWS' | 'SMTP' | 'GMAIL' | 'SENDGRID';\n user?: string;\n password?: string;\n from: string;\n to: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport interface EmailData {\n subject: string;\n html: string;\n text?: string;\n to?: string;\n from?: string;\n}\n\nexport interface EmailServiceInterface {\n send(emailData: EmailData): Promise<boolean>;\n}\n\nexport class EmailService implements EmailServiceInterface {\n private config: EmailPluginConfig;\n private sesClient?: SESClient;\n private transporter?: nodemailer.Transporter;\n\n constructor(config: EmailPluginConfig) {\n this.config = config;\n if (config.type === 'AWS') {\n if (!config.region || !config.accessKeyId || !config.secretAccessKey) {\n throw new Error('AWS SES configuration incomplete');\n }\n this.sesClient = new SESClient({\n region: config.region,\n credentials: { accessKeyId: config.accessKeyId, secretAccessKey: config.secretAccessKey },\n });\n } else if (config.type === 'SMTP' || config.type === 'GMAIL') {\n if (!config.user || !config.password) throw new Error('SMTP configuration incomplete');\n this.transporter = nodemailer.createTransport({\n host: config.type === 'GMAIL' ? 'smtp.gmail.com' : undefined,\n port: 587,\n secure: false,\n auth: { user: config.user, pass: config.password },\n });\n } else {\n throw new Error(`Unsupported email type: ${config.type}`);\n }\n }\n\n async send(emailData: EmailData): Promise<boolean> {\n try {\n if (this.config.type === 'AWS' && this.sesClient) {\n await this.sesClient.send(\n new SendEmailCommand({\n Source: emailData.from || this.config.from,\n Destination: { ToAddresses: [emailData.to || this.config.to] },\n Message: {\n Subject: { Data: emailData.subject, Charset: 'UTF-8' },\n Body: {\n Html: { Data: emailData.html, Charset: 'UTF-8' },\n ...(emailData.text && { Text: { Data: emailData.text, Charset: 'UTF-8' } }),\n },\n },\n })\n );\n return true;\n }\n if ((this.config.type === 'SMTP' || this.config.type === 'GMAIL') && this.transporter) {\n await this.transporter.sendMail({\n from: emailData.from || this.config.from,\n to: emailData.to || this.config.to,\n subject: emailData.subject,\n html: emailData.html,\n text: emailData.text,\n });\n return true;\n }\n return false;\n } catch (error) {\n console.error('Email sending failed:', error);\n return false;\n }\n }\n}\n\nexport const emailTemplates = {\n formSubmission: (data: { formName: string; contactName: string; contactEmail: string; formData: unknown }) => ({\n subject: `New Form Submission: ${data.formName}`,\n html: `<h2>New Form Submission</h2><p><strong>Form:</strong> ${data.formName}</p><p><strong>Contact:</strong> ${data.contactName} (${data.contactEmail})</p><pre>${JSON.stringify(data.formData, null, 2)}</pre>`,\n text: `New Form Submission\\nForm: ${data.formName}\\nContact: ${data.contactName} (${data.contactEmail})\\n${JSON.stringify(data.formData, null, 2)}`,\n }),\n contactSubmission: (data: { name: string; email: string; phone?: string; message?: string }) => ({\n subject: `New Contact Form Submission from ${data.name}`,\n html: `<h2>New Contact Form Submission</h2><p><strong>Name:</strong> ${data.name}</p><p><strong>Email:</strong> ${data.email}</p>${data.phone ? `<p><strong>Phone:</strong> ${data.phone}</p>` : ''}${data.message ? `<p><strong>Message:</strong></p><p>${data.message}</p>` : ''}`,\n text: `New Contact Form Submission\\nName: ${data.name}\\nEmail: ${data.email}\\n${data.phone ? `Phone: ${data.phone}\\n` : ''}${data.message ? `Message: ${data.message}` : ''}`,\n }),\n passwordReset: (data: { resetLink: string }) => ({\n subject: 'Reset your password',\n html: `<h2>Reset your password</h2><p>Click the link below to set a new password. This link expires in 1 hour.</p><p><a href=\"${data.resetLink}\">${data.resetLink}</a></p>`,\n text: `Reset your password: ${data.resetLink}\\n\\nThis link expires in 1 hour.`,\n }),\n};\n","import Stripe from 'stripe';\nimport type { PaymentServiceInterface, PaymentIntent } from './index';\n\nexport interface StripeServiceConfig {\n secretKey: string;\n webhookSecret?: string;\n}\n\nexport class StripePaymentService implements PaymentServiceInterface {\n private stripe: Stripe;\n private webhookSecret?: string;\n\n constructor(config: StripeServiceConfig) {\n this.stripe = new Stripe(config.secretKey, { apiVersion: '2024-06-20' });\n this.webhookSecret = config.webhookSecret;\n }\n\n async createPaymentIntent(\n amount: number,\n currency: string,\n metadata?: Record<string, string>\n ): Promise<PaymentIntent> {\n const intent = await this.stripe.paymentIntents.create({\n amount: Math.round(amount * 100),\n currency: currency.toLowerCase(),\n metadata,\n });\n\n return {\n id: intent.id,\n clientSecret: intent.client_secret || '',\n amount,\n currency,\n status: intent.status,\n };\n }\n\n async capturePayment(paymentId: string, amount?: number): Promise<boolean> {\n try {\n await this.stripe.paymentIntents.capture(paymentId, {\n amount_to_capture: amount ? Math.round(amount * 100) : undefined,\n });\n return true;\n } catch {\n return false;\n }\n }\n\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean {\n if (!this.webhookSecret) return false;\n try {\n this.stripe.webhooks.constructEvent(payload, signature, this.webhookSecret);\n return true;\n } catch {\n return false;\n }\n }\n}\n","import Razorpay from 'razorpay';\nimport crypto from 'crypto';\nimport type { PaymentServiceInterface, PaymentIntent } from './index';\n\nexport interface RazorpayServiceConfig {\n keyId: string;\n keySecret: string;\n webhookSecret?: string;\n}\n\nexport class RazorpayPaymentService implements PaymentServiceInterface {\n private razorpay: Razorpay;\n private keySecret: string;\n private webhookSecret?: string;\n\n constructor(config: RazorpayServiceConfig) {\n this.razorpay = new Razorpay({\n key_id: config.keyId,\n key_secret: config.keySecret,\n });\n this.keySecret = config.keySecret;\n this.webhookSecret = config.webhookSecret;\n }\n\n async createPaymentIntent(\n amount: number,\n currency: string,\n metadata?: Record<string, string>\n ): Promise<PaymentIntent> {\n const order = await this.razorpay.orders.create({\n amount: Math.round(amount * 100),\n currency: currency.toUpperCase(),\n notes: metadata,\n });\n\n return {\n id: order.id,\n clientSecret: order.id,\n amount,\n currency,\n status: order.status,\n };\n }\n\n async capturePayment(paymentId: string, amount?: number): Promise<boolean> {\n try {\n await this.razorpay.payments.capture(paymentId, amount ? Math.round(amount * 100) : 0, 'INR');\n return true;\n } catch {\n return false;\n }\n }\n\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean {\n const secret = this.webhookSecret || this.keySecret;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(typeof payload === 'string' ? payload : payload.toString('utf8'))\n .digest('hex');\n return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature));\n }\n}\n","export * from './plugins/types';\nexport * from './plugins/registry';\nexport { erpPlugin } from './plugins/erp';\nexport type { ERPPluginConfig, ERPPluginInstance } from './plugins/erp';\nexport { emailPlugin, EmailService, emailTemplates } from './plugins/email';\nexport type { EmailPluginConfig, EmailData, EmailServiceInterface } from './plugins/email';\nexport { analyticsPlugin } from './plugins/analytics';\nexport type { AnalyticsPluginConfig } from './plugins/analytics';\nexport { smsPlugin } from './plugins/sms';\nexport { paymentPlugin } from './plugins/payment';\nexport type { PaymentPluginConfig, PaymentServiceInterface, PaymentIntent } from './plugins/payment';\nexport { s3StoragePlugin, localStoragePlugin } from './plugins/storage';\nexport type { StorageService, S3StoragePluginConfig, LocalStoragePluginConfig } from './plugins/storage';\nexport { llmPlugin, LlmService } from './plugins/llm';\nexport type { LlmPluginConfig, LlmServiceInterface, LlmMessage, LlmChatOptions } from './plugins/llm';\nexport * from './lib';\nexport * from './entities';\nexport * from './auth';\nexport * from './api';\nexport { DEFAULT_ADMIN_NAV } from './admin/config';\nexport type { AdminNavItem } from './admin/config';\n","import type { CmsPlugin, PluginContext } from './types';\n\nexport interface CreateCmsAppOptions {\n dataSource: unknown;\n config?: Record<string, string>;\n plugins?: CmsPlugin[];\n logger?: PluginContext['logger'];\n}\n\nconst noopLogger: PluginContext['logger'] = {\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\nexport interface CmsApp {\n dataSource: unknown;\n getPlugin<T = unknown>(name: string): T | undefined;\n}\n\nexport async function createCmsApp(options: CreateCmsAppOptions): Promise<CmsApp> {\n const { dataSource, config = {}, plugins = [], logger = noopLogger } = options;\n const context: PluginContext = { dataSource, config, logger };\n const registry = new Map<string, unknown>();\n\n for (const plugin of plugins) {\n try {\n const instance = await plugin.init(context);\n registry.set(plugin.name, instance !== undefined ? instance : plugin);\n } catch (err) {\n logger.warn(`Plugin \"${plugin.name}\" failed to init: ${err instanceof Error ? err.message : err}`);\n }\n }\n\n return {\n dataSource,\n getPlugin<T>(name: string): T | undefined {\n return registry.get(name) as T | undefined;\n },\n };\n}\n","interface ERPAuthCredentials {\n clientId: string;\n clientSecret: string;\n tenantId: string;\n}\n\ninterface ERPAuthToken {\n access_token: string;\n token_type: string;\n expires_in: number;\n expires_at?: number;\n}\n\nexport class ERPAuthService {\n private baseUrl: string;\n private credentials: ERPAuthCredentials;\n private token: ERPAuthToken | null = null;\n\n constructor(config: { baseUrl?: string; clientId: string; clientSecret: string; tenantId: string }) {\n this.baseUrl = config.baseUrl || 'https://uat.infuroerp.com';\n this.credentials = {\n clientId: config.clientId,\n clientSecret: config.clientSecret,\n tenantId: config.tenantId,\n };\n }\n\n async authenticate(): Promise<ERPAuthToken> {\n const authUrl = `${this.baseUrl}/api/auth/account/app-login`;\n const authPayload = {\n clientId: this.credentials.clientId,\n clientSecret: this.credentials.clientSecret,\n tenantId: this.credentials.tenantId,\n };\n\n const response = await fetch(authUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(authPayload),\n });\n\n if (!response.ok) {\n const errorData = await response.text();\n throw new Error(`Authentication failed: ${response.status} - ${errorData}`);\n }\n\n const tokenData = await response.json();\n const actualToken =\n tokenData.access_token ||\n tokenData.token ||\n tokenData.accessToken ||\n tokenData.jwt ||\n tokenData.bearer_token ||\n tokenData.auth_token;\n\n if (!actualToken) {\n throw new Error('No access token found in authentication response');\n }\n\n const expiresIn = tokenData.expires_in || tokenData.expiresIn || 3600;\n const expiresAt = Date.now() + expiresIn * 1000;\n const token: ERPAuthToken = {\n access_token: actualToken,\n token_type: tokenData.token_type || tokenData.tokenType || 'Bearer',\n expires_in: expiresIn,\n expires_at: expiresAt,\n };\n this.token = token;\n return token;\n }\n\n async getValidToken(): Promise<string> {\n if (this.token && this.token.expires_at && Date.now() < this.token.expires_at) {\n return this.token.access_token;\n }\n const newToken = await this.authenticate();\n return newToken.access_token;\n }\n\n async makeAuthenticatedRequest(url: string, options: RequestInit = {}): Promise<Response> {\n const token = await this.getValidToken();\n const headers = {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n ...options.headers,\n };\n return fetch(url, { ...options, headers });\n }\n}\n","import type { ERPAuthService } from './erp-auth';\n\nexport interface ContactFormData {\n firstName: string;\n lastName: string;\n email: string;\n phone?: string;\n industry?: string;\n message?: string;\n}\n\ninterface ExternalContactPayload {\n contact: string;\n type: string;\n status: string;\n tag_ids: string[];\n company_id: null;\n first_name: string;\n last_name: string;\n email: string;\n phone: string;\n country: string;\n}\n\ninterface ExternalOpportunityPayload {\n contact_id: string;\n name: string;\n description: string;\n createdAt: string;\n pipeline_id: string;\n pipeline_stage_id: string;\n amount: number | null;\n expected_close_date: string;\n actual_close_date: string;\n owner: string | null;\n}\n\nexport interface ERPSubmissionResult {\n success: boolean;\n contactId: string;\n opportunityId?: string;\n error?: string;\n}\n\nexport class ERPSubmissionService {\n private baseUrl: string;\n private pipelineId: string;\n private pipelineStageId: string;\n private auth: ERPAuthService;\n\n constructor(config: {\n baseUrl?: string;\n pipelineId: string;\n pipelineStageId: string;\n auth: ERPAuthService;\n }) {\n this.baseUrl = config.baseUrl || 'https://uat.infuroerp.com';\n this.pipelineId = config.pipelineId;\n this.pipelineStageId = config.pipelineStageId;\n this.auth = config.auth;\n }\n\n async submitContact(formData: ContactFormData): Promise<ERPSubmissionResult> {\n try {\n if (!formData.firstName || !formData.lastName || !formData.email) {\n throw new Error('Missing required fields: First name, last name, and email are required');\n }\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(formData.email)) {\n throw new Error('Invalid email format');\n }\n\n const contactPayload: ExternalContactPayload = {\n contact: `${formData.firstName} ${formData.lastName}`,\n type: 'Individual',\n status: 'Active',\n tag_ids: [],\n company_id: null,\n first_name: formData.firstName,\n last_name: formData.lastName,\n email: formData.email,\n phone: formData.phone || '',\n country: '',\n };\n\n const contactApiUrl = `${this.baseUrl}/api/crm/contacts`;\n const contactResponse = await this.auth.makeAuthenticatedRequest(contactApiUrl, {\n method: 'POST',\n body: JSON.stringify(contactPayload),\n });\n\n if (!contactResponse.ok) {\n const errorData = await contactResponse.text();\n throw new Error(`Failed to submit contact: ${contactResponse.status} - ${errorData}`);\n }\n\n const contactData = await contactResponse.json();\n const contactId = contactData.id || contactData.data?.id;\n if (!contactId) {\n throw new Error('No contact ID returned from API');\n }\n\n let opportunityId: string | undefined;\n if (this.pipelineId && this.pipelineStageId) {\n const currentDate = new Date().toISOString();\n const opportunityPayload: ExternalOpportunityPayload = {\n contact_id: contactId,\n name: `${formData.industry || 'General'} Inquiry - ${formData.firstName} ${formData.lastName}`,\n description: formData.message || 'Inquiry from website contact form',\n createdAt: currentDate,\n pipeline_id: this.pipelineId,\n pipeline_stage_id: this.pipelineStageId,\n amount: null,\n expected_close_date: currentDate,\n actual_close_date: currentDate,\n owner: null,\n };\n const opportunityApiUrl = `${this.baseUrl}/api/crm/opportunities`;\n const opportunityResponse = await this.auth.makeAuthenticatedRequest(opportunityApiUrl, {\n method: 'POST',\n body: JSON.stringify(opportunityPayload),\n });\n if (opportunityResponse.ok) {\n const opportunityData = await opportunityResponse.json();\n opportunityId = opportunityData.id || opportunityData.data?.id;\n }\n }\n\n return { success: true, contactId, opportunityId };\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Failed to submit to ERP';\n return { success: false, contactId: '', error: message };\n }\n }\n\n extractContactData(formData: Record<string, unknown>, formFields: { id: string | number; type: string; label: string }[]): ContactFormData | null {\n const contactData: ContactFormData = {\n firstName: '',\n lastName: '',\n email: '',\n phone: '',\n industry: '',\n message: '',\n };\n let hasEmail = false;\n\n for (const field of formFields) {\n const fieldValue = formData[field.id.toString()];\n if (fieldValue == null) continue;\n const label = field.label.toLowerCase();\n const value = String(fieldValue).trim();\n\n if (field.type === 'email') {\n contactData.email = value;\n hasEmail = true;\n } else if (field.type === 'phone') {\n contactData.phone = value;\n } else if (field.type === 'text' || field.type === 'textarea') {\n if (label.includes('first name') || label.includes('firstname')) {\n contactData.firstName = value;\n } else if (label.includes('last name') || label.includes('lastname')) {\n contactData.lastName = value;\n } else if (label.includes('name') && !contactData.firstName) {\n const nameParts = value.split(' ');\n if (nameParts.length >= 2) {\n contactData.firstName = nameParts[0];\n contactData.lastName = nameParts.slice(1).join(' ');\n } else {\n contactData.firstName = value;\n }\n } else if (label.includes('industry')) {\n contactData.industry = value;\n } else if (label.includes('message') || label.includes('comment') || label.includes('description') || label.includes('inquiry')) {\n contactData.message = value;\n }\n }\n }\n\n if (!hasEmail && !contactData.firstName) return null;\n if (!contactData.firstName && contactData.email) {\n contactData.firstName = contactData.email.split('@')[0];\n contactData.lastName = '';\n }\n return contactData;\n }\n}\n","import type { CmsPlugin } from '../types';\nimport { ERPAuthService } from './erp-auth';\nimport { ERPSubmissionService } from './erp-submission';\n\nexport interface ERPPluginConfig {\n baseUrl?: string;\n clientId: string;\n clientSecret: string;\n tenantId: string;\n pipelineId?: string;\n pipelineStageId?: string;\n}\n\nexport interface ERPPluginInstance {\n auth: ERPAuthService;\n submission: ERPSubmissionService;\n}\n\nexport function erpPlugin(config: ERPPluginConfig): CmsPlugin<ERPPluginInstance> {\n return {\n name: 'erp',\n version: '1.0.0',\n async init(context) {\n const baseUrl = config.baseUrl || context.config.ERP_API_BASE_URL || 'https://uat.infuroerp.com';\n const clientId = config.clientId || context.config.CLIENT_ID || '';\n const clientSecret = config.clientSecret || context.config.CLIENT_SECRET || '';\n const tenantId = config.tenantId || context.config.TENANT_ID || '';\n const pipelineId = config.pipelineId || context.config.PIPELINE_ID || '';\n const pipelineStageId = config.pipelineStageId || context.config.PIPELINE_STAGE_ID || '';\n\n const auth = new ERPAuthService({\n baseUrl,\n clientId,\n clientSecret,\n tenantId,\n });\n const submission = new ERPSubmissionService({\n baseUrl,\n pipelineId,\n pipelineStageId,\n auth,\n });\n return { auth, submission };\n },\n };\n}\n\nexport { ERPAuthService, ERPSubmissionService };\nexport type { ContactFormData, ERPSubmissionResult } from './erp-submission';\n","import type { CmsPlugin } from '../types';\nimport { EmailService } from './email-service';\n\nexport interface EmailPluginConfig {\n type: 'AWS' | 'SMTP' | 'GMAIL' | 'SENDGRID';\n user?: string;\n password?: string;\n from: string;\n to: string;\n region?: string;\n accessKeyId?: string;\n secretAccessKey?: string;\n}\n\nexport function emailPlugin(config: EmailPluginConfig): CmsPlugin<EmailService> {\n return {\n name: 'email',\n version: '1.0.0',\n async init(context) {\n const from = config.from || context.config.SMTP_FROM || 'no-reply@example.com';\n const to = config.to || context.config.SMTP_TO || 'info@example.com';\n const type = (config.type || context.config.SMTP_TYPE) as EmailPluginConfig['type'] || 'SMTP';\n const merged: EmailPluginConfig = {\n ...config,\n from,\n to,\n type,\n user: config.user ?? context.config.SMTP_USER,\n password: config.password ?? context.config.SMTP_PASSWORD,\n region: config.region ?? context.config.AWS_REGION,\n accessKeyId: config.accessKeyId ?? context.config.AWS_ACCESS_KEY_ID,\n secretAccessKey: config.secretAccessKey ?? context.config.AWS_SECRET_ACCESS_KEY,\n };\n if (type === 'AWS' && (!merged.region || !merged.accessKeyId || !merged.secretAccessKey)) {\n context.logger.warn('Email plugin skipped: AWS SES configuration incomplete');\n return undefined;\n }\n if ((type === 'SMTP' || type === 'GMAIL') && (!merged.user || !merged.password)) {\n context.logger.warn('Email plugin skipped: SMTP credentials not configured');\n return undefined;\n }\n return new EmailService(merged);\n },\n };\n}\n\nexport { EmailService, emailTemplates } from './email-service';\nexport type { EmailData, EmailPluginConfig as EmailConfig, EmailServiceInterface } from './email-service';\n","import { google } from 'googleapis';\n\nexport interface AnalyticsData {\n visitors: number;\n pageViews: number;\n bounceRate: number;\n avgSessionDuration: number;\n topPages: Array<{ page: string; views: number }>;\n trafficSources: Array<{ source: string; sessions: number }>;\n geographicData: Array<{ country: string; sessions: number }>;\n dailyUsers: Array<{ date: string; users: number }>;\n}\n\nexport interface AnalyticsPluginConfig {\n privateKey: string;\n clientEmail: string;\n viewId: string;\n}\n\nexport class AnalyticsService {\n private analytics: ReturnType<typeof google.analyticsdata>;\n private viewId: string;\n\n constructor(config: AnalyticsPluginConfig) {\n const privateKey = config.privateKey.replace(/\\\\n/g, '\\n');\n const auth = new google.auth.JWT({\n email: config.clientEmail,\n key: privateKey,\n scopes: ['https://www.googleapis.com/auth/analytics.readonly'],\n });\n this.analytics = google.analyticsdata({ version: 'v1beta', auth });\n this.viewId = config.viewId;\n }\n\n async getAnalyticsData(days = 30): Promise<AnalyticsData> {\n const endDate = new Date();\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - days);\n\n const [visitors, pageViews, bounceRate, sessionDuration, topPages, trafficSources, geographicData, dailyUsers] =\n await Promise.all([\n this.getVisitors(startDate, endDate),\n this.getPageViews(startDate, endDate),\n this.getBounceRate(startDate, endDate),\n this.getAvgSessionDuration(startDate, endDate),\n this.getTopPages(startDate, endDate),\n this.getTrafficSources(startDate, endDate),\n this.getGeographicData(startDate, endDate),\n this.getDailyUsers(startDate, endDate),\n ]);\n\n return {\n visitors,\n pageViews,\n bounceRate,\n avgSessionDuration: sessionDuration,\n topPages,\n trafficSources,\n geographicData,\n dailyUsers,\n };\n }\n\n private async runReport(requestBody: Record<string, unknown>) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = await (this.analytics.properties.runReport as any)({\n property: `properties/${this.viewId}`,\n requestBody,\n });\n return response?.data as { rows?: Array<{ dimensionValues: { value: string }[]; metricValues: { value: string }[] }> };\n }\n\n private async getVisitors(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'totalUsers' }],\n });\n return parseInt(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getPageViews(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'screenPageViews' }],\n });\n return parseInt(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getBounceRate(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'bounceRate' }],\n });\n return parseFloat(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getAvgSessionDuration(startDate: Date, endDate: Date): Promise<number> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n metrics: [{ name: 'averageSessionDuration' }],\n });\n return parseFloat(data.rows?.[0]?.metricValues?.[0]?.value || '0');\n }\n\n private async getTopPages(startDate: Date, endDate: Date): Promise<Array<{ page: string; views: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'pagePath' }],\n metrics: [{ name: 'screenPageViews' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ page: row.dimensionValues[0].value, views: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getTrafficSources(\n startDate: Date,\n endDate: Date\n ): Promise<Array<{ source: string; sessions: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'sessionSource' }],\n metrics: [{ name: 'sessions' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ source: row.dimensionValues[0].value, sessions: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getGeographicData(\n startDate: Date,\n endDate: Date\n ): Promise<Array<{ country: string; sessions: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'country' }],\n metrics: [{ name: 'sessions' }],\n limit: 10,\n });\n return data.rows?.map((row) => ({ country: row.dimensionValues[0].value, sessions: parseInt(row.metricValues[0].value) })) || [];\n }\n\n private async getDailyUsers(startDate: Date, endDate: Date): Promise<Array<{ date: string; users: number }>> {\n const data = await this.runReport({\n dateRanges: [{ startDate: startDate.toISOString().split('T')[0], endDate: endDate.toISOString().split('T')[0] }],\n dimensions: [{ name: 'date' }],\n metrics: [{ name: 'totalUsers' }],\n orderBys: [{ dimension: { dimensionName: 'date' } }],\n });\n return (\n data.rows?.map((row) => {\n const dateStr = row.dimensionValues[0].value;\n return { date: `${dateStr.substring(4, 6)}/${dateStr.substring(6, 8)}`, users: parseInt(row.metricValues[0].value) };\n }) || []\n );\n }\n}\n","import type { CmsPlugin } from '../types';\nimport { AnalyticsService } from './analytics-service';\n\nexport interface AnalyticsPluginConfig {\n privateKey?: string;\n clientEmail?: string;\n viewId?: string;\n}\n\nexport function analyticsPlugin(config: AnalyticsPluginConfig = {}): CmsPlugin<AnalyticsService> {\n return {\n name: 'analytics',\n version: '1.0.0',\n async init(context) {\n const privateKey = config.privateKey ?? context.config.GOOGLE_ANALYTICS_PRIVATE_KEY;\n const clientEmail = config.clientEmail ?? context.config.GOOGLE_ANALYTICS_CLIENT_EMAIL;\n const viewId = config.viewId ?? context.config.GOOGLE_ANALYTICS_VIEW_ID ?? '';\n if (!privateKey || !clientEmail || !viewId) {\n throw new Error('Google Analytics credentials not configured');\n }\n return new AnalyticsService({ privateKey, clientEmail, viewId });\n },\n };\n}\n\nexport { AnalyticsService } from './analytics-service';\nexport type { AnalyticsData } from './analytics-service';\n","import type { CmsPlugin } from '../types';\n\n/** Provider-agnostic SMS interface. Implementations (Twilio, AWS SNS, etc.) can be added later. */\nexport interface SmsServiceInterface {\n send(to: string, message: string): Promise<boolean>;\n}\n\nexport interface SmsPluginConfig {\n provider?: string;\n [key: string]: string | undefined;\n}\n\n/** Stub SMS plugin - no implementation yet. Register and implement in app or extend core later. */\nexport function smsPlugin(_config: SmsPluginConfig = {}): CmsPlugin<SmsServiceInterface | null> {\n return {\n name: 'sms',\n version: '1.0.0',\n async init() {\n return null;\n },\n };\n}\n","import type { CmsPlugin, PluginContext } from '../types';\n\nexport interface PaymentIntent {\n id: string;\n clientSecret: string;\n amount: number;\n currency: string;\n status: string;\n}\n\nexport interface PaymentServiceInterface {\n createPaymentIntent(amount: number, currency: string, metadata?: Record<string, string>): Promise<PaymentIntent>;\n capturePayment(paymentId: string, amount?: number): Promise<boolean>;\n verifyWebhookSignature(payload: string | Buffer, signature: string): boolean;\n}\n\nexport interface StripeConfig {\n provider: 'stripe';\n secretKey: string;\n webhookSecret?: string;\n}\n\nexport interface RazorpayConfig {\n provider: 'razorpay';\n keyId: string;\n keySecret: string;\n webhookSecret?: string;\n}\n\nexport type PaymentPluginConfig = StripeConfig | RazorpayConfig;\n\nexport function paymentPlugin(config: PaymentPluginConfig): CmsPlugin<PaymentServiceInterface | undefined> {\n return {\n name: 'payment',\n version: '1.0.0',\n async init(context: PluginContext) {\n if (config.provider === 'stripe') {\n const { StripePaymentService } = await import('./stripe');\n const secretKey = config.secretKey || context.config.STRIPE_SECRET_KEY;\n if (!secretKey) {\n context.logger.warn('Payment plugin skipped: Stripe secret key not configured');\n return undefined;\n }\n return new StripePaymentService({\n secretKey,\n webhookSecret: config.webhookSecret || context.config.STRIPE_WEBHOOK_SECRET,\n });\n }\n\n if (config.provider === 'razorpay') {\n const { RazorpayPaymentService } = await import('./razorpay');\n const keyId = config.keyId || context.config.RAZORPAY_KEY_ID;\n const keySecret = config.keySecret || context.config.RAZORPAY_KEY_SECRET;\n if (!keyId || !keySecret) {\n context.logger.warn('Payment plugin skipped: Razorpay credentials not configured');\n return undefined;\n }\n return new RazorpayPaymentService({\n keyId,\n keySecret,\n webhookSecret: config.webhookSecret || context.config.RAZORPAY_WEBHOOK_SECRET,\n });\n }\n\n context.logger.warn(`Payment plugin skipped: unknown provider \"${(config as { provider: string }).provider}\"`);\n return undefined;\n },\n };\n}\n","import type { CmsPlugin } from '../types';\nimport type { StorageService } from './types';\n\nexport interface S3StoragePluginConfig {\n region: string;\n accessKeyId: string;\n secretAccessKey: string;\n bucket: string;\n baseUrl?: string;\n prefix?: string;\n}\n\nfunction getS3Storage(config: S3StoragePluginConfig): StorageService {\n const prefix = (config.prefix ?? 'uploads').replace(/\\/$/, '');\n const keyPrefix = prefix ? `${prefix}/` : '';\n\n return {\n async upload(buffer: Buffer, key: string, contentType: string): Promise<string> {\n const { S3Client, PutObjectCommand } = await import('@aws-sdk/client-s3');\n const client = new S3Client({\n region: config.region,\n credentials: {\n accessKeyId: config.accessKeyId,\n secretAccessKey: config.secretAccessKey,\n },\n });\n const fullKey = keyPrefix + key.replace(/^\\/+/, '');\n await client.send(\n new PutObjectCommand({\n Bucket: config.bucket,\n Key: fullKey,\n Body: buffer,\n ContentType: contentType,\n })\n );\n if (config.baseUrl) {\n return `${config.baseUrl.replace(/\\/$/, '')}/${fullKey}`;\n }\n return `https://s3.${config.region}.amazonaws.com/${config.bucket}/${fullKey}`;\n },\n };\n}\n\nexport function s3StoragePlugin(\n config: Partial<S3StoragePluginConfig> & { bucket: string }\n): CmsPlugin<StorageService> {\n return {\n name: 'storage',\n version: '1.0.0',\n async init(context) {\n const region = config.region ?? context.config.AWS_REGION ?? '';\n const accessKeyId = config.accessKeyId ?? context.config.AWS_ACCESS_KEY_ID ?? '';\n const secretAccessKey = config.secretAccessKey ?? context.config.AWS_SECRET_ACCESS_KEY ?? '';\n const bucket = config.bucket ?? context.config.AWS_BUCKET_NAME ?? '';\n const baseUrl = config.baseUrl ?? context.config.S3_MEDIA_URL ?? context.config.S3_CUSTOM_DOMAIN;\n const resolvedBaseUrl =\n typeof baseUrl === 'string' && baseUrl\n ? baseUrl.startsWith('http')\n ? baseUrl\n : `https://${baseUrl}`\n : undefined;\n if (!region || !accessKeyId || !secretAccessKey || !bucket) {\n throw new Error('S3 storage plugin: missing region, accessKeyId, secretAccessKey or bucket');\n }\n return getS3Storage({\n region,\n accessKeyId,\n secretAccessKey,\n bucket,\n baseUrl: resolvedBaseUrl,\n prefix: config.prefix ?? 'uploads',\n });\n },\n };\n}\n","import type { CmsPlugin } from '../types';\nimport type { StorageService } from './types';\n\nexport interface LocalStoragePluginConfig {\n /** Directory relative to process.cwd() (e.g. \"public/uploads\"). */\n dir?: string;\n /** Public URL prefix for returned URLs (e.g. \"\" for \"/uploads/...\"). */\n publicPath?: string;\n}\n\nfunction getLocalStorage(config: LocalStoragePluginConfig): StorageService {\n const dir = (config.dir ?? 'public/uploads').replace(/\\/$/, '');\n const publicPath =\n config.publicPath ??\n (dir === 'public/uploads' ? '/uploads' : `/${dir.replace(/^\\/+/, '').replace(/\\\\/g, '/')}`);\n\n return {\n async upload(buffer: Buffer, key: string, _contentType: string): Promise<string> {\n const fs = await import('fs/promises');\n const path = await import('path');\n const normalizedKey = key.replace(/^\\/+/, '').replace(/\\.\\./g, '');\n const fileName = normalizedKey.replace(/^uploads\\//, '');\n const fullDir = path.join(process.cwd(), dir);\n await fs.mkdir(fullDir, { recursive: true });\n const filePath = path.join(fullDir, fileName);\n const fileDir = path.dirname(filePath);\n await fs.mkdir(fileDir, { recursive: true });\n await fs.writeFile(filePath, buffer);\n return `${publicPath.replace(/\\/$/, '')}/${fileName}`;\n },\n };\n}\n\nexport function localStoragePlugin(config: LocalStoragePluginConfig = {}): CmsPlugin<StorageService> {\n return {\n name: 'storage',\n version: '1.0.0',\n async init(context) {\n const dir = config.dir ?? context.config.UPLOAD_DIR ?? 'public/uploads';\n return getLocalStorage({ ...config, dir });\n },\n };\n}\n","export interface LlmMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n}\n\nexport interface LlmChatOptions {\n model?: string;\n temperature?: number;\n max_tokens?: number;\n}\n\nexport interface LlmServiceInterface {\n chat(messages: LlmMessage[], options?: LlmChatOptions): Promise<{ content: string }>;\n streamChat(messages: LlmMessage[], options?: LlmChatOptions): AsyncIterable<string>;\n /** OpenAI-compatible embeddings; returns [] if gateway does not support /v1/embeddings */\n embed?(text: string, options?: { model?: string }): Promise<number[]>;\n}\n\nexport class LlmService implements LlmServiceInterface {\n private static embedWarned = false;\n\n constructor(\n private readonly baseURL: string,\n private readonly apiKey: string,\n private readonly defaultEmbeddingModel?: string\n ) {}\n\n private get base(): string {\n return this.baseURL.replace(/\\/$/, '');\n }\n\n private get url(): string {\n return `${this.base}/v1/chat/completions`;\n }\n\n /**\n * OpenAI-compatible embeddings. Returns [] if endpoint not available or unexpected response.\n * Server must implement: POST /v1/embeddings\n * Body: { model: string, input: string }\n * Response: { data: [ { embedding: number[] } ] } or { embedding: number[] }\n */\n async embed(text: string, options: { model?: string } = {}): Promise<number[]> {\n const model = options.model ?? this.defaultEmbeddingModel ?? 'text-embedding-3-small';\n const input = text.slice(0, 8000);\n const res = await fetch(`${this.base}/v1/embeddings`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model,\n input,\n }),\n });\n if (!res.ok) {\n const body = await res.text();\n if (!LlmService.embedWarned) {\n LlmService.embedWarned = true;\n console.warn(`[LLM embed] ${res.status} ${res.statusText}: ${body.slice(0, 400)}`);\n }\n return [];\n }\n let data: Record<string, unknown>;\n try {\n data = (await res.json()) as Record<string, unknown>;\n } catch {\n console.warn('[LLM embed] Response is not JSON');\n return [];\n }\n // OpenAI shape: { data: [ { embedding: number[] } ] }\n let embedding = (data?.data as Array<{ embedding?: number[] }>)?.[0]?.embedding;\n if (!Array.isArray(embedding) && Array.isArray(data?.embedding)) {\n embedding = data.embedding as number[];\n }\n if (!Array.isArray(embedding) && Array.isArray((data?.data as unknown[])?.[0])) {\n const first = (data.data as unknown[])[0];\n embedding = Array.isArray(first) ? first : (first as { embedding?: number[] })?.embedding;\n }\n if (!Array.isArray(embedding) && !LlmService.embedWarned) {\n LlmService.embedWarned = true;\n console.warn('[LLM embed] Unexpected response shape. Keys:', Object.keys(data), 'data[0] type:', Array.isArray(data?.data) ? typeof (data.data as unknown[])[0] : 'n/a');\n }\n return Array.isArray(embedding) ? embedding : [];\n }\n\n async chat(messages: LlmMessage[], options: LlmChatOptions = {}): Promise<{ content: string }> {\n const res = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model ?? 'qwen2.5:3b-instruct',\n messages,\n stream: false,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n }),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`LLM gateway error: ${res.status} ${text}`);\n }\n const data = (await res.json()) as { choices?: Array<{ message?: { content?: string } }> };\n const content = data.choices?.[0]?.message?.content ?? '';\n return { content };\n }\n\n async *streamChat(messages: LlmMessage[], options: LlmChatOptions = {}): AsyncIterable<string> {\n const res = await fetch(this.url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.apiKey}`,\n },\n body: JSON.stringify({\n model: options.model ?? 'qwen2.5:3b-instruct',\n messages,\n stream: true,\n temperature: options.temperature,\n max_tokens: options.max_tokens,\n }),\n });\n if (!res.ok) {\n const text = await res.text();\n throw new Error(`LLM gateway error: ${res.status} ${text}`);\n }\n const reader = res.body?.getReader();\n if (!reader) return;\n const decoder = new TextDecoder();\n let buffer = '';\n while (true) {\n const { value, done } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split('\\n');\n buffer = lines.pop() ?? '';\n for (const line of lines) {\n if (line.startsWith('data: ') && line !== 'data: [DONE]') {\n try {\n const json = JSON.parse(line.slice(6)) as { choices?: Array<{ delta?: { content?: string } }> };\n const content = json.choices?.[0]?.delta?.content;\n if (content) yield content;\n } catch {\n // skip malformed chunk\n }\n }\n }\n }\n }\n}\n","import type { CmsPlugin } from '../types';\nimport { LlmService } from './llm-service';\n\nexport interface LlmPluginConfig {\n baseURL?: string;\n apiKey?: string;\n /** Default model for embed(); also from env EMBEDDING_MODEL (e.g. for Qwen use your server's embedding model name). */\n embeddingModel?: string;\n}\n\nexport function llmPlugin(config: LlmPluginConfig = {}): CmsPlugin<LlmService | undefined> {\n return {\n name: 'llm',\n version: '1.0.0',\n async init(context) {\n const baseURL = config.baseURL ?? context.config.LLM_GATEWAY_URL;\n const apiKey = config.apiKey ?? context.config.LLM_API_KEY;\n if (!baseURL || !apiKey) {\n context.logger.warn('LLM plugin skipped: LLM_GATEWAY_URL or LLM_API_KEY not set');\n return undefined;\n }\n const embeddingModel = config.embeddingModel ?? context.config.EMBEDDING_MODEL;\n return new LlmService(baseURL.replace(/\\/$/, ''), apiKey, embeddingModel);\n },\n };\n}\n\nexport { LlmService } from './llm-service';\nexport type { LlmServiceInterface, LlmMessage, LlmChatOptions } from './llm-service';\n","import { type ClassValue, clsx } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateSlug(title: string): string {\n return title\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/(^-|-$)/g, '');\n}\n\nexport function validateSlug(slug: string): boolean {\n const slugRegex = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;\n return slugRegex.test(slug) && slug.length >= 3 && slug.length <= 50;\n}\n\nexport function formatDate(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function formatDateTime(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n hour: '2-digit',\n minute: '2-digit',\n });\n}\n\nexport function formatDateOnly(date: Date | string): string {\n const d = new Date(date);\n return d.toLocaleDateString('en-US', { year: 'numeric', month: 'long', day: 'numeric' });\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength).trim() + '...';\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { UserGroup } from './user-group.entity';\n\n@Entity('users')\nexport class User {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n email: string;\n\n @Column('varchar', { nullable: true })\n password: string | null;\n\n @Column('boolean', { default: false })\n blocked: boolean;\n\n @Column('int', { nullable: true })\n groupId: number | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => UserGroup, (g) => g.users, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'groupId' })\n group: UserGroup | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { Permission } from './permission.entity';\nimport { User } from './user.entity';\n\n@Entity('user_groups')\nexport class UserGroup {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => Permission, (p) => p.group)\n permissions: Permission[];\n\n @OneToMany(() => User, (u) => u.group)\n users: User[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { UserGroup } from './user-group.entity';\n\n@Entity('permissions')\nexport class Permission {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n groupId: number;\n\n @Column('varchar')\n entity: string;\n\n @Column('boolean', { default: false })\n canCreate: boolean;\n\n @Column('boolean', { default: false })\n canRead: boolean;\n\n @Column('boolean', { default: false })\n canUpdate: boolean;\n\n @Column('boolean', { default: false })\n canDelete: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => UserGroup, (g) => g.permissions, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'groupId' })\n group: UserGroup;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('password_reset_tokens')\nexport class PasswordResetToken {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n email: string;\n\n @Column('varchar', { unique: true })\n token: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n expiresAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n}\n","import {\n Entity,\n PrimaryGeneratedColumn,\n Column,\n ManyToOne,\n OneToMany,\n ManyToMany,\n JoinTable,\n JoinColumn,\n} from 'typeorm';\nimport { User } from './user.entity';\nimport { Category } from './category.entity';\nimport { Seo } from './seo.entity';\nimport { Comment } from './comment.entity';\nimport { Tag } from './tag.entity';\n\n@Entity('blogs')\nexport class Blog {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n title: string;\n\n @Column('text')\n content: string;\n\n @Column('varchar', { nullable: true })\n coverImage: string | null;\n\n @Column('int')\n authorId: number;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @ManyToOne(() => User, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'authorId' })\n author: User;\n\n @ManyToOne(() => Category, (c) => c.blogs, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: Category | null;\n\n @ManyToOne(() => Seo, (s) => s.blogs, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @OneToMany(() => Comment, (c) => c.blog)\n comments: Comment[];\n\n @ManyToMany(() => Tag, (t) => t.blogs)\n @JoinTable({\n name: 'blog_tags',\n joinColumn: { name: 'blogId', referencedColumnName: 'id' },\n inverseJoinColumn: { name: 'tagId', referencedColumnName: 'id' },\n })\n tags: Tag[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport type { Blog } from './blog.entity';\n\n@Entity('categories')\nexport class Category {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany('Blog', 'category')\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { Blog } from './blog.entity';\n\n@Entity('seos')\nexport class Seo {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { nullable: true })\n title: string | null;\n\n @Column('varchar', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n keywords: string | null;\n\n @Column('varchar', { nullable: true })\n ogTitle: string | null;\n\n @Column('varchar', { nullable: true })\n ogDescription: string | null;\n\n @Column('varchar', { nullable: true })\n ogImage: string | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => Blog, (blog) => blog.seo)\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { User } from './user.entity';\nimport { Blog } from './blog.entity';\n\n@Entity('comments')\nexport class Comment {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('text')\n content: string;\n\n @Column('int')\n blogId: number;\n\n @Column('int')\n authorId: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => User, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'authorId' })\n author: User;\n\n @ManyToOne(() => Blog, (b) => b.comments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'blogId' })\n blog: Blog;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToMany } from 'typeorm';\nimport { Blog } from './blog.entity';\n\n@Entity('tags')\nexport class Tag {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n name: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToMany(() => Blog, (blog) => blog.tags)\n blogs: Blog[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { FormSubmission } from './form-submission.entity';\nimport { Address } from './address.entity';\nimport { Order } from './order.entity';\nimport { Payment } from './payment.entity';\nimport { ChatConversation } from './chat-conversation.entity';\n\n@Entity('contacts')\nexport class Contact {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n email: string;\n\n @Column('varchar', { nullable: true })\n phone: string | null;\n\n @Column('varchar', { nullable: true })\n type: string | null;\n\n @Column('varchar', { nullable: true })\n company: string | null;\n\n @Column('varchar', { nullable: true })\n taxId: string | null;\n\n @Column('text', { nullable: true })\n notes: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => FormSubmission, (fs) => fs.contact)\n form_submissions: FormSubmission[];\n\n @OneToMany(() => Address, (a) => a.contact)\n addresses: Address[];\n\n @OneToMany(() => Order, (o) => o.contact)\n orders: Order[];\n\n @OneToMany(() => Payment, (p) => p.contact)\n payments: Payment[];\n\n @OneToMany(() => ChatConversation, (c) => c.contact)\n chatConversations: ChatConversation[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Form } from './form.entity';\nimport { Contact } from './contact.entity';\n\n@Entity('form_submissions')\nexport class FormSubmission {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n formId: number;\n\n @Column('int', { nullable: true })\n contactId: number | null;\n\n @Column('jsonb')\n data: Record<string, unknown>;\n\n @Column('varchar', { nullable: true })\n ipAddress: string | null;\n\n @Column('varchar', { nullable: true })\n userAgent: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Form, (f) => f.submissions, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'formId' })\n form: Form;\n\n @ManyToOne(() => Contact, (c) => c.form_submissions, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { FormField } from './form-field.entity';\nimport { FormSubmission } from './form-submission.entity';\n\n@Entity('forms')\nexport class Form {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n campaign: string | null;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @OneToMany(() => FormField, (f) => f.form)\n fields: FormField[];\n\n @OneToMany(() => FormSubmission, (s) => s.form)\n submissions: FormSubmission[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Form } from './form.entity';\n\n@Entity('form_fields')\nexport class FormField {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n formId: number;\n\n @Column('varchar')\n label: string;\n\n @Column('varchar')\n type: string;\n\n @Column('varchar', { nullable: true })\n placeholder: string | null;\n\n @Column('varchar', { nullable: true })\n options: string | null;\n\n @Column('boolean', { default: false })\n required: boolean;\n\n @Column('varchar', { nullable: true })\n validation: string | null;\n\n @Column('int')\n order: number;\n\n @Column('int', { default: 1 })\n groupId: number;\n\n @Column('int', { default: 12 })\n columnWidth: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Form, (f) => f.fields, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'formId' })\n form: Form;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Contact } from './contact.entity';\n\n@Entity('addresses')\nexport class Address {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n contactId: number;\n\n @Column('varchar', { nullable: true })\n tag: string | null;\n\n @Column('varchar', { nullable: true })\n line1: string | null;\n\n @Column('varchar', { nullable: true })\n line2: string | null;\n\n @Column('varchar', { nullable: true })\n city: string | null;\n\n @Column('varchar', { nullable: true })\n state: string | null;\n\n @Column('varchar', { nullable: true })\n postalCode: string | null;\n\n @Column('varchar', { nullable: true })\n country: string | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Contact, (c) => c.addresses, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { Contact } from './contact.entity';\nimport { Address } from './address.entity';\nimport type { OrderItem } from './order-item.entity';\nimport type { Payment } from './payment.entity';\n\n@Entity('orders')\nexport class Order {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar', { unique: true })\n orderNumber: string;\n\n @Column('int')\n contactId: number;\n\n @Column('int', { nullable: true })\n billingAddressId: number | null;\n\n @Column('int', { nullable: true })\n shippingAddressId: number | null;\n\n @Column('varchar', { default: 'pending' })\n status: 'pending' | 'confirmed' | 'processing' | 'completed' | 'cancelled';\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n subtotal: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n tax: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n discount: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n total: number;\n\n @Column('varchar', { default: 'INR' })\n currency: string;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Contact, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact;\n\n @ManyToOne(() => Address, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'billingAddressId' })\n billingAddress: Address | null;\n\n @ManyToOne(() => Address, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'shippingAddressId' })\n shippingAddress: Address | null;\n\n @OneToMany('OrderItem', 'order')\n items: OrderItem[];\n\n @OneToMany('Payment', 'order')\n payments: Payment[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Order } from './order.entity';\nimport { Contact } from './contact.entity';\n\n@Entity('payments')\nexport class Payment {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n orderId: number;\n\n @Column('int', { nullable: true })\n contactId: number | null;\n\n @Column('decimal', { precision: 12, scale: 2 })\n amount: number;\n\n @Column('varchar', { default: 'INR' })\n currency: string;\n\n @Column('varchar', { default: 'pending' })\n status: 'pending' | 'processing' | 'completed' | 'failed' | 'refunded';\n\n @Column('varchar', { nullable: true })\n method: string | null;\n\n @Column('varchar', { nullable: true })\n externalReference: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', nullable: true })\n paidAt: Date | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => Order, (o) => o.payments, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'orderId' })\n order: Order;\n\n @ManyToOne(() => Contact, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { Contact } from './contact.entity';\nimport { ChatMessage } from './chat-message.entity';\n\n@Entity('chat_conversations')\nexport class ChatConversation {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n contactId: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Contact, (c) => c.chatConversations, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'contactId' })\n contact: Contact;\n\n @OneToMany(() => ChatMessage, (m) => m.conversation)\n messages: ChatMessage[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { ChatConversation } from './chat-conversation.entity';\n\n@Entity('chat_messages')\nexport class ChatMessage {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n conversationId: number;\n\n @Column('varchar')\n role: 'user' | 'assistant' | 'system';\n\n @Column('text')\n content: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @ManyToOne(() => ChatConversation, (c) => c.messages, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'conversationId' })\n conversation: ChatConversation;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, Unique } from 'typeorm';\n\n@Entity('configs')\n@Unique(['settings', 'key'])\nexport class Config {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n settings: string;\n\n @Column('varchar')\n key: string;\n\n @Column('varchar')\n value: string;\n\n @Column('varchar', { default: 'private' })\n type: 'public' | 'private';\n\n @Column('boolean', { default: false })\n encrypted: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('media')\nexport class Media {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n filename: string;\n\n @Column('varchar')\n url: string;\n\n @Column('varchar')\n mimeType: string;\n\n @Column('int', { default: 0 })\n size: number;\n\n @Column('varchar', { nullable: true })\n alt: string | null;\n\n @Column('boolean', { default: false })\n isPublic: boolean;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Seo } from './seo.entity';\n\n@Entity('pages')\nexport class Page {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n title: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column({ type: 'jsonb', default: {} })\n content: object;\n\n @Column('boolean', { default: false })\n published: boolean;\n\n @Column('varchar', { default: 'default' })\n theme: string;\n\n @Column('int', { nullable: true })\n parentId: number | null;\n\n @ManyToOne(() => Page, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'parentId' })\n parent: Page | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport type { Product } from './product.entity';\nimport type { Collection } from './collection.entity';\n\n@Entity('product_categories')\nexport class ProductCategory {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('int', { nullable: true })\n parentId: number | null;\n\n @Column('varchar', { nullable: true })\n image: string | null;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.children, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'parentId' })\n parent: ProductCategory | null;\n\n @OneToMany(() => ProductCategory, (c) => c.parent)\n children: ProductCategory[];\n\n @OneToMany('Product', 'category')\n products: Product[];\n\n @OneToMany('Collection', 'category')\n collections: Collection[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { ProductCategory } from './product-category.entity';\nimport { Brand } from './brand.entity';\nimport { Seo } from './seo.entity';\nimport type { Product } from './product.entity';\n\n@Entity('collections')\nexport class Collection {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('int', { nullable: true })\n brandId: number | null;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('varchar', { nullable: true })\n image: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.collections, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: ProductCategory | null;\n\n @ManyToOne(() => Brand, (b) => b.collections, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'brandId' })\n brand: Brand | null;\n\n @OneToMany('Product', 'collection')\n products: Product[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany, ManyToOne, JoinColumn } from 'typeorm';\nimport { Seo } from './seo.entity';\nimport type { Product } from './product.entity';\nimport type { Collection } from './collection.entity';\n\n@Entity('brands')\nexport class Brand {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('varchar', { nullable: true })\n logo: string | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @OneToMany('Product', 'brand')\n products: Product[];\n\n @OneToMany('Collection', 'brand')\n collections: Collection[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, OneToMany, JoinColumn } from 'typeorm';\nimport { Collection } from './collection.entity';\nimport { Brand } from './brand.entity';\nimport { ProductCategory } from './product-category.entity';\nimport { Seo } from './seo.entity';\nimport type { ProductAttribute } from './product-attribute.entity';\nimport type { ProductTax } from './product-tax.entity';\n\n@Entity('products')\nexport class Product {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int', { nullable: true })\n collectionId: number | null;\n\n @Column('int', { nullable: true })\n brandId: number | null;\n\n @Column('int', { nullable: true })\n categoryId: number | null;\n\n @Column('varchar', { nullable: true })\n sku: string | null;\n\n @Column('varchar', { unique: true, nullable: true })\n slug: string | null;\n\n @Column('varchar', { nullable: true })\n name: string | null;\n\n @Column('decimal', { precision: 12, scale: 2 })\n price: number;\n\n @Column('decimal', { precision: 12, scale: 2, nullable: true })\n compareAtPrice: number | null;\n\n @Column('int', { default: 0 })\n quantity: number;\n\n @Column('varchar', { default: 'draft' })\n status: 'draft' | 'available' | 'reserved' | 'sold';\n\n @Column('boolean', { default: false })\n featured: boolean;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n\n @Column('int', { nullable: true })\n seoId: number | null;\n\n @ManyToOne(() => Seo, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'seoId' })\n seo: Seo | null;\n\n @ManyToOne(() => Collection, (c) => c.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'collectionId' })\n collection: Collection | null;\n\n @ManyToOne(() => Brand, (b) => b.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'brandId' })\n brand: Brand | null;\n\n @ManyToOne(() => ProductCategory, (c) => c.products, { onDelete: 'SET NULL' })\n @JoinColumn({ name: 'categoryId' })\n category: ProductCategory | null;\n\n @OneToMany('ProductAttribute', 'product')\n attributes: ProductAttribute[];\n\n @OneToMany('ProductTax', 'product')\n taxes: ProductTax[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('attributes')\nexport class Attribute {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('varchar', { default: 'text' })\n type: 'text' | 'number' | 'select' | 'boolean';\n\n @Column('jsonb', { nullable: true })\n options: string[] | null;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('int', { default: 0 })\n sortOrder: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Product } from './product.entity';\nimport { Attribute } from './attribute.entity';\n\n@Entity('product_attributes')\nexport class ProductAttribute {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n productId: number;\n\n @Column('int')\n attributeId: number;\n\n @Column('varchar')\n value: string;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Product, (p) => p.attributes, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n\n @ManyToOne(() => Attribute, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'attributeId' })\n attribute: Attribute;\n}\n","import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';\n\n@Entity('taxes')\nexport class Tax {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { unique: true })\n slug: string;\n\n @Column('decimal', { precision: 5, scale: 2 })\n rate: number;\n\n @Column('boolean', { default: false })\n isDefault: boolean;\n\n @Column('text', { nullable: true })\n description: string | null;\n\n @Column('boolean', { default: true })\n active: boolean;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @Column({ type: 'timestamp', nullable: true })\n deletedAt: Date | null;\n\n @Column('boolean', { default: false })\n deleted: boolean;\n\n @Column('int', { nullable: true })\n createdBy: number | null;\n\n @Column('int', { nullable: true })\n updatedBy: number | null;\n\n @Column('int', { nullable: true })\n deletedBy: number | null;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Product } from './product.entity';\nimport { Tax } from './tax.entity';\n\n@Entity('product_taxes')\nexport class ProductTax {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n productId: number;\n\n @Column('int')\n taxId: number;\n\n @Column('decimal', { precision: 5, scale: 2, nullable: true })\n rate: number | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Product, (p) => p.taxes, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n\n @ManyToOne(() => Tax, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'taxId' })\n tax: Tax;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { Order } from './order.entity';\nimport { Product } from './product.entity';\n\n@Entity('order_items')\nexport class OrderItem {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n orderId: number;\n\n @Column('int')\n productId: number;\n\n @Column('int', { default: 1 })\n quantity: number;\n\n @Column('decimal', { precision: 12, scale: 2 })\n unitPrice: number;\n\n @Column('decimal', { precision: 12, scale: 2, default: 0 })\n tax: number;\n\n @Column('decimal', { precision: 12, scale: 2 })\n total: number;\n\n @Column('jsonb', { nullable: true })\n metadata: Record<string, unknown> | null;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @ManyToOne(() => Order, (o) => o.items, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'orderId' })\n order: Order;\n\n @ManyToOne(() => Product, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'productId' })\n product: Product;\n}\n","import { Entity, PrimaryGeneratedColumn, Column, OneToMany } from 'typeorm';\nimport { KnowledgeBaseChunk } from './knowledge-base-chunk.entity';\n\n@Entity('knowledge_base_documents')\nexport class KnowledgeBaseDocument {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('varchar')\n name: string;\n\n @Column('varchar', { nullable: true })\n sourceUrl: string | null;\n\n @Column('text')\n content: string;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n updatedAt: Date;\n\n @OneToMany(() => KnowledgeBaseChunk, (c) => c.document)\n chunks: KnowledgeBaseChunk[];\n}\n","import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm';\nimport { KnowledgeBaseDocument } from './knowledge-base-document.entity';\n\n@Entity('knowledge_base_chunks')\nexport class KnowledgeBaseChunk {\n @PrimaryGeneratedColumn()\n id: number;\n\n @Column('int')\n documentId: number;\n\n @Column('text')\n content: string;\n\n @Column('int', { default: 0 })\n chunkIndex: number;\n\n @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })\n createdAt: Date;\n\n @ManyToOne(() => KnowledgeBaseDocument, (d) => d.chunks, { onDelete: 'CASCADE' })\n @JoinColumn({ name: 'documentId' })\n document: KnowledgeBaseDocument;\n}\n","import type { EntityTarget } from 'typeorm';\nimport { User } from './user.entity';\nimport { PasswordResetToken } from './password-reset-token.entity';\nimport { UserGroup } from './user-group.entity';\nimport { Permission } from './permission.entity';\nimport { Blog } from './blog.entity';\nimport { Tag } from './tag.entity';\nimport { Category } from './category.entity';\nimport { Comment } from './comment.entity';\nimport { Contact } from './contact.entity';\nimport { Address } from './address.entity';\nimport { Form } from './form.entity';\nimport { FormField } from './form-field.entity';\nimport { FormSubmission } from './form-submission.entity';\nimport { Seo } from './seo.entity';\nimport { Config } from './config.entity';\nimport { Media } from './media.entity';\nimport { Page } from './page.entity';\nimport { ProductCategory } from './product-category.entity';\nimport { Collection } from './collection.entity';\nimport { Product } from './product.entity';\nimport { Attribute } from './attribute.entity';\nimport { ProductAttribute } from './product-attribute.entity';\nimport { Tax } from './tax.entity';\nimport { ProductTax } from './product-tax.entity';\nimport { Order } from './order.entity';\nimport { OrderItem } from './order-item.entity';\nimport { Payment } from './payment.entity';\nimport { Brand } from './brand.entity';\nimport { KnowledgeBaseDocument } from './knowledge-base-document.entity';\nimport { KnowledgeBaseChunk } from './knowledge-base-chunk.entity';\nimport { ChatConversation } from './chat-conversation.entity';\nimport { ChatMessage } from './chat-message.entity';\n\nexport {\n User,\n PasswordResetToken,\n UserGroup,\n Permission,\n Blog,\n Tag,\n Category,\n Comment,\n Contact,\n Form,\n FormField,\n FormSubmission,\n Seo,\n Config,\n Media,\n Page,\n ProductCategory,\n Collection,\n Product,\n Attribute,\n ProductAttribute,\n Tax,\n ProductTax,\n Order,\n OrderItem,\n Payment,\n Brand,\n KnowledgeBaseDocument,\n KnowledgeBaseChunk,\n ChatConversation,\n ChatMessage,\n};\n\n/** Map API resource segment (e.g. \"blogs\", \"form_submissions\") to entity. Used by CRUD handler. */\nexport const CMS_ENTITY_MAP: Record<string, EntityTarget<import('typeorm').ObjectLiteral>> = {\n users: User,\n password_reset_tokens: PasswordResetToken,\n user_groups: UserGroup,\n permissions: Permission,\n blogs: Blog,\n tags: Tag,\n categories: Category,\n comments: Comment,\n contacts: Contact,\n addresses: Address,\n forms: Form,\n form_fields: FormField,\n form_submissions: FormSubmission,\n seos: Seo,\n configs: Config,\n media: Media,\n pages: Page,\n product_categories: ProductCategory,\n collections: Collection,\n products: Product,\n attributes: Attribute,\n product_attributes: ProductAttribute,\n taxes: Tax,\n product_taxes: ProductTax,\n orders: Order,\n order_items: OrderItem,\n payments: Payment,\n brands: Brand,\n knowledge_base_documents: KnowledgeBaseDocument,\n knowledge_base_chunks: KnowledgeBaseChunk,\n chat_conversations: ChatConversation,\n chat_messages: ChatMessage,\n};\n","export interface SessionUser {\n id?: string;\n email?: string | null;\n name?: string | null;\n groupId?: number;\n permissions?: string[];\n}\n\nexport type GetSession = () => Promise<{ user?: SessionUser } | null>;\n\nexport const OPEN_ENDPOINTS: Array<Record<string, string[]>> = [\n { '/api/contacts': ['POST'] },\n { '/api/form-submissions': ['POST'] },\n { '/api/blogs': ['GET'] },\n];\n\nexport const PERMISSION_REQUIRED_ENDPOINTS: Record<string, string[]> = {};\n\nexport function isOpenEndpoint(pathname: string): boolean {\n return OPEN_ENDPOINTS.some((endpoint) => pathname.startsWith(Object.keys(endpoint)[0]));\n}\n\nexport function getRequiredPermission(pathname: string): string[] | null {\n return null;\n}\n\nexport function isPublicMethod(pathname: string, method: string): boolean {\n for (const endpoint of OPEN_ENDPOINTS) {\n const key = Object.keys(endpoint)[0];\n if (pathname.startsWith(key) && endpoint[key].includes(method)) return true;\n }\n return false;\n}\n\nexport interface AuthHelpers {\n requireAuth(req: Request): Promise<Response | null>;\n requirePermission(req: Request, permission: string): Promise<Response | null>;\n getAuthenticatedUser(): Promise<SessionUser | null>;\n}\n\nexport function createAuthHelpers(getSession: GetSession, NextResponse: { json: (body: unknown, init?: { status?: number }) => Response }): AuthHelpers {\n return {\n async requireAuth() {\n const session = await getSession();\n if (!session?.user?.email) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n }\n return null;\n },\n async requirePermission() {\n const session = await getSession();\n if (!session?.user?.email) {\n return NextResponse.json({ error: 'Unauthorized' }, { status: 401 });\n }\n return null;\n },\n async getAuthenticatedUser() {\n const session = await getSession();\n return session?.user ?? null;\n },\n };\n}\n","export interface CmsMiddlewareConfig {\n publicAdminPaths?: string[];\n publicApiPaths?: string[];\n /** path -> allowed methods */\n publicApiMethods?: Record<string, string[]>;\n signInPath?: string;\n getSessionToken?: (request: { cookies: { get: (name: string) => { value?: string } | undefined } }) => string | undefined;\n}\n\n/** Default public API paths (no auth). Sites should extend this with their own routes. */\nexport const defaultPublicApiMethods: Record<string, string[]> = {\n '/api/contacts': ['POST'],\n '/api/form-submissions': ['POST'],\n '/api/blogs': ['GET'],\n '/api/forms': ['GET'],\n '/api/auth': ['GET', 'POST'],\n '/api/health': ['GET'],\n '/api/users/forgot-password': ['POST'],\n '/api/users/set-password': ['POST'],\n '/api/users/invite': ['POST'],\n};\n\nfunction defaultGetSessionToken(request: { cookies: { get: (name: string) => { value?: string } | undefined } }): string | undefined {\n return (\n request.cookies.get('__Secure-next-auth.session-token')?.value ??\n request.cookies.get('next-auth.session-token')?.value\n );\n}\n\nfunction isPublicMethod(pathname: string, method: string, publicApiMethods: Record<string, string[]>): boolean {\n for (const [endpoint, methods] of Object.entries(publicApiMethods)) {\n if (pathname.startsWith(endpoint) && methods.includes(method)) return true;\n }\n return false;\n}\n\n/**\n * Returns middleware logic. Use from Next.js middleware:\n * import { createCmsMiddleware } from '@infuro/cms-core';\n * export const middleware = createCmsMiddleware({ ... });\n * export const config = { matcher: ['/admin/:path*', '/api/:path*'] };\n */\nexport function createCmsMiddleware(config: CmsMiddlewareConfig = {}) {\n const {\n publicAdminPaths = ['/admin/signin', '/admin/forgot-password', '/admin/reset-password', '/admin/invite'],\n publicApiMethods = defaultPublicApiMethods,\n signInPath = '/admin/signin',\n getSessionToken = defaultGetSessionToken,\n } = config;\n\n return function cmsMiddleware(request: {\n nextUrl: { pathname: string };\n url: string;\n method: string;\n cookies: { get: (name: string) => { value?: string } | undefined };\n }): { type: 'next' } | { type: 'redirect'; url: string } | { type: 'json'; status: number; body: unknown } {\n const pathname = request.nextUrl.pathname;\n const method = request.method;\n\n if (publicAdminPaths.some((p) => pathname === p || pathname.startsWith(p + '/'))) {\n return { type: 'next' };\n }\n\n if (pathname.startsWith('/admin')) {\n const token = getSessionToken(request);\n if (!token) {\n return { type: 'redirect', url: new URL(signInPath, request.url).toString() };\n }\n }\n\n if (pathname.startsWith('/api')) {\n if (isPublicMethod(pathname, method, publicApiMethods)) {\n return { type: 'next' };\n }\n const token = getSessionToken(request);\n if (!token) {\n return { type: 'json', status: 401, body: { error: 'Unauthorized' } };\n }\n }\n\n return { type: 'next' };\n };\n}\n","/**\n * Build NextAuth options for credentials auth. App can extend/override via extend().\n */\nimport type { NextAuthOptions } from 'next-auth';\nimport _CredentialsProvider from 'next-auth/providers/credentials';\nconst CredentialsProvider = (_CredentialsProvider as unknown as { default: typeof _CredentialsProvider }).default ?? _CredentialsProvider;\n\nexport interface NextAuthUser {\n id: number;\n email: string;\n name: string | null;\n password: string | null;\n blocked?: boolean;\n deleted?: boolean;\n groupId?: number | null;\n group?: { permissions?: unknown[] };\n}\n\nexport interface NextAuthOptionsConfig {\n /** Resolve user by email (e.g. from TypeORM). Return null if not found. */\n getUserByEmail: (email: string) => Promise<NextAuthUser | null>;\n comparePassword: (plain: string, hash: string) => Promise<boolean>;\n signInPage?: string;\n secret?: string;\n extend?: (options: NextAuthOptions) => NextAuthOptions;\n}\n\nexport function getNextAuthOptions(config: NextAuthOptionsConfig): NextAuthOptions {\n const { getUserByEmail, comparePassword, signInPage = '/admin/signin', secret, extend } = config;\n\n const options: NextAuthOptions = {\n secret: secret ?? process.env.NEXTAUTH_SECRET,\n providers: [\n CredentialsProvider({\n name: 'credentials',\n credentials: {\n email: { label: 'Email', type: 'email' },\n password: { label: 'Password', type: 'password' },\n },\n async authorize(credentials) {\n if (!credentials?.email || !credentials?.password) return null;\n try {\n const user = await getUserByEmail(credentials.email);\n if (!user || user.blocked || (user as { deleted?: boolean }).deleted || !user.password) return null;\n const valid = await comparePassword(credentials.password, user.password);\n if (!valid) return null;\n return {\n id: user.id.toString(),\n email: user.email,\n name: user.name,\n groupId: user.groupId ?? undefined,\n permissions: ['admin'],\n };\n } catch {\n return null;\n }\n },\n }),\n ],\n session: { strategy: 'jwt' },\n pages: { signIn: signInPage },\n cookies: {\n sessionToken: {\n name: process.env.NEXTAUTH_URL?.startsWith('https')\n ? '__Secure-next-auth.session-token'\n : 'next-auth.session-token',\n options: {\n httpOnly: true,\n sameSite: 'lax',\n path: '/',\n secure: process.env.NEXTAUTH_URL?.startsWith('https') ?? false,\n },\n },\n },\n callbacks: {\n async jwt({ token, user }) {\n if (user) {\n (token as Record<string, unknown>).id = user.id;\n (token as Record<string, unknown>).groupId = (user as { groupId?: number }).groupId;\n (token as Record<string, unknown>).permissions = (user as { permissions?: string[] }).permissions;\n }\n return token;\n },\n async session({ session, token }) {\n if (session.user) {\n (session.user as Record<string, unknown>).id = (token as Record<string, unknown>).id;\n (session.user as Record<string, unknown>).groupId = (token as Record<string, unknown>).groupId;\n (session.user as Record<string, unknown>).permissions = (token as Record<string, unknown>).permissions;\n }\n return session;\n },\n },\n };\n\n return extend ? extend(options) : options;\n}\n","import type { DataSource } from 'typeorm';\nimport { ILike, Like, MoreThan } from 'typeorm';\nimport type { Repository } from 'typeorm';\n\nexport type EntityMap = Record<string, import('typeorm').EntityTarget<import('typeorm').ObjectLiteral>>;\n\nexport interface CrudHandlerOptions {\n requireAuth: (req: Request) => Promise<Response | null>;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nconst DATE_COLUMN_TYPES = new Set([\n 'date', 'datetime', 'datetime2', 'timestamp', 'timestamptz', 'timetz', 'smalldatetime', 'timestamp with time zone', 'timestamp without time zone',\n]);\n\nconst TIMESTAMP_PROP_NAMES = new Set(['createdAt', 'updatedAt', 'deletedAt']);\n\nfunction isInvalidDateValue(v: unknown): boolean {\n if (v === '' || v == null) return true;\n if (typeof v === 'string') return isNaN(Date.parse(v)) || /NaN|Invalid/i.test(v);\n if (v instanceof Date) return isNaN(v.getTime());\n return false;\n}\n\n/** Strip empty/invalid values for boolean, number, and date columns so DB defaults apply. */\nfunction sanitizeBodyForEntity(repo: Repository<import('typeorm').ObjectLiteral>, body: Record<string, unknown>): void {\n const meta = repo.metadata;\n for (const col of meta.columns) {\n if (!(col.propertyName in body)) continue;\n const v = body[col.propertyName];\n const t = typeof col.type === 'string' ? col.type : (col.type as Function)?.name ?? '';\n const isBoolean = t === 'boolean' || t === 'bool' || col.type === Boolean;\n const isNumber = ['int', 'integer', 'int2', 'int4', 'int8', 'smallint', 'bigint', 'number', 'Number'].includes(t) || col.type === Number;\n const isDate = DATE_COLUMN_TYPES.has(t) || col.type === Date || TIMESTAMP_PROP_NAMES.has(col.propertyName);\n if (v === '' && (isBoolean || isNumber)) {\n delete body[col.propertyName];\n } else if (isDate && isInvalidDateValue(v)) {\n delete body[col.propertyName];\n }\n }\n}\n\nexport function createCrudHandler(\n dataSource: DataSource,\n entityMap: EntityMap,\n options: CrudHandlerOptions\n) {\n const { requireAuth, json } = options;\n\n return {\n async GET(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const { searchParams } = new URL(req.url);\n const page = Number(searchParams.get('page')) || 1;\n const limit = Math.min(Number(searchParams.get('limit')) || 10, 100);\n const skip = (page - 1) * limit;\n const sortFieldRaw = searchParams.get('sortField') || 'createdAt';\n const sortOrder = searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const search = searchParams.get('search');\n\n // Orders list: include contact + itemsSummary; search (order# + customer), status, date, paymentRef\n if (resource === 'orders') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'orderNumber', 'contactId', 'status', 'total', 'currency', 'createdAt', 'updatedAt'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderOrders = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const statusFilter = searchParams.get('status')?.trim();\n const dateFrom = searchParams.get('dateFrom')?.trim();\n const dateTo = searchParams.get('dateTo')?.trim();\n const paymentRef = searchParams.get('paymentRef')?.trim();\n\n let orderIdsFromPayment: number[] | null = null;\n if (paymentRef && entityMap['payments']) {\n const paymentRepo = dataSource.getRepository(entityMap['payments']);\n const payments = await paymentRepo\n .createQueryBuilder('p')\n .select('p.orderId')\n .where('p.externalReference = :ref', { ref: paymentRef })\n .orWhere(\"p.metadata->>'razorpayPaymentId' = :ref\", { ref: paymentRef })\n .getRawMany<{ orderId: number }>();\n orderIdsFromPayment = payments.map((r) => r.orderId);\n if (orderIdsFromPayment.length === 0) {\n return json({ total: 0, page, limit, totalPages: 0, data: [] });\n }\n }\n\n const qb = repo\n .createQueryBuilder('order')\n .leftJoinAndSelect('order.contact', 'contact')\n .leftJoinAndSelect('order.items', 'items')\n .leftJoinAndSelect('items.product', 'product')\n .leftJoinAndSelect('product.collection', 'collection')\n .orderBy(`order.${sortField}`, sortOrderOrders)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere(\n '(order.orderNumber ILIKE :term OR contact.name ILIKE :term OR contact.email ILIKE :term)',\n { term }\n );\n }\n if (statusFilter) qb.andWhere('order.status = :status', { status: statusFilter });\n if (dateFrom) qb.andWhere('order.createdAt >= :dateFrom', { dateFrom: new Date(dateFrom + 'T00:00:00.000Z') });\n if (dateTo) qb.andWhere('order.createdAt <= :dateTo', { dateTo: new Date(dateTo + 'T23:59:59.999Z') });\n if (orderIdsFromPayment && orderIdsFromPayment.length) qb.andWhere('order.id IN (:...orderIds)', { orderIds: orderIdsFromPayment });\n\n const [rows, total] = await qb.getManyAndCount();\n const data = (rows as Record<string, unknown>[]).map((order: Record<string, unknown>) => {\n const contact = order.contact as Record<string, unknown> | undefined;\n const items = (order.items as Array<{ product?: { name?: string; collection?: { name?: string } }; quantity: number }>) ?? [];\n const itemsSummary = items\n .map((i) => {\n const label = i.product?.collection?.name ?? i.product?.name ?? 'Product';\n return `${label} × ${i.quantity}`;\n })\n .join(', ') || '—';\n return {\n ...order,\n contact: contact ? { id: contact.id, name: contact.name, email: contact.email, phone: contact.phone } : null,\n itemsSummary,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Payments list: include order + contact; search (customer), status, date, method, orderNumber\n if (resource === 'payments') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'orderId', 'amount', 'currency', 'status', 'method', 'paidAt', 'createdAt', 'updatedAt'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderPayments = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const statusFilter = searchParams.get('status')?.trim();\n const dateFrom = searchParams.get('dateFrom')?.trim();\n const dateTo = searchParams.get('dateTo')?.trim();\n const methodFilter = searchParams.get('method')?.trim();\n const orderNumberParam = searchParams.get('orderNumber')?.trim();\n\n const qb = repo\n .createQueryBuilder('payment')\n .leftJoinAndSelect('payment.order', 'ord')\n .leftJoinAndSelect('ord.contact', 'orderContact')\n .leftJoinAndSelect('payment.contact', 'contact')\n .orderBy(`payment.${sortField}`, sortOrderPayments)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere(\n '(orderContact.name ILIKE :term OR orderContact.email ILIKE :term OR contact.name ILIKE :term OR contact.email ILIKE :term)',\n { term }\n );\n }\n if (statusFilter) qb.andWhere('payment.status = :status', { status: statusFilter });\n if (dateFrom) qb.andWhere('payment.createdAt >= :dateFrom', { dateFrom: new Date(dateFrom + 'T00:00:00.000Z') });\n if (dateTo) qb.andWhere('payment.createdAt <= :dateTo', { dateTo: new Date(dateTo + 'T23:59:59.999Z') });\n if (methodFilter) qb.andWhere('payment.method = :method', { method: methodFilter });\n if (orderNumberParam) qb.andWhere('ord.orderNumber ILIKE :orderNumber', { orderNumber: `%${orderNumberParam}%` });\n\n const [rows, total] = await qb.getManyAndCount();\n const data = (rows as Record<string, unknown>[]).map((payment: Record<string, unknown>) => {\n const order = payment.order as Record<string, unknown> | undefined;\n const orderContact = order?.contact as Record<string, unknown> | undefined;\n const contact = payment.contact as Record<string, unknown> | undefined;\n const customer = orderContact ?? contact;\n return {\n ...payment,\n order: order ? { id: order.id, orderNumber: order.orderNumber, contact: orderContact ? { name: orderContact.name, email: orderContact.email } : null } : null,\n contact: customer ? { id: customer.id, name: customer.name, email: customer.email } : null,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Products list: status and inventory filters\n if (resource === 'products') {\n const repo = dataSource.getRepository(entity);\n const statusFilter = searchParams.get('status')?.trim();\n const inventory = searchParams.get('inventory')?.trim();\n const productWhere: Record<string, unknown> = {};\n if (statusFilter) productWhere.status = statusFilter;\n if (inventory === 'in_stock') productWhere.quantity = MoreThan(0);\n if (inventory === 'out_of_stock') productWhere.quantity = 0;\n if (search && typeof search === 'string' && search.trim()) {\n productWhere.name = ILike(`%${search.trim()}%`);\n }\n const [data, total] = await repo.findAndCount({\n where: Object.keys(productWhere).length ? productWhere : undefined,\n skip,\n take: limit,\n order: { [sortFieldRaw]: sortOrder },\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n // Contacts list: filters (type, orderId), optional includeSummary (orderCount, totalPaid)\n if (resource === 'contacts') {\n const repo = dataSource.getRepository(entity);\n const allowedSort = ['id', 'name', 'email', 'createdAt', 'type'];\n const sortField = allowedSort.includes(sortFieldRaw) ? sortFieldRaw : 'createdAt';\n const sortOrderContacts = searchParams.get('sortOrder') === 'asc' ? 'ASC' : 'DESC';\n const typeFilter = searchParams.get('type')?.trim();\n const orderIdParam = searchParams.get('orderId')?.trim();\n const includeSummary = searchParams.get('includeSummary') === '1';\n\n const qb = repo\n .createQueryBuilder('contact')\n .orderBy(`contact.${sortField}`, sortOrderContacts)\n .skip(skip)\n .take(limit);\n\n if (search && typeof search === 'string' && search.trim()) {\n const term = `%${search.trim()}%`;\n qb.andWhere('(contact.name ILIKE :term OR contact.email ILIKE :term OR contact.phone ILIKE :term)', { term });\n }\n if (typeFilter) qb.andWhere('contact.type = :type', { type: typeFilter });\n if (orderIdParam) {\n const orderId = Number(orderIdParam);\n if (!Number.isNaN(orderId)) {\n qb.andWhere('contact.id IN (SELECT \"contactId\" FROM orders WHERE id = :orderId)', { orderId });\n }\n }\n\n if (includeSummary && entityMap['orders'] && entityMap['payments']) {\n qb.loadRelationCountAndMap('contact._orderCount', 'contact.orders');\n const [rows, total] = await qb.getManyAndCount();\n const contactIds = (rows as { id: number }[]).map((c) => c.id);\n const paymentRepo = dataSource.getRepository(entityMap['payments']);\n const paidByContact = await paymentRepo\n .createQueryBuilder('p')\n .select('p.contactId', 'contactId')\n .addSelect('COALESCE(SUM(CAST(p.amount AS DECIMAL)), 0)', 'total')\n .where('p.contactId IN (:...ids)', { ids: contactIds.length ? contactIds : [0] })\n .andWhere('p.status = :status', { status: 'completed' })\n .groupBy('p.contactId')\n .getRawMany<{ contactId: number; total: string }>();\n const totalPaidMap = new Map<number, number>(paidByContact.map((r) => [r.contactId, Number(r.total)]));\n const data = (rows as Record<string, unknown>[]).map((c) => {\n const { _orderCount, ...rest } = c as { _orderCount?: number; id: number };\n return {\n ...rest,\n orderCount: _orderCount ?? 0,\n totalPaid: totalPaidMap.get((rest as { id: number }).id) ?? 0,\n };\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n const [data, total] = await qb.getManyAndCount();\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n }\n\n const repo = dataSource.getRepository(entity);\n const typeFilter = searchParams.get('type');\n let where: Record<string, unknown>[] | Record<string, unknown> = {};\n if (resource === 'media') {\n const mediaWhere: Record<string, unknown> = {};\n if (search) mediaWhere.filename = ILike(`%${search}%`);\n if (typeFilter) mediaWhere.mimeType = Like(`${typeFilter}/%`);\n where = Object.keys(mediaWhere).length > 0 ? mediaWhere : {};\n } else if (search) {\n where = [{ name: ILike(`%${search}%`) }, { title: ILike(`%${search}%`) }];\n }\n const [data, total] = await repo.findAndCount({\n skip,\n take: limit,\n order: { [sortFieldRaw]: sortOrder },\n where,\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n },\n\n async POST(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const body = await req.json();\n if (!body || typeof body !== 'object' || Object.keys(body).length === 0) {\n return json({ error: 'Invalid request payload' }, { status: 400 });\n }\n const repo = dataSource.getRepository(entity);\n sanitizeBodyForEntity(repo, body as Record<string, unknown>);\n const created = await repo.save(repo.create(body as object));\n return json(created, { status: 201 });\n },\n\n async GET_METADATA(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const repo = dataSource.getRepository(entity);\n const meta = repo.metadata;\n\n // Collect unique column names from indices\n const uniqueFromIndices = new Set<string>();\n for (const idx of meta.indices) {\n if (idx.isUnique && idx.columns.length === 1) {\n uniqueFromIndices.add(idx.columns[0].propertyName);\n }\n }\n for (const uniq of meta.uniques) {\n if (uniq.columns.length === 1) {\n uniqueFromIndices.add(uniq.columns[0].propertyName);\n }\n }\n\n const columns = meta.columns.map((col) => ({\n name: col.propertyName,\n type: typeof col.type === 'string' ? col.type : (col.type as { name?: string })?.name ?? 'unknown',\n nullable: col.isNullable,\n isUnique: uniqueFromIndices.has(col.propertyName),\n isPrimary: col.isPrimary,\n default: col.default,\n }));\n\n const uniqueColumns = [...uniqueFromIndices];\n\n return json({ columns, uniqueColumns });\n },\n\n async BULK_POST(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n const body = await req.json();\n const { records, upsertKey = 'id' } = body as { records: object[]; upsertKey?: string };\n\n if (!Array.isArray(records) || records.length === 0) {\n return json({ error: 'Records array is required' }, { status: 400 });\n }\n\n const repo = dataSource.getRepository(entity);\n\n // Sanitize each record\n for (const record of records) {\n sanitizeBodyForEntity(repo, record as Record<string, unknown>);\n }\n\n try {\n const result = await repo.upsert(records, {\n conflictPaths: [upsertKey],\n skipUpdateIfNoValuesChanged: true,\n });\n return json({\n success: true,\n imported: result.identifiers.length,\n identifiers: result.identifiers,\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Bulk import failed';\n return json({ error: message }, { status: 400 });\n }\n },\n\n async GET_EXPORT(req: Request, resource: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!resource || !entity) {\n return json({ error: 'Invalid resource' }, { status: 400 });\n }\n\n const { searchParams } = new URL(req.url);\n const format = searchParams.get('format') || 'csv';\n\n const repo = dataSource.getRepository(entity);\n const meta = repo.metadata;\n\n // Check if entity has 'deleted' column\n const hasDeleted = meta.columns.some((c) => c.propertyName === 'deleted');\n const where = hasDeleted ? { deleted: false } : {};\n\n const data = await repo.find({ where });\n\n // Get exportable columns (exclude soft-delete related)\n const excludeCols = new Set(['deletedAt', 'deletedBy', 'deleted']);\n const columns = meta.columns\n .filter((c) => !excludeCols.has(c.propertyName))\n .map((c) => c.propertyName);\n\n if (format === 'json') {\n return json(data);\n }\n\n // CSV format\n const escapeCSV = (val: unknown): string => {\n if (val === null || val === undefined) return '';\n const str = typeof val === 'object' ? JSON.stringify(val) : String(val);\n if (str.includes(',') || str.includes('\"') || str.includes('\\n')) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n const header = columns.join(',');\n const rows = data.map((row) =>\n columns.map((col) => escapeCSV((row as Record<string, unknown>)[col])).join(',')\n );\n const csv = [header, ...rows].join('\\n');\n\n return new Response(csv, {\n headers: {\n 'Content-Type': 'text/csv; charset=utf-8',\n 'Content-Disposition': `attachment; filename=\"${resource}.csv\"`,\n },\n });\n },\n };\n}\n\nexport function createCrudByIdHandler(\n dataSource: DataSource,\n entityMap: EntityMap,\n options: CrudHandlerOptions\n) {\n const { requireAuth, json } = options;\n\n return {\n async GET(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const repo = dataSource.getRepository(entity);\n\n if (resource === 'orders') {\n const order = await repo.findOne({\n where: { id: Number(id) },\n relations: ['contact', 'billingAddress', 'shippingAddress', 'items', 'items.product', 'items.product.collection', 'payments'],\n });\n if (!order) return json({ message: 'Not found' }, { status: 404 });\n return json(order);\n }\n\n if (resource === 'contacts') {\n const contact = await repo.findOne({\n where: { id: Number(id) },\n relations: ['form_submissions', 'form_submissions.form', 'orders', 'payments', 'addresses'],\n });\n if (!contact) return json({ message: 'Not found' }, { status: 404 });\n const orders = (contact as { orders?: { total?: unknown; createdAt?: string }[] }).orders ?? [];\n const payments = (contact as { payments?: { status: string; amount?: number }[] }).payments ?? [];\n const totalPaid = payments\n .filter((p) => p.status === 'completed')\n .reduce((sum, p) => sum + Number(p.amount ?? 0), 0);\n const lastOrderAt =\n orders.length > 0\n ? orders.reduce((latest, o) => {\n const t = o.createdAt ? new Date(o.createdAt).getTime() : 0;\n return t > latest ? t : latest;\n }, 0)\n : null;\n return json({\n ...contact,\n summary: {\n totalOrders: orders.length,\n totalPaid,\n lastOrderAt: lastOrderAt ? new Date(lastOrderAt).toISOString() : null,\n },\n });\n }\n\n if (resource === 'payments') {\n const payment = await repo.findOne({\n where: { id: Number(id) },\n relations: ['order', 'order.contact', 'contact'],\n });\n if (!payment) return json({ message: 'Not found' }, { status: 404 });\n return json(payment);\n }\n\n const item = await repo.findOne({ where: { id: Number(id) } });\n return item ? json(item) : json({ message: 'Not found' }, { status: 404 });\n },\n\n async PUT(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const body = await req.json();\n const repo = dataSource.getRepository(entity);\n if (body && typeof body === 'object') sanitizeBodyForEntity(repo, body as Record<string, unknown>);\n await repo.update(Number(id), body as object);\n const updated = await repo.findOne({ where: { id: Number(id) } });\n return updated ? json(updated) : json({ message: 'Not found' }, { status: 404 });\n },\n\n async DELETE(req: Request, resource: string, id: string) {\n const authError = await requireAuth(req);\n if (authError) return authError;\n const entity = entityMap[resource];\n if (!entity) return json({ error: 'Invalid resource' }, { status: 400 });\n const repo = dataSource.getRepository(entity);\n const result = await repo.delete(Number(id));\n if (result.affected === 0) return json({ message: 'Not found' }, { status: 404 });\n return json({ message: 'Deleted successfully' }, { status: 200 });\n },\n };\n}\n","/**\n * Auth API handler factories. Inject dataSource + entityMap, sendEmail, hash/compare; optional hooks to customize.\n */\nimport type { DataSource } from 'typeorm';\nimport type { EntityMap } from './crud';\n\nexport interface AuthHandlersConfig {\n json: (body: unknown, init?: { status?: number }) => Response;\n baseUrl: string;\n hashPassword: (plain: string) => Promise<string>;\n comparePassword: (plain: string, hash: string) => Promise<boolean>;\n}\n\nexport interface ForgotPasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n sendEmail?: (opts: { to: string; subject: string; html: string; text?: string }) => Promise<void>;\n resetExpiryHours?: number;\n afterCreateToken?: (email: string, resetLink: string) => Promise<void>;\n}\n\nexport function createForgotPasswordHandler(config: ForgotPasswordConfig) {\n const { dataSource, entityMap, json, baseUrl, sendEmail, resetExpiryHours = 1, afterCreateToken } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { email?: string };\n const email = typeof body?.email === 'string' ? body.email.trim().toLowerCase() : '';\n if (!email) return json({ error: 'Email is required' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email }, select: ['email'] });\n const msg = 'If an account exists with this email, you will receive a reset link shortly.';\n if (!user) return json({ message: msg }, { status: 200 });\n\n const crypto = await import('crypto');\n const token = crypto.randomBytes(32).toString('hex');\n const expiresAt = new Date(Date.now() + (resetExpiryHours * 60 * 60 * 1000));\n const tokenRepo = dataSource.getRepository(entityMap.password_reset_tokens);\n await tokenRepo.save(tokenRepo.create({ email: user.email, token, expiresAt }));\n const resetLink = `${baseUrl}/admin/reset-password?token=${token}`;\n\n if (sendEmail) await sendEmail({ to: user.email, subject: 'Password reset', html: `<a href=\"${resetLink}\">Reset password</a>`, text: resetLink });\n if (afterCreateToken) await afterCreateToken(user.email, resetLink);\n return json({ message: msg }, { status: 200 });\n } catch (err) {\n return json({ error: 'Something went wrong. Please try again.' }, { status: 500 });\n }\n };\n}\n\nexport interface SetPasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n minPasswordLength?: number;\n beforeUpdate?: (email: string, userId: number) => Promise<void>;\n}\n\nexport function createSetPasswordHandler(config: SetPasswordConfig) {\n const { dataSource, entityMap, json, hashPassword, minPasswordLength = 6, beforeUpdate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { token?: string; newPassword?: string };\n const { token, newPassword } = body;\n if (!token || !newPassword) return json({ error: 'Token and new password are required' }, { status: 400 });\n if (newPassword.length < minPasswordLength) return json({ error: 'Password must be at least 6 characters' }, { status: 400 });\n\n const tokenRepo = dataSource.getRepository(entityMap.password_reset_tokens);\n const record = await tokenRepo.findOne({ where: { token } });\n if (!record || record.expiresAt < new Date()) return json({ error: 'Invalid or expired reset link. Please request a new one.' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email: record.email }, select: ['id'] });\n if (!user) return json({ error: 'User not found' }, { status: 400 });\n\n if (beforeUpdate) await beforeUpdate(record.email, user.id);\n const hashedPassword = await hashPassword(newPassword);\n await userRepo.update(user.id, { password: hashedPassword, updatedAt: new Date() });\n await tokenRepo.delete({ email: record.email });\n return json({ message: 'Password updated successfully. You can now sign in.' });\n } catch {\n return json({ error: 'Something went wrong. Please try again.' }, { status: 500 });\n }\n };\n}\n\nexport interface InviteAcceptConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n beforeActivate?: (email: string, userId: number) => Promise<void>;\n}\n\n/** Decode invite token (base64 email) and set password + unblock user */\nexport function createInviteAcceptHandler(config: InviteAcceptConfig) {\n const { dataSource, entityMap, json, hashPassword, beforeActivate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const body = await request.json().catch(() => ({})) as { token?: string; password?: string };\n const { token, password } = body;\n if (!token || !password) return json({ error: 'Missing required fields: token, password' }, { status: 400 });\n\n let email: string;\n try {\n email = Buffer.from(token, 'base64').toString('utf8');\n } catch {\n return json({ error: 'Invalid or expired invite token' }, { status: 400 });\n }\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email }, select: ['id', 'blocked'] });\n if (!user) return json({ error: 'User not found' }, { status: 400 });\n if (!user.blocked) return json({ error: 'User is already active' }, { status: 400 });\n\n if (beforeActivate) await beforeActivate(email, user.id);\n const hashedPassword = await hashPassword(password);\n await userRepo.update(user.id, { password: hashedPassword, blocked: false });\n return json({ message: 'User account activated successfully' }, { status: 200 });\n } catch (err) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface ChangePasswordConfig extends AuthHandlersConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n getSession: () => Promise<{ user?: { email?: string | null } } | null>;\n minPasswordLength?: number;\n beforeUpdate?: (email: string) => Promise<void>;\n}\n\nexport function createChangePasswordHandler(config: ChangePasswordConfig) {\n const { dataSource, entityMap, json, comparePassword, hashPassword, getSession, minPasswordLength = 6, beforeUpdate } = config;\n return async function POST(request: Request): Promise<Response> {\n try {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n\n const body = await request.json().catch(() => ({})) as { currentPassword?: string; newPassword?: string };\n const { currentPassword, newPassword } = body;\n if (!currentPassword || !newPassword) return json({ error: 'Current password and new password are required' }, { status: 400 });\n if (newPassword.length < minPasswordLength) return json({ error: 'New password must be at least 6 characters long' }, { status: 400 });\n\n const userRepo = dataSource.getRepository(entityMap.users);\n const user = await userRepo.findOne({ where: { email: session.user.email }, select: ['password'] });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n if (!user.password) return json({ error: 'Current password is incorrect' }, { status: 400 });\n const valid = await comparePassword(currentPassword, user.password);\n if (!valid) return json({ error: 'Current password is incorrect' }, { status: 400 });\n\n if (beforeUpdate) await beforeUpdate(session.user.email);\n const hashedPassword = await hashPassword(newPassword);\n await userRepo.update({ email: session.user.email }, { password: hashedPassword, updatedAt: new Date() });\n return json({ message: 'Password updated successfully' });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface UserAuthApiConfig\n extends ForgotPasswordConfig,\n Omit<SetPasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>,\n Omit<InviteAcceptConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword'>,\n Omit<ChangePasswordConfig, 'dataSource' | 'entityMap' | 'json' | 'baseUrl' | 'hashPassword' | 'comparePassword' | 'beforeUpdate' | 'getSession'> {\n getSession?: () => Promise<{ user?: { email?: string | null } } | null>;\n beforeChangePasswordUpdate?: (email: string) => Promise<void>;\n}\n\nconst USER_AUTH_PATHS = ['forgot-password', 'invite', 'set-password', 'reset-password'] as const;\n\n/**\n * Single router for all user-auth APIs. Mount in the app once.\n * Use when you have no users/[id] route (else Next.js gives [id] precedence and \"forgot-password\" would match as id).\n * Path is the segment after the mount (e.g. \"forgot-password\"). Returns 404 for unknown paths.\n */\nexport function createUserAuthApiRouter(config: UserAuthApiConfig) {\n const forgot = createForgotPasswordHandler(config);\n const setPass = createSetPasswordHandler(config);\n const invite = createInviteAcceptHandler(config);\n const changePass = config.getSession\n ? createChangePasswordHandler({\n ...config,\n getSession: config.getSession,\n beforeUpdate: config.beforeChangePasswordUpdate,\n })\n : null;\n\n return {\n async POST(req: Request, pathname: string): Promise<Response> {\n const path = pathname.replace(/\\/$/, '');\n if (!USER_AUTH_PATHS.includes(path as (typeof USER_AUTH_PATHS)[number])) {\n return config.json({ error: 'Not found' }, { status: 404 });\n }\n if (path === 'forgot-password') return forgot(req);\n if (path === 'set-password') return setPass(req);\n if (path === 'invite') return invite(req);\n if (path === 'reset-password' && changePass) return changePass(req);\n return config.json({ error: 'Not found' }, { status: 404 });\n },\n };\n}\n","/**\n * CMS API handlers: dashboard, analytics, upload, blog/form by slug, users (list/create/get/update/delete/regenerate-invite/avatar/profile).\n * All accept injectable deps; upload supports S3 or local.\n */\nimport type { DataSource } from 'typeorm';\nimport { MoreThanOrEqual, ILike } from 'typeorm';\nimport type { EntityMap } from './crud';\n\nexport interface CmsHandlersBase {\n json: (body: unknown, init?: { status?: number }) => Response;\n requireAuth: (req: Request) => Promise<Response | null>;\n}\n\nexport interface DashboardStatsConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n requirePermission?: (req: Request, permission: string) => Promise<Response | null>;\n}\n\nexport function createDashboardStatsHandler(config: DashboardStatsConfig) {\n const { dataSource, entityMap, json, requireAuth, requirePermission } = config;\n return async function GET(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n if (requirePermission) {\n const permErr = await requirePermission(req, 'view_dashboard');\n if (permErr) return permErr;\n }\n try {\n const sevenDaysAgo = new Date(Date.now() - 7 * 24 * 60 * 60 * 1000);\n const repo = (name: string) => entityMap[name] ? dataSource.getRepository(entityMap[name]) : undefined;\n const [contactsCount, formsCount, formSubmissionsCount, usersCount, blogsCount, recentContacts, recentSubmissions] = await Promise.all([\n repo('contacts')?.count() ?? 0,\n repo('forms')?.count({ where: { deleted: false } }) ?? 0,\n repo('form_submissions')?.count() ?? 0,\n repo('users')?.count({ where: { deleted: false } }) ?? 0,\n repo('blogs')?.count({ where: { deleted: false } }) ?? 0,\n repo('contacts')?.count({ where: { createdAt: MoreThanOrEqual(sevenDaysAgo) } }) ?? 0,\n repo('form_submissions')?.count({ where: { createdAt: MoreThanOrEqual(sevenDaysAgo) } }) ?? 0,\n ]);\n return json({\n contacts: { total: contactsCount, recent: recentContacts },\n forms: { total: formsCount, submissions: formSubmissionsCount, recentSubmissions },\n users: usersCount,\n blogs: blogsCount,\n });\n } catch (err) {\n return json({ error: 'Failed to fetch dashboard stats' }, { status: 500 });\n }\n };\n}\n\nexport interface AnalyticsHandlerConfig extends CmsHandlersBase {\n getAnalyticsData?: (days: number) => Promise<unknown>;\n getPropertyId?: () => ({ currentViewId?: string; [k: string]: unknown });\n getPermissions?: () => ({ serviceAccountEmail?: string; currentViewId?: string; [k: string]: unknown });\n}\n\nexport function createAnalyticsHandlers(config: AnalyticsHandlerConfig) {\n const { json, getAnalyticsData, getPropertyId, getPermissions } = config;\n return {\n async GET(req: Request): Promise<Response> {\n if (!getAnalyticsData) return json({ error: 'Analytics not configured' }, { status: 404 });\n try {\n const url = new URL(req.url);\n const days = parseInt(url.searchParams.get('days') || '30', 10);\n const data = await getAnalyticsData(days);\n return json(data);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : '';\n if (msg.includes('authentication credential')) return json({ error: 'Google Analytics authentication failed.' }, { status: 401 });\n if (msg.includes('sufficient permissions')) return json({ error: 'Service account does not have access.' }, { status: 403 });\n return json({ error: 'Failed to fetch analytics data' }, { status: 500 });\n }\n },\n propertyId: async (): Promise<Response> => {\n const payload = getPropertyId ? getPropertyId() : { currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID };\n return json({ message: 'Property ID Information', ...payload });\n },\n permissions: async (): Promise<Response> => {\n const payload = getPermissions ? getPermissions() : {\n serviceAccountEmail: process.env.GOOGLE_ANALYTICS_CLIENT_EMAIL,\n currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID,\n };\n return json({ message: 'Permission Troubleshooting Guide', ...payload });\n },\n };\n}\n\nimport type { StorageService } from '../plugins/storage';\n\nexport type { StorageService };\n\nexport interface UploadHandlerConfig extends CmsHandlersBase {\n /** Storage plugin instance or getter (e.g. () => getCms().then(c => c.getPlugin('storage'))). If not set, uses local fallback. */\n storage?: StorageService | (() => StorageService | undefined) | (() => Promise<StorageService | undefined>);\n /** Fallback when storage not set: dir relative to cwd (e.g. \"public/uploads\") */\n localUploadDir?: string;\n allowedTypes?: string[];\n maxSizeBytes?: number;\n}\n\nexport function createUploadHandler(config: UploadHandlerConfig) {\n const { json, requireAuth, storage, localUploadDir = 'public/uploads', allowedTypes, maxSizeBytes = 10 * 1024 * 1024 } = config;\n const allowed = allowedTypes ?? ['image/jpeg', 'image/png', 'image/gif', 'image/webp', 'application/pdf', 'text/plain'];\n return async function POST(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formData = await req.formData();\n const file = formData.get('file') as File | null;\n if (!file) return json({ error: 'No file uploaded' }, { status: 400 });\n if (!allowed.includes(file.type)) return json({ error: 'File type not allowed' }, { status: 400 });\n if (file.size > maxSizeBytes) return json({ error: 'File size exceeds limit' }, { status: 400 });\n const buffer = Buffer.from(await file.arrayBuffer());\n const fileName = `${Date.now()}-${file.name}`;\n const contentType = file.type || 'application/octet-stream';\n const raw = typeof storage === 'function' ? storage() : storage;\n const storageService = raw instanceof Promise ? await raw : raw;\n if (storageService) {\n const fileUrl = await storageService.upload(buffer, `uploads/${fileName}`, contentType);\n return json({ filePath: fileUrl });\n }\n const fs = await import('fs/promises');\n const path = await import('path');\n const dir = path.join(process.cwd(), localUploadDir);\n await fs.mkdir(dir, { recursive: true });\n const filePath = path.join(dir, fileName);\n await fs.writeFile(filePath, buffer);\n return json({ filePath: `/${localUploadDir.replace(/^\\/+/, '').replace(/\\\\/g, '/')}/${fileName}` });\n } catch (err) {\n return json({ error: 'File upload failed' }, { status: 500 });\n }\n };\n}\n\nexport interface BlogBySlugConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\nexport function createBlogBySlugHandler(config: BlogBySlugConfig) {\n const { dataSource, entityMap, json } = config;\n return async function GET(_req: Request, slug: string): Promise<Response> {\n try {\n const blogRepo = dataSource.getRepository(entityMap.blogs);\n const blog = await blogRepo.findOne({\n where: { slug, published: true },\n relations: ['author', 'category', 'tags', 'seo'],\n });\n if (!blog) return json({ error: 'Blog not found' }, { status: 404 });\n return json(blog);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormBySlugConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\nexport function createFormBySlugHandler(config: FormBySlugConfig) {\n const { dataSource, entityMap, json } = config;\n return async function GET(_req: Request, slug: string): Promise<Response> {\n try {\n const formRepo = dataSource.getRepository(entityMap.forms);\n const form = await formRepo.findOne({\n where: { slug, published: true, deleted: false },\n relations: ['fields'],\n order: { fields: { order: 'ASC' } },\n });\n if (!form) return json({ error: 'Form not found' }, { status: 404 });\n const out = form as { fields?: unknown[] };\n if (Array.isArray(out.fields)) out.fields = out.fields.filter((f) => !(f as { deleted?: boolean }).deleted);\n return json(form);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormSaveHandlersConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n}\n\n/** Normalize a field from payload for DB: only include columns that exist on form_fields. */\nfunction normalizeFieldRow(f: Record<string, unknown>, formId: number): Record<string, unknown> {\n const order = typeof f.order === 'number' ? f.order : Number(f.order) || 0;\n const groupId = typeof f.groupId === 'number' ? f.groupId : Number(f.groupId) || 1;\n const columnWidth = typeof f.columnWidth === 'number' ? f.columnWidth : Number(f.columnWidth) || 12;\n return {\n formId,\n label: f.label != null ? String(f.label) : '',\n type: f.type != null ? String(f.type) : 'text',\n placeholder: f.placeholder != null ? String(f.placeholder) : null,\n options: f.options != null ? (typeof f.options === 'string' ? f.options : JSON.stringify(f.options)) : null,\n required: Boolean(f.required),\n validation: f.validation != null ? (typeof f.validation === 'string' ? f.validation : JSON.stringify(f.validation)) : null,\n order,\n groupId,\n columnWidth,\n };\n}\n\nexport function createFormSaveHandlers(config: FormSaveHandlersConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n const formRepo = () => dataSource.getRepository(entityMap.forms);\n const fieldRepo = () => dataSource.getRepository(entityMap.form_fields);\n\n return {\n async GET(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formId = Number(id);\n if (!Number.isInteger(formId) || formId <= 0) return json({ error: 'Invalid form id' }, { status: 400 });\n const form = await formRepo().findOne({\n where: { id: formId },\n relations: ['fields'],\n order: { fields: { order: 'ASC' } },\n });\n if (!form) return json({ message: 'Not found' }, { status: 404 });\n const out = form as { fields?: { deleted?: boolean }[] };\n if (Array.isArray(out.fields)) out.fields = out.fields.filter((f) => !f.deleted);\n return json(form);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async POST(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid request payload' }, { status: 400 });\n const fields = Array.isArray(body.fields) ? body.fields : [];\n const { fields: _f, ...formRow } = body;\n const form = await formRepo().save(formRepo().create(formRow as object));\n for (let i = 0; i < fields.length; i++) {\n const row = normalizeFieldRow(fields[i] as Record<string, unknown>, form.id);\n (row as Record<string, unknown>).order = i + 1;\n await fieldRepo().save(fieldRepo().create(row as object));\n }\n const saved = await formRepo().findOne({ where: { id: form.id }, relations: ['fields'], order: { fields: { order: 'ASC' } } });\n return json(saved ?? form, { status: 201 });\n } catch (e) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async PUT(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const formId = Number(id);\n if (!Number.isInteger(formId) || formId <= 0) return json({ error: 'Invalid form id' }, { status: 400 });\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid request payload' }, { status: 400 });\n const existing = await formRepo().findOne({ where: { id: formId } });\n if (!existing) return json({ message: 'Not found' }, { status: 404 });\n const fields = Array.isArray(body.fields) ? body.fields : [];\n const formRow: Record<string, unknown> = {};\n for (const key of ['name', 'description', 'campaign', 'slug', 'published']) {\n if (body[key] !== undefined) formRow[key] = body[key];\n }\n if (Object.keys(formRow).length > 0) await formRepo().update(formId, formRow as object);\n await fieldRepo().delete({ formId });\n for (let i = 0; i < fields.length; i++) {\n const row = normalizeFieldRow(fields[i] as Record<string, unknown>, formId);\n (row as Record<string, unknown>).order = i + 1;\n await fieldRepo().save(fieldRepo().create(row as object));\n }\n const saved = await formRepo().findOne({ where: { id: formId }, relations: ['fields'], order: { fields: { order: 'ASC' } } });\n return saved ? json(saved) : json({ message: 'Not found' }, { status: 404 });\n } catch (e) {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n };\n}\n\nexport interface FormSubmissionHandlerConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nexport interface FormSubmissionGetByIdConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n json: (body: unknown, init?: { status?: number }) => Response;\n}\n\nexport function createFormSubmissionGetByIdHandler(config: FormSubmissionGetByIdConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n return async function GET(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const submissionId = Number(id);\n if (!Number.isInteger(submissionId) || submissionId <= 0) return json({ error: 'Invalid id' }, { status: 400 });\n const repo = dataSource.getRepository(entityMap.form_submissions);\n const submission = await repo.findOne({\n where: { id: submissionId },\n relations: ['form', 'contact'],\n });\n if (!submission) return json({ message: 'Not found' }, { status: 404 });\n const form = submission as { form?: { id: number; fields?: unknown[] } };\n if (form.form?.id) {\n const formRepo = dataSource.getRepository(entityMap.forms);\n const formWithFields = await formRepo.findOne({\n where: { id: form.form.id },\n relations: ['fields'],\n order: { fields: { order: 'ASC' as const } },\n });\n if (formWithFields) (submission as { form?: unknown }).form = formWithFields;\n }\n return json(submission);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface FormSubmissionListConfig extends FormSubmissionGetByIdConfig {}\n\nexport function createFormSubmissionListHandler(config: FormSubmissionListConfig) {\n const { dataSource, entityMap, json, requireAuth } = config;\n return async function GET(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const repo = dataSource.getRepository(entityMap.form_submissions);\n const { searchParams } = new URL(req.url);\n const page = Number(searchParams.get('page')) || 1;\n const limit = Math.min(100, Number(searchParams.get('limit')) || 10);\n const skip = (page - 1) * limit;\n const sortField = searchParams.get('sortField') || 'createdAt';\n const sortOrder = searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const [data, total] = await repo.findAndCount({\n skip,\n take: limit,\n order: { [sortField]: sortOrder },\n relations: ['form', 'contact'],\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nfunction pickContactFromSubmission(\n fields: { id: number; type: string; label: string }[],\n data: Record<string, unknown>\n): { name: string; email: string; phone: string | null } | null {\n let email: string | null = null;\n let name: string | null = null;\n let phone: string | null = null;\n for (const f of fields) {\n const val = data[String(f.id)];\n if (val == null || val === '') continue;\n const str = String(val).trim();\n if (f.type === 'email' || (f.label && f.label.toLowerCase().includes('email'))) {\n if (str && !email) email = str;\n } else if (f.type === 'phone' || (f.label && f.label.toLowerCase().includes('phone'))) {\n if (str && !phone) phone = str;\n } else if (f.label && f.label.toLowerCase().includes('name') && (f.type === 'text' || !f.type)) {\n if (str && !name) name = str;\n }\n }\n if (!email) return null;\n return { name: name || email, email, phone: phone || null };\n}\n\nexport function createFormSubmissionHandler(config: FormSubmissionHandlerConfig) {\n const { dataSource, entityMap, json } = config;\n return async function POST(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as Record<string, unknown> | null;\n if (!body || typeof body !== 'object') {\n return json({ error: 'Invalid request payload' }, { status: 400 });\n }\n const formId = typeof body.formId === 'number' ? body.formId : Number(body.formId);\n if (!Number.isInteger(formId) || formId <= 0) {\n return json({ error: 'formId is required and must be a positive integer' }, { status: 400 });\n }\n const data = body.data;\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n return json({ error: 'data is required and must be an object' }, { status: 400 });\n }\n const formRepo = dataSource.getRepository(entityMap.forms);\n const form = await formRepo.findOne({\n where: { id: formId, published: true, deleted: false },\n relations: ['fields'],\n });\n if (!form) {\n return json({ error: 'Form not found' }, { status: 404 });\n }\n const fields = (form as { fields?: { id: number; type: string; label: string; deleted?: boolean }[] }).fields ?? [];\n const activeFields = fields.filter((f) => !f.deleted);\n\n let contactId: number | null =\n body.contactId != null && body.contactId !== ''\n ? (typeof body.contactId === 'number' ? body.contactId : Number(body.contactId))\n : null;\n\n if (!contactId) {\n const contactData = pickContactFromSubmission(activeFields, data as Record<string, unknown>);\n if (contactData) {\n const contactRepo = dataSource.getRepository(entityMap.contacts);\n let contact = await contactRepo.findOne({ where: { email: contactData.email } });\n if (!contact) {\n contact = await contactRepo.save(\n contactRepo.create({\n name: contactData.name,\n email: contactData.email,\n phone: contactData.phone,\n })\n );\n }\n contactId = contact.id;\n }\n }\n\n const ipAddress = (req.headers.get('x-forwarded-for') ?? req.headers.get('x-real-ip') ?? null) as string | null;\n const userAgent = req.headers.get('user-agent') ?? null;\n const submissionRepo = dataSource.getRepository(entityMap.form_submissions);\n const created = await submissionRepo.save(\n submissionRepo.create({\n formId,\n contactId: Number.isInteger(contactId) ? contactId : null,\n data: data as Record<string, unknown>,\n ipAddress: ipAddress?.slice(0, 255) ?? null,\n userAgent: userAgent?.slice(0, 500) ?? null,\n })\n );\n return json(created, { status: 201 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n };\n}\n\nexport interface UsersApiConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n baseUrl: string;\n}\n\nexport function createUsersApiHandlers(config: UsersApiConfig) {\n const { dataSource, entityMap, json, requireAuth, baseUrl } = config;\n const userRepo = () => dataSource.getRepository(entityMap.users);\n return {\n async list(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const url = new URL(req.url);\n const page = Math.max(1, parseInt(url.searchParams.get('page') || '1', 10));\n const limit = Math.min(100, parseInt(url.searchParams.get('limit') || '10', 10));\n const skip = (page - 1) * limit;\n const sortField = url.searchParams.get('sortField') || 'createdAt';\n const sortOrder = url.searchParams.get('sortOrder') === 'desc' ? 'DESC' : 'ASC';\n const search = url.searchParams.get('search');\n const where = search ? [{ name: ILike(`%${search}%`) }, { email: ILike(`%${search}%`) }] : {};\n const [data, total] = await userRepo().findAndCount({\n skip,\n take: limit,\n order: { [sortField]: sortOrder },\n where,\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n return json({ total, page, limit, totalPages: Math.ceil(total / limit), data });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async create(req: Request): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = await req.json() as Record<string, unknown>;\n if (!body?.name || !body?.email) return json({ error: 'Name and email are required' }, { status: 400 });\n const existing = await userRepo().findOne({ where: { email: body.email as string } });\n if (existing) return json({ error: 'User with this email already exists' }, { status: 400 });\n const newUser = await userRepo().save(\n userRepo().create({ name: body.name, email: body.email, password: null, blocked: true, groupId: (body.groupId as number) ?? null })\n );\n const emailToken = Buffer.from(newUser.email).toString('base64');\n const inviteLink = `${baseUrl}/admin/invite?token=${emailToken}`;\n return json({ message: 'User created successfully (blocked until password is set)', user: newUser, inviteLink }, { status: 201 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async getById(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const user = await userRepo().findOne({\n where: { id: parseInt(id, 10) },\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n return json(user);\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async update(req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n try {\n const body = await req.json() as Record<string, unknown>;\n const { password: _p, ...safe } = body;\n await userRepo().update(parseInt(id, 10), safe as object);\n const updated = await userRepo().findOne({\n where: { id: parseInt(id, 10) },\n relations: ['group'],\n select: ['id', 'name', 'email', 'blocked', 'createdAt', 'updatedAt', 'groupId'],\n });\n return updated ? json(updated) : json({ error: 'Not found' }, { status: 404 });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async delete(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const r = await userRepo().delete(parseInt(id, 10));\n if (r.affected === 0) return json({ error: 'User not found' }, { status: 404 });\n return json({ message: 'User deleted successfully' });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n async regenerateInvite(_req: Request, id: string): Promise<Response> {\n const authErr = await requireAuth(new Request(_req.url));\n if (authErr) return authErr;\n try {\n const user = await userRepo().findOne({ where: { id: parseInt(id, 10) }, select: ['email'] });\n if (!user) return json({ error: 'User not found' }, { status: 404 });\n const emailToken = Buffer.from(user.email).toString('base64');\n const inviteLink = `${baseUrl}/admin/invite?token=${emailToken}`;\n return json({ message: 'New invite link generated successfully', inviteLink });\n } catch {\n return json({ error: 'Server Error' }, { status: 500 });\n }\n },\n };\n}\n\nexport interface UserAvatarConfig extends CmsHandlersBase {\n getSession: () => Promise<{ user?: { email?: string | null } } | null>;\n /** Save avatar (buffer, fileName) => publicUrl. Default: local public/uploads/avatars */\n saveAvatar?: (buffer: Buffer, fileName: string) => Promise<string>;\n}\n\nexport function createUserAvatarHandler(config: UserAvatarConfig) {\n const { json, getSession, saveAvatar } = config;\n return async function POST(req: Request): Promise<Response> {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n try {\n const formData = await req.formData();\n const file = formData.get('avatar') as File | null;\n if (!file) return json({ error: 'No file uploaded' }, { status: 400 });\n if (!file.type.startsWith('image/')) return json({ error: 'File must be an image' }, { status: 400 });\n if (file.size > 5 * 1024 * 1024) return json({ error: 'File size must be less than 5MB' }, { status: 400 });\n const buffer = Buffer.from(await file.arrayBuffer());\n const ext = file.name.split('.').pop() || 'jpg';\n const fileName = `avatar_${session.user.email}_${Date.now()}.${ext}`;\n const avatarUrl = saveAvatar\n ? await saveAvatar(buffer, fileName)\n : await (async () => {\n const fs = await import('fs/promises');\n const path = await import('path');\n const dir = path.join(process.cwd(), 'public', 'uploads', 'avatars');\n await fs.mkdir(dir, { recursive: true });\n await fs.writeFile(path.join(dir, fileName), buffer);\n return `/uploads/avatars/${fileName}`;\n })();\n return json({ message: 'Avatar uploaded successfully', avatarUrl });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface UserProfileConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n getSession: () => Promise<{ user?: { email?: string | null; name?: string | null } } | null>;\n}\n\nexport function createUserProfileHandler(config: UserProfileConfig) {\n const { dataSource, entityMap, json, getSession } = config;\n return async function PUT(req: Request): Promise<Response> {\n const session = await getSession();\n if (!session?.user?.email) return json({ error: 'Unauthorized' }, { status: 401 });\n try {\n const body = await req.json() as { name?: string };\n if (!body?.name) return json({ error: 'Name is required' }, { status: 400 });\n const userRepo = dataSource.getRepository(entityMap.users);\n await userRepo.update({ email: session.user.email }, { name: body.name, updatedAt: new Date() });\n const updated = await userRepo.findOne({ where: { email: session.user.email }, select: ['id', 'name', 'email'] });\n if (!updated) return json({ error: 'Not found' }, { status: 404 });\n return json({ message: 'Profile updated successfully', user: { id: updated.id, name: updated.name, email: updated.email } });\n } catch {\n return json({ error: 'Internal server error' }, { status: 500 });\n }\n };\n}\n\nexport interface SettingsApiConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n encryptionKey?: string;\n /** Groups in this list are readable without auth (GET returns all keys for the group). */\n publicGetGroups?: string[];\n}\n\nfunction simpleEncrypt(text: string, key: string): string {\n const buf = Buffer.from(text, 'utf8');\n const keyBuf = Buffer.from(key.padEnd(32, '0').slice(0, 32), 'utf8');\n const out = Buffer.alloc(buf.length);\n for (let i = 0; i < buf.length; i++) out[i] = buf[i] ^ keyBuf[i % keyBuf.length];\n return out.toString('base64');\n}\n\nfunction simpleDecrypt(encoded: string, key: string): string {\n const buf = Buffer.from(encoded, 'base64');\n const keyBuf = Buffer.from(key.padEnd(32, '0').slice(0, 32), 'utf8');\n const out = Buffer.alloc(buf.length);\n for (let i = 0; i < buf.length; i++) out[i] = buf[i] ^ keyBuf[i % keyBuf.length];\n return out.toString('utf8');\n}\n\nexport function createSettingsApiHandlers(config: SettingsApiConfig) {\n const { dataSource, entityMap, json, requireAuth, encryptionKey, publicGetGroups } = config;\n const configRepo = () => dataSource.getRepository(entityMap.configs);\n\n return {\n async GET(req: Request, group: string): Promise<Response> {\n const isPublicGroup = publicGetGroups?.includes(group);\n const authErr = isPublicGroup ? null : await requireAuth(req);\n const isAuthed = !authErr;\n\n try {\n const where: Record<string, unknown> = { settings: group, deleted: false };\n if (!isAuthed && !isPublicGroup) where.type = 'public';\n\n const rows = await configRepo().find({ where });\n const result: Record<string, unknown> = {};\n for (const row of rows) {\n const r = row as { key: string; value: string; encrypted?: boolean; type?: string };\n let val = r.value;\n if (r.encrypted && encryptionKey) {\n try { val = simpleDecrypt(val, encryptionKey); } catch { /* return raw if decrypt fails */ }\n }\n result[r.key] = val;\n }\n return json(result);\n } catch {\n return json({ error: 'Failed to fetch settings' }, { status: 500 });\n }\n },\n\n async PUT(req: Request, group: string): Promise<Response> {\n const authErr = await requireAuth(req);\n if (authErr) return authErr;\n\n try {\n const body = await req.json() as Record<string, { value: string; type?: 'public' | 'private'; encrypted?: boolean }>;\n if (!body || typeof body !== 'object') return json({ error: 'Invalid payload' }, { status: 400 });\n\n const repo = configRepo();\n for (const [key, entry] of Object.entries(body)) {\n const val = typeof entry === 'string' ? entry : entry.value;\n const type = (typeof entry === 'object' && entry.type) || 'private';\n const encrypted = !!(typeof entry === 'object' && entry.encrypted);\n\n let storedValue = val;\n if (encrypted && encryptionKey) {\n storedValue = simpleEncrypt(val, encryptionKey);\n }\n\n const existing = await repo.findOne({ where: { settings: group, key } });\n if (existing) {\n await repo.update(existing.id, { value: storedValue, type, encrypted, updatedAt: new Date() } as object);\n } else {\n await repo.save(repo.create({ settings: group, key, value: storedValue, type, encrypted } as object));\n }\n }\n return json({ message: 'Settings saved' });\n } catch {\n return json({ error: 'Failed to save settings' }, { status: 500 });\n }\n },\n };\n}\n\nexport interface ChatApiConfig extends CmsHandlersBase {\n dataSource: DataSource;\n entityMap: EntityMap;\n getCms: () => Promise<{ getPlugin: (name: string) => unknown }>;\n}\n\nconst KB_CHUNK_LIMIT = 10;\nconst KB_CONTEXT_MAX_CHARS = 4000;\n\nfunction getQueryTerms(message: string): string[] {\n return message\n .replace(/[^\\w\\s]/g, ' ')\n .split(/\\s+/)\n .filter((w) => w.length > 2)\n .slice(0, 6);\n}\n\nexport function createChatHandlers(config: ChatApiConfig) {\n const { dataSource, entityMap, json, getCms } = config;\n const contactRepo = () => dataSource.getRepository(entityMap.contacts);\n const convRepo = () => dataSource.getRepository(entityMap.chat_conversations);\n const msgRepo = () => dataSource.getRepository(entityMap.chat_messages);\n const chunkRepo = () => dataSource.getRepository(entityMap.knowledge_base_chunks);\n\n return {\n async identify(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { name?: string; email?: string; phone?: string };\n const name = body?.name?.trim();\n const email = body?.email?.trim();\n if (!name || !email) return json({ error: 'name and email required' }, { status: 400 });\n const repo = contactRepo();\n let contact = await repo.findOne({ where: { email, deleted: false } });\n if (!contact) {\n const created = repo.create({ name, email, phone: body.phone?.trim() || null } as object);\n contact = await repo.save(created);\n }\n const convRepoInst = convRepo();\n const conv = await convRepoInst.save(convRepoInst.create({ contactId: (contact as { id: number }).id } as object));\n return json({\n contactId: (contact as { id: number }).id,\n conversationId: (conv as { id: number }).id,\n });\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Failed to identify';\n return json({ error: 'Failed to identify', detail: message }, { status: 500 });\n }\n },\n async getMessages(req: Request, conversationId: string): Promise<Response> {\n try {\n const conv = await convRepo().findOne({\n where: { id: parseInt(conversationId, 10) },\n relations: ['messages'],\n });\n if (!conv) return json({ error: 'Conversation not found' }, { status: 404 });\n const messages = ((conv as { messages?: Array<{ role: string; content: string; createdAt: string }> }).messages ?? [])\n .sort((a, b) => new Date(a.createdAt).getTime() - new Date(b.createdAt).getTime())\n .map((m) => ({ role: m.role, content: m.content }));\n return json({ messages });\n } catch {\n return json({ error: 'Failed to fetch messages' }, { status: 500 });\n }\n },\n async postMessage(req: Request): Promise<Response> {\n try {\n const body = (await req.json()) as { conversationId?: number; message?: string };\n const conversationId = body?.conversationId;\n const message = body?.message?.trim();\n if (!conversationId || !message) return json({ error: 'conversationId and message required' }, { status: 400 });\n const conv = await convRepo().findOne({\n where: { id: conversationId },\n relations: ['messages'],\n });\n if (!conv) return json({ error: 'Conversation not found' }, { status: 404 });\n const msgRepoInst = msgRepo();\n await msgRepoInst.save(msgRepoInst.create({ conversationId, role: 'user', content: message } as object));\n const cms = await getCms();\n const llm = cms.getPlugin('llm') as {\n chat: (messages: Array<{ role: string; content: string }>, opts?: object) => Promise<{ content: string }>;\n embed?: (text: string) => Promise<number[]>;\n } | undefined;\n if (!llm?.chat) return json({ error: 'LLM not configured' }, { status: 503 });\n let contextParts: string[] = [];\n const queryEmbedding = llm.embed ? await llm.embed(message) : null;\n if (queryEmbedding && queryEmbedding.length > 0) {\n const vectorStr = '[' + queryEmbedding.join(',') + ']';\n try {\n const rows = (await dataSource.query(\n `SELECT id, content FROM knowledge_base_chunks WHERE embedding IS NOT NULL ORDER BY embedding <=> $1::vector LIMIT $2`,\n [vectorStr, KB_CHUNK_LIMIT]\n )) as Array<{ id: number; content: string }>;\n let totalLen = 0;\n for (const r of rows) {\n const text = (r.content ?? '').trim();\n if (!text || totalLen + text.length > KB_CONTEXT_MAX_CHARS) continue;\n contextParts.push(text);\n totalLen += text.length;\n }\n } catch {\n // pgvector not available or query failed; fall back to keyword\n }\n }\n if (contextParts.length === 0) {\n const terms = getQueryTerms(message);\n if (terms.length > 0) {\n const conditions = terms.map((t) => ({ content: ILike(`%${t}%`) }));\n const chunks = await chunkRepo().find({\n where: conditions,\n take: KB_CHUNK_LIMIT,\n order: { id: 'ASC' },\n });\n const seen = new Set<string>();\n let totalLen = 0;\n for (const c of chunks as Array<{ content: string }>) {\n const text = c.content.trim();\n if (seen.has(text) || totalLen + text.length > KB_CONTEXT_MAX_CHARS) continue;\n seen.add(text);\n contextParts.push(text);\n totalLen += text.length;\n }\n }\n }\n const history = ((conv as { messages?: Array<{ role: string; content: string; createdAt?: string }> }).messages ?? [])\n .sort((a, b) => new Date(a.createdAt ?? 0).getTime() - new Date(b.createdAt ?? 0).getTime())\n .map((m) => ({ role: m.role as 'user' | 'assistant' | 'system', content: m.content }));\n const systemContent = contextParts.length > 0\n ? `Use the following context about the company and its products to answer. If the answer is not in the context, say so.\\n\\nContext:\\n${contextParts.join('\\n\\n')}`\n : 'You are a helpful assistant for the company. If you do not have specific information, say so.';\n const messages = [\n { role: 'system' as const, content: systemContent },\n ...history,\n { role: 'user' as const, content: message },\n ];\n const { content } = await llm.chat(messages);\n await msgRepoInst.save(msgRepoInst.create({ conversationId, role: 'assistant', content } as object));\n return json({ content });\n } catch (err) {\n const msg = err instanceof Error ? err.message : '';\n return json({ error: msg || 'Failed to send message' }, { status: 500 });\n }\n },\n };\n}\n","/**\n * Single CMS API handler: dashboard, analytics, upload, blog/form by slug, users API, user auth, CRUD. Mount once (e.g. app/api/[[...path]]/route.ts).\n */\nimport type { DataSource } from 'typeorm';\nimport { createCrudHandler, createCrudByIdHandler } from './crud';\nimport type { CrudHandlerOptions, EntityMap } from './crud';\nimport { createUserAuthApiRouter } from './auth-handlers';\nimport type { UserAuthApiConfig } from './auth-handlers';\nimport {\n createDashboardStatsHandler,\n createAnalyticsHandlers,\n createUploadHandler,\n createBlogBySlugHandler,\n createFormBySlugHandler,\n createFormSaveHandlers,\n createFormSubmissionHandler,\n createFormSubmissionGetByIdHandler,\n createFormSubmissionListHandler,\n createUsersApiHandlers,\n createUserAvatarHandler,\n createUserProfileHandler,\n createSettingsApiHandlers,\n createChatHandlers,\n} from './cms-handlers';\nimport type {\n DashboardStatsConfig,\n AnalyticsHandlerConfig,\n UploadHandlerConfig,\n BlogBySlugConfig,\n FormBySlugConfig,\n FormSaveHandlersConfig,\n FormSubmissionHandlerConfig,\n FormSubmissionGetByIdConfig,\n UsersApiConfig,\n UserAvatarConfig,\n UserProfileConfig,\n SettingsApiConfig,\n ChatApiConfig,\n} from './cms-handlers';\n\n/** CMS instance with getPlugin; when provided, analytics and userAuth.sendEmail can be resolved from plugins when not passed. */\nexport type CmsGetter = () => Promise<{ getPlugin: (name: string) => unknown }>;\n\nexport interface CmsApiHandlerConfig {\n dataSource: DataSource;\n entityMap: EntityMap;\n requireAuth: (req: Request) => Promise<Response | null>;\n json: (body: unknown, init?: { status?: number }) => Response;\n pathToModel?: (segment: string) => string;\n crudResources?: string[];\n /** When set, analytics and userAuth.sendEmail can be derived from getPlugin('analytics') and getPlugin('email') when not provided. */\n getCms?: CmsGetter;\n userAuth?: UserAuthApiConfig;\n /** GET /api/dashboard/stats */\n dashboard?: DashboardStatsConfig;\n /** GET /api/analytics. If omitted and getCms is set, uses getCms().getPlugin('analytics'). */\n analytics?: AnalyticsHandlerConfig;\n /** POST /api/upload (S3 or local) */\n upload?: UploadHandlerConfig;\n /** GET /api/blogs/slug/:slug (public) */\n blogBySlug?: BlogBySlugConfig;\n /** GET /api/forms/slug/:slug (public) */\n formBySlug?: FormBySlugConfig;\n /** POST/PUT /api/forms (save form + fields; when set, overrides CRUD for forms) */\n formSave?: FormSaveHandlersConfig;\n /** POST /api/form-submissions (public, no auth) */\n formSubmission?: FormSubmissionHandlerConfig;\n /** GET /api/form-submissions/:id (auth) with form + contact relations */\n formSubmissionGetById?: FormSubmissionGetByIdConfig;\n /** GET/POST /api/users, GET/PUT/DELETE /api/users/:id, POST /api/users/:id/regenerate-invite */\n usersApi?: UsersApiConfig;\n /** POST /api/users/avatar */\n userAvatar?: UserAvatarConfig;\n /** PUT /api/users/profile */\n userProfile?: UserProfileConfig;\n /** GET/PUT /api/settings/:group */\n settings?: SettingsApiConfig;\n /** POST /api/chat/identify, GET /api/chat/conversations/:id/messages, POST /api/chat/messages */\n chat?: ChatApiConfig;\n}\n\nconst DEFAULT_EXCLUDE = new Set(['users', 'password_reset_tokens', 'user_groups', 'permissions', 'comments', 'form_fields', 'configs']);\n\nexport function createCmsApiHandler(config: CmsApiHandlerConfig) {\n const {\n dataSource,\n entityMap,\n pathToModel = (s) => s,\n crudResources = Object.keys(entityMap).filter((k) => !DEFAULT_EXCLUDE.has(k)),\n getCms,\n userAuth: userAuthConfig,\n dashboard,\n analytics: analyticsConfig,\n upload,\n blogBySlug,\n formBySlug,\n formSave: formSaveConfig,\n formSubmission: formSubmissionConfig,\n formSubmissionGetById: formSubmissionGetByIdConfig,\n usersApi,\n userAvatar,\n userProfile,\n settings: settingsConfig,\n chat: chatConfig,\n } = config;\n\n const analytics: AnalyticsHandlerConfig | undefined =\n analyticsConfig ??\n (getCms\n ? {\n json: config.json,\n requireAuth: async () => null,\n getAnalyticsData: async (days) => {\n const cms = await getCms();\n const a = cms.getPlugin('analytics') as { getAnalyticsData?: (days: number) => Promise<unknown> } | undefined;\n if (!a?.getAnalyticsData) throw new Error('Analytics not configured');\n return a.getAnalyticsData(days);\n },\n getPropertyId: () => ({ currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID }),\n getPermissions: () => ({\n serviceAccountEmail: process.env.GOOGLE_ANALYTICS_CLIENT_EMAIL,\n currentViewId: process.env.GOOGLE_ANALYTICS_VIEW_ID,\n }),\n }\n : undefined);\n\n const userAuth: UserAuthApiConfig | undefined =\n userAuthConfig && getCms && userAuthConfig.sendEmail === undefined\n ? {\n ...userAuthConfig,\n sendEmail: async (opts) => {\n const cms = await getCms();\n const email = cms.getPlugin('email') as { send: (data: { subject: string; html: string; text?: string; to?: string }) => Promise<boolean> } | undefined;\n if (!email?.send) return;\n const { emailTemplates } = await import('../plugins/email/email-service');\n const { subject, html, text } = emailTemplates.passwordReset({ resetLink: opts.text || opts.html });\n await email.send({ subject, html, text, to: opts.to });\n },\n }\n : userAuthConfig;\n\n const crudOpts: CrudHandlerOptions = { requireAuth: config.requireAuth, json: config.json };\n const crud = createCrudHandler(dataSource, entityMap, crudOpts);\n const crudById = createCrudByIdHandler(dataSource, entityMap, crudOpts);\n const userAuthRouter = userAuth ? createUserAuthApiRouter(userAuth) : null;\n\n const dashboardGet = dashboard ? createDashboardStatsHandler(dashboard) : null;\n const analyticsHandlers = analytics ? createAnalyticsHandlers(analytics) : null;\n const uploadPost = upload ? createUploadHandler(upload) : null;\n const blogBySlugGet = blogBySlug ? createBlogBySlugHandler(blogBySlug) : null;\n const formBySlugGet = formBySlug ? createFormBySlugHandler(formBySlug) : null;\n const formSaveHandlers = formSaveConfig ? createFormSaveHandlers(formSaveConfig) : null;\n const formSubmissionPost = formSubmissionConfig ? createFormSubmissionHandler(formSubmissionConfig) : null;\n const formSubmissionGetById = formSubmissionGetByIdConfig ? createFormSubmissionGetByIdHandler(formSubmissionGetByIdConfig) : null;\n const formSubmissionList = formSubmissionGetByIdConfig ? createFormSubmissionListHandler(formSubmissionGetByIdConfig) : null;\n const usersHandlers = usersApi ? createUsersApiHandlers(usersApi) : null;\n const avatarPost = userAvatar ? createUserAvatarHandler(userAvatar) : null;\n const profilePut = userProfile ? createUserProfileHandler(userProfile) : null;\n const settingsHandlers = settingsConfig ? createSettingsApiHandlers(settingsConfig) : null;\n const chatHandlers = chatConfig ? createChatHandlers(chatConfig) : null;\n\n function resolveResource(segment: string): string {\n const model = pathToModel(segment);\n return crudResources.includes(model) ? model : segment;\n }\n\n return {\n async handle(method: string, path: string[], req: Request): Promise<Response> {\n // Dashboard: [\"dashboard\", \"stats\"]\n if (path[0] === 'dashboard' && path[1] === 'stats' && path.length === 2 && method === 'GET' && dashboardGet) {\n return dashboardGet(req);\n }\n // Analytics: [\"analytics\"], [\"analytics\", \"property-id\"], [\"analytics\", \"permissions\"]\n if (path[0] === 'analytics' && analyticsHandlers) {\n if (path.length === 1 && method === 'GET') return analyticsHandlers.GET(req);\n if (path.length === 2 && path[1] === 'property-id' && method === 'GET') return analyticsHandlers.propertyId();\n if (path.length === 2 && path[1] === 'permissions' && method === 'GET') return analyticsHandlers.permissions();\n }\n // Upload: [\"upload\"]\n if (path[0] === 'upload' && path.length === 1 && method === 'POST' && uploadPost) return uploadPost(req);\n // Blog by slug: [\"blogs\", \"slug\", slug] (public)\n if (path[0] === 'blogs' && path[1] === 'slug' && path.length === 3 && method === 'GET' && blogBySlugGet) {\n return blogBySlugGet(req, path[2]);\n }\n // Form by slug: [\"forms\", \"slug\", slug] (public)\n if (path[0] === 'forms' && path[1] === 'slug' && path.length === 3 && method === 'GET' && formBySlugGet) {\n return formBySlugGet(req, path[2]);\n }\n // Form submission: [\"form-submissions\"] GET (auth, list with relations) or POST (public); [\"form-submissions\", id] GET (auth, with relations)\n if (path[0] === 'form-submissions') {\n if (path.length === 1) {\n if (method === 'GET' && formSubmissionList) return formSubmissionList(req);\n if (method === 'POST' && formSubmissionPost) return formSubmissionPost(req);\n }\n if (path.length === 2 && method === 'GET' && formSubmissionGetById) return formSubmissionGetById(req, path[1]);\n }\n // Form save: [\"forms\"] POST; [\"forms\", id] GET (with fields) or PUT/PATCH (saves form + fields)\n if (path[0] === 'forms' && formSaveHandlers) {\n if (path.length === 1 && method === 'POST') return formSaveHandlers.POST(req);\n if (path.length === 2) {\n if (method === 'GET') return formSaveHandlers.GET(req, path[1]);\n if (method === 'PUT' || method === 'PATCH') return formSaveHandlers.PUT(req, path[1]);\n }\n }\n // Users API\n if (path[0] === 'users' && usersHandlers) {\n if (path.length === 1) {\n if (method === 'GET') return usersHandlers.list(req);\n if (method === 'POST') return usersHandlers.create(req);\n }\n if (path.length === 2) {\n if (path[1] === 'avatar' && method === 'POST' && avatarPost) return avatarPost(req);\n if (path[1] === 'profile' && method === 'PUT' && profilePut) return profilePut(req);\n // users/:id\n const id = path[1];\n if (method === 'GET') return usersHandlers.getById(req, id);\n if (method === 'PUT' || method === 'PATCH') return usersHandlers.update(req, id);\n if (method === 'DELETE') return usersHandlers.delete(req, id);\n }\n if (path.length === 3 && path[2] === 'regenerate-invite' && method === 'POST') {\n return usersHandlers.regenerateInvite(req, path[1]);\n }\n }\n // User auth: [\"users\", \"forgot-password\"] etc.\n if (path[0] === 'users' && path.length === 2 && userAuthRouter && method === 'POST') {\n return userAuthRouter.POST(req, path[1]);\n }\n // Settings: [\"settings\", group]\n if (path[0] === 'settings' && path.length === 2 && settingsHandlers) {\n if (method === 'GET') return settingsHandlers.GET(req, path[1]);\n if (method === 'PUT') return settingsHandlers.PUT(req, path[1]);\n }\n // Chat: [\"chat\", \"identify\"] POST; [\"chat\", \"conversations\", id, \"messages\"] GET; [\"chat\", \"messages\"] POST\n if (path[0] === 'chat' && chatHandlers) {\n if (path.length === 2 && path[1] === 'identify' && method === 'POST') return chatHandlers.identify(req);\n if (path.length === 4 && path[1] === 'conversations' && path[3] === 'messages' && method === 'GET') return chatHandlers.getMessages(req, path[2]);\n if (path.length === 2 && path[1] === 'messages' && method === 'POST') return chatHandlers.postMessage(req);\n }\n\n // CRUD: [\"blogs\"] or [\"blogs\", \"123\"]\n if (path.length === 0) return config.json({ error: 'Not found' }, { status: 404 });\n const resource = resolveResource(path[0]);\n if (!crudResources.includes(resource)) return config.json({ error: 'Invalid resource' }, { status: 400 });\n\n // Bulk operations: [\"products\", \"metadata\"], [\"products\", \"bulk\"], [\"products\", \"export\"]\n if (path.length === 2) {\n if (path[1] === 'metadata' && method === 'GET') {\n return crud.GET_METADATA(req, resource);\n }\n if (path[1] === 'bulk' && method === 'POST') {\n return crud.BULK_POST(req, resource);\n }\n if (path[1] === 'export' && method === 'GET') {\n return crud.GET_EXPORT(req, resource);\n }\n }\n\n if (path.length === 1) {\n if (method === 'GET') return crud.GET(req, resource);\n if (method === 'POST') return crud.POST(req, resource);\n return config.json({ error: 'Method not allowed' }, { status: 405 });\n }\n if (path.length === 2) {\n const id = path[1];\n if (method === 'GET') return crudById.GET(req, resource, id);\n if (method === 'PUT' || method === 'PATCH') return crudById.PUT(req, resource, id);\n if (method === 'DELETE') return crudById.DELETE(req, resource, id);\n return config.json({ error: 'Method not allowed' }, { status: 405 });\n }\n return config.json({ error: 'Not found' }, { status: 404 });\n },\n };\n}\n","export interface AdminNavItem {\n href: string;\n label: string;\n icon?: string;\n}\n\nexport const DEFAULT_ADMIN_NAV: AdminNavItem[] = [\n { href: '/admin/dashboard', label: 'Dashboard' },\n { href: '/admin/contacts', label: 'Contacts' },\n { href: '/admin/blogs', label: 'Blogs' },\n { href: '/admin/users', label: 'Users' },\n { href: '/admin/forms', label: 'Forms' },\n { href: '/admin/submissions', label: 'Submissions' },\n { href: '/admin/pages', label: 'Pages' },\n];\n"],"mappings":"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","names":["nodemailer","Stripe","Razorpay","crypto","StripePaymentService","RazorpayPaymentService","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","import_typeorm","isPublicMethod","_CredentialsProvider","import_typeorm","repo","total","data","typeFilter","crypto","import_typeorm","emailTemplates"]}