study / okdevtv star
허광남 허광남 02-28
bookmark with userId
@c84d1feae090cc573ce30f3b74e9400a63b37499
lib/user.js
--- lib/user.js
+++ lib/user.js
@@ -22,6 +22,16 @@
   return row
 }
 
+async function getByEmail(email) {
+  await sequelize.sync()
+  const row = await User.findOne({
+    where: {
+      email: email,
+    },
+  })
+  return row
+}
+
 async function findAll() {
   await sequelize.sync()
   const rows = await User.findAll()
@@ -60,6 +70,7 @@
 module.exports = {
   create,
   get,
+  getByEmail,
   findAll,
   update,
   remove,
 
lib/utils (added)
+++ lib/utils
@@ -0,0 +1,25 @@
+const bcrypt = require('bcryptjs')
+
+async function hashPassword(password) {
+  const hashed = await hashPasswordInner(password)
+  return hashed;
+}
+
+function hashPasswordInner(password) {
+  const saltRounds = 10
+  return new Promise((resolve, reject) => {
+    bcrypt.hash(password, saltRounds, function (err, hash) {
+      if (err) reject(err)
+      resolve(hash)
+    })
+  })
+}
+
+async function comparePassword(password, hash) {
+  return await bcrypt.compare(password, hash)
+}
+
+module.exports = {
+  hashPassword,
+  comparePassword,
+}
routes/apis.js
--- routes/apis.js
+++ routes/apis.js
@@ -35,7 +35,7 @@
 })
 
 router.post('/bookmark', async function (req, res) {
-  let data = req.body
+  let data = { pathname: req.body.pathname, userId: req.session.userId }
   await bookmark.create(data)
   res.json({
     status: 200,
routes/user.js
--- routes/user.js
+++ routes/user.js
@@ -142,9 +142,9 @@
   const password = req.body.password
   try {
     const result = await user_service.doLogin({ email, password })
-    if (result) {
+    if (result.id) {
       req.session.user = email
-      console.log(req.session.user)
+      req.session.userId = result.id
       res.json({ status: 'ok', msg: 'login success' })
       return
     } else {
services/user-service.js
--- services/user-service.js
+++ services/user-service.js
@@ -3,18 +3,7 @@
 const knex = require('../lib/knex')
 const mail = require('../lib/mail')
 const { v4: uuidv4 } = require('uuid')
-const bcrypt = require('bcryptjs')
-const { send } = require('../lib/aws-ses')
-
-function hashPassword(password) {
-  const saltRounds = 10
-  return new Promise((resolve, reject) => {
-    bcrypt.hash(password, saltRounds, function (err, hash) {
-      if (err) reject(err)
-      resolve(hash)
-    })
-  })
-}
+const { hashPassword, comparePassword } = require('../lib/utils')
 
 module.exports = {
   signupByGitHub: async function (github) {
@@ -57,39 +46,6 @@
       email: email.trim(),
       uuid,
     })
-  },
-  signupByEmail_: async function (email) {
-    // check duplication
-    try {
-      const result = await knex.raw(`select email from user where email = ?`, [
-        email.trim(),
-      ])
-      if (result[0].length > 0) {
-        throw new Error('duplicate email')
-      }
-
-      // check recent
-      const sql_recent = `select count(*) as cnt
-          from user_candidate
-          where email = ? and finish = 'N'
-          and timediff(now(), createdAt) < '00:05:00';`
-      const result_recent = await knex.raw(sql_recent, [email.trim()])
-      if (result_recent[0][0]['cnt'] > 0) {
-        throw new Error('email sent already')
-      }
-
-      // generate uuid
-      const uuid = uuidv4()
-      const url = process.env.BASE_URL
-      await this.sendGuideMail(url, uuid, email)
-
-      // save sending info
-      const res = await user_candidate.create(email, uuid)
-      return res
-    } catch (error) {
-      console.error(error)
-      throw error
-    }
   },
   sendGuideMail: async function (uuid, email) {
     const url = process.env.BASE_URL
@@ -158,13 +114,16 @@
   },
 
   doLogin: async ({ email, password }) => {
-    const query = `select id, passwd from users where email = ?`
-    const result = await knex.raw(query, [email])
-    if (result[0].length === 0) {
+    const result = await user.getByEmail(email)
+    if (!result.dataValues.id) {
       throw new Error('등록되지 않은 사용자입니다.')
     }
-    const hashedPassword = result[0][0].passwd
-    return bcrypt.compare(password, hashedPassword)
+    const isOk = await comparePassword(password, result.dataValues.passwd)
+    if (isOk) {
+      return result.dataValues
+    } else {
+      throw new Error('비밀번호가 일치하지 않습니다.')
+    }
   },
   resetPassword: async (email) => {
     // generate uuid
tests/user.test.js
--- tests/user.test.js
+++ tests/user.test.js
@@ -1,4 +1,5 @@
 const user = require('../lib/user')
+const { hashPassword, comparePassword } = require('../lib/utils')
 const randomEmail = require('random-email')({ domain: 'okdevtv.com' })
 const userData = {
   email: randomEmail,
@@ -19,6 +20,17 @@
     expect(row.email).toBe(userData.email)
     user.remove(result.dataValues.id)
   })
+
+  it('login', async () => {
+    const hashed = await hashPassword('okpassokpass');
+    userData.passwd = hashed;
+    const result = await user.create(userData)
+    const row = await user.get(result.dataValues.id)
+    const compare = await comparePassword('okpassokpass', row.passwd)
+    expect(compare).toBe(true)
+
+    user.remove(result.dataValues.id)
+  })
 })
 
 module.exports = userData
Add a comment
List