From 6fb3c9c65252e66e07b3fd9fc898c6c67cf1f8fe Mon Sep 17 00:00:00 2001 From: Emily Date: Sun, 2 Jun 2024 16:01:57 +0200 Subject: [PATCH] fix email env --- .gitignore | 1 + broker/src/Controller.ts | 13 ++- dashboard/nuxt.config.ts | 4 + .../server/api/auth/google_login.post.ts | 4 +- dashboard/server/init.ts | 12 ++- shared/services/EmailService.ts | 80 +++++++++++-------- 6 files changed, 75 insertions(+), 39 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..17f15e1 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +steps \ No newline at end of file diff --git a/broker/src/Controller.ts b/broker/src/Controller.ts index ffbb634..2bb57af 100644 --- a/broker/src/Controller.ts +++ b/broker/src/Controller.ts @@ -2,7 +2,16 @@ import { TProjectCount } from "@schema/ProjectsCounts"; import { ProjectModel } from "@schema/ProjectSchema"; import { UserModel } from "@schema/UserSchema"; import { LimitNotifyModel } from "@schema/broker/LimitNotifySchema"; -import { sendLimitEmail50 } from '@services/EmailService'; +import EmailService from '@services/EmailService'; +import { requireEnv } from "../../shared/utilts/requireEnv"; + + +EmailService.createTransport( + requireEnv('EMAIL_SERVICE'), + requireEnv('EMAIL_HOST'), + requireEnv('EMAIL_USER'), + requireEnv('EMAIL_PASS'), +); export async function checkLimitsForEmail(projectCounts: TProjectCount) { @@ -13,7 +22,7 @@ export async function checkLimitsForEmail(projectCounts: TProjectCount) { if (!project) return; const owner = await UserModel.findById(project.owner); if (!owner) return; - await sendLimitEmail50(owner.email); + await EmailService.sendLimitEmail50(owner.email); await LimitNotifyModel.updateOne({ project_id: projectCounts._id }, { limit1: true, limit2: false, limit3: false }, { upsert: true }); } diff --git a/dashboard/nuxt.config.ts b/dashboard/nuxt.config.ts index e504985..c676f73 100644 --- a/dashboard/nuxt.config.ts +++ b/dashboard/nuxt.config.ts @@ -32,6 +32,10 @@ export default defineNuxtConfig({ AI_ORG: process.env.AI_ORG, AI_PROJECT: process.env.AI_PROJECT, AI_KEY: process.env.AI_KEY, + EMAIL_SERVICE: process.env.EMAIL_SERVICE, + EMAIL_HOST: process.env.EMAIL_HOST, + EMAIL_USER: process.env.EMAIL_USER, + EMAIL_PASS: process.env.EMAIL_PASS, AUTH_JWT_SECRET: process.env.AUTH_JWT_SECRET, GOOGLE_AUTH_CLIENT_ID: process.env.GOOGLE_AUTH_CLIENT_ID, GOOGLE_AUTH_CLIENT_SECRET: process.env.GOOGLE_AUTH_CLIENT_SECRET, diff --git a/dashboard/server/api/auth/google_login.post.ts b/dashboard/server/api/auth/google_login.post.ts index 51aad0f..6de7494 100644 --- a/dashboard/server/api/auth/google_login.post.ts +++ b/dashboard/server/api/auth/google_login.post.ts @@ -2,7 +2,7 @@ import { OAuth2Client } from 'google-auth-library'; import { createUserJwt } from '~/server/AuthManager'; import { UserModel } from '@schema/UserSchema'; -import { sendWelcomeEmail } from '@services/EmailService'; +import EmailService from '@services/EmailService'; const { GOOGLE_AUTH_CLIENT_SECRET, GOOGLE_AUTH_CLIENT_ID } = useRuntimeConfig() @@ -47,7 +47,7 @@ export default defineEventHandler(async event => { const savedUser = await newUser.save(); setImmediate(() => { - if (payload.email) sendWelcomeEmail(payload.email); + if (payload.email) EmailService.sendWelcomeEmail(payload.email); }); return { error: false, access_token: createUserJwt({ email: savedUser.email, name: savedUser.name }) } diff --git a/dashboard/server/init.ts b/dashboard/server/init.ts index c814c6f..eb4f1ff 100644 --- a/dashboard/server/init.ts +++ b/dashboard/server/init.ts @@ -1,5 +1,7 @@ import mongoose from "mongoose"; import { Redis } from "~/server/services/CacheService"; +import EmailService from '@services/EmailService'; + const config = useRuntimeConfig(); let connection: mongoose.Mongoose; @@ -7,8 +9,16 @@ export default async () => { console.log('[SERVER] Initializing'); + EmailService.createTransport( + config.EMAIL_SERVICE, + config.EMAIL_HOST, + config.EMAIL_USER, + config.EMAIL_PASS, + ); + + if (!connection || connection.connection.readyState == mongoose.ConnectionStates.disconnected) { - console.log('[DATABASE] Connecting'); + console.log('[DATABASE] Connecting'); connection = await mongoose.connect(config.MONGO_CONNECTION_STRING); console.log('[DATABASE] Connected'); } diff --git a/shared/services/EmailService.ts b/shared/services/EmailService.ts index 1b6815a..a9aefa0 100644 --- a/shared/services/EmailService.ts +++ b/shared/services/EmailService.ts @@ -1,14 +1,8 @@ import nodemailer from 'nodemailer'; -import { requireEnv } from '../utilts/requireEnv'; +import type SMTPTransport from 'nodemailer/lib/smtp-transport'; + + -const transport = nodemailer.createTransport({ - service: requireEnv('EMAIL_SERVICE'), - host: requireEnv('EMAIL_HOST'), - auth: { - user: requireEnv('EMAIL_USER'), - pass: requireEnv('EMAIL_PASS') - } -}); const TemplateEmail50 = ` @@ -228,32 +222,50 @@ const TemplateEmailWelcome = ` ` -export async function sendLimitEmail50(target: string) { - try { - await transport.sendMail({ - from: 'helplitlyx@gmail.com', - to: target, - subject: 'Project limit 50%', - html: TemplateEmail50 + +class EmailService { + + private transport: nodemailer.Transporter; + + createTransport(service: string, host: string, user: string, pass: string) { + this.transport = nodemailer.createTransport({ + service, host, auth: { user, pass } }); - return true; - } catch (ex) { - console.error('ERROR SENDING EMAIL', ex); - return false; } + + async sendLimitEmail50(target: string) { + try { + if (!this.transport) return console.error('Transport not created'); + await this.transport.sendMail({ + from: 'helplitlyx@gmail.com', + to: target, + subject: 'Project limit 50%', + html: TemplateEmail50 + }); + return true; + } catch (ex) { + console.error('ERROR SENDING EMAIL', ex); + return false; + } + } + + async sendWelcomeEmail(target: string) { + try { + if (!this.transport) return console.error('Transport not created'); + await this.transport.sendMail({ + from: 'helplitlyx@gmail.com', + to: target, + subject: 'Welcome to Litlyx', + html: TemplateEmailWelcome + }); + return true; + } catch (ex) { + console.error('ERROR SENDING EMAIL', ex); + return false; + } + } + } -export async function sendWelcomeEmail(target: string) { - try { - await transport.sendMail({ - from: 'helplitlyx@gmail.com', - to: target, - subject: 'Welcome to Litlyx', - html: TemplateEmailWelcome - }); - return true; - } catch (ex) { - console.error('ERROR SENDING EMAIL', ex); - return false; - } -} \ No newline at end of file +const instance = new EmailService(); +export default instance; \ No newline at end of file