1. Vamos começar criando uma migrate para caps

    $ sequelize migration:create --name=caps
    
  2. Agora vamos criar uma tabela da mesma forma para spaceships

    $ sequelize migration:create --name=spaceships
    
  3. Agora iremos criar a tabela “pivô”, chamada de capsSpaceships

    $ sequelize migration:create --name=capSpaceships
    
  4. Agora faremos nossa as migrations por ordem, primeiro caps

    "use strict";
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable("caps", {
          id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true,
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          registerNumber: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable("caps");
      },
    };
    
  5. Agora a migration de spaceship

    "use strict";
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable("spaceships", {
          id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true,
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          capacity: {
            type: Sequelize.INTEGER,
            allowNull: false,
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable("spaceships");
      },
    };
    
  6. Agora a migration de capSpaceship

    "use strict";
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable("capSpaceship", {
          id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true,
          },
          capId: {
            type: Sequelize.INTEGER,
            allowNull: false,
            references: { model: "caps", key: "id" },
            onUpdate: "CASCADE",
            onDelete: "CASCADE",
          },
          spaceshipId: {
            type: Sequelize.INTEGER,
            allowNull: false,
            references: { model: "spaceships", key: "id" },
            onUpdate: "CASCADE",
            onDelete: "CASCADE",
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable("capSpaceship");
      },
    };
    
  7. Agora vamos criar os models, vamos criar Cap e Spaceship, não é necessário model para o pivô, pois ele será automático com os Ids. Primeiro vamos configurar Cap

    const { DataTypes } = require("sequelize");
    const sequelize = require("../config/sequelize");
    
    const Cap = sequelize.define("caps", {
      name: DataTypes.STRING,
      registerNumber: DataTypes.STRING,
    });
    
    module.exports = Cap;
    
  8. Agora vamos fazer o model de Spaceship

    const { DataTypes } = require("sequelize");
    const sequelize = require("../config/sequelize");
    
    const Spaceship = sequelize.define("spaceships", {
      name: DataTypes.STRING,
      capacity: DataTypes.INTEGER,
    });
    
    module.exports = Spaceship;
    
  9. Agora iremos lá em associations para fazer a associação deles como Many to Many

    const Cap = require("../models/Cap");
    const Spaceship = require("../models/Spaceship");
    
    Cap.belongsToMany(Spaceship, {
      foreingKey: "capId",
      through: "capSpaceship",
      as: "spaceships",
    });
    
    Spaceship.belongsToMany(Cap, {
      foreingKey: "spaceshipId",
      through: "capSpaceship",
      as: "caps",
    });
    
  10. Agora faremos a criação das tabelas por cli

    $ sequelize db:migrate
    
  11. Agora vamos criar os dois controllers, e importar eles dentro de routes

    const CapController = require("./controllers/CapController");
    const SpaceshipController = require("./controllers/SpaceshipController");
    
  12. Vamos primeiro fazer a rota de criação de listagem de cap, as duas de uma vez!

    routes.post("/cap", CapController.store);
    routes.get("/cap", CapController.index);
    
  13. Agora vamos criar os controllers no CapController, ambos também de uma vez, para agilizar

    const Cap = require("../models/Cap");
    
    module.exports = {
      async store(req, res) {
        const { name, registerNumber } = req.body;
    
        const cap = await Cap.create({ name, registerNumber });
    
        return res.json(cap);
      },
      async index(req, res) {
        const cap = await Cap.findAll();
    
        return res.json(cap);
      },
    };
    
  14. E agora você pode testar, criando dois caps e também vendo se eles são listados! No postman, crie uma pasta chamada CAPS e o método GET, colocando a url: http://localhost:3000/cap

  15. Se quisermos criar um capitão, criamos um método post com a url: http://localhost:3000/cap e no body, inserimos o json:

{
"name": "Armstrong",
"registerNumber": 87984984
}
  1. Vamos agora para as rotas de spaceship!

    routes.post("/caps/:capId/spaceships", SpaceshipController.store);
    routes.get("/caps/:capId/spaceships", SpaceshipController.index);
    
  2. Vamos fazer também esses métodos (SpaceshipController, ambos de uma só vez!

    const Spaceship = require("../models/Spaceship");
    const Cap = require("../models/Cap");
    
    module.exports = {
      async store(req, res) {
        const { capId } = req.params;
        const { name, capacity } = req.body;
    
        const cap = await Cap.findByPk(capId);
    
        if (!cap) {
          res.send("Error, this cap does not exist!");
        }
    
        const [spaceships] = await Spaceship.findOrCreate({
          where: { name, capacity },
        });
    
        await cap.addSpaceship(spaceships);
    
        return res.json(spaceships);
      },
      async index(req, res) {
        const { capId } = req.params;
    
        const cap = await Cap.findByPk(capId, {
          include: { association: "spaceships" },
        });
    
        return res.json(cap);
      },
    };