1. Agora vamos fazer um relacionamento hasOne (Tem um - ou um pra um), vamos criar uma nova tabela através da migration para armazenar os satélites, pois cada planeta terá 1 satélite!

  2. Utilize o comando “sequelize migration:create —name=satelites” colocando os dados que precisamos e a chave estrangeira também!

    "use strict";
    
    module.exports = {
      up: async (queryInterface, Sequelize) => {
        await queryInterface.createTable("satelites", {
          id: {
            type: Sequelize.INTEGER,
            autoIncrement: true,
            allowNull: false,
            primaryKey: true,
          },
          name: {
            type: Sequelize.STRING,
            allowNull: false,
          },
          serial_number: {
            type: Sequelize.INTEGER,
            allowNull: false,
          },
          planetId: {
            type: Sequelize.INTEGER,
            allowNull: false,
            references: { model: "planets", key: "id" },
            onUpdate: "CASCADE",
            onDelete: "CASCADE",
          },
          createdAt: {
            type: Sequelize.DATE,
          },
          updatedAt: {
            type: Sequelize.DATE,
          },
        });
      },
    
      down: async (queryInterface, Sequelize) => {
        await queryInterface.dropTable("satelites");
      },
    };
    
  3. Vamos agora criar o model Satelite.js, dentro da pasta models!

    const {DataTypes} = require("sequelize");
    const sequelize = require("../config/sequelize");
    
    const Satelite = sequelize.define("satelites", {
        name: DataTypes.STRING,
        serial_number: DataTypes.INTEGER,
        planetId: DataTypes.INTEGER,
    });
    
    module.exports = Satelite;
    
  4. Em seguida, vamos criar um arquivo dentro de config chamado associations.js, que terá as configurações de relacionamentos das tabelas!

    const Planet = require("../models/Planet");
    const Satelite = require("../models/Satelite");
    
    Planet.hasOne(Satelite, { onDelete: "CASCADE", onUpdate: "CASCADE" });
    Satelite.belongsTo(Planet, { foreingKey: "planetId", as: "planet" });
    
    module.exports = { Planet, Satelite };
    
  5. Agora, no arquivo index, vamos fazer o require global, para ter na raiz do projeto as conexões sendo chamadas.

const express = require("express");
const routes = require("./routes");

require("../config/associations");

const app = express();

app.use(express.json());
app.use(routes);

app.listen(3000);
  1. Em routes, vamos fazer a rota de criação de um satélite para um planeta específico, passando o ID dele!

    routes.post("/planet/:planetId/satelites", SateliteController.store);
    
  2. Em SateliteController, vamos criar o método store, que será responsável por armazenar os dados e vamos utilizar testando o método POST:

    const Satelite = require("../../models/Satelite");
    const Planet = require("../../models/Planet");
    
    module.exports = {
      async store(req, res) {
        const { planetId } = req.params;
        const { name, serial_number } = req.body;
    
        const planet = await Planet.findByPk(planetId);
    
        if (!planet) {
          res.send("Esse planeta não existe!");
        }
    
        const satelite = await Satelite.create({ name, serial_number, planetId });
    
        return res.json(satelite);
      },
    };
    
  3. Vamos testar no postman e verificar se está funcionando: - Antes de começarmos os testes, precisamos iniciar o servidor do nodemon: npx nodemon src/index.js.

Ainda não temos nenhum, então vamos criar um método POST para cadastrar os satelites: