- Antes de começarmos a escrever o controlador já sabemos que será necessário ter um serviço que obterá o usuário a partir do seu e-mail, que será usado para verificar se um usuário já existe. Crie o serviço userService.ts e adicione o método findByEmail:
// src/services/userService.ts
import { User } from '../models'
export const userService = {
findByEmail: async (email: string) => {
const user = await User.findOne({
attributes: [
'id',
['first_name', 'firstName'],
['last_name', 'lastName'],
'phone',
'birth',
'email',
'password'
],
where: { email }
})
return user
},
}
- Além disso, precisaremos de um método para criar o novo usuário no banco de dados. Mas antes vamos garantir que estamos exportando a interface que contém os atributos de criação de um usuário. O arquivo de modelo deve estar da seguinte forma:
// src/models/user.ts
// ...
export interface UserCreationAttributes extends Optional<UserAttributes, 'id'> {}
// ...
- Agora vamos utilizar a interface UserCreationAttributes na criação do método create:
// src/services/userService.ts
import { User } from '../models'
import { UserCreationAttributes } from '../models/user'
export const userService = {
findByEmail: async (email: string) => {
const user = await User.findOne({
attributes: [
'id',
['first_name', 'firstName'],
['last_name', 'lastName'],
'phone',
'birth',
'email',
'password'
],
where: { email }
})
return user
},
create: async (attributes: UserCreationAttributes) => {
const user = await User.create(attributes)
return user
}
}
- Vamos então criar um controlador para as rotas de autenticação chamado authController.ts. Nele vamos começar criando o método register:
// src/controllers/authController.ts
import { Request, Response } from 'express'
import { userService } from '../services/userService'
export const authController = {
// POST /auth/register
register: async (req: Request, res: Response) => {
const { firstName, lastName, phone, birth, email, password } = req.body
try {
const userAlreadyExists = await userService.findByEmail(email)
if (userAlreadyExists) {
throw new Error('Este e-mail já está cadastrado.')
}
const user = await userService.create({
firstName,
lastName,
phone,
birth,
email,
password,
role: 'user'
})
return res.status(201).json(user)
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
export { authController }
- Como é a primeira vez que estamos trabalhando com o corpo da requisição precisamos incluir um middleware para parsear o conteúdo JSON do corpo:
// src/server.ts
// ...
app.use(express.static('public'))
app.use(express.json())
app.use(router)
app.use(adminJs.options.rootPath, adminJsRouter)
const PORT = process.env.port || 3000
app.listen(PORT, async () => {
await database.authenticate().then(() => {
console.log('DB connection successfull.')
})
console.log(`Server started successfuly at port ${PORT}.`)
})
- Por fim, basta criar a rota e adicionar o método do controlador:
// src/routes.ts
import express from 'express'
import { authController } from './controllers/authController'
// ...
router.post('/auth/register', authController.register)
// ...