npx sequelize-cli migration:generate --name create-likes-table
// 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')
  }
};
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'
  }
})
// 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
}
// 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
  }
}
// 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 })
      }
    }
  }
}
// src/routes.ts

// ...

import { likesController } from './controllers/likesController'

// ...

router.post('/likes', ensureAuth, likesController.save)

export { router }