Wecode - Project 1 (부트캠프)/Project 1 과정

Project 1- 3일 차: 코드 리뷰, 비교 - userService / 회원가입 , 로그인

Queen Julia 2023. 9. 14. 08:09

코드 분리를 이미 만든 한 파일에서 해보고, 한 branch에 올렸는데,

그 이후 바로 

처음부터 여러 branch에 올리니

 

app.post("/login", 로 써야 할지, const signup. 으로 써야할지

연결하는 함수는 어디에 들어가야할지 헷갈렸다. 

 

그래서 우선, 깃허브에 올라온 이전 팀의 동기 코드가 로그인 성공했다고 해서 

참고했다. 

 

일단, 나는 내 로컬에서 여러 branch를 다 올리기에 

분업한 후 merge 하는 팀과는 방식이 달랐다. 

 

// 동기 -userservice (연두색 부분은 나에게 없던 것/ 

const { DataSource } = require('typeorm')
const dotenv = require('dotenv')
const jwt = require('jsonwebtoken')
const bcrypt = require('bcrypt')
 
dotenv.config()      //    두 줄 합쳐서 나는 require("dotenv").config();

const myDataSource = new DataSource({
    type : process.env.DB_TYPE,     // 나는 CONNECTION
    host : process.env.DB_HOST,
    port : process.env.DB_PORT,
    username : process.env.DB_USER,   // 나는  USERNAME
    password : process.env.DB_PASSWORD,
    database : process.env.DB_NAME   /// 나는 DATABASE
})

myDataSource.initialize()    .then(() => {
        console.log("Data Source has been initialized!_userService")   // 나는 구분을 안 해줬구나 -> 나중에 어떤 차이일지 궁금
    })


//회원가입 
const userSignup = async(req, res) => {
    try {
        const me = req.body;
        console.log("ME : ", me);


        const {nickname, email, password } = me;

        //이메일 정규화     (3)
        let regex = new RegExp('[a-z0-9]+@[a-z]+\.[a-z]{2,3}');
        if(regex.test(email) == false){
            const error = new Error("DISABLE_EMAIL");
            error.statusCode = 400;
            error.code = "DISABLE_EMAIL"
            throw error
        }

 

 // 나는

   const emailRegex = /[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}/g;
    const extractedEmails = email.match(emailRegex);
    if (!email.match(emailRegex)) {
      const error = new Error("특수문자 사용 안함");
      error.statusCode = 400;
      throw error;
    }
    console.log(extractedEmails);


        //email, name, password가 다 입력되지 않은 경우. (1) 
        if(nickname === undefined || email === undefined || password === undefined){
            const error = new Error("KEY_ERROR")
            error.statusCode = 400
            error.code = "KEY_ERROR"
            throw error
        }

        //비밀번호가 너무 짧을 때 (4)
        if(password.length < 10){
            const error = new Error("INVALID_PASSWORD")
            error.statusCode = 400
            error.code = "INVALID_PASSWORD"
            throw error
        }

        //이메일 중복 가입.  (2)
        //1. 유저가 입력한 이메일이 이미 우리 DB에 있는지 확인
        const existingData = await myDataSource.query(`
         SELECT id, email FROM users WHERE email = '${email}'
        `)
        console.log("user : " , existingData)
     // 2. 있으면 에러 
        if(existingData.length != 0){                          // 나는 existingUser.length > 0
            const error = new Error("alreadyEmail")
            error.statusCode = 400
            error.code = "alreadyEmail"
            throw error
        }

        //비밀번호에 특수문자 없을 때
        const specialKey = /[~!@#$%^&*()_+|{}]/; //특수문자
        if(specialKey.test(password) == false) {
            const error = new Error("passwordNeedSpecial")
            error.statusCode = 400
            error.code = "passwordNeedSpecial"
            throw error
        }

        //비밀번호 암호화
        const saltRounds = 10;
        const hashedPw = await bcrypt.hash(password, saltRounds);

        const userData = await myDataSource.query(`
        INSERT INTO users (
            nickname, 
            email, 
            password
            ) VALUES (
                '${nickname}',
                '${email}',
                '${hashedPw}'
            )
        `)

        console.log("signUpSuccess");
        console.log("New User : ", userData);
        

        //FRONT 전달
        return res.status(201).json({
            "code" : "signUpSuccess"
        })

    } catch (error) {
        console.log(error)
        return res.status(400).json(error)
    }
}


//로그인 
const userLogin = async(req, res) => {
    try {
        const { email, password } = req.body;   

 

// 나는 

// const email = req.body.email;
// const password = req.body.password;

       
        //Email을 가진 사람 있는지 확인 (2)
        const userEmail = await myDataSource.query(`. //나는 existinguser로 했는데, 알아보는데 ★편한 변수인듯
        SELECT id, email, password FROM users WHERE email = '${email}'
       `)

        //Email pw KEY_ERROR 확인  (1)

        if(email === undefined || password === undefined){
            const error = new Error("KEY_ERROR")
            error.statusCode = 400
            error.code = "KEY_ERROR"
            throw error
        }

        //if 유저 이메일이 없으면 -> 없는 유저라고 출력
        if(userEmail.length === 0){
           const error = new Error("emptyEmail").  //duplicated emaill 로 내가 잘못 메세지 설정한 것을 알 게 됨"EMAIL_Unexist"
            error.statusCode = 400
            error.code = "emptyEmail" // 나는 400
            throw error
        }
        //없으면 -> 정상 진행

 


// 동기 님은 해당 이메일 소유자의 비밀번호 일치 확인을 해쉬로 하심

        //찐 비번이랑 암호화 해서 DB에 있는 비번 비교
        const hashPw = await bcrypt.compare(password, userEmail[0].password);

        //if false라면 -> 없는 비번이라고 출력
        if(!hashPw){
            const error = new Error("passwordError")
            error.statusCode = 400
            error.code = "passwordError"
            throw error
        }
        //같으면 -> 정상 진행

        //payload로 전달할 내용인 해당 유저의 id값
        const userId userEmail[0].id;
        const token = jwt.sign({"id" : userId }, process.env.TYPEORM_JWT)
        // 나는 const token = jwt.sign({id : userEmail[0].id}, 'password')

        console.log("loginSuccess")
        return res.status(200).json({
            "code" : "logInSuccess",
            "accessToken" : token
        })

    } catch (error) {
        console.log(error)
        return res.status(400).json(error)
    }
}


module.exports = {
    userSignup,
    userLogin
}

 

//나는 getUsers도 했다 .  프론트가 나중에 받아갈때를 위해.. 없어도 되나>?

const getUsers = async (req, res) => {
try {
const userData = await myDataSource.query(
"SELECT id, nickname, email FROM USERS "
);

console.log("USER DATA:", userData);

return res.status(200).json({
users: userData,
});
} catch (error) {
console.log(error);
return res.status(500).json({
message: error.message,
});
}
};
module.exprots = {
signUp: signUp,
logIn: logIn,
getUsers: getUsers,
};