@astralibx/email-account-manager 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +118 -0
- package/dist/index.d.mts +1049 -0
- package/dist/index.d.ts +1049 -0
- package/dist/index.js +3044 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +2999 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +68 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/errors/index.ts","../src/validation/config.schema.ts","../src/constants/index.ts","../src/schemas/email-account.schema.ts","../src/schemas/email-daily-stats.schema.ts","../src/schemas/email-identifier.schema.ts","../src/schemas/email-draft.schema.ts","../src/schemas/global-settings.schema.ts","../src/services/settings.service.ts","../src/services/identifier.service.ts","../src/services/health-tracker.ts","../src/services/warmup-manager.ts","../src/services/capacity-manager.ts","../src/services/unsubscribe.service.ts","../src/services/queue.service.ts","../src/services/smtp.service.ts","../src/services/approval.service.ts","../src/services/imap-bounce-checker.ts","../src/services/ses-webhook-handler.ts","../src/queues/send.queue.ts","../src/queues/approval.queue.ts","../src/controllers/account.controller.ts","../src/controllers/identifier.controller.ts","../src/controllers/approval.controller.ts","../src/controllers/settings.controller.ts","../src/controllers/unsubscribe.controller.ts","../src/routes/index.ts","../src/routes/ses-webhook.routes.ts","../src/routes/unsubscribe.routes.ts","../src/index.ts"],"names":["Schema","text","msg","crypto","html","Router"],"mappings":"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","file":"index.mjs","sourcesContent":["import { AlxError } from '@astralibx/core';\n\nexport class AlxAccountError extends AlxError {\n constructor(message: string, public readonly code: string) {\n super(message, code);\n this.name = 'AlxAccountError';\n }\n}\n\nexport class ConfigValidationError extends AlxAccountError {\n constructor(message: string, public readonly field: string) {\n super(message, 'CONFIG_VALIDATION');\n this.name = 'ConfigValidationError';\n }\n}\n\nexport class AccountDisabledError extends AlxAccountError {\n constructor(\n public readonly accountId: string,\n public readonly reason: string,\n ) {\n super(`Account ${accountId} is disabled: ${reason}`, 'ACCOUNT_DISABLED');\n this.name = 'AccountDisabledError';\n }\n}\n\nexport class NoAvailableAccountError extends AlxAccountError {\n constructor() {\n super('No available accounts with remaining capacity', 'NO_AVAILABLE_ACCOUNT');\n this.name = 'NoAvailableAccountError';\n }\n}\n\nexport class SmtpConnectionError extends AlxAccountError {\n constructor(\n public readonly accountId: string,\n public readonly originalError: Error,\n ) {\n super(`SMTP connection failed for account ${accountId}: ${originalError.message}`, 'SMTP_CONNECTION');\n this.name = 'SmtpConnectionError';\n }\n}\n\nexport class InvalidTokenError extends AlxAccountError {\n constructor(public readonly tokenType: 'unsubscribe') {\n super(`Invalid or expired ${tokenType} token`, 'INVALID_TOKEN');\n this.name = 'InvalidTokenError';\n }\n}\n\nexport class QuotaExceededError extends AlxAccountError {\n constructor(\n public readonly accountId: string,\n public readonly dailyMax: number,\n public readonly currentSent: number,\n ) {\n super(\n `Account ${accountId} exceeded daily quota: ${currentSent}/${dailyMax}`,\n 'QUOTA_EXCEEDED',\n );\n this.name = 'QuotaExceededError';\n }\n}\n\nexport class SnsSignatureError extends AlxAccountError {\n constructor() {\n super('SNS message signature verification failed', 'SNS_SIGNATURE_INVALID');\n this.name = 'SnsSignatureError';\n }\n}\n\nexport class AccountNotFoundError extends AlxAccountError {\n constructor(public readonly accountId: string) {\n super(`Account not found: ${accountId}`, 'ACCOUNT_NOT_FOUND');\n this.name = 'AccountNotFoundError';\n }\n}\n\nexport class DraftNotFoundError extends AlxAccountError {\n constructor(public readonly draftId: string) {\n super(`Draft not found: ${draftId}`, 'DRAFT_NOT_FOUND');\n this.name = 'DraftNotFoundError';\n }\n}\n","import { z } from 'zod';\nimport { loggerSchema, baseDbSchema, baseRedisSchema } from '@astralibx/core';\nimport { ConfigValidationError } from '../errors';\n\nconst warmupPhaseSchema = z.object({\n days: z.tuple([z.number().int().min(0), z.number().int().min(0)]),\n dailyLimit: z.number().int().positive(),\n delayMinMs: z.number().int().min(0),\n delayMaxMs: z.number().int().min(0),\n});\n\nconst configSchema = z.object({\n db: baseDbSchema,\n redis: baseRedisSchema,\n logger: loggerSchema.optional(),\n options: z.object({\n warmup: z.object({\n defaultSchedule: z.array(warmupPhaseSchema).min(1),\n }).optional(),\n healthDefaults: z.object({\n minScore: z.number().min(0).max(100).optional(),\n maxBounceRate: z.number().min(0).max(100).optional(),\n maxConsecutiveErrors: z.number().int().positive().optional(),\n }).optional(),\n ses: z.object({\n enabled: z.boolean(),\n validateSignature: z.boolean().optional(),\n allowedTopicArns: z.array(z.string()).optional(),\n }).optional(),\n unsubscribe: z.object({\n builtin: z.object({\n enabled: z.boolean(),\n secret: z.string().min(1),\n baseUrl: z.string().url(),\n tokenExpiryDays: z.number().int().positive().optional(),\n }).optional(),\n generateUrl: z.function().optional(),\n }).optional(),\n queues: z.object({\n sendQueueName: z.string().optional(),\n approvalQueueName: z.string().optional(),\n }).optional(),\n }).optional(),\n hooks: z.object({\n onAccountDisabled: z.function().optional(),\n onWarmupComplete: z.function().optional(),\n onHealthDegraded: z.function().optional(),\n onSend: z.function().optional(),\n onSendError: z.function().optional(),\n onBounce: z.function().optional(),\n onUnsubscribe: z.function().optional(),\n onDelivery: z.function().optional(),\n onComplaint: z.function().optional(),\n onOpen: z.function().optional(),\n onClick: z.function().optional(),\n onDraftCreated: z.function().optional(),\n onDraftApproved: z.function().optional(),\n onDraftRejected: z.function().optional(),\n }).optional(),\n});\n\nexport function validateConfig(raw: unknown): void {\n const result = configSchema.safeParse(raw);\n if (!result.success) {\n const issues = result.error.issues\n .map((i) => ` ${i.path.join('.')}: ${i.message}`)\n .join('\\n');\n throw new ConfigValidationError(\n `Invalid EmailAccountManagerConfig:\\n${issues}`,\n result.error.issues[0]?.path.join('.') ?? '',\n );\n }\n}\n","export const ACCOUNT_PROVIDER = {\n Gmail: 'gmail',\n Ses: 'ses',\n} as const;\n\nexport type AccountProvider = (typeof ACCOUNT_PROVIDER)[keyof typeof ACCOUNT_PROVIDER];\n\nexport const ACCOUNT_STATUS = {\n Active: 'active',\n Disabled: 'disabled',\n QuotaExceeded: 'quota_exceeded',\n Error: 'error',\n Warmup: 'warmup',\n} as const;\n\nexport type AccountStatus = (typeof ACCOUNT_STATUS)[keyof typeof ACCOUNT_STATUS];\n\nexport const IDENTIFIER_STATUS = {\n Active: 'active',\n Bounced: 'bounced',\n Unsubscribed: 'unsubscribed',\n Blocked: 'blocked',\n Invalid: 'invalid',\n} as const;\n\nexport type IdentifierStatus = (typeof IDENTIFIER_STATUS)[keyof typeof IDENTIFIER_STATUS];\n\nexport const BOUNCE_TYPE = {\n Hard: 'hard',\n Soft: 'soft',\n InboxFull: 'inbox_full',\n InvalidEmail: 'invalid_email',\n} as const;\n\nexport type BounceType = (typeof BOUNCE_TYPE)[keyof typeof BOUNCE_TYPE];\n\nexport const DRAFT_STATUS = {\n Pending: 'pending',\n Approved: 'approved',\n Rejected: 'rejected',\n Queued: 'queued',\n Sent: 'sent',\n Failed: 'failed',\n} as const;\n\nexport type DraftStatus = (typeof DRAFT_STATUS)[keyof typeof DRAFT_STATUS];\n\nexport const EMAIL_EVENT_TYPE = {\n Sent: 'sent',\n Failed: 'failed',\n Delivered: 'delivered',\n Bounced: 'bounced',\n Complained: 'complained',\n Opened: 'opened',\n Clicked: 'clicked',\n Unsubscribed: 'unsubscribed',\n} as const;\n\nexport type EmailEventType = (typeof EMAIL_EVENT_TYPE)[keyof typeof EMAIL_EVENT_TYPE];\n\nexport const SES_BOUNCE_TYPE = {\n Permanent: 'Permanent',\n Transient: 'Transient',\n Undetermined: 'Undetermined',\n} as const;\n\nexport type SesBounceType = (typeof SES_BOUNCE_TYPE)[keyof typeof SES_BOUNCE_TYPE];\n\nexport const SES_COMPLAINT_TYPE = {\n Abuse: 'abuse',\n AuthFailure: 'auth-failure',\n Fraud: 'fraud',\n NotSpam: 'not-spam',\n Other: 'other',\n Virus: 'virus',\n} as const;\n\nexport type SesComplaintType = (typeof SES_COMPLAINT_TYPE)[keyof typeof SES_COMPLAINT_TYPE];\n\nexport const SNS_MESSAGE_TYPE = {\n Notification: 'Notification',\n SubscriptionConfirmation: 'SubscriptionConfirmation',\n UnsubscribeConfirmation: 'UnsubscribeConfirmation',\n} as const;\n\nexport type SnsMessageType = (typeof SNS_MESSAGE_TYPE)[keyof typeof SNS_MESSAGE_TYPE];\n\nexport const SES_NOTIFICATION_TYPE = {\n Bounce: 'Bounce',\n Complaint: 'Complaint',\n Delivery: 'Delivery',\n Send: 'Send',\n Open: 'Open',\n Click: 'Click',\n} as const;\n\nexport type SesNotificationType = (typeof SES_NOTIFICATION_TYPE)[keyof typeof SES_NOTIFICATION_TYPE];\n","import { Schema, Model, HydratedDocument } from 'mongoose';\nimport { ACCOUNT_PROVIDER, ACCOUNT_STATUS } from '../constants';\nimport type { AccountProvider, AccountStatus } from '../constants';\nimport type { WarmupPhase } from '../types/config.types';\n\nexport interface IEmailAccount {\n email: string;\n senderName: string;\n provider: AccountProvider;\n status: AccountStatus;\n\n smtp: { host: string; port: number; user: string; pass: string };\n imap?: { host: string; port: number; user: string; pass: string };\n ses?: { region: string; configurationSet?: string };\n\n limits: { dailyMax: number };\n\n health: {\n score: number;\n consecutiveErrors: number;\n bounceCount: number;\n thresholds: {\n minScore: number;\n maxBounceRate: number;\n maxConsecutiveErrors: number;\n };\n };\n\n warmup: {\n enabled: boolean;\n startedAt?: Date;\n completedAt?: Date;\n currentDay: number;\n schedule: WarmupPhase[];\n };\n\n totalEmailsSent: number;\n lastSuccessfulSendAt?: Date;\n lastImapCheckAt?: Date;\n\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type EmailAccountDocument = HydratedDocument<IEmailAccount>;\n\nexport interface EmailAccountStatics {\n findActive(): Promise<EmailAccountDocument[]>;\n findByProvider(provider: AccountProvider): Promise<EmailAccountDocument[]>;\n findByEmail(email: string): Promise<EmailAccountDocument | null>;\n getBestAvailable(): Promise<EmailAccountDocument | null>;\n}\n\nexport type EmailAccountModel = Model<IEmailAccount> & EmailAccountStatics;\n\nexport interface CreateEmailAccountSchemaOptions {\n collectionName?: string;\n}\n\nexport function createEmailAccountSchema(options?: CreateEmailAccountSchemaOptions) {\n const schema = new Schema<IEmailAccount>(\n {\n email: { type: String, required: true, unique: true, lowercase: true },\n senderName: { type: String, required: true },\n provider: { type: String, enum: Object.values(ACCOUNT_PROVIDER), required: true },\n status: {\n type: String,\n enum: Object.values(ACCOUNT_STATUS),\n default: ACCOUNT_STATUS.Active,\n index: true,\n },\n\n // WARNING: SMTP/IMAP credentials are stored as plaintext in the database.\n // Consumers MUST encrypt `smtp.pass` and `imap.pass` at the application layer\n // before storing, and decrypt after retrieval. A built-in encryption layer\n // is planned for a future version.\n smtp: {\n type: {\n host: { type: String, required: true },\n port: { type: Number, required: true },\n user: { type: String, required: true },\n pass: { type: String, required: true },\n },\n required: true,\n _id: false,\n },\n\n imap: {\n type: {\n host: { type: String, required: true },\n port: { type: Number, required: true },\n user: { type: String, required: true },\n pass: { type: String, required: true },\n },\n _id: false,\n },\n\n ses: {\n type: {\n region: { type: String, required: true },\n configurationSet: String,\n },\n _id: false,\n },\n\n limits: {\n type: {\n dailyMax: { type: Number, required: true, default: 100 },\n },\n required: true,\n _id: false,\n },\n\n health: {\n type: {\n score: { type: Number, default: 100, min: 0, max: 100 },\n consecutiveErrors: { type: Number, default: 0 },\n bounceCount: { type: Number, default: 0 },\n thresholds: {\n type: {\n minScore: { type: Number, default: 50 },\n maxBounceRate: { type: Number, default: 5 },\n maxConsecutiveErrors: { type: Number, default: 10 },\n },\n _id: false,\n },\n },\n required: true,\n _id: false,\n },\n\n warmup: {\n type: {\n enabled: { type: Boolean, default: true },\n startedAt: Date,\n completedAt: Date,\n currentDay: { type: Number, default: 1 },\n schedule: [{\n days: { type: [Number], required: true },\n dailyLimit: { type: Number, required: true },\n delayMinMs: { type: Number, required: true },\n delayMaxMs: { type: Number, required: true },\n _id: false,\n }],\n },\n required: true,\n _id: false,\n },\n\n totalEmailsSent: { type: Number, default: 0 },\n lastSuccessfulSendAt: Date,\n lastImapCheckAt: Date,\n },\n {\n timestamps: true,\n collection: options?.collectionName || 'email_accounts',\n\n statics: {\n findActive() {\n return this.find({\n status: { $in: [ACCOUNT_STATUS.Active, ACCOUNT_STATUS.Warmup] },\n });\n },\n\n findByProvider(provider: AccountProvider) {\n return this.find({ provider });\n },\n\n findByEmail(email: string) {\n return this.findOne({ email: email.toLowerCase().trim() });\n },\n\n async getBestAvailable(): Promise<EmailAccountDocument | null> {\n const accounts: EmailAccountDocument[] = await this.find({\n status: { $in: [ACCOUNT_STATUS.Active, ACCOUNT_STATUS.Warmup] },\n });\n\n if (accounts.length === 0) return null;\n\n return accounts\n .sort((a, b) => b.health.score - a.health.score)[0] || null;\n },\n },\n },\n );\n\n schema.index({ status: 1, 'health.score': -1 });\n schema.index({ 'health.score': -1 });\n schema.index({ provider: 1 });\n\n return schema;\n}\n","import { Schema, Model, Types, HydratedDocument } from 'mongoose';\n\nexport interface IEmailDailyStats {\n accountId: Types.ObjectId;\n date: string;\n sent: number;\n failed: number;\n bounced: number;\n delivered: number;\n complained: number;\n opened: number;\n clicked: number;\n unsubscribed: number;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type EmailDailyStatsDocument = HydratedDocument<IEmailDailyStats>;\n\nexport interface EmailDailyStatsStatics {\n incrementStat(accountId: string, field: string, count?: number, date?: string): Promise<EmailDailyStatsDocument>;\n getForAccount(accountId: string, days?: number): Promise<EmailDailyStatsDocument[]>;\n getForDate(date: string): Promise<EmailDailyStatsDocument[]>;\n}\n\nexport type EmailDailyStatsModel = Model<IEmailDailyStats> & EmailDailyStatsStatics;\n\nexport interface CreateEmailDailyStatsSchemaOptions {\n collectionName?: string;\n}\n\nexport function createEmailDailyStatsSchema(options?: CreateEmailDailyStatsSchemaOptions) {\n const schema = new Schema<IEmailDailyStats>(\n {\n accountId: { type: Schema.Types.ObjectId, required: true, index: true },\n date: { type: String, required: true, index: true },\n sent: { type: Number, default: 0 },\n failed: { type: Number, default: 0 },\n bounced: { type: Number, default: 0 },\n delivered: { type: Number, default: 0 },\n complained: { type: Number, default: 0 },\n opened: { type: Number, default: 0 },\n clicked: { type: Number, default: 0 },\n unsubscribed: { type: Number, default: 0 },\n },\n {\n timestamps: true,\n collection: options?.collectionName || 'email_daily_stats',\n\n statics: {\n incrementStat(accountId: string, field: string, count = 1, date?: string) {\n const targetDate = date || new Date().toISOString().split('T')[0];\n const update: Record<string, number> = {};\n update[field] = count;\n\n return this.findOneAndUpdate(\n { accountId: new Types.ObjectId(accountId), date: targetDate },\n { $inc: update },\n { upsert: true, new: true },\n );\n },\n\n getForAccount(accountId: string, days = 30) {\n const startDate = new Date();\n startDate.setDate(startDate.getDate() - days);\n const startDateStr = startDate.toISOString().split('T')[0];\n\n return this.find({\n accountId: new Types.ObjectId(accountId),\n date: { $gte: startDateStr },\n }).sort({ date: -1 });\n },\n\n getForDate(date: string) {\n return this.find({ date });\n },\n },\n },\n );\n\n schema.index({ accountId: 1, date: -1 }, { unique: true });\n\n return schema;\n}\n","import { Schema, Model, HydratedDocument } from 'mongoose';\nimport { IDENTIFIER_STATUS, BOUNCE_TYPE } from '../constants';\nimport type { IdentifierStatus, BounceType } from '../constants';\n\nexport interface IEmailIdentifier {\n email: string;\n status: IdentifierStatus;\n sentCount: number;\n bounceCount: number;\n lastSentAt?: Date;\n lastBouncedAt?: Date;\n bounceType?: BounceType;\n unsubscribedAt?: Date;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type EmailIdentifierDocument = HydratedDocument<IEmailIdentifier>;\n\nexport interface EmailIdentifierStatics {\n findOrCreate(email: string): Promise<{ identifier: EmailIdentifierDocument; created: boolean }>;\n markBounced(email: string, bounceType: BounceType): Promise<EmailIdentifierDocument | null>;\n markUnsubscribed(email: string): Promise<EmailIdentifierDocument | null>;\n incrementSentCount(email: string): Promise<EmailIdentifierDocument | null>;\n findByEmail(email: string): Promise<EmailIdentifierDocument | null>;\n}\n\nexport type EmailIdentifierModel = Model<IEmailIdentifier> & EmailIdentifierStatics;\n\nexport interface CreateEmailIdentifierSchemaOptions {\n collectionName?: string;\n}\n\nexport function createEmailIdentifierSchema(options?: CreateEmailIdentifierSchemaOptions) {\n const schema = new Schema<IEmailIdentifier>(\n {\n email: { type: String, required: true, unique: true, lowercase: true },\n status: {\n type: String,\n enum: Object.values(IDENTIFIER_STATUS),\n default: IDENTIFIER_STATUS.Active,\n index: true,\n },\n sentCount: { type: Number, default: 0 },\n bounceCount: { type: Number, default: 0 },\n lastSentAt: Date,\n lastBouncedAt: Date,\n bounceType: { type: String, enum: Object.values(BOUNCE_TYPE) },\n unsubscribedAt: Date,\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n collection: options?.collectionName || 'email_identifiers',\n\n statics: {\n async findOrCreate(email: string) {\n const normalized = email.toLowerCase().trim();\n const existing = await this.findOne({ email: normalized });\n if (existing) {\n return { identifier: existing, created: false };\n }\n const identifier = await this.findOneAndUpdate(\n { email: normalized },\n {\n $setOnInsert: {\n email: normalized,\n status: IDENTIFIER_STATUS.Active,\n sentCount: 0,\n bounceCount: 0,\n },\n },\n { upsert: true, new: true },\n );\n return { identifier: identifier!, created: true };\n },\n\n markBounced(email: string, bounceType: BounceType) {\n const normalized = email.toLowerCase().trim();\n return this.findOneAndUpdate(\n { email: normalized },\n {\n $set: {\n status: IDENTIFIER_STATUS.Bounced,\n bounceType,\n lastBouncedAt: new Date(),\n },\n $inc: { bounceCount: 1 },\n },\n { new: true },\n );\n },\n\n markUnsubscribed(email: string) {\n const normalized = email.toLowerCase().trim();\n return this.findOneAndUpdate(\n { email: normalized },\n {\n $set: {\n status: IDENTIFIER_STATUS.Unsubscribed,\n unsubscribedAt: new Date(),\n },\n },\n { new: true },\n );\n },\n\n incrementSentCount(email: string) {\n const normalized = email.toLowerCase().trim();\n return this.findOneAndUpdate(\n { email: normalized },\n {\n $inc: { sentCount: 1 },\n $set: { lastSentAt: new Date() },\n },\n { new: true, upsert: true },\n );\n },\n\n findByEmail(email: string) {\n const normalized = email.toLowerCase().trim();\n return this.findOne({ email: normalized });\n },\n },\n },\n );\n\n schema.index({ email: 1 }, { unique: true });\n schema.index({ status: 1 });\n\n return schema;\n}\n","import { Schema, Model, Types, HydratedDocument } from 'mongoose';\nimport { DRAFT_STATUS } from '../constants';\nimport type { DraftStatus } from '../constants';\n\nexport interface IEmailDraft {\n to: string;\n subject: string;\n htmlBody: string;\n textBody?: string;\n accountId: Types.ObjectId;\n status: DraftStatus;\n approvedAt?: Date;\n rejectedAt?: Date;\n rejectionReason?: string;\n sentAt?: Date;\n scheduledAt?: Date;\n failureReason?: string;\n metadata?: Record<string, unknown>;\n createdAt: Date;\n updatedAt: Date;\n}\n\nexport type EmailDraftDocument = HydratedDocument<IEmailDraft>;\n\nexport interface EmailDraftStatics {\n findPending(limit?: number): Promise<EmailDraftDocument[]>;\n findByStatus(status: DraftStatus, limit?: number): Promise<EmailDraftDocument[]>;\n countByStatus(): Promise<Record<string, number>>;\n}\n\nexport type EmailDraftModel = Model<IEmailDraft> & EmailDraftStatics;\n\nexport interface CreateEmailDraftSchemaOptions {\n collectionName?: string;\n}\n\nexport function createEmailDraftSchema(options?: CreateEmailDraftSchemaOptions) {\n const schema = new Schema<IEmailDraft>(\n {\n to: { type: String, required: true, lowercase: true },\n subject: { type: String, required: true },\n htmlBody: { type: String, required: true },\n textBody: String,\n accountId: { type: Schema.Types.ObjectId, required: true, index: true },\n status: {\n type: String,\n enum: Object.values(DRAFT_STATUS),\n default: DRAFT_STATUS.Pending,\n index: true,\n },\n approvedAt: Date,\n rejectedAt: Date,\n rejectionReason: String,\n sentAt: Date,\n scheduledAt: Date,\n failureReason: String,\n metadata: { type: Schema.Types.Mixed },\n },\n {\n timestamps: true,\n collection: options?.collectionName || 'email_drafts',\n\n statics: {\n findPending(limit = 50) {\n return this.find({ status: DRAFT_STATUS.Pending })\n .sort({ createdAt: -1 })\n .limit(limit);\n },\n\n findByStatus(status: DraftStatus, limit = 50) {\n return this.find({ status })\n .sort({ createdAt: -1 })\n .limit(limit);\n },\n\n async countByStatus() {\n const results = await this.aggregate([\n { $group: { _id: '$status', count: { $sum: 1 } } },\n ]);\n\n const counts: Record<string, number> = {};\n for (const status of Object.values(DRAFT_STATUS)) {\n counts[status] = 0;\n }\n for (const result of results) {\n counts[result._id] = result.count;\n }\n return counts;\n },\n },\n },\n );\n\n schema.index({ status: 1, createdAt: -1 });\n schema.index({ accountId: 1, status: 1 });\n\n return schema;\n}\n","import { Schema, Model, HydratedDocument } from 'mongoose';\nimport type { GlobalSettings } from '../types/settings.types';\n\nexport interface IGlobalSettings extends Omit<GlobalSettings, '_id'> {\n _id: string;\n}\n\nexport type GlobalSettingsDocument = HydratedDocument<IGlobalSettings>;\n\nexport interface GlobalSettingsStatics {\n getSettings(): Promise<GlobalSettingsDocument>;\n updateSettings(partial: Partial<Omit<GlobalSettings, '_id' | 'updatedAt'>>): Promise<GlobalSettingsDocument>;\n}\n\nexport type GlobalSettingsModel = Model<IGlobalSettings> & GlobalSettingsStatics;\n\nconst DEFAULT_SETTINGS: Omit<GlobalSettings, '_id' | 'updatedAt'> = {\n timezone: 'UTC',\n devMode: {\n enabled: false,\n testEmails: [],\n },\n imap: {\n enabled: false,\n pollIntervalMs: 300000,\n searchSince: 'last_check',\n bounceSenders: ['mailer-daemon@googlemail.com'],\n },\n ses: {\n configurationSet: undefined,\n trackOpens: true,\n trackClicks: true,\n },\n approval: {\n enabled: false,\n defaultMode: 'manual',\n autoApproveDelayMs: 0,\n sendWindow: {\n timezone: 'UTC',\n startHour: 9,\n endHour: 21,\n },\n spreadStrategy: 'random',\n maxSpreadMinutes: 120,\n },\n unsubscribePage: {\n companyName: '',\n logoUrl: undefined,\n accentColor: undefined,\n },\n queues: {\n sendConcurrency: 3,\n sendAttempts: 3,\n sendBackoffMs: 5000,\n approvalConcurrency: 1,\n approvalAttempts: 3,\n approvalBackoffMs: 10000,\n },\n};\n\nexport interface CreateGlobalSettingsSchemaOptions {\n collectionName?: string;\n}\n\nexport function createGlobalSettingsSchema(options?: CreateGlobalSettingsSchemaOptions) {\n const schema = new Schema<IGlobalSettings>(\n {\n _id: { type: String, default: 'global' },\n\n timezone: { type: String, default: DEFAULT_SETTINGS.timezone },\n\n devMode: {\n type: {\n enabled: { type: Boolean, default: false },\n testEmails: [{ type: String }],\n },\n default: () => ({ ...DEFAULT_SETTINGS.devMode }),\n _id: false,\n },\n\n imap: {\n type: {\n enabled: { type: Boolean, default: false },\n pollIntervalMs: { type: Number, default: 300000 },\n searchSince: { type: String, enum: ['last_check', 'last_24h', 'last_7d'], default: 'last_check' },\n bounceSenders: [{ type: String }],\n },\n default: () => ({ ...DEFAULT_SETTINGS.imap }),\n _id: false,\n },\n\n ses: {\n type: {\n configurationSet: String,\n trackOpens: { type: Boolean, default: true },\n trackClicks: { type: Boolean, default: true },\n },\n default: () => ({ ...DEFAULT_SETTINGS.ses }),\n _id: false,\n },\n\n approval: {\n type: {\n enabled: { type: Boolean, default: false },\n defaultMode: { type: String, enum: ['manual', 'auto'], default: 'manual' },\n autoApproveDelayMs: { type: Number, default: 0 },\n sendWindow: {\n type: {\n timezone: { type: String, default: 'UTC' },\n startHour: { type: Number, default: 9, min: 0, max: 23 },\n endHour: { type: Number, default: 21, min: 0, max: 23 },\n },\n _id: false,\n },\n spreadStrategy: { type: String, enum: ['random', 'even'], default: 'random' },\n maxSpreadMinutes: { type: Number, default: 120 },\n },\n default: () => ({ ...DEFAULT_SETTINGS.approval, sendWindow: { ...DEFAULT_SETTINGS.approval.sendWindow } }),\n _id: false,\n },\n\n unsubscribePage: {\n type: {\n companyName: { type: String, default: '' },\n logoUrl: String,\n accentColor: String,\n },\n default: () => ({ ...DEFAULT_SETTINGS.unsubscribePage }),\n _id: false,\n },\n\n queues: {\n type: {\n sendConcurrency: { type: Number, default: 3 },\n sendAttempts: { type: Number, default: 3 },\n sendBackoffMs: { type: Number, default: 5000 },\n approvalConcurrency: { type: Number, default: 1 },\n approvalAttempts: { type: Number, default: 3 },\n approvalBackoffMs: { type: Number, default: 10000 },\n },\n default: () => ({ ...DEFAULT_SETTINGS.queues }),\n _id: false,\n },\n },\n {\n timestamps: { createdAt: false, updatedAt: true },\n collection: options?.collectionName || 'global_settings',\n\n statics: {\n async getSettings(): Promise<GlobalSettingsDocument> {\n let doc = await this.findById('global');\n if (!doc) {\n doc = await this.create({ _id: 'global', ...DEFAULT_SETTINGS });\n }\n return doc;\n },\n\n async updateSettings(partial: Partial<Omit<GlobalSettings, '_id' | 'updatedAt'>>): Promise<GlobalSettingsDocument> {\n const flatUpdate: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(partial)) {\n if (value !== undefined && typeof value === 'object' && !Array.isArray(value)) {\n for (const [subKey, subValue] of Object.entries(value as unknown as Record<string, unknown>)) {\n flatUpdate[`${key}.${subKey}`] = subValue;\n }\n } else {\n flatUpdate[key] = value;\n }\n }\n\n const doc = await this.findOneAndUpdate(\n { _id: 'global' },\n { $set: flatUpdate },\n { new: true, upsert: true },\n );\n return doc!;\n },\n },\n },\n );\n\n return schema;\n}\n","import type { GlobalSettings, UpdateGlobalSettingsInput } from '../types/settings.types';\nimport type { LogAdapter } from '../types/config.types';\nimport type { GlobalSettingsModel } from '../schemas/global-settings.schema';\n\nconst DEFAULTS: Omit<GlobalSettings, '_id' | 'updatedAt'> = {\n timezone: 'UTC',\n devMode: { enabled: false, testEmails: [] },\n imap: {\n enabled: false,\n pollIntervalMs: 300000,\n searchSince: 'last_check',\n bounceSenders: ['mailer-daemon@googlemail.com'],\n },\n ses: { trackOpens: true, trackClicks: true },\n approval: {\n enabled: false,\n defaultMode: 'manual',\n autoApproveDelayMs: 0,\n sendWindow: { timezone: 'UTC', startHour: 9, endHour: 21 },\n spreadStrategy: 'random',\n maxSpreadMinutes: 120,\n },\n unsubscribePage: { companyName: '' },\n queues: {\n sendConcurrency: 3,\n sendAttempts: 3,\n sendBackoffMs: 5000,\n approvalConcurrency: 1,\n approvalAttempts: 3,\n approvalBackoffMs: 10000,\n },\n};\n\nexport class SettingsService {\n private cache: GlobalSettings | null = null;\n\n constructor(\n private GlobalSettings: GlobalSettingsModel,\n private logger: LogAdapter,\n ) {}\n\n async get(): Promise<GlobalSettings> {\n if (this.cache) return this.cache;\n\n let doc = await this.GlobalSettings.findById('global').lean<GlobalSettings>();\n\n if (!doc) {\n doc = await this.GlobalSettings.create({\n _id: 'global',\n ...DEFAULTS,\n updatedAt: new Date(),\n }) as unknown as GlobalSettings;\n this.logger.info('GlobalSettings created with defaults');\n }\n\n this.cache = doc;\n return doc;\n }\n\n async update(partial: UpdateGlobalSettingsInput): Promise<GlobalSettings> {\n const flattened = flattenObject({ ...partial, updatedAt: new Date() });\n\n const doc = await this.GlobalSettings.findByIdAndUpdate(\n 'global',\n { $set: flattened },\n { new: true, upsert: true },\n ).lean<GlobalSettings>();\n\n this.cache = doc;\n this.logger.info('GlobalSettings updated', { sections: Object.keys(partial) });\n return doc!;\n }\n\n async updateSection(section: string, data: unknown): Promise<GlobalSettings> {\n const setFields: Record<string, unknown> = { updatedAt: new Date() };\n\n if (typeof data === 'object' && data !== null) {\n for (const [key, value] of Object.entries(data)) {\n setFields[`${section}.${key}`] = value;\n }\n } else {\n setFields[section] = data;\n }\n\n const doc = await this.GlobalSettings.findByIdAndUpdate(\n 'global',\n { $set: setFields },\n { new: true, upsert: true },\n ).lean<GlobalSettings>();\n\n this.cache = doc;\n this.logger.info('GlobalSettings section updated', { section });\n return doc!;\n }\n\n invalidateCache(): void {\n this.cache = null;\n }\n}\n\nfunction flattenObject(obj: Record<string, any>, prefix = ''): Record<string, any> {\n const result: Record<string, any> = {};\n for (const [key, value] of Object.entries(obj)) {\n const fullKey = prefix ? `${prefix}.${key}` : key;\n if (value && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date)) {\n Object.assign(result, flattenObject(value, fullKey));\n } else {\n result[fullKey] = value;\n }\n }\n return result;\n}\n","import type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport type { BounceType, IdentifierStatus } from '../constants';\nimport { IDENTIFIER_STATUS } from '../constants';\nimport type { EmailIdentifierDocument, EmailIdentifierModel } from '../schemas/email-identifier.schema';\n\nexport class IdentifierService {\n constructor(\n private EmailIdentifier: EmailIdentifierModel,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async findOrCreate(email: string): Promise<EmailIdentifierDocument> {\n const normalized = email.toLowerCase().trim();\n\n const doc = await this.EmailIdentifier.findOneAndUpdate(\n { email: normalized },\n {\n $setOnInsert: {\n email: normalized,\n status: IDENTIFIER_STATUS.Active,\n sentCount: 0,\n bounceCount: 0,\n },\n },\n { upsert: true, new: true },\n );\n\n return doc!;\n }\n\n async findByEmail(email: string): Promise<EmailIdentifierDocument | null> {\n return this.EmailIdentifier.findOne({ email: email.toLowerCase().trim() });\n }\n\n async markBounced(email: string, bounceType: BounceType): Promise<void> {\n const normalized = email.toLowerCase().trim();\n\n await this.EmailIdentifier.findOneAndUpdate(\n { email: normalized },\n {\n $set: {\n status: IDENTIFIER_STATUS.Bounced,\n bounceType,\n lastBouncedAt: new Date(),\n },\n $inc: { bounceCount: 1 },\n },\n { upsert: true },\n );\n\n this.logger.warn('Identifier marked bounced', { email: normalized, bounceType });\n this.hooks?.onBounce?.({ accountId: '', email: normalized, bounceType, provider: '' });\n }\n\n async markUnsubscribed(email: string): Promise<void> {\n const normalized = email.toLowerCase().trim();\n\n await this.EmailIdentifier.findOneAndUpdate(\n { email: normalized },\n {\n $set: {\n status: IDENTIFIER_STATUS.Unsubscribed,\n unsubscribedAt: new Date(),\n },\n },\n { upsert: true },\n );\n\n this.logger.info('Identifier marked unsubscribed', { email: normalized });\n this.hooks?.onUnsubscribe?.({ email: normalized });\n }\n\n async updateStatus(email: string, status: IdentifierStatus): Promise<void> {\n await this.EmailIdentifier.findOneAndUpdate(\n { email: email.toLowerCase().trim() },\n { $set: { status } },\n );\n }\n\n async incrementSentCount(email: string): Promise<void> {\n await this.EmailIdentifier.findOneAndUpdate(\n { email: email.toLowerCase().trim() },\n {\n $inc: { sentCount: 1 },\n $set: { lastSentAt: new Date() },\n },\n );\n }\n\n async merge(sourceEmail: string, targetEmail: string): Promise<void> {\n const source = await this.findByEmail(sourceEmail);\n const target = await this.findByEmail(targetEmail);\n\n if (!source) {\n this.logger.warn('Merge source not found', { sourceEmail });\n return;\n }\n\n if (!target) {\n await this.EmailIdentifier.findOneAndUpdate(\n { email: sourceEmail.toLowerCase().trim() },\n { $set: { email: targetEmail.toLowerCase().trim() } },\n );\n return;\n }\n\n await this.EmailIdentifier.findByIdAndUpdate(target._id, {\n $inc: {\n sentCount: source.sentCount || 0,\n bounceCount: source.bounceCount || 0,\n },\n $set: {\n ...(source.lastSentAt && (!target.lastSentAt || source.lastSentAt > target.lastSentAt)\n ? { lastSentAt: source.lastSentAt }\n : {}),\n ...(source.metadata\n ? { metadata: { ...source.metadata, ...(target.metadata || {}) } }\n : {}),\n },\n });\n\n await this.EmailIdentifier.findByIdAndDelete(source._id);\n this.logger.info('Identifiers merged', { sourceEmail, targetEmail });\n }\n\n async list(\n filters?: { status?: string },\n page = 1,\n limit = 50,\n ): Promise<{ items: EmailIdentifierDocument[]; total: number }> {\n const query: Record<string, unknown> = {};\n if (filters?.status) query.status = filters.status;\n\n const [items, total] = await Promise.all([\n this.EmailIdentifier.find(query)\n .sort({ updatedAt: -1 })\n .skip((page - 1) * limit)\n .limit(limit),\n this.EmailIdentifier.countDocuments(query),\n ]);\n\n return { items, total };\n }\n}\n","import type { AccountHealth } from '../types/account.types';\nimport type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport type { BounceType } from '../constants';\nimport { ACCOUNT_STATUS } from '../constants';\nimport type { SettingsService } from './settings.service';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\nimport type { EmailDailyStatsModel } from '../schemas/email-daily-stats.schema';\n\nexport class HealthTracker {\n constructor(\n private EmailAccount: EmailAccountModel,\n private EmailDailyStats: EmailDailyStatsModel,\n private settings: SettingsService,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async recordSuccess(accountId: string): Promise<void> {\n const updated = await this.EmailAccount.findByIdAndUpdate(\n accountId,\n [\n {\n $set: {\n 'health.score': { $min: [100, { $add: ['$health.score', 1] }] },\n 'health.consecutiveErrors': 0,\n lastSuccessfulSendAt: new Date(),\n totalEmailsSent: { $add: ['$totalEmailsSent', 1] },\n },\n },\n ],\n { new: true },\n );\n\n if (!updated) return;\n\n const dateStr = await this.getTodayDateString();\n await this.incrementDailyStat(accountId, 'sent', 1, dateStr);\n }\n\n async recordError(accountId: string, error: string): Promise<void> {\n const updated = await this.EmailAccount.findByIdAndUpdate(\n accountId,\n [\n {\n $set: {\n 'health.score': { $max: [0, { $subtract: ['$health.score', 5] }] },\n 'health.consecutiveErrors': { $add: ['$health.consecutiveErrors', 1] },\n },\n },\n ],\n { new: true },\n );\n\n if (!updated) return;\n\n const acct = updated as any;\n const newScore = acct.health.score;\n const newErrors = acct.health.consecutiveErrors;\n\n this.logger.warn('Account health degraded', {\n accountId,\n error,\n score: newScore,\n consecutiveErrors: newErrors,\n });\n\n this.hooks?.onHealthDegraded?.({ accountId, healthScore: newScore });\n\n const thresholds = acct.health.thresholds;\n const shouldDisable =\n newScore < thresholds.minScore ||\n newErrors > thresholds.maxConsecutiveErrors;\n\n if (shouldDisable) {\n const reason = newScore < thresholds.minScore\n ? `Health score ${newScore} below minimum ${thresholds.minScore}`\n : `${newErrors} consecutive errors exceeds maximum ${thresholds.maxConsecutiveErrors}`;\n\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: { status: ACCOUNT_STATUS.Disabled },\n });\n\n this.logger.error('Account auto-disabled', { accountId, reason });\n this.hooks?.onAccountDisabled?.({ accountId, reason });\n }\n }\n\n async recordBounce(accountId: string, email: string, bounceType: BounceType): Promise<void> {\n const updated = await this.EmailAccount.findByIdAndUpdate(\n accountId,\n [\n {\n $set: {\n 'health.score': { $max: [0, { $subtract: ['$health.score', 10] }] },\n 'health.bounceCount': { $add: ['$health.bounceCount', 1] },\n },\n },\n ],\n { new: true },\n );\n\n if (!updated) return;\n\n const acct = updated as any;\n const newScore = acct.health.score;\n const newBounceCount = acct.health.bounceCount;\n const totalSent = acct.totalEmailsSent || 1;\n const bounceRate = (newBounceCount / totalSent) * 100;\n\n const dateStr = await this.getTodayDateString();\n await this.incrementDailyStat(accountId, 'bounced', 1, dateStr);\n\n this.logger.warn('Bounce recorded', { accountId, email, bounceType, score: newScore });\n this.hooks?.onBounce?.({\n accountId,\n email,\n bounceType,\n provider: acct.provider,\n });\n\n if (bounceRate > acct.health.thresholds.maxBounceRate) {\n const reason = `Bounce rate ${bounceRate.toFixed(1)}% exceeds maximum ${acct.health.thresholds.maxBounceRate}%`;\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: { status: ACCOUNT_STATUS.Disabled },\n });\n this.logger.error('Account auto-disabled due to bounce rate', { accountId, reason });\n this.hooks?.onAccountDisabled?.({ accountId, reason });\n }\n }\n\n async getHealth(accountId: string): Promise<AccountHealth | null> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return null;\n return this.toAccountHealth(account);\n }\n\n async getAllHealth(): Promise<AccountHealth[]> {\n const accounts = await this.EmailAccount.find();\n return accounts.map((a) => this.toAccountHealth(a));\n }\n\n private toAccountHealth(account: any): AccountHealth {\n return {\n accountId: account._id.toString(),\n email: account.email,\n score: account.health.score,\n consecutiveErrors: account.health.consecutiveErrors,\n bounceCount: account.health.bounceCount,\n thresholds: account.health.thresholds,\n status: account.status,\n };\n }\n\n private async getTodayDateString(): Promise<string> {\n const globalSettings = await this.settings.get();\n const tz = globalSettings.timezone || 'UTC';\n const now = new Date();\n const formatted = now.toLocaleDateString('en-CA', { timeZone: tz });\n return formatted;\n }\n\n private async incrementDailyStat(\n accountId: string,\n field: string,\n amount: number,\n date: string,\n ): Promise<void> {\n await this.EmailDailyStats.findOneAndUpdate(\n { accountId, date },\n { $inc: { [field]: amount } },\n { upsert: true },\n );\n }\n}\n","import type { LogAdapter, EmailAccountManagerConfig, WarmupPhase } from '../types/config.types';\nimport { ACCOUNT_STATUS } from '../constants';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\n\nexport interface WarmupStatus {\n accountId: string;\n email: string;\n enabled: boolean;\n currentDay: number;\n startedAt?: Date;\n completedAt?: Date;\n currentPhase: WarmupPhase | null;\n dailyLimit: number;\n delayRange: { min: number; max: number };\n}\n\nexport class WarmupManager {\n constructor(\n private EmailAccount: EmailAccountModel,\n private config: EmailAccountManagerConfig,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async startWarmup(accountId: string): Promise<void> {\n const defaultSchedule = this.config.options?.warmup?.defaultSchedule;\n\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: {\n 'warmup.enabled': true,\n 'warmup.startedAt': new Date(),\n 'warmup.completedAt': null,\n 'warmup.currentDay': 1,\n status: ACCOUNT_STATUS.Warmup,\n ...(defaultSchedule ? { 'warmup.schedule': defaultSchedule } : {}),\n },\n });\n\n this.logger.info('Warmup started', { accountId });\n }\n\n async completeWarmup(accountId: string): Promise<void> {\n const account = await this.EmailAccount.findByIdAndUpdate(\n accountId,\n {\n $set: {\n 'warmup.enabled': false,\n 'warmup.completedAt': new Date(),\n status: ACCOUNT_STATUS.Active,\n },\n },\n { new: true },\n );\n\n if (account) {\n this.logger.info('Warmup completed', { accountId, email: (account as any).email });\n this.hooks?.onWarmupComplete?.({\n accountId,\n email: (account as any).email,\n });\n }\n }\n\n async resetWarmup(accountId: string): Promise<void> {\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: {\n 'warmup.enabled': true,\n 'warmup.startedAt': new Date(),\n 'warmup.completedAt': null,\n 'warmup.currentDay': 1,\n status: ACCOUNT_STATUS.Warmup,\n },\n });\n\n this.logger.info('Warmup reset', { accountId });\n }\n\n async getCurrentPhase(accountId: string): Promise<WarmupPhase | null> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return null;\n\n const warmup = (account as any).warmup;\n if (!warmup?.enabled || !warmup.schedule) return null;\n\n return this.findPhaseForDay(warmup.schedule, warmup.currentDay);\n }\n\n async getRecommendedDelay(accountId: string): Promise<number> {\n const phase = await this.getCurrentPhase(accountId);\n if (!phase) return 0;\n\n return Math.floor(Math.random() * (phase.delayMaxMs - phase.delayMinMs + 1)) + phase.delayMinMs;\n }\n\n async getDailyLimit(accountId: string): Promise<number> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return 0;\n\n const warmup = (account as any).warmup;\n if (!warmup?.enabled) return (account as any).limits.dailyMax;\n\n const phase = this.findPhaseForDay(warmup.schedule, warmup.currentDay);\n return phase ? phase.dailyLimit : (account as any).limits.dailyMax;\n }\n\n async advanceDay(accountId: string): Promise<void> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return;\n\n const warmup = (account as any).warmup;\n if (!warmup?.enabled) return;\n\n const nextDay = warmup.currentDay + 1;\n const maxDay = this.getMaxDay(warmup.schedule);\n\n if (maxDay > 0 && nextDay > maxDay) {\n await this.completeWarmup(accountId);\n } else {\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: { 'warmup.currentDay': nextDay },\n });\n }\n }\n\n async getStatus(accountId: string): Promise<WarmupStatus | null> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return null;\n\n const acct = account as any;\n const warmup = acct.warmup;\n const phase = warmup?.schedule\n ? this.findPhaseForDay(warmup.schedule, warmup.currentDay)\n : null;\n\n return {\n accountId: acct._id.toString(),\n email: acct.email,\n enabled: warmup?.enabled ?? false,\n currentDay: warmup?.currentDay ?? 0,\n startedAt: warmup?.startedAt,\n completedAt: warmup?.completedAt,\n currentPhase: phase,\n dailyLimit: phase ? phase.dailyLimit : acct.limits.dailyMax,\n delayRange: phase\n ? { min: phase.delayMinMs, max: phase.delayMaxMs }\n : { min: 0, max: 0 },\n };\n }\n\n async updateSchedule(accountId: string, schedule: WarmupPhase[]): Promise<void> {\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: { 'warmup.schedule': schedule },\n });\n this.logger.info('Warmup schedule updated', { accountId, phases: schedule.length });\n }\n\n private findPhaseForDay(schedule: WarmupPhase[], day: number): WarmupPhase | null {\n for (const phase of schedule) {\n const [start, end] = phase.days;\n if (end === 0) {\n if (day >= start) return phase;\n } else {\n if (day >= start && day <= end) return phase;\n }\n }\n return null;\n }\n\n private getMaxDay(schedule: WarmupPhase[]): number {\n let max = 0;\n for (const phase of schedule) {\n if (phase.days[1] === 0) return 0;\n if (phase.days[1] > max) max = phase.days[1];\n }\n return max;\n }\n}\n","import type { AccountCapacity } from '../types/account.types';\nimport type { LogAdapter } from '../types/config.types';\nimport { ACCOUNT_STATUS } from '../constants';\nimport type { WarmupManager } from './warmup-manager';\nimport type { SettingsService } from './settings.service';\nimport type { EmailAccountDocument, EmailAccountModel } from '../schemas/email-account.schema';\nimport type { EmailDailyStatsModel } from '../schemas/email-daily-stats.schema';\n\nexport class CapacityManager {\n constructor(\n private EmailAccount: EmailAccountModel,\n private EmailDailyStats: EmailDailyStatsModel,\n private warmupManager: WarmupManager,\n private settings: SettingsService,\n private logger: LogAdapter,\n ) {}\n\n async getBestAccount(): Promise<EmailAccountDocument | null> {\n const accounts = await this.EmailAccount.find({\n status: { $in: [ACCOUNT_STATUS.Active, ACCOUNT_STATUS.Warmup] },\n }).sort({ 'health.score': -1 });\n\n for (const account of accounts) {\n const acct = account as any;\n const capacity = await this.getAccountCapacity(acct._id.toString());\n if (capacity.remaining > 0) {\n return account;\n }\n }\n\n return null;\n }\n\n async getAccountCapacity(accountId: string): Promise<AccountCapacity> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) {\n return {\n accountId,\n email: '',\n provider: 'gmail' as any,\n dailyMax: 0,\n sentToday: 0,\n remaining: 0,\n usagePercent: 0,\n };\n }\n\n const acct = account as any;\n const sentToday = await this.getSentToday(accountId);\n const dailyMax = await this.getDailyLimit(acct);\n const remaining = Math.max(0, dailyMax - sentToday);\n const usagePercent = dailyMax > 0 ? Math.round((sentToday / dailyMax) * 100) : 0;\n\n return {\n accountId: acct._id.toString(),\n email: acct.email,\n provider: acct.provider,\n dailyMax,\n sentToday,\n remaining,\n usagePercent,\n };\n }\n\n async getAllCapacity(): Promise<{ accounts: AccountCapacity[]; totalRemaining: number }> {\n const accounts = await this.EmailAccount.find({\n status: { $in: [ACCOUNT_STATUS.Active, ACCOUNT_STATUS.Warmup] },\n });\n\n const capacities = await Promise.all(\n accounts.map((a) => this.getAccountCapacity((a as any)._id.toString())),\n );\n\n const totalRemaining = capacities.reduce((sum, c) => sum + c.remaining, 0);\n\n return { accounts: capacities, totalRemaining };\n }\n\n private async getSentToday(accountId: string): Promise<number> {\n const dateStr = await this.getTodayDateString();\n const stat = await this.EmailDailyStats.findOne({ accountId, date: dateStr });\n return stat?.sent || 0;\n }\n\n private async getDailyLimit(account: any): Promise<number> {\n if (account.warmup?.enabled) {\n const warmupLimit = await this.warmupManager.getDailyLimit(account._id.toString());\n return warmupLimit;\n }\n return account.limits.dailyMax;\n }\n\n private async getTodayDateString(): Promise<string> {\n const globalSettings = await this.settings.get();\n const tz = globalSettings.timezone || 'UTC';\n return new Date().toLocaleDateString('en-CA', { timeZone: tz });\n }\n}\n","import crypto from 'crypto';\nimport type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport { IDENTIFIER_STATUS } from '../constants';\nimport { InvalidTokenError } from '../errors';\nimport type { EmailIdentifierModel } from '../schemas/email-identifier.schema';\n\nconst SEPARATOR = '|';\n\nexport class UnsubscribeService {\n constructor(\n private EmailIdentifier: EmailIdentifierModel,\n private config: EmailAccountManagerConfig,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n generateUrl(email: string, accountId?: string): string {\n const customGenerator = this.config.options?.unsubscribe?.generateUrl;\n if (customGenerator) {\n return customGenerator(email, accountId || '');\n }\n\n const builtin = this.config.options?.unsubscribe?.builtin;\n if (!builtin?.enabled || !builtin.baseUrl) {\n return '';\n }\n\n const token = this.generateToken(email);\n return `${builtin.baseUrl}?token=${token}`;\n }\n\n generateToken(email: string): string {\n const secret = this.config.options?.unsubscribe?.builtin?.secret;\n if (!secret) return '';\n\n const timestamp = Date.now().toString();\n const payload = `${email.toLowerCase()}${SEPARATOR}${timestamp}`;\n const signature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('base64url');\n const token = `${payload}${SEPARATOR}${signature}`;\n return Buffer.from(token).toString('base64url');\n }\n\n verifyToken(email: string, token: string): boolean {\n try {\n const secret = this.config.options?.unsubscribe?.builtin?.secret;\n if (!secret) return false;\n\n const decoded = Buffer.from(token, 'base64url').toString('utf-8');\n const parts = decoded.split(SEPARATOR);\n\n if (parts.length !== 3) return false;\n\n const [tokenEmail, timestampStr, providedSignature] = parts;\n const payload = `${tokenEmail}${SEPARATOR}${timestampStr}`;\n const expectedSignature = crypto\n .createHmac('sha256', secret)\n .update(payload)\n .digest('base64url');\n\n const sig1 = Buffer.from(providedSignature);\n const sig2 = Buffer.from(expectedSignature);\n\n if (sig1.length !== sig2.length || !crypto.timingSafeEqual(sig1, sig2)) {\n return false;\n }\n\n if (email && tokenEmail !== email.toLowerCase()) {\n return false;\n }\n\n const expiryDays = this.config.options?.unsubscribe?.builtin?.tokenExpiryDays;\n if (expiryDays) {\n const timestamp = parseInt(timestampStr, 10);\n const expiresAt = timestamp + expiryDays * 24 * 60 * 60 * 1000;\n if (Date.now() > expiresAt) return false;\n }\n\n return true;\n } catch {\n return false;\n }\n }\n\n async handleUnsubscribe(\n email: string,\n token: string,\n ): Promise<{ success: boolean; error?: string; email?: string }> {\n const decoded = Buffer.from(token, 'base64url').toString('utf-8');\n const parts = decoded.split(SEPARATOR);\n const tokenEmail = parts.length === 3 ? parts[0] : email;\n\n if (!this.verifyToken(tokenEmail, token)) {\n return { success: false, error: 'Invalid or expired unsubscribe link' };\n }\n\n const identifier = await this.EmailIdentifier.findOne({\n email: tokenEmail.toLowerCase(),\n });\n\n if (!identifier) {\n return { success: true, email: tokenEmail };\n }\n\n if ((identifier as any).status === IDENTIFIER_STATUS.Unsubscribed) {\n return { success: true, email: tokenEmail };\n }\n\n await this.EmailIdentifier.findByIdAndUpdate(identifier._id, {\n $set: {\n status: IDENTIFIER_STATUS.Unsubscribed,\n unsubscribedAt: new Date(),\n },\n });\n\n this.logger.info('Unsubscribe processed', { email: tokenEmail });\n this.hooks?.onUnsubscribe?.({ email: tokenEmail });\n\n return { success: true, email: tokenEmail };\n }\n\n getConfirmationHtml(email: string, success: boolean): string {\n const statusIcon = success ? '✓' : '✗';\n const statusColor = success ? '#22c55e' : '#ef4444';\n const title = success ? 'Unsubscribed' : 'Error';\n const message = success\n ? `${email ? email + ' has' : 'You have'} been unsubscribed successfully.`\n : 'Invalid or expired unsubscribe link. Please try again.';\n\n return `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n <meta charset=\"UTF-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n <title>Unsubscribe</title>\n <style>\n body {\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;\n display: flex;\n align-items: center;\n justify-content: center;\n min-height: 100vh;\n margin: 0;\n background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);\n }\n .card {\n background: white;\n padding: 40px 50px;\n border-radius: 16px;\n box-shadow: 0 10px 40px rgba(0,0,0,0.1);\n text-align: center;\n max-width: 400px;\n }\n .icon {\n font-size: 48px;\n color: ${statusColor};\n margin-bottom: 20px;\n }\n h1 { color: #1f2937; font-size: 24px; margin: 0 0 12px; }\n p { color: #6b7280; font-size: 16px; margin: 0; line-height: 1.5; }\n </style>\n</head>\n<body>\n <div class=\"card\">\n <div class=\"icon\">${statusIcon}</div>\n <h1>${title}</h1>\n <p>${message}</p>\n </div>\n</body>\n</html>`;\n }\n}\n","import { Queue, Worker, Job } from 'bullmq';\nimport type { Redis } from 'ioredis';\nimport type { EmailAccountManagerConfig, LogAdapter } from '../types/config.types';\nimport type { SettingsService } from './settings.service';\n\nexport interface QueueStats {\n waiting: number;\n active: number;\n completed: number;\n failed: number;\n delayed: number;\n}\n\nexport interface SendJobData {\n accountId: string;\n to: string;\n subject: string;\n html: string;\n text: string;\n unsubscribeUrl?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ApprovalJobData {\n draftId: string;\n scheduledAt?: string;\n}\n\nexport class QueueService {\n private sendQueue!: Queue;\n private approvalQueue!: Queue;\n private sendWorker!: Worker;\n private approvalWorker!: Worker;\n\n constructor(\n private redis: Redis,\n private config: EmailAccountManagerConfig,\n private settings: SettingsService,\n private logger: LogAdapter,\n ) {}\n\n async init(processors: {\n sendProcessor: (job: Job) => Promise<void>;\n approvalProcessor: (job: Job) => Promise<void>;\n }): Promise<void> {\n const keyPrefix = this.config.redis.keyPrefix || 'eam:';\n const sendQueueName = this.config.options?.queues?.sendQueueName || 'email-send';\n const approvalQueueName = this.config.options?.queues?.approvalQueueName || 'email-approved';\n\n const globalSettings = await this.settings.get();\n const queueSettings = globalSettings.queues;\n\n const redisConnection = this.redis as any;\n\n this.sendQueue = new Queue(sendQueueName, {\n connection: redisConnection,\n prefix: keyPrefix,\n });\n\n this.approvalQueue = new Queue(approvalQueueName, {\n connection: redisConnection,\n prefix: keyPrefix,\n });\n\n this.sendWorker = new Worker(\n sendQueueName,\n processors.sendProcessor,\n {\n connection: redisConnection,\n prefix: keyPrefix,\n concurrency: queueSettings.sendConcurrency,\n },\n );\n\n this.approvalWorker = new Worker(\n approvalQueueName,\n processors.approvalProcessor,\n {\n connection: redisConnection,\n prefix: keyPrefix,\n concurrency: queueSettings.approvalConcurrency,\n },\n );\n\n this.sendWorker.on('failed', (job, err) => {\n this.logger.error('Send job failed', {\n jobId: job?.id,\n error: err.message,\n });\n });\n\n this.approvalWorker.on('failed', (job, err) => {\n this.logger.error('Approval job failed', {\n jobId: job?.id,\n error: err.message,\n });\n });\n\n this.logger.info('Queue service initialized', {\n sendQueue: sendQueueName,\n approvalQueue: approvalQueueName,\n });\n }\n\n async enqueueSend(data: SendJobData): Promise<string> {\n const globalSettings = await this.settings.get();\n const queueSettings = globalSettings.queues;\n\n const job = await this.sendQueue.add('send', data, {\n attempts: queueSettings.sendAttempts,\n backoff: {\n type: 'exponential',\n delay: queueSettings.sendBackoffMs,\n },\n });\n\n return job.id || '';\n }\n\n async enqueueApproval(data: ApprovalJobData): Promise<string> {\n const globalSettings = await this.settings.get();\n const queueSettings = globalSettings.queues;\n\n const delay = data.scheduledAt\n ? Math.max(0, new Date(data.scheduledAt).getTime() - Date.now())\n : 0;\n\n const job = await this.approvalQueue.add('approved', data, {\n attempts: queueSettings.approvalAttempts,\n backoff: {\n type: 'exponential',\n delay: queueSettings.approvalBackoffMs,\n },\n delay,\n });\n\n return job.id || '';\n }\n\n async getStats(): Promise<{ send: QueueStats; approval: QueueStats }> {\n const [sendCounts, approvalCounts] = await Promise.all([\n this.sendQueue.getJobCounts('waiting', 'active', 'completed', 'failed', 'delayed'),\n this.approvalQueue.getJobCounts('waiting', 'active', 'completed', 'failed', 'delayed'),\n ]);\n\n return {\n send: sendCounts as unknown as QueueStats,\n approval: approvalCounts as unknown as QueueStats,\n };\n }\n\n async pause(queue: 'send' | 'approval'): Promise<void> {\n const target = queue === 'send' ? this.sendQueue : this.approvalQueue;\n await target.pause();\n this.logger.info('Queue paused', { queue });\n }\n\n async resume(queue: 'send' | 'approval'): Promise<void> {\n const target = queue === 'send' ? this.sendQueue : this.approvalQueue;\n await target.resume();\n this.logger.info('Queue resumed', { queue });\n }\n\n async close(): Promise<void> {\n await Promise.all([\n this.sendWorker?.close(),\n this.approvalWorker?.close(),\n this.sendQueue?.close(),\n this.approvalQueue?.close(),\n ]);\n this.logger.info('Queue service closed');\n }\n}\n","import nodemailer, { type Transporter } from 'nodemailer';\nimport type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport { ACCOUNT_PROVIDER } from '../constants';\nimport type { CapacityManager } from './capacity-manager';\nimport type { HealthTracker } from './health-tracker';\nimport type { IdentifierService } from './identifier.service';\nimport type { UnsubscribeService } from './unsubscribe.service';\nimport type { QueueService } from './queue.service';\nimport type { SettingsService } from './settings.service';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\n\nexport interface SmtpSendParams {\n accountId?: string;\n to: string;\n subject: string;\n html: string;\n text?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface SmtpSendResult {\n success: boolean;\n messageId?: string;\n error?: string;\n draftId?: string;\n}\n\nexport class SmtpService {\n private devRoundRobinIndex = 0;\n private transporterPool = new Map<string, Transporter>();\n\n constructor(\n private EmailAccount: EmailAccountModel,\n private capacityManager: CapacityManager,\n private healthTracker: HealthTracker,\n private identifierService: IdentifierService,\n private unsubscribeService: UnsubscribeService,\n private queueService: QueueService,\n private settings: SettingsService,\n private config: EmailAccountManagerConfig,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async send(params: SmtpSendParams): Promise<SmtpSendResult> {\n const globalSettings = await this.settings.get();\n\n if (globalSettings.approval.enabled) {\n return { success: true, draftId: 'approval-required' };\n }\n\n const account = params.accountId\n ? await this.EmailAccount.findById(params.accountId)\n : await this.capacityManager.getBestAccount();\n\n if (!account) {\n return { success: false, error: 'No available email account' };\n }\n\n const acct = account as any;\n const unsubscribeUrl = this.unsubscribeService.generateUrl(params.to, acct._id.toString());\n\n const jobId = await this.queueService.enqueueSend({\n accountId: acct._id.toString(),\n to: params.to,\n subject: params.subject,\n html: params.html,\n text: params.text || '',\n unsubscribeUrl: unsubscribeUrl || undefined,\n metadata: params.metadata,\n });\n\n return { success: true, messageId: jobId };\n }\n\n async testConnection(accountId: string): Promise<{ success: boolean; error?: string }> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return { success: false, error: 'Account not found' };\n\n try {\n const acct = account as any;\n const transporter = this.createTransporter(acct);\n await transporter.verify();\n transporter.close();\n return { success: true };\n } catch (err) {\n const message = err instanceof Error ? err.message : 'Unknown error';\n return { success: false, error: message };\n }\n }\n\n async executeSend(\n accountId: string,\n to: string,\n subject: string,\n html: string,\n text: string,\n unsubscribeUrl?: string,\n ): Promise<SmtpSendResult> {\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return { success: false, error: 'Account not found' };\n\n const acct = account as any;\n\n try {\n const globalSettings = await this.settings.get();\n let recipientEmail = to;\n\n if (globalSettings.devMode.enabled && globalSettings.devMode.testEmails.length > 0) {\n const testEmails = globalSettings.devMode.testEmails;\n const devIndex = this.devRoundRobinIndex++ % testEmails.length;\n recipientEmail = testEmails[devIndex];\n this.logger.info('Dev mode: email redirected', { original: to, redirected: recipientEmail });\n }\n\n const transporter = this.getOrCreateTransporter(accountId, acct);\n\n const headers: Record<string, string> = {};\n\n if (acct.provider === ACCOUNT_PROVIDER.Ses && acct.ses?.configurationSet) {\n headers['X-SES-CONFIGURATION-SET'] = acct.ses.configurationSet;\n }\n\n if (unsubscribeUrl) {\n headers['List-Unsubscribe'] = `<${unsubscribeUrl}>`;\n headers['List-Unsubscribe-Post'] = 'List-Unsubscribe=One-Click';\n }\n\n const mailOptions = {\n from: `${acct.senderName} <${acct.email}>`,\n to: recipientEmail,\n subject,\n text,\n html,\n headers,\n };\n\n const info = await transporter.sendMail(mailOptions);\n\n const messageId = info.messageId?.replace(/[<>]/g, '');\n\n await this.healthTracker.recordSuccess(accountId);\n await this.identifierService.incrementSentCount(to);\n\n this.hooks?.onSend?.({ accountId, email: to, messageId });\n this.logger.info('Email sent', { accountId, to, messageId });\n\n return { success: true, messageId };\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : 'Unknown error';\n\n this.transporterPool.delete(accountId);\n\n await this.healthTracker.recordError(accountId, errorMsg);\n\n this.hooks?.onSendError?.({ accountId, email: to, error: errorMsg });\n this.logger.error('Email send failed', { accountId, to, error: errorMsg });\n\n return { success: false, error: errorMsg };\n }\n }\n\n closeAll(): void {\n for (const [id, transporter] of this.transporterPool) {\n try {\n transporter.close();\n } catch {\n // ignore close errors\n }\n }\n this.transporterPool.clear();\n }\n\n private getOrCreateTransporter(accountId: string, account: any): Transporter {\n const existing = this.transporterPool.get(accountId);\n if (existing) return existing;\n\n const transporter = this.createTransporter(account, true);\n this.transporterPool.set(accountId, transporter);\n return transporter;\n }\n\n private createTransporter(account: any, pooled = false): Transporter {\n return nodemailer.createTransport({\n host: account.smtp.host,\n port: account.smtp.port || 587,\n secure: account.smtp.port === 465,\n auth: {\n user: account.smtp.user,\n pass: account.smtp.pass,\n },\n ...(pooled ? { pool: true, maxConnections: 5, maxMessages: 100 } : {}),\n });\n }\n}\n","import type { CreateDraftInput } from '../types/draft.types';\nimport type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport { DRAFT_STATUS } from '../constants';\nimport { DraftNotFoundError } from '../errors';\nimport type { QueueService } from './queue.service';\nimport type { SettingsService } from './settings.service';\nimport type { EmailDraftDocument, EmailDraftModel } from '../schemas/email-draft.schema';\n\nexport class ApprovalService {\n constructor(\n private EmailDraft: EmailDraftModel,\n private queueService: QueueService,\n private settings: SettingsService,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async createDraft(input: CreateDraftInput): Promise<EmailDraftDocument> {\n const draft = await this.EmailDraft.create({\n ...input,\n status: DRAFT_STATUS.Pending,\n });\n\n this.logger.info('Draft created', { draftId: draft._id.toString(), to: input.to });\n this.hooks?.onDraftCreated?.({\n draftId: draft._id.toString(),\n to: input.to,\n subject: input.subject,\n });\n\n return draft;\n }\n\n async approve(draftId: string): Promise<void> {\n const draft = await this.EmailDraft.findById(draftId);\n if (!draft) throw new DraftNotFoundError(draftId);\n\n const scheduledAt = await this.calculateScheduledTime(0, 1);\n\n await this.EmailDraft.findByIdAndUpdate(draftId, {\n $set: {\n status: DRAFT_STATUS.Approved,\n approvedAt: new Date(),\n scheduledAt,\n },\n });\n\n await this.queueService.enqueueApproval({\n draftId,\n scheduledAt: scheduledAt?.toISOString(),\n });\n\n this.logger.info('Draft approved', { draftId });\n this.hooks?.onDraftApproved?.({\n draftId,\n to: (draft as any).to,\n scheduledAt,\n });\n }\n\n async reject(draftId: string, reason?: string): Promise<void> {\n const draft = await this.EmailDraft.findById(draftId);\n if (!draft) throw new DraftNotFoundError(draftId);\n\n await this.EmailDraft.findByIdAndUpdate(draftId, {\n $set: {\n status: DRAFT_STATUS.Rejected,\n rejectedAt: new Date(),\n ...(reason ? { rejectionReason: reason } : {}),\n },\n });\n\n this.logger.info('Draft rejected', { draftId, reason });\n this.hooks?.onDraftRejected?.({\n draftId,\n to: (draft as any).to,\n reason,\n });\n }\n\n async bulkApprove(draftIds: string[]): Promise<void> {\n const total = draftIds.length;\n\n for (let i = 0; i < total; i++) {\n const scheduledAt = await this.calculateScheduledTime(i, total);\n\n await this.EmailDraft.findByIdAndUpdate(draftIds[i], {\n $set: {\n status: DRAFT_STATUS.Approved,\n approvedAt: new Date(),\n scheduledAt,\n },\n });\n\n await this.queueService.enqueueApproval({\n draftId: draftIds[i],\n scheduledAt: scheduledAt?.toISOString(),\n });\n }\n\n this.logger.info('Bulk approve completed', { count: total });\n }\n\n async bulkReject(draftIds: string[], reason?: string): Promise<void> {\n await this.EmailDraft.updateMany(\n { _id: { $in: draftIds } },\n {\n $set: {\n status: DRAFT_STATUS.Rejected,\n rejectedAt: new Date(),\n ...(reason ? { rejectionReason: reason } : {}),\n },\n },\n );\n\n this.logger.info('Bulk reject completed', { count: draftIds.length, reason });\n }\n\n async sendNow(draftId: string): Promise<void> {\n const draft = await this.EmailDraft.findById(draftId);\n if (!draft) throw new DraftNotFoundError(draftId);\n\n await this.EmailDraft.findByIdAndUpdate(draftId, {\n $set: {\n status: DRAFT_STATUS.Approved,\n approvedAt: new Date(),\n },\n });\n\n await this.queueService.enqueueApproval({ draftId });\n\n this.logger.info('Draft sent immediately', { draftId });\n }\n\n async updateContent(\n draftId: string,\n content: { subject?: string; htmlBody?: string; textBody?: string },\n ): Promise<EmailDraftDocument> {\n const updates: Record<string, unknown> = {};\n if (content.subject !== undefined) updates.subject = content.subject;\n if (content.htmlBody !== undefined) updates.htmlBody = content.htmlBody;\n if (content.textBody !== undefined) updates.textBody = content.textBody;\n\n const draft = await this.EmailDraft.findByIdAndUpdate(\n draftId,\n { $set: updates },\n { new: true },\n );\n\n if (!draft) throw new DraftNotFoundError(draftId);\n return draft;\n }\n\n async getDrafts(\n filters?: { status?: string },\n page = 1,\n limit = 50,\n ): Promise<{ items: EmailDraftDocument[]; total: number }> {\n const query: Record<string, unknown> = {};\n if (filters?.status) query.status = filters.status;\n\n const [items, total] = await Promise.all([\n this.EmailDraft.find(query)\n .sort({ createdAt: -1 })\n .skip((page - 1) * limit)\n .limit(limit),\n this.EmailDraft.countDocuments(query),\n ]);\n\n return { items, total };\n }\n\n async getDraftById(draftId: string): Promise<EmailDraftDocument | null> {\n return this.EmailDraft.findById(draftId);\n }\n\n async countByStatus(): Promise<Record<string, number>> {\n const counts = await this.EmailDraft.aggregate([\n { $group: { _id: '$status', count: { $sum: 1 } } },\n ]);\n\n const result: Record<string, number> = {};\n for (const entry of counts) {\n result[entry._id] = entry.count;\n }\n return result;\n }\n\n private async calculateScheduledTime(index: number, total: number): Promise<Date> {\n const globalSettings = await this.settings.get();\n const approval = globalSettings.approval;\n\n if (!approval.sendWindow) {\n return new Date();\n }\n\n const now = new Date();\n const tz = approval.sendWindow.timezone || globalSettings.timezone || 'UTC';\n\n const currentHour = parseInt(\n now.toLocaleString('en-US', { timeZone: tz, hour: 'numeric', hour12: false }),\n 10,\n );\n\n let scheduledDate = new Date(now);\n\n if (currentHour < approval.sendWindow.startHour) {\n const diff = approval.sendWindow.startHour - currentHour;\n scheduledDate = new Date(now.getTime() + diff * 60 * 60 * 1000);\n } else if (currentHour >= approval.sendWindow.endHour) {\n const hoursUntilNextStart = 24 - currentHour + approval.sendWindow.startHour;\n scheduledDate = new Date(now.getTime() + hoursUntilNextStart * 60 * 60 * 1000);\n }\n\n if (total <= 1) return scheduledDate;\n\n const maxSpreadMs = approval.maxSpreadMinutes * 60 * 1000;\n\n if (approval.spreadStrategy === 'even') {\n const interval = total > 1 ? maxSpreadMs / (total - 1) : 0;\n return new Date(scheduledDate.getTime() + index * interval);\n }\n\n const randomDelay = Math.floor(Math.random() * maxSpreadMs);\n return new Date(scheduledDate.getTime() + randomDelay);\n }\n}\n","import type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport { ACCOUNT_PROVIDER, BOUNCE_TYPE, ACCOUNT_STATUS } from '../constants';\nimport type { HealthTracker } from './health-tracker';\nimport type { IdentifierService } from './identifier.service';\nimport type { SettingsService } from './settings.service';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\n\nconst BOUNCE_PATTERNS = [\n { pattern: /recipient inbox full|mailbox full|mail box full|delivery incomplete/i, type: BOUNCE_TYPE.InboxFull },\n { pattern: /address not found|user unknown|no such user|does not exist|invalid address|message blocked/i, type: BOUNCE_TYPE.InvalidEmail },\n] as const;\n\nexport class ImapBounceChecker {\n private polling: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private EmailAccount: EmailAccountModel,\n private healthTracker: HealthTracker,\n private identifierService: IdentifierService,\n private settings: SettingsService,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async start(): Promise<void> {\n const globalSettings = await this.settings.get();\n\n if (!globalSettings.imap.enabled) {\n this.logger.info('IMAP bounce checker disabled');\n return;\n }\n\n const intervalMs = globalSettings.imap.pollIntervalMs || 300000;\n\n this.polling = setInterval(async () => {\n try {\n await this.checkNow();\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.logger.error('IMAP polling error', { error: msg });\n }\n }, intervalMs);\n\n this.logger.info('IMAP bounce checker started', { intervalMs });\n }\n\n stop(): void {\n if (this.polling) {\n clearInterval(this.polling);\n this.polling = null;\n this.logger.info('IMAP bounce checker stopped');\n }\n }\n\n async checkNow(): Promise<void> {\n const accounts = await this.EmailAccount.find({\n provider: ACCOUNT_PROVIDER.Gmail,\n status: { $in: [ACCOUNT_STATUS.Active, ACCOUNT_STATUS.Warmup] },\n 'imap.host': { $exists: true },\n });\n\n this.logger.info('IMAP bounce check starting', { accounts: accounts.length });\n\n for (const account of accounts) {\n try {\n await this.checkAccount((account as any)._id.toString());\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.logger.error('IMAP check failed for account', {\n accountId: (account as any)._id.toString(),\n error: msg,\n });\n }\n }\n }\n\n async checkAccount(accountId: string): Promise<{ bouncesFound: number }> {\n let ImapFlow: any;\n try {\n ImapFlow = (await import('imapflow')).ImapFlow;\n } catch {\n this.logger.warn('imapflow package not installed, skipping IMAP check');\n return { bouncesFound: 0 };\n }\n\n const account = await this.EmailAccount.findById(accountId);\n if (!account) return { bouncesFound: 0 };\n\n const acct = account as any;\n if (!acct.imap?.host || !acct.imap?.user || !acct.imap?.pass) {\n return { bouncesFound: 0 };\n }\n\n const globalSettings = await this.settings.get();\n const bounceSenders = globalSettings.imap.bounceSenders || ['mailer-daemon@googlemail.com'];\n\n const client = new ImapFlow({\n host: acct.imap.host,\n port: acct.imap.port || 993,\n secure: true,\n auth: {\n user: acct.imap.user,\n pass: acct.imap.pass,\n },\n logger: false,\n });\n\n let bouncesFound = 0;\n\n try {\n await client.connect();\n const lock = await client.getMailboxLock('INBOX');\n\n try {\n const searchDate = this.getSearchDate(globalSettings.imap.searchSince, acct.lastImapCheckAt);\n const senderQuery = bounceSenders.map((s: string) => ({ from: s }));\n\n const messages = client.fetch(\n {\n or: senderQuery,\n since: searchDate,\n },\n { source: true },\n );\n\n for await (const msg of messages) {\n try {\n const source = msg.source?.toString() || '';\n const recipientMatch = source.match(\n /Original-Recipient:.*?;?\\s*<?([^\\s<>]+@[^\\s<>]+)>?/i,\n ) || source.match(\n /Final-Recipient:.*?;?\\s*<?([^\\s<>]+@[^\\s<>]+)>?/i,\n ) || source.match(\n /was\\s+not\\s+delivered\\s+to\\s+<?([^\\s<>]+@[^\\s<>]+)>?/i,\n );\n\n if (!recipientMatch) continue;\n\n const recipientEmail = recipientMatch[1].toLowerCase();\n const bounceType = this.classifyBounce(source);\n\n await this.identifierService.markBounced(recipientEmail, bounceType);\n await this.healthTracker.recordBounce(accountId, recipientEmail, bounceType);\n\n this.hooks?.onBounce?.({\n accountId,\n email: recipientEmail,\n bounceType,\n provider: ACCOUNT_PROVIDER.Gmail,\n });\n\n bouncesFound++;\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.logger.warn('Failed to parse bounce message', { error: msg });\n }\n }\n } finally {\n lock.release();\n }\n\n await client.logout();\n\n await this.EmailAccount.findByIdAndUpdate(accountId, {\n $set: { lastImapCheckAt: new Date() },\n });\n } catch (err) {\n const msg = err instanceof Error ? err.message : 'Unknown error';\n this.logger.error('IMAP connection failed', { accountId, error: msg });\n try { await client.logout(); } catch { /* ignore */ }\n }\n\n this.logger.info('IMAP bounce check completed', { accountId, bouncesFound });\n return { bouncesFound };\n }\n\n private classifyBounce(messageBody: string): typeof BOUNCE_TYPE[keyof typeof BOUNCE_TYPE] {\n for (const { pattern, type } of BOUNCE_PATTERNS) {\n if (pattern.test(messageBody)) return type;\n }\n return BOUNCE_TYPE.Soft;\n }\n\n private getSearchDate(searchSince: string, lastImapCheckAt?: Date): Date {\n const now = new Date();\n const fallback24h = new Date(now.getTime() - 24 * 60 * 60 * 1000);\n\n switch (searchSince) {\n case 'last_24h':\n return fallback24h;\n case 'last_7d':\n return new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000);\n case 'last_check':\n return lastImapCheckAt ? new Date(lastImapCheckAt) : fallback24h;\n default:\n return fallback24h;\n }\n }\n}\n","import https from 'https';\nimport crypto from 'crypto';\nimport type { SnsMessage, SesNotification, SesBounce, SesComplaint } from '../types/event.types';\nimport type { LogAdapter, EmailAccountManagerConfig } from '../types/config.types';\nimport {\n ACCOUNT_PROVIDER,\n BOUNCE_TYPE,\n IDENTIFIER_STATUS,\n SNS_MESSAGE_TYPE,\n SES_NOTIFICATION_TYPE,\n SES_BOUNCE_TYPE,\n} from '../constants';\nimport { SnsSignatureError } from '../errors';\nimport type { HealthTracker } from './health-tracker';\nimport type { IdentifierService } from './identifier.service';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\n\nconst SNS_SIGNATURE_KEYS = [\n 'Message',\n 'MessageId',\n 'Subject',\n 'SubscribeURL',\n 'Timestamp',\n 'Token',\n 'TopicArn',\n 'Type',\n];\n\nexport interface WebhookProcessResult {\n processed: boolean;\n type?: string;\n error?: string;\n}\n\nexport class SesWebhookHandler {\n constructor(\n private healthTracker: HealthTracker,\n private identifierService: IdentifierService,\n private EmailAccount: EmailAccountModel,\n private config: EmailAccountManagerConfig,\n private logger: LogAdapter,\n private hooks?: EmailAccountManagerConfig['hooks'],\n ) {}\n\n async handleSnsMessage(body: unknown): Promise<WebhookProcessResult> {\n const message = this.parseBody(body);\n\n if (!message || !message.Type) {\n return { processed: false, error: 'Invalid SNS message format' };\n }\n\n const validateSignature = this.config.options?.ses?.validateSignature !== false;\n if (validateSignature && message.SignatureVersion) {\n const valid = await this.validateSignature(message);\n if (!valid) {\n throw new SnsSignatureError();\n }\n }\n\n const allowedTopics = this.config.options?.ses?.allowedTopicArns;\n if (allowedTopics?.length && !allowedTopics.includes(message.TopicArn)) {\n return { processed: false, error: 'Topic ARN not allowed' };\n }\n\n if (message.Type === SNS_MESSAGE_TYPE.SubscriptionConfirmation) {\n return this.handleSubscriptionConfirmation(message);\n }\n\n if (message.Type === SNS_MESSAGE_TYPE.UnsubscribeConfirmation) {\n return { processed: true, type: 'unsubscribe_confirmed' };\n }\n\n if (message.Type === SNS_MESSAGE_TYPE.Notification) {\n const notification: SesNotification = JSON.parse(message.Message);\n return this.processNotification(notification);\n }\n\n return { processed: true, type: 'ignored' };\n }\n\n private async handleSubscriptionConfirmation(\n message: SnsMessage,\n ): Promise<WebhookProcessResult> {\n if (!message.SubscribeURL) {\n return { processed: false, error: 'No SubscribeURL provided' };\n }\n\n try {\n const url = new URL(message.SubscribeURL);\n if (!url.hostname.endsWith('.amazonaws.com')) {\n this.logger.warn('Rejected SubscribeURL with non-AWS hostname', {\n hostname: url.hostname,\n });\n return { processed: false, error: 'SubscribeURL hostname is not from amazonaws.com' };\n }\n } catch {\n return { processed: false, error: 'Invalid SubscribeURL' };\n }\n\n return new Promise((resolve) => {\n https\n .get(message.SubscribeURL!, (res) => {\n resolve({\n processed: res.statusCode === 200,\n type: 'subscription_confirmed',\n });\n })\n .on('error', (err) => {\n resolve({ processed: false, error: err.message });\n });\n });\n }\n\n private async processNotification(\n notification: SesNotification,\n ): Promise<WebhookProcessResult> {\n const accountId = await this.findAccountIdBySource(notification.mail.source);\n\n switch (notification.notificationType) {\n case SES_NOTIFICATION_TYPE.Bounce:\n return this.processBounce(accountId, notification.bounce!);\n\n case SES_NOTIFICATION_TYPE.Complaint:\n return this.processComplaint(accountId, notification.complaint!);\n\n case SES_NOTIFICATION_TYPE.Delivery:\n if (notification.delivery) {\n for (const recipient of notification.delivery.recipients) {\n this.hooks?.onDelivery?.({ accountId: accountId || '', email: recipient });\n }\n }\n return { processed: true, type: 'delivery' };\n\n case SES_NOTIFICATION_TYPE.Open:\n if (notification.open) {\n const recipients = notification.mail.destination || [];\n for (const email of recipients) {\n this.hooks?.onOpen?.({\n accountId: accountId || '',\n email,\n timestamp: new Date(notification.open.timestamp),\n });\n }\n }\n return { processed: true, type: 'open' };\n\n case SES_NOTIFICATION_TYPE.Click:\n if (notification.click) {\n const recipients = notification.mail.destination || [];\n for (const email of recipients) {\n this.hooks?.onClick?.({\n accountId: accountId || '',\n email,\n link: notification.click.link,\n });\n }\n }\n return { processed: true, type: 'click' };\n\n default:\n return { processed: true, type: 'unknown' };\n }\n }\n\n private async processBounce(\n accountId: string | null,\n bounce: SesBounce,\n ): Promise<WebhookProcessResult> {\n const bounceType =\n bounce.bounceType === SES_BOUNCE_TYPE.Permanent\n ? BOUNCE_TYPE.Hard\n : BOUNCE_TYPE.Soft;\n\n for (const recipient of bounce.bouncedRecipients) {\n const email = recipient.emailAddress;\n\n if (bounce.bounceType === SES_BOUNCE_TYPE.Permanent) {\n const subType = bounce.bounceSubType?.toLowerCase();\n if (subType === 'noemail' || subType === 'general') {\n await this.identifierService.updateStatus(email, IDENTIFIER_STATUS.Invalid);\n } else {\n await this.identifierService.markBounced(email, BOUNCE_TYPE.Hard);\n }\n } else {\n if (bounce.bounceSubType?.toLowerCase() === 'mailboxfull') {\n await this.identifierService.markBounced(email, BOUNCE_TYPE.InboxFull);\n } else {\n await this.identifierService.markBounced(email, BOUNCE_TYPE.Soft);\n }\n }\n\n if (accountId) {\n await this.healthTracker.recordBounce(accountId, email, bounceType);\n }\n\n this.hooks?.onBounce?.({\n accountId: accountId || '',\n email,\n bounceType,\n provider: ACCOUNT_PROVIDER.Ses,\n });\n }\n\n return { processed: true, type: 'bounce' };\n }\n\n private async processComplaint(\n accountId: string | null,\n complaint: SesComplaint,\n ): Promise<WebhookProcessResult> {\n for (const recipient of complaint.complainedRecipients) {\n await this.identifierService.updateStatus(\n recipient.emailAddress,\n IDENTIFIER_STATUS.Blocked,\n );\n\n this.hooks?.onComplaint?.({\n accountId: accountId || '',\n email: recipient.emailAddress,\n });\n }\n\n return { processed: true, type: 'complaint' };\n }\n\n private async validateSignature(message: SnsMessage): Promise<boolean> {\n try {\n if (message.SignatureVersion !== '1') return false;\n\n const certificate = await this.fetchCertificate(message.SigningCertURL);\n const parts: string[] = [];\n const record = message as unknown as Record<string, unknown>;\n\n for (const key of SNS_SIGNATURE_KEYS) {\n const value = record[key];\n if (value !== undefined && value !== null) {\n parts.push(key);\n parts.push(String(value));\n }\n }\n\n const stringToSign = parts.join('\\n') + '\\n';\n const verifier = crypto.createVerify('SHA1');\n verifier.update(stringToSign, 'utf8');\n\n const signatureBuffer = Buffer.from(message.Signature, 'base64');\n return verifier.verify(certificate, signatureBuffer);\n } catch {\n return false;\n }\n }\n\n private async fetchCertificate(certUrl: string): Promise<string> {\n return new Promise((resolve, reject) => {\n const url = new URL(certUrl);\n if (!url.hostname.endsWith('.amazonaws.com')) {\n return reject(new Error('Invalid certificate URL: not from amazonaws.com'));\n }\n if (url.protocol !== 'https:') {\n return reject(new Error('Invalid certificate URL: must be HTTPS'));\n }\n\n https\n .get(certUrl, (res) => {\n let data = '';\n res.on('data', (chunk) => {\n data += chunk;\n });\n res.on('end', () => resolve(data));\n res.on('error', reject);\n })\n .on('error', reject);\n });\n }\n\n private parseBody(rawBody: unknown): SnsMessage {\n if (typeof rawBody === 'string') {\n return JSON.parse(rawBody);\n }\n return rawBody as SnsMessage;\n }\n\n private async findAccountIdBySource(source: string): Promise<string | null> {\n const email = source.replace(/.*<(.+)>/, '$1').toLowerCase();\n const account = await this.EmailAccount.findOne({ email });\n return account ? (account as any)._id.toString() : null;\n }\n}\n","import type { Job } from 'bullmq';\nimport type { SmtpService } from '../services/smtp.service';\nimport type { LogAdapter } from '../types/config.types';\n\nexport function createSendProcessor(smtpService: SmtpService, logger: LogAdapter) {\n return async (job: Job) => {\n const { accountId, to, subject, html, text, unsubscribeUrl } = job.data;\n\n logger.info('Processing send job', { jobId: job.id, accountId, to });\n\n const result = await smtpService.executeSend(accountId, to, subject, html, text, unsubscribeUrl);\n\n if (!result.success) {\n throw new Error(result.error || 'Send failed');\n }\n };\n}\n","import type { Job } from 'bullmq';\nimport type { SmtpService } from '../services/smtp.service';\nimport type { QueueService } from '../services/queue.service';\nimport type { LogAdapter } from '../types/config.types';\nimport { DRAFT_STATUS } from '../constants';\nimport type { EmailDraftModel } from '../schemas/email-draft.schema';\n\nexport function createApprovalProcessor(\n EmailDraft: EmailDraftModel,\n smtpService: SmtpService,\n queueService: QueueService,\n logger: LogAdapter,\n) {\n return async (job: Job) => {\n const { draftId } = job.data;\n\n const draft = await EmailDraft.findById(draftId);\n if (!draft) {\n logger.warn('Approval job: draft not found', { draftId });\n return;\n }\n\n const d = draft as any;\n if (d.status !== DRAFT_STATUS.Approved) {\n logger.warn('Approval job: draft not in approved status', { draftId, status: d.status });\n return;\n }\n\n logger.info('Processing approved draft', { draftId, to: d.to });\n\n await EmailDraft.findByIdAndUpdate(draftId, {\n $set: { status: DRAFT_STATUS.Queued },\n });\n\n await queueService.enqueueSend({\n accountId: d.accountId.toString(),\n to: d.to,\n subject: d.subject,\n html: d.htmlBody,\n text: d.textBody || '',\n });\n };\n}\n","import type { Request, Response } from 'express';\nimport type { CreateEmailAccountInput, UpdateEmailAccountInput } from '../types/account.types';\nimport type { CapacityManager } from '../services/capacity-manager';\nimport type { HealthTracker } from '../services/health-tracker';\nimport type { WarmupManager } from '../services/warmup-manager';\nimport type { SmtpService } from '../services/smtp.service';\nimport type { ImapBounceChecker } from '../services/imap-bounce-checker';\nimport type { EmailAccountManagerConfig } from '../types/config.types';\nimport type { EmailAccountModel } from '../schemas/email-account.schema';\n\nexport function createAccountController(\n EmailAccount: EmailAccountModel,\n capacityManager: CapacityManager,\n healthTracker: HealthTracker,\n warmupManager: WarmupManager,\n smtpService: SmtpService,\n imapBounceChecker: ImapBounceChecker | null,\n config: EmailAccountManagerConfig,\n) {\n return {\n async list(req: Request, res: Response) {\n try {\n const accounts = await EmailAccount.find()\n .select('-smtp.pass -imap.pass')\n .sort({ createdAt: -1 });\n res.json({ success: true, data: { accounts } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getById(req: Request, res: Response) {\n try {\n const account = await EmailAccount.findById(req.params.id).select('-smtp.pass -imap.pass');\n if (!account) {\n return res.status(404).json({ success: false, error: 'Account not found' });\n }\n res.json({ success: true, data: { account } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async create(req: Request, res: Response) {\n try {\n const input: CreateEmailAccountInput = req.body;\n\n if (!input.email || !input.senderName) {\n return res.status(400).json({ success: false, error: 'email and senderName are required' });\n }\n\n const existing = await EmailAccount.findOne({ email: input.email.toLowerCase() });\n if (existing) {\n return res.status(400).json({ success: false, error: 'Email account already exists' });\n }\n\n const healthDefaults = config.options?.healthDefaults;\n const warmupDefaults = config.options?.warmup?.defaultSchedule;\n\n const accountData = {\n email: input.email.toLowerCase(),\n senderName: input.senderName,\n provider: input.provider,\n smtp: input.smtp,\n ...(input.imap ? { imap: input.imap } : {}),\n ...(input.ses ? { ses: input.ses } : {}),\n limits: { dailyMax: input.limits?.dailyMax || 450 },\n health: {\n score: 100,\n consecutiveErrors: 0,\n bounceCount: 0,\n thresholds: {\n minScore: input.health?.thresholds?.minScore ?? healthDefaults?.minScore ?? 50,\n maxBounceRate: input.health?.thresholds?.maxBounceRate ?? healthDefaults?.maxBounceRate ?? 5,\n maxConsecutiveErrors: input.health?.thresholds?.maxConsecutiveErrors ?? healthDefaults?.maxConsecutiveErrors ?? 10,\n },\n },\n warmup: {\n enabled: true,\n startedAt: new Date(),\n currentDay: 1,\n schedule: input.warmup?.schedule || warmupDefaults || [],\n },\n status: 'warmup',\n totalEmailsSent: 0,\n };\n\n const account = await EmailAccount.create(accountData);\n const saved = account.toObject();\n delete (saved as any).smtp?.pass;\n delete (saved as any).imap?.pass;\n\n res.status(201).json({ success: true, data: { account: saved } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async update(req: Request, res: Response) {\n try {\n const input: UpdateEmailAccountInput = req.body;\n const updates: Record<string, unknown> = {};\n\n if (input.senderName !== undefined) updates.senderName = input.senderName;\n if (input.status !== undefined) updates.status = input.status;\n if (input.smtp) {\n for (const [k, v] of Object.entries(input.smtp)) {\n if (v !== undefined && (k !== 'pass' || v !== '')) updates[`smtp.${k}`] = v;\n }\n }\n if (input.imap) {\n for (const [k, v] of Object.entries(input.imap)) {\n if (v !== undefined && (k !== 'pass' || v !== '')) updates[`imap.${k}`] = v;\n }\n }\n if (input.ses) {\n for (const [k, v] of Object.entries(input.ses)) {\n if (v !== undefined) updates[`ses.${k}`] = v;\n }\n }\n if (input.limits?.dailyMax !== undefined) updates['limits.dailyMax'] = input.limits.dailyMax;\n\n const account = await EmailAccount.findByIdAndUpdate(\n req.params.id,\n { $set: updates },\n { new: true },\n ).select('-smtp.pass -imap.pass');\n\n if (!account) {\n return res.status(404).json({ success: false, error: 'Account not found' });\n }\n\n res.json({ success: true, data: { account } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async remove(req: Request, res: Response) {\n try {\n const result = await EmailAccount.findByIdAndDelete(req.params.id);\n if (!result) {\n return res.status(404).json({ success: false, error: 'Account not found' });\n }\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async bulkUpdate(req: Request, res: Response) {\n try {\n const { accountIds, updates } = req.body;\n if (!Array.isArray(accountIds) || accountIds.length === 0) {\n return res.status(400).json({ success: false, error: 'accountIds array is required' });\n }\n\n const allowed: Record<string, unknown> = {};\n if (updates?.status !== undefined) allowed.status = updates.status;\n if (updates?.dailyMax !== undefined) allowed['limits.dailyMax'] = updates.dailyMax;\n\n if (Object.keys(allowed).length === 0) {\n return res.status(400).json({ success: false, error: 'No valid updates provided' });\n }\n\n const result = await EmailAccount.updateMany(\n { _id: { $in: accountIds } },\n { $set: allowed },\n );\n\n res.json({ success: true, data: { matched: result.matchedCount, modified: result.modifiedCount } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getCapacity(_req: Request, res: Response) {\n try {\n const result = await capacityManager.getAllCapacity();\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getHealth(_req: Request, res: Response) {\n try {\n const accounts = await healthTracker.getAllHealth();\n res.json({ success: true, data: { accounts } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getWarmupStatus(_req: Request, res: Response) {\n try {\n const accounts = await EmailAccount.find({ 'warmup.enabled': true });\n const statuses = await Promise.all(\n accounts.map((a) => warmupManager.getStatus((a as any)._id.toString())),\n );\n res.json({ success: true, data: { accounts: statuses.filter(Boolean) } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async testConnection(req: Request, res: Response) {\n try {\n const result = await smtpService.testConnection(req.params.id);\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async checkBounces(req: Request, res: Response) {\n try {\n if (!imapBounceChecker) {\n return res.status(400).json({ success: false, error: 'IMAP bounce checker not available' });\n }\n const result = await imapBounceChecker.checkAccount(req.params.id);\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getWarmup(req: Request, res: Response) {\n try {\n const status = await warmupManager.getStatus(req.params.id);\n if (!status) {\n return res.status(404).json({ success: false, error: 'Account not found' });\n }\n res.json({ success: true, data: status });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateWarmupSchedule(req: Request, res: Response) {\n try {\n const { schedule } = req.body;\n if (!Array.isArray(schedule)) {\n return res.status(400).json({ success: false, error: 'schedule array is required' });\n }\n await warmupManager.updateSchedule(req.params.id, schedule);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async startWarmup(req: Request, res: Response) {\n try {\n await warmupManager.startWarmup(req.params.id);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async completeWarmup(req: Request, res: Response) {\n try {\n await warmupManager.completeWarmup(req.params.id);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async resetWarmup(req: Request, res: Response) {\n try {\n await warmupManager.resetWarmup(req.params.id);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateHealthThresholds(req: Request, res: Response) {\n try {\n const { thresholds } = req.body;\n if (!thresholds || typeof thresholds !== 'object') {\n return res.status(400).json({ success: false, error: 'thresholds object is required' });\n }\n\n const updates: Record<string, unknown> = {};\n if (thresholds.minScore !== undefined) updates['health.thresholds.minScore'] = thresholds.minScore;\n if (thresholds.maxBounceRate !== undefined) updates['health.thresholds.maxBounceRate'] = thresholds.maxBounceRate;\n if (thresholds.maxConsecutiveErrors !== undefined) updates['health.thresholds.maxConsecutiveErrors'] = thresholds.maxConsecutiveErrors;\n\n const account = await EmailAccount.findByIdAndUpdate(\n req.params.id,\n { $set: updates },\n { new: true },\n ).select('-smtp.pass -imap.pass');\n\n if (!account) {\n return res.status(404).json({ success: false, error: 'Account not found' });\n }\n\n res.json({ success: true, data: { account } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n };\n}\n","import type { Request, Response } from 'express';\nimport type { IdentifierService } from '../services/identifier.service';\n\nexport function createIdentifierController(identifierService: IdentifierService) {\n return {\n async list(req: Request, res: Response) {\n try {\n const status = req.query.status as string | undefined;\n const page = parseInt(req.query.page as string, 10) || 1;\n const limit = parseInt(req.query.limit as string, 10) || 50;\n\n const result = await identifierService.list(\n status ? { status } : undefined,\n page,\n limit,\n );\n\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getByEmail(req: Request, res: Response) {\n try {\n const identifier = await identifierService.findByEmail(req.params.email);\n if (!identifier) {\n return res.status(404).json({ success: false, error: 'Identifier not found' });\n }\n res.json({ success: true, data: { identifier } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateStatus(req: Request, res: Response) {\n try {\n const { status } = req.body;\n if (!status) {\n return res.status(400).json({ success: false, error: 'status is required' });\n }\n\n await identifierService.updateStatus(req.params.email, status);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async merge(req: Request, res: Response) {\n try {\n const { sourceEmail, targetEmail } = req.body;\n if (!sourceEmail || !targetEmail) {\n return res.status(400).json({ success: false, error: 'sourceEmail and targetEmail are required' });\n }\n\n await identifierService.merge(sourceEmail, targetEmail);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n };\n}\n","import type { Request, Response } from 'express';\nimport type { ApprovalService } from '../services/approval.service';\n\nexport function createApprovalController(approvalService: ApprovalService) {\n return {\n async getDrafts(req: Request, res: Response) {\n try {\n const status = req.query.status as string | undefined;\n const page = parseInt(req.query.page as string, 10) || 1;\n const limit = parseInt(req.query.limit as string, 10) || 50;\n\n const result = await approvalService.getDrafts(\n status ? { status } : undefined,\n page,\n limit,\n );\n\n res.json({ success: true, data: result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async getDraftById(req: Request, res: Response) {\n try {\n const draft = await approvalService.getDraftById(req.params.id);\n if (!draft) {\n return res.status(404).json({ success: false, error: 'Draft not found' });\n }\n res.json({ success: true, data: { draft } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async countByStatus(_req: Request, res: Response) {\n try {\n const counts = await approvalService.countByStatus();\n res.json({ success: true, data: counts });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async approve(req: Request, res: Response) {\n try {\n await approvalService.approve(req.params.id);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async reject(req: Request, res: Response) {\n try {\n const { reason } = req.body;\n await approvalService.reject(req.params.id, reason);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async sendNow(req: Request, res: Response) {\n try {\n await approvalService.sendNow(req.params.id);\n res.json({ success: true });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateContent(req: Request, res: Response) {\n try {\n const draft = await approvalService.updateContent(req.params.id, req.body);\n res.json({ success: true, data: { draft } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async bulkApprove(req: Request, res: Response) {\n try {\n const { draftIds } = req.body;\n if (!Array.isArray(draftIds) || draftIds.length === 0) {\n return res.status(400).json({ success: false, error: 'draftIds array is required' });\n }\n await approvalService.bulkApprove(draftIds);\n res.json({ success: true, data: { approved: draftIds.length } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async bulkReject(req: Request, res: Response) {\n try {\n const { draftIds, reason } = req.body;\n if (!Array.isArray(draftIds) || draftIds.length === 0) {\n return res.status(400).json({ success: false, error: 'draftIds array is required' });\n }\n await approvalService.bulkReject(draftIds, reason);\n res.json({ success: true, data: { rejected: draftIds.length } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n };\n}\n","import type { Request, Response } from 'express';\nimport type { SettingsService } from '../services/settings.service';\n\nexport function createSettingsController(settingsService: SettingsService) {\n return {\n async getSettings(_req: Request, res: Response) {\n try {\n const settings = await settingsService.get();\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateSettings(req: Request, res: Response) {\n try {\n const settings = await settingsService.update(req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateTimezone(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('timezone', req.body.timezone);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateDevMode(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('devMode', req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateImap(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('imap', req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateApproval(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('approval', req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateQueues(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('queues', req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n\n async updateSes(req: Request, res: Response) {\n try {\n const settings = await settingsService.updateSection('ses', req.body);\n res.json({ success: true, data: { settings } });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n };\n}\n","import type { Request, Response } from 'express';\nimport type { UnsubscribeService } from '../services/unsubscribe.service';\n\nexport function createUnsubscribeController(unsubscribeService: UnsubscribeService) {\n return {\n async handleGet(req: Request, res: Response) {\n try {\n const token = req.query.token as string;\n\n if (!token) {\n const html = unsubscribeService.getConfirmationHtml('', false);\n return res.status(400).type('html').send(html);\n }\n\n const result = await unsubscribeService.handleUnsubscribe('', token);\n const html = unsubscribeService.getConfirmationHtml(result.email || '', result.success);\n res.status(200).type('html').send(html);\n } catch {\n const html = unsubscribeService.getConfirmationHtml('', false);\n res.status(500).type('html').send(html);\n }\n },\n\n async handlePost(req: Request, res: Response) {\n try {\n const token = (req.query.token || req.body?.token) as string;\n\n if (!token) {\n return res.status(400).json({ success: false, error: 'Missing token' });\n }\n\n const result = await unsubscribeService.handleUnsubscribe('', token);\n res.json({ success: result.success, error: result.error });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n },\n };\n}\n","import { Router } from 'express';\nimport type { createAccountController } from '../controllers/account.controller';\nimport type { createIdentifierController } from '../controllers/identifier.controller';\nimport type { createApprovalController } from '../controllers/approval.controller';\nimport type { createSettingsController } from '../controllers/settings.controller';\nimport type { QueueService } from '../services/queue.service';\n\ninterface AdminRoutesDeps {\n accountController: ReturnType<typeof createAccountController>;\n identifierController: ReturnType<typeof createIdentifierController>;\n approvalController: ReturnType<typeof createApprovalController>;\n settingsController: ReturnType<typeof createSettingsController>;\n queueService: QueueService;\n}\n\nexport function createAdminRoutes(deps: AdminRoutesDeps): Router {\n const router = Router();\n const {\n accountController,\n identifierController,\n approvalController,\n settingsController,\n queueService,\n } = deps;\n\n // --- Account routes ---\n router.get('/accounts', accountController.list);\n router.post('/accounts', accountController.create);\n router.get('/accounts/capacity', accountController.getCapacity);\n router.get('/accounts/health', accountController.getHealth);\n router.get('/accounts/warmup', accountController.getWarmupStatus);\n router.patch('/accounts/bulk-update', accountController.bulkUpdate);\n router.get('/accounts/:id', accountController.getById);\n router.put('/accounts/:id', accountController.update);\n router.delete('/accounts/:id', accountController.remove);\n router.post('/accounts/:id/test', accountController.testConnection);\n router.post('/accounts/:id/check-bounces', accountController.checkBounces);\n router.get('/accounts/:id/warmup', accountController.getWarmup);\n router.put('/accounts/:id/warmup/schedule', accountController.updateWarmupSchedule);\n router.post('/accounts/:id/warmup/start', accountController.startWarmup);\n router.post('/accounts/:id/warmup/complete', accountController.completeWarmup);\n router.post('/accounts/:id/warmup/reset', accountController.resetWarmup);\n router.put('/accounts/:id/health/thresholds', accountController.updateHealthThresholds);\n\n // --- Identifier routes ---\n router.get('/identifiers', identifierController.list);\n router.get('/identifiers/:email', identifierController.getByEmail);\n router.patch('/identifiers/:email/status', identifierController.updateStatus);\n router.post('/identifiers/merge', identifierController.merge);\n\n // --- Approval/Draft routes ---\n router.get('/drafts', approvalController.getDrafts);\n router.get('/drafts/count', approvalController.countByStatus);\n router.post('/drafts/bulk-approve', approvalController.bulkApprove);\n router.post('/drafts/bulk-reject', approvalController.bulkReject);\n router.get('/drafts/:id', approvalController.getDraftById);\n router.patch('/drafts/:id/approve', approvalController.approve);\n router.patch('/drafts/:id/reject', approvalController.reject);\n router.post('/drafts/:id/send-now', approvalController.sendNow);\n router.patch('/drafts/:id/content', approvalController.updateContent);\n\n // --- Settings routes ---\n router.get('/settings', settingsController.getSettings);\n router.put('/settings', settingsController.updateSettings);\n router.patch('/settings/timezone', settingsController.updateTimezone);\n router.patch('/settings/dev-mode', settingsController.updateDevMode);\n router.patch('/settings/imap', settingsController.updateImap);\n router.patch('/settings/approval', settingsController.updateApproval);\n router.patch('/settings/queues', settingsController.updateQueues);\n router.patch('/settings/ses', settingsController.updateSes);\n\n // --- Queue stats ---\n router.get('/queues/stats', async (_req, res) => {\n try {\n const stats = await queueService.getStats();\n res.json({ success: true, data: stats });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n res.status(500).json({ success: false, error: message });\n }\n });\n\n return router;\n}\n","import { Router, text, json } from 'express';\nimport type { SesWebhookHandler } from '../services/ses-webhook-handler';\n\nexport function createSesWebhookRoutes(handler: SesWebhookHandler): Router {\n const router = Router();\n\n router.use(text({ type: '*/*' }));\n router.use(json({ type: 'application/json' }));\n\n router.post('/', async (req, res) => {\n try {\n const body = typeof req.body === 'string' ? JSON.parse(req.body) : req.body;\n const result = await handler.handleSnsMessage(body);\n res.json({ success: true, ...result });\n } catch (error: unknown) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n const status = message.includes('signature') ? 403 : 500;\n res.status(status).json({ success: false, error: message });\n }\n });\n\n return router;\n}\n","import { Router } from 'express';\nimport type { createUnsubscribeController } from '../controllers/unsubscribe.controller';\n\nexport function createUnsubscribeRoutes(\n controller: ReturnType<typeof createUnsubscribeController>,\n): Router {\n const router = Router();\n\n router.get('/', controller.handleGet);\n router.post('/', controller.handlePost);\n\n return router;\n}\n","import type { Router } from 'express';\nimport type { EmailAccountManagerConfig, LogAdapter } from './types/config.types';\nimport { validateConfig } from './validation/config.schema';\nimport { createEmailAccountSchema, type EmailAccountModel } from './schemas/email-account.schema';\nimport { createEmailDailyStatsSchema, type EmailDailyStatsModel } from './schemas/email-daily-stats.schema';\nimport { createEmailIdentifierSchema, type EmailIdentifierModel } from './schemas/email-identifier.schema';\nimport { createEmailDraftSchema, type EmailDraftModel } from './schemas/email-draft.schema';\nimport { createGlobalSettingsSchema, type GlobalSettingsModel } from './schemas/global-settings.schema';\nimport { SettingsService } from './services/settings.service';\nimport { IdentifierService } from './services/identifier.service';\nimport { HealthTracker } from './services/health-tracker';\nimport { WarmupManager } from './services/warmup-manager';\nimport { CapacityManager } from './services/capacity-manager';\nimport { UnsubscribeService } from './services/unsubscribe.service';\nimport { QueueService } from './services/queue.service';\nimport { SmtpService } from './services/smtp.service';\nimport { ApprovalService } from './services/approval.service';\nimport { ImapBounceChecker } from './services/imap-bounce-checker';\nimport { SesWebhookHandler } from './services/ses-webhook-handler';\nimport { createSendProcessor } from './queues/send.queue';\nimport { createApprovalProcessor } from './queues/approval.queue';\nimport { createAccountController } from './controllers/account.controller';\nimport { createIdentifierController } from './controllers/identifier.controller';\nimport { createApprovalController } from './controllers/approval.controller';\nimport { createSettingsController } from './controllers/settings.controller';\nimport { createUnsubscribeController } from './controllers/unsubscribe.controller';\nimport { createAdminRoutes } from './routes';\nimport { createSesWebhookRoutes } from './routes/ses-webhook.routes';\nimport { createUnsubscribeRoutes } from './routes/unsubscribe.routes';\n\nexport interface EmailAccountManager {\n routes: Router;\n webhookRoutes: { ses: Router };\n unsubscribeRoutes: Router;\n\n accounts: {\n model: any;\n create: (data: any) => Promise<any>;\n findById: (id: string) => Promise<any>;\n update: (id: string, data: any) => Promise<any>;\n remove: (id: string) => Promise<any>;\n };\n capacity: CapacityManager;\n health: HealthTracker;\n warmup: WarmupManager;\n smtp: SmtpService;\n imap: ImapBounceChecker;\n approval: ApprovalService;\n unsubscribe: UnsubscribeService;\n identifiers: IdentifierService;\n queues: QueueService;\n settings: SettingsService;\n\n destroy(): Promise<void>;\n}\n\nconst noopLogger: LogAdapter = {\n info: () => {},\n warn: () => {},\n error: () => {},\n};\n\nexport function createEmailAccountManager(\n config: EmailAccountManagerConfig,\n): EmailAccountManager {\n validateConfig(config);\n\n const conn = config.db.connection;\n const prefix = config.db.collectionPrefix || '';\n const logger = config.logger || noopLogger;\n const hooks = config.hooks;\n\n const EmailAccount = conn.model<any>(\n `${prefix}EmailAccount`,\n createEmailAccountSchema(),\n ) as EmailAccountModel;\n\n const EmailDailyStats = conn.model<any>(\n `${prefix}EmailDailyStats`,\n createEmailDailyStatsSchema(),\n ) as EmailDailyStatsModel;\n\n const EmailIdentifier = conn.model<any>(\n `${prefix}EmailIdentifier`,\n createEmailIdentifierSchema(),\n ) as EmailIdentifierModel;\n\n const EmailDraft = conn.model<any>(\n `${prefix}EmailDraft`,\n createEmailDraftSchema(),\n ) as EmailDraftModel;\n\n const GlobalSettings = conn.model<any>(\n `${prefix}GlobalSettings`,\n createGlobalSettingsSchema(),\n ) as GlobalSettingsModel;\n\n const settingsService = new SettingsService(GlobalSettings, logger);\n\n const identifierService = new IdentifierService(EmailIdentifier, logger, hooks);\n\n const healthTracker = new HealthTracker(\n EmailAccount,\n EmailDailyStats,\n settingsService,\n logger,\n hooks,\n );\n\n const warmupManager = new WarmupManager(EmailAccount, config, logger, hooks);\n\n const capacityManager = new CapacityManager(\n EmailAccount,\n EmailDailyStats,\n warmupManager,\n settingsService,\n logger,\n );\n\n const unsubscribeService = new UnsubscribeService(EmailIdentifier, config, logger, hooks);\n\n const queueService = new QueueService(\n config.redis.connection,\n config,\n settingsService,\n logger,\n );\n\n const smtpService = new SmtpService(\n EmailAccount,\n capacityManager,\n healthTracker,\n identifierService,\n unsubscribeService,\n queueService,\n settingsService,\n config,\n logger,\n hooks,\n );\n\n const approvalService = new ApprovalService(\n EmailDraft,\n queueService,\n settingsService,\n logger,\n hooks,\n );\n\n const imapBounceChecker = new ImapBounceChecker(\n EmailAccount,\n healthTracker,\n identifierService,\n settingsService,\n logger,\n hooks,\n );\n\n const sesWebhookHandler = new SesWebhookHandler(\n healthTracker,\n identifierService,\n EmailAccount,\n config,\n logger,\n hooks,\n );\n\n const sendProcessor = createSendProcessor(smtpService, logger);\n const approvalProcessor = createApprovalProcessor(\n EmailDraft,\n smtpService,\n queueService,\n logger,\n );\n\n queueService.init({ sendProcessor, approvalProcessor }).catch((err) => {\n logger.error('Failed to initialize queues', {\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n });\n\n imapBounceChecker.start().catch((err) => {\n logger.error('Failed to start IMAP bounce checker', {\n error: err instanceof Error ? err.message : 'Unknown error',\n });\n });\n\n const accountController = createAccountController(\n EmailAccount,\n capacityManager,\n healthTracker,\n warmupManager,\n smtpService,\n imapBounceChecker,\n config,\n );\n\n const identifierController = createIdentifierController(identifierService);\n const approvalController = createApprovalController(approvalService);\n const settingsController = createSettingsController(settingsService);\n const unsubscribeController = createUnsubscribeController(unsubscribeService);\n\n const routes = createAdminRoutes({\n accountController,\n identifierController,\n approvalController,\n settingsController,\n queueService,\n });\n\n const sesWebhookRouter = createSesWebhookRoutes(sesWebhookHandler);\n const unsubscribeRouter = createUnsubscribeRoutes(unsubscribeController);\n\n const accounts = {\n model: EmailAccount,\n create: (data: any) => EmailAccount.create(data),\n findById: (id: string) => EmailAccount.findById(id),\n update: (id: string, data: any) =>\n EmailAccount.findByIdAndUpdate(id, { $set: data }, { new: true }),\n remove: (id: string) => EmailAccount.findByIdAndDelete(id),\n };\n\n async function destroy(): Promise<void> {\n imapBounceChecker.stop();\n smtpService.closeAll();\n await queueService.close();\n logger.info('EmailAccountManager destroyed');\n }\n\n return {\n routes,\n webhookRoutes: { ses: sesWebhookRouter },\n unsubscribeRoutes: unsubscribeRouter,\n accounts,\n capacity: capacityManager,\n health: healthTracker,\n warmup: warmupManager,\n smtp: smtpService,\n imap: imapBounceChecker,\n approval: approvalService,\n unsubscribe: unsubscribeService,\n identifiers: identifierService,\n queues: queueService,\n settings: settingsService,\n destroy,\n };\n}\n\nexport * from './types';\nexport * from './constants';\nexport * from './errors';\nexport { validateConfig } from './validation/config.schema';\nexport * from './schemas';\nexport { SettingsService } from './services/settings.service';\nexport { IdentifierService } from './services/identifier.service';\nexport { HealthTracker } from './services/health-tracker';\nexport { WarmupManager, type WarmupStatus } from './services/warmup-manager';\nexport { CapacityManager } from './services/capacity-manager';\nexport { SmtpService, type SmtpSendParams, type SmtpSendResult } from './services/smtp.service';\nexport { UnsubscribeService } from './services/unsubscribe.service';\nexport { QueueService, type QueueStats, type SendJobData, type ApprovalJobData } from './services/queue.service';\nexport { ApprovalService } from './services/approval.service';\nexport { ImapBounceChecker } from './services/imap-bounce-checker';\nexport { SesWebhookHandler, type WebhookProcessResult } from './services/ses-webhook-handler';\n"]}
|