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!
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");
},
};
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;
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 };
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);
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);
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);
},
};
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: