From b72f51599f7f7e8a6afc94a72e3e286f43c993ea Mon Sep 17 00:00:00 2001
From: dongjae <dhehdwo7@ajou.ac.kr>
Date: Sat, 9 Dec 2023 20:55:44 +0900
Subject: [PATCH] feat(auth): Merge email

---
 app.js                                        |  95 ++++++------
 package-lock.json                             |  12 --
 package.json                                  |   1 -
 src/common/database/index.js                  |   2 +-
 src/common/database/migration/migration.js    |   2 +-
 ...entities.sql => 09_authemail.entities.sql} |   2 +-
 src/common/dotenv/dotenv.js                   |  35 +++--
 src/modules/auth/auth.email.js                | 135 ++++++++++--------
 8 files changed, 149 insertions(+), 135 deletions(-)
 rename src/common/database/migration/schema/{authemail.entities.sql => 09_authemail.entities.sql} (78%)

diff --git a/app.js b/app.js
index 59549e3..760a5f5 100644
--- a/app.js
+++ b/app.js
@@ -4,48 +4,53 @@ const WebSocket = require("ws");
 const { initWebSocket } = require("./src/modules/socket/chatws.controller.js");
 const routes = require("./src/route");
 const { dongception } = require("#dongception");
-const dotenv = require("./src/common/dotenv/dotenv.js")
-dotenv();
-
-const app = express();
-const port = 8080;
-const socketPort = 3001;
-
-const server = http.createServer(app);
-
-const wss = new WebSocket.Server({
-  server,
-  cors: {
-    origin: "*",
-    methods: ["GET", "POST"],
-  },
-});
-initWebSocket(wss);
-
-app.use(express.json());
-app.use(express.urlencoded({ extended: true }));
-app.use((req, res, next) => {
-  res.header("Access-Control-Allow-Origin", "*");
-  res.header(
-    "Access-Control-Allow-Headers",
-    "Origin, X-Requested-With, Content-Type, Accept, Authorization"
-  );
-  res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
-
-  if (req.method === 'OPTIONS') {
-    res.status(200).send();
-  } else {
-    next();
-  }
-});
-app.use("/api", routes);
-
-app.use(dongception);
-
-app.listen(port, () => {
-  console.log(`Server is running on port ${port}`);
-});
-
-server.listen(socketPort, () => {
-  console.log("running on port " + socketPort);
-});
+const dotenv = require("./src/common/dotenv/dotenv.js");
+
+async function main() {
+  await dotenv();
+
+  const app = express();
+  const port = 8080;
+  const socketPort = 3001;
+
+  const server = http.createServer(app);
+
+  const wss = new WebSocket.Server({
+    server,
+    cors: {
+      origin: "*",
+      methods: ["GET", "POST"],
+    },
+  });
+  initWebSocket(wss);
+
+  app.use(express.json());
+  app.use(express.urlencoded({ extended: true }));
+  app.use((req, res, next) => {
+    res.header("Access-Control-Allow-Origin", "*");
+    res.header(
+      "Access-Control-Allow-Headers",
+      "Origin, X-Requested-With, Content-Type, Accept, Authorization"
+    );
+    res.header("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
+
+    if (req.method === "OPTIONS") {
+      res.status(200).send();
+    } else {
+      next();
+    }
+  });
+  app.use("/api", routes);
+
+  app.use(dongception);
+
+  app.listen(port, () => {
+    console.log(`Server is running on port ${port}`);
+  });
+
+  server.listen(socketPort, () => {
+    console.log("running on port " + socketPort);
+  });
+}
+
+main();
diff --git a/package-lock.json b/package-lock.json
index 33a84fe..0e23b2b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -12,7 +12,6 @@
         "cookie-parser": "^1.4.6",
         "cors": "^2.8.5",
         "crypto": "^1.0.1",
-        "dotenv": "^16.3.1",
         "express": "^4.18.2",
         "express-session": "^1.17.3",
         "jsonwebtoken": "^9.0.2",
@@ -255,17 +254,6 @@
         "npm": "1.2.8000 || >= 1.4.16"
       }
     },
-    "node_modules/dotenv": {
-      "version": "16.3.1",
-      "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz",
-      "integrity": "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==",
-      "engines": {
-        "node": ">=12"
-      },
-      "funding": {
-        "url": "https://github.com/motdotla/dotenv?sponsor=1"
-      }
-    },
     "node_modules/ecdsa-sig-formatter": {
       "version": "1.0.11",
       "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
diff --git a/package.json b/package.json
index 433cd8e..25084b2 100644
--- a/package.json
+++ b/package.json
@@ -11,7 +11,6 @@
     "cookie-parser": "^1.4.6",
     "cors": "^2.8.5",
     "crypto": "^1.0.1",
-    "dotenv": "^16.3.1",
     "express": "^4.18.2",
     "express-session": "^1.17.3",
     "jsonwebtoken": "^9.0.2",
diff --git a/src/common/database/index.js b/src/common/database/index.js
index 2fb6702..4270c99 100644
--- a/src/common/database/index.js
+++ b/src/common/database/index.js
@@ -2,7 +2,7 @@ const mysql = require("mysql2");
 
 const connection = mysql.createConnection({
   host: "127.0.0.1",
-  port: 3306,
+  port: 4040,
   user: "root",
   password: "1234",
   database: "cakaatalk",
diff --git a/src/common/database/migration/migration.js b/src/common/database/migration/migration.js
index 047103c..7158cc0 100644
--- a/src/common/database/migration/migration.js
+++ b/src/common/database/migration/migration.js
@@ -5,7 +5,7 @@ const path = require("path");
 // MySQL 연결 설정
 const connection = mysql.createConnection({
   host: "127.0.0.1",
-  port: 3306,
+  port: 4040,
   user: "root",
   password: "1234",
   database: "cakaatalk",
diff --git a/src/common/database/migration/schema/authemail.entities.sql b/src/common/database/migration/schema/09_authemail.entities.sql
similarity index 78%
rename from src/common/database/migration/schema/authemail.entities.sql
rename to src/common/database/migration/schema/09_authemail.entities.sql
index 25565ef..0d6d309 100644
--- a/src/common/database/migration/schema/authemail.entities.sql
+++ b/src/common/database/migration/schema/09_authemail.entities.sql
@@ -1,4 +1,4 @@
- CREATE TABLE IF NOT EXISTS authemail (
+ CREATE TABLE AUTHEMAIL (
     id INT AUTO_INCREMENT PRIMARY KEY,
     email VARCHAR(255) NOT NULL,
     auth_code VARCHAR(6) NOT NULL,
diff --git a/src/common/dotenv/dotenv.js b/src/common/dotenv/dotenv.js
index 54c3974..1766b43 100644
--- a/src/common/dotenv/dotenv.js
+++ b/src/common/dotenv/dotenv.js
@@ -1,21 +1,26 @@
-const fs = require('fs');
-const path = require('path');
+const fs = require("fs");
+const path = require("path");
 
 const dotenv = () => {
-    const envPath = path.join('.env');
-    try {
-      const envContent = fs.readFileSync(envPath, 'utf-8');
-    
-      envContent.split('\n').forEach((line) => {
-        const [key, value] = line.split('=');
+  const envPath = path.join(".env");
+  return new Promise((resolve, reject) => {
+    fs.readFile(envPath, "utf-8", (err, data) => {
+      if (err) {
+        reject("Error loading env: " + err);
+        return;
+      }
+
+      data.split("\n").forEach((line) => {
+        const [key, value] = line.split("=");
         if (key && value) {
           process.env[key.trim()] = value.trim();
         }
       });
-    
-      console.log('env loaded successfully');
-    } catch (error) {
-      console.error('Error loading env:', error);
-    }
-}
-module.exports = dotenv;
\ No newline at end of file
+
+      console.log("env loaded successfully");
+      resolve();
+    });
+  });
+};
+
+module.exports = dotenv;
diff --git a/src/modules/auth/auth.email.js b/src/modules/auth/auth.email.js
index 6350091..8ed8972 100644
--- a/src/modules/auth/auth.email.js
+++ b/src/modules/auth/auth.email.js
@@ -1,43 +1,48 @@
-const nodemailer = require('nodemailer');
-const dotenv = require('dotenv');
-const crypto = require('crypto');
+const nodemailer = require("nodemailer");
+const crypto = require("crypto");
 const { ErrorResponse } = require("#dongception");
 
-const gmail_email = process.env.GMAIL_SENDER;
-const gmail_password = process.env.GMAIL_PASSWORD;
+let gmail_email = process.env.GMAIL_SENDER;
+let gmail_password = process.env.GMAIL_PASSWORD;
 const CODE_LEN = 6;
 
 function generateRandomString(length) {
-    const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
-    let result = '';
+  const characters =
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+  let result = "";
 
-    for (let i = 0; i < length; i++) {
-        const randomIndex = crypto.randomInt(characters.length);
-        result += characters.charAt(randomIndex);
-    }
+  for (let i = 0; i < length; i++) {
+    const randomIndex = crypto.randomInt(characters.length);
+    result += characters.charAt(randomIndex);
+  }
 
-    return result;
+  return result;
 }
 
-const transporter = nodemailer.createTransport({
-    service: 'gmail',
-    host: 'stmp.gmail.com',
-    port: '587',
-    auth: {
-        user: gmail_email,
-        pass: gmail_password
-    }
-});
+let transporter;
 
 exports.sendAuthMail = async (toEmail) => {
-    return new Promise((resolve, reject) => {
-        const authCode = generateRandomString(CODE_LEN);
+  gmail_email = process.env.GMAIL_SENDER;
+  gmail_password = process.env.GMAIL_PASSWORD;
+  transporter = nodemailer.createTransport({
+    service: "gmail",
+    host: "stmp.gmail.com",
+    port: "587",
+    auth: {
+      user: gmail_email,
+      pass: gmail_password,
+    },
+  });
+
+  console.log(gmail_email, gmail_password);
+  return new Promise((resolve, reject) => {
+    const authCode = generateRandomString(CODE_LEN);
 
-        const mailOptions = {
-            from: gmail_email,
-            to: toEmail,
-            subject: '[no-reply] Cakaatalk 회원가입 인증 코드 안내',
-            html: `<div style="margin:100px;">
+    const mailOptions = {
+      from: gmail_email,
+      to: toEmail,
+      subject: "[no-reply] Cakaatalk 회원가입 인증 코드 안내",
+      html: `<div style="margin:100px;">
                         <h1> 안녕하세요.</h1>
                         <h1> Cakaatalk 인증 요청 메일 입니다.</h1>
                         <br>
@@ -49,30 +54,42 @@ exports.sendAuthMail = async (toEmail) => {
                             <div style="font-size:130%">${authCode}</div>
                         </div>
                         <br/>
-                    </div>`
-        };
+                    </div>`,
+    };
 
-        transporter.sendMail(mailOptions, function (error, info) {
-            if (error) {
-                console.error('이메일 전송 실패:', error);
-                throw new ErrorResponse(STATUS_CODES.BAD_REQUEST, "이메일 전송 실패");
-            } else {
-                console.log('이메일 전송 성공:', info.response);
-                resolve(authCode);
-            }
-        });
+    transporter.sendMail(mailOptions, function (error, info) {
+      if (error) {
+        console.error("이메일 전송 실패:", error);
+        throw new ErrorResponse(STATUS_CODES.BAD_REQUEST, "이메일 전송 실패");
+      } else {
+        console.log("이메일 전송 성공:", info.response);
+        resolve(authCode);
+      }
     });
-}
+  });
+};
 
 exports.sendFindMail = async (toEmail) => {
-    return new Promise((resolve, reject) => {
-        const authCode = generateRandomString(CODE_LEN);
+  gmail_email = process.env.GMAIL_SENDER;
+  gmail_password = process.env.GMAIL_PASSWORD;
+  transporter = nodemailer.createTransport({
+    service: "gmail",
+    host: "stmp.gmail.com",
+    port: "587",
+    auth: {
+      user: gmail_email,
+      pass: gmail_password,
+    },
+  });
+
+  return new Promise((resolve, reject) => {
+    const authCode = generateRandomString(CODE_LEN);
 
-        const mailOptions = {
-            from: gmail_email,
-            to: toEmail,
-            subject: '[no-reply] Cakaatalk 비밀번호 찾기 코드 안내',
-            html: `<div style="margin:100px;">
+    const mailOptions = {
+      from: gmail_email,
+      to: toEmail,
+      subject: "[no-reply] Cakaatalk 비밀번호 찾기 코드 안내",
+      html: `<div style="margin:100px;">
                         <h1> 안녕하세요.</h1>
                         <h1> Cakaatalk 비밀번호 찾기 메일 입니다.</h1>
                         <br>
@@ -84,17 +101,17 @@ exports.sendFindMail = async (toEmail) => {
                             <div style="font-size:130%">${authCode}</div>
                         </div>
                         <br/>
-                    </div>`
-        };
+                    </div>`,
+    };
 
-        transporter.sendMail(mailOptions, function (error, info) {
-            if (error) {
-                console.error('이메일 전송 실패:', error);
-                reject(error);
-            } else {
-                console.log('이메일 전송 성공:', info.response);
-                resolve(authCode);
-            }
-        });
+    transporter.sendMail(mailOptions, function (error, info) {
+      if (error) {
+        console.error("이메일 전송 실패:", error);
+        reject(error);
+      } else {
+        console.log("이메일 전송 성공:", info.response);
+        resolve(authCode);
+      }
     });
-}
\ No newline at end of file
+  });
+};
-- 
GitLab