vertically-challenged
@vertically-challenged

Как сделать этот код лучше?

Я хочу расширить объект sql данной функцией, но как вынести описание методов registerUser и authentication в отдельный файл, чтобы TypeScript не ругался и код функции не был таким громоздким, ведь в этих методах я обращаюсь к нативным методам того же объекта sql?

const crp = require('./crypto.ts')

interface IExtendedSQL {
  [index: string]: any
}

interface IRegisterResponse {
  status: string
  cause: string
  message: string
}

module.exports = (sql: any) => {
  const extendedSQL: IExtendedSQL = sql

  extendedSQL.registerUser = (email: string, login: string, password: string): Promise<IRegisterResponse> => {
    return new Promise<IRegisterResponse>((resolve) => {
      if (password.length < 10 || password.length > 64) {
        resolve({
          status: 'unregistered',
          cause: 'Invalid password',
          message: 'Пароль должен быть от 10 до 64 символов',
        })
        return
      }
      extendedSQL.query(`SELECT * FROM users WHERE email = '${email}' or login = '${login}'`, (err: any, results: any): void => {
        if (err) console.log(err)
        if (results.length !== 0) {
          resolve({
            status: 'unregistered',
            cause: 'This username or email address is already taken',
            message: 'Такой логин или почта уже используются',
          })
          return
        }
        crp.hash(password).then((result: string) => {
          extendedSQL.query('create table if not exists users(id int primary key auto_increment, email varchar(255) not null, login varchar(255) not null, password varchar(255) not null)')
          extendedSQL.query(`INSERT INTO users(email, login, password) VALUES('${email}', '${login}', '${result}')`)
        })
        resolve({
          status: 'registered',
          cause: 'Successful registration',
          message: 'Успешная регистрация',
        })
      })
    })
  }
  extendedSQL.authentication = (emailOrLogin: string, password: string): Promise<boolean> => {
    return new Promise<boolean>((resolve) => {
      const searchField = (emailOrLogin.includes('@')) ? 'email' : 'login'
      extendedSQL.query(`SELECT * FROM users WHERE ${searchField} = '${emailOrLogin}'`, async (err: any, results: any): Promise<void> => {
        if (err) console.log(err)
        if (results.length === 0) {
          resolve(false)
          return
        }
        const [, salt] = results[0].password.split(':')
        const generatedPassword = await crp.hash(password, salt)
        if (generatedPassword === results[0].password) resolve(true)
        resolve(false)
      })
    })
  }
  return extendedSQL
}
  • Вопрос задан
  • 73 просмотра
Пригласить эксперта
Ответы на вопрос 1
@karminski
Senior React.JS Developer
Что сразу бросилось в глаза в registerUser. Вы на ошибку валидации делаете resolve, хотя логичнее делать reject. Resolve в вашем случае - это успешная регистрация.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы