diff --git a/app.js b/app.js index 59549e359143e451d3ab7e6d7f8870e4d7f5918f..760a5f5ea72936604d0bb7806ccacab84ca238e9 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 33a84fef591888b17b0c06be0da4b8d7a719175f..0e23b2b4858e51758e9fbb1d1e6dbdffd6e38fac 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 433cd8e102f72ec8a7df960cff07a988a630047e..25084b2c6491f525d8d5566722e11ecd0323ed00 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 2fb67024409f8bea0173ef5b34af4be60bb9e3c4..4270c99b5dcd584e48903debc1b79e87d75d8723 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 047103cb898758320c84dac0b6ace82de4e79ddb..7158cc00244d1e4464e1b87642f281428d547969 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 25565ef50ce3771108333b8620a0ccd296a8c9b6..0d6d309e995805982196ecc64b500b74d3f52c00 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 54c397441cdd84888eeeaf11240eedfbfd4b9a85..1766b43348c6c8b4d826c7de45109a7a56c2cb69 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 635009148cec39be1b0daaa648b567a787b89297..8ed89722cef23636897a48a6f8d5ab273961b8e1 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 + }); +};