- Vamos começar gerando a migration para a tabela likes:
npx sequelize-cli migration:generate --name create-likes-table
- E adicione o conteúdo da migration:
// src/database/migrations/XXXXXXXXXXXXXX-create-likes-table
'use strict';
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.createTable('likes', {
user_id: {
allowNull: false,
primaryKey: true,
type: Sequelize.DataTypes.INTEGER,
references: { model: 'users', key: 'id' },
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
},
course_id: {
allowNull: false,
primaryKey: true,
type: Sequelize.DataTypes.INTEGER,
references: { model: 'courses', key: 'id' },
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
},
created_at: {
allowNull: false,
type: Sequelize.DATE
},
updated_at: {
allowNull: false,
type: Sequelize.DATE
}
})
},
async down (queryInterface, Sequelize) {
await queryInterface.dropTable('likes')
}
};
- Com a migration criada, execute-a:
npx sequelize-cli db:migrate
// src/models/Like.ts
import { DataTypes, Model } from "sequelize"
import { sequelize } from "../database"
export interface Like {
userId: number
courseId: number
}
export interface LikeInstance extends Model<Like>, Like { }
export const Like = sequelize.define<LikeInstance, Like>('Like', {
userId: {
allowNull: false,
primaryKey: true,
type: DataTypes.INTEGER,
references: {
model: 'users',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
},
courseId: {
allowNull: false,
primaryKey: true,
type: DataTypes.INTEGER,
references: {
model: 'courses',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
}
})
- Agora que temos o modelo podemos incluir suas associações:
// src/models/index.ts
// ...
import { Like } from './Like'
// ...
Course.belongsToMany(User, { through: Favorite })
Course.belongsToMany(User, { through: Like })
// ...
User.belongsToMany(Course, { through: Favorite })
User.belongsToMany(Course, { through: Like })
// ...
export {
Category,
Course,
Episode,
Favorite,
Like,
User
}
- Com o modelo totalmente pronto, vamos criar um serviço likeService.ts e dentro dele um método para criar um novo like no banco de dados:
// src/services/likeService.ts
import { Like } from "../models"
export const likeService = {
create: async (userId: number, courseId: number) => {
const like = await Like.create({
userId,
courseId
})
return like
}
}
- E então crie um controlador para consumir esse serviço:
// src/controllers/likesController.ts
import { Request, Response } from 'express'
import { likeService } from '../services/likeService'
export const likesController = {
// POST /likes
save: async (req: AuthenticatedRequest, res: Response) => {
const userId = req.user!.id
const { courseId } = req.body
try {
const like = await likeService.create(userId, courseId)
return res.status(201).json(like)
} catch (err) {
if (err instanceof Error) {
return res.status(400).json({ message: err.message })
}
}
}
}
- Por fim, só precisamos criar uma nova rota e incluir o método do controlador:
// src/routes.ts
// ...
import { likesController } from './controllers/likesController'
// ...
router.post('/likes', ensureAuth, likesController.save)
export { router }