[next-todo] register

dnslfkrh·2024년 7월 12일

todo 웹앱 프로젝트

회원가입 순서

  1. 사용 가능한 아이디인지 검사
  2. 사용 가능한 이메일인지 검사
  3. 이메일로 인증코드 전송
  4. 인증코드 검증
  5. 비밀번호 및 비밀번호 확인

사용 가능한 아이디인지 검사

export const checkIdExist = async (id: string): Promise<boolean> => {

    try {
        const [isIdExist] = await database.execute<RowDataPacket[]>('SELECT user_id FROM users WHERE user_id = ?', [id]);

        console.log(isIdExist);
        if (Array.isArray(isIdExist) && isIdExist.length === 0) {
            return true;
        } else {
            return false;
        }

    } catch (error) {
        console.error("데이터베이스 조회 중 오류:", error);
        throw new Error('데이터를 가져오는 중 오류가 발생했습니다.');
    }
}

사용 가능한 이메일인지 검사

export const checkEmailAvailability = async (email: string): Promise<boolean> => {

    try {
        const [isEmailExist] = await database.execute<RowDataPacket[]>('SELECT user_id FROM users WHERE email = ?', [email]);

        if (Array.isArray(isEmailExist) && isEmailExist.length === 0) {
            return true;
        } else {
            return false;
        }

    } catch (error) {
        console.error("데이터베이스 조회 중 오류:", error);
        throw new Error('데이터를 가져오는 중 오류가 발생했습니다.');
    }
}

아이디와 이메일 모두 테이블에 레코드 정보가 없으면 사용 가능

이메일로 인증코드 전송

export const sendEmail = async (sendCase: number, email: string, id: string): Promise<boolean> => {
    try {
        const transporter = nodemailer.createTransport({
            service: 'gmail',
            auth: {
                user: process.env.EMAIL_USER,
                pass: process.env.EMAIL_KEY
            }
        });

        let mailOptions;
        let code;

        switch (sendCase) {
            case 1:
                code = Math.random().toString(36).substring(2, 8);
                mailOptions = {
                    to: email,
                    subject: 'Verification code',
                    text: `Your verification code is : [${code}]`
                };
                await transporter.sendMail(mailOptions);
                const isLogCreate = await createLog(email, code);
                if (!isLogCreate) {
                    return false;
                }

                break;
          	
            // ~~
        }

        return true;
    } catch (error) {
        console.error('Failed to send email:', error);
        return false;
    }
}

nodemailer 모듈을 사용하여 gmail로 이메일 전송

인증코드 검증

export const verifyCode = async (email: string, code: string): Promise<boolean> => {
    try {
        const query = 'SELECT * FROM logs WHERE email = ? AND code = ?';
        const values = [email, code];
        const [isLogExist] = await database.execute(query, values);

        if (Array.isArray(isLogExist) && isLogExist.length > 0) {
            return true;
        } else {
            return false;
        }
    } catch (error) {
        console.error('Error verifying code:', error);
        return false;
    }
}

쌩 sql로 하는 것 보다는..
그냥 서버에서 typeorm 써서 해야겠다..

profile
안녕하세요

0개의 댓글