Я хочу расширить объект 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
}