import path from 'path' import nodemailer, { TransportOptions } from 'nodemailer' import fs from 'fs-extra' import consola from 'consola' import { POST, QRequestController, SECURE, } from './../../modules/RequestController' interface Lead { name: string phone: string email: string [index: string]: any } interface Data { email: boolean data: Lead } export default class CRMController extends QRequestController { @POST @SECURE() async get() { const skip = this.query.skip ? Number(this.query.skip) : 0 const limit = this.query.limit ? Number(this.query.limit) : 0 const leads = await this.db .collection('crm') .find() .project({ admin_email: 0, project_name: 0 }) .sort({ createDate: -1 }) .skip(skip) .limit(limit) .toArray() return leads } @POST async add() { const date = new Date().toISOString() const params: Data = this.body const lead = params.data lead.createDate = date await this.db.collection('crm').insertOne(lead) if (params.email) { this.sendEmail(lead) } return this.answer(true) } async sendEmail(lead: Lead) { const [ { smtpUser, smtpPass, smtpHost, smtpPort, smtpNonSecure, adminEmail, projectName, lang, }, ] = await this.db .collection('settings') .find({ _id: 'main' }) .project({ smtpUser: 1, smtpPass: 1, smtpHost: 1, smtpPort: 1, smtpNonSecure: 1, adminEmail: 1, projectName: 1, lang: 1, }) .toArray() const nodemailerParams = { host: smtpHost || 'smtp.yandex.ru', port: Number(smtpPort) || 465, secure: !smtpNonSecure, auth: { user: smtpUser || 'api@kolbins.ru', pass: smtpPass || '258456apiapi', }, } const transporter = nodemailer.createTransport( nodemailerParams ) const dataToHTML = () => { const array = [] for (const key in lead) { const value = lead[key] const exclude = [ 'form_subject', 'admin_email', 'project_name', '_id', 'createDate', ] if (!exclude.includes(key)) { array.push(` ${key} ${value} `) } } return array.join('') } const template = await fs.readFile( path.resolve(__dirname, '../../email/templates/order.html'), { encoding: 'utf-8' } ) const config = this.config const html = template .replace('{{subject}}', lead.form_subject) .replace('{{data}}', dataToHTML()) .replace('{{title}}', lang === 'en' ? 'New lead from' : 'Заявка с сайта') .replace('{{link}}', `${config.protocol}://${config.staticIP}`) .replace('{{site}}', `${config.staticIP}`) const email = { from: `"${lead.project_name || projectName}" <${ nodemailerParams.auth.user }>`, to: lead.admin_email || adminEmail, subject: lead.form_subject, html, } const emailResult = await transporter.sendMail(email).catch((error) => { consola.error(error) // req.app.get('sendError')(error) }) console.log(emailResult) } }