Instruções para a aula

Instalação do sequelize

npm install sequelize sequelize-cli mysql2

Configuração da conexão com banco de dados

  • Criar arquivo com as configurações src/config/database.js
module.exports = {
  dialect: "mysql",
  host: "localhost",
  username: "root",
  password: "****",
  database: "syscondom",
  logging: false,
  define: {
    timestamp: true,
    underscored: true,
  },
};
  • Criar arquivo de configuração sequelize /.sequelizerc (na raíz do projeto)

Aqui dizemos para o sequelize onde procurar nossos arquivos de configuração da conexão e das migrations.

const path = require("path");

module.exports = {
  config: path.resolve(__dirname, "src", "config", "database.js"),
  "migrations-path": path.resolve(__dirname, "src", "database", "migrations"),
};
  • Criar arquivo de conexão src/database/index.js
const Sequelize = require("sequelize");
const dbConfig = require("../config/database");
const connection = new Sequelize(dbConfig);

module.exports = connection;
  • Criar o banco de dados npx sequelize db:create

Criação das migrations (estrutura do bd)

Migrations: Uma forma de versionar a criação do banco de dados e sua evolução. Cria uma linha do tempo com as alterações.

  • Criar migrations npx sequelize migration:generate --name create_manager

src/database/migrations/[DATE_TIME]create_manager

"use strict";

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable("managers", {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
      },
      name: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      cpf: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      cellphone: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      password: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updated_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
    });
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable("managers");
  },
};

src/database/migrations/[DATE_TIME]create_condominium

npx sequelize migration:generate --name create_condominium

"use strict";

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable("condominiums", {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
      },
      created_manager_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: { model: "managers", key: "id" },
        onUpdate: "CASCADE",
        onDelete: "CASCADE",
      },
      name: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      cnpj: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      ticket: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updated_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
    });
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable("condominiums");
  },
};

src/database/migrations/[DATE_TIME]create_management

npx sequelize migration:generate --name create_management

"use strict";

module.exports = {
  up: (queryInterface, Sequelize) => {
    return queryInterface.createTable("managements", {
      id: {
        type: Sequelize.INTEGER,
        primaryKey: true,
        autoIncrement: true,
        allowNull: false,
      },
      manager_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: { model: "managers", key: "id" },
        onUpdate: "CASCADE",
        onDelete: "CASCADE",
      },
      condominium_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: { model: "condominiums", key: "id" },
        onUpdate: "CASCADE",
        onDelete: "CASCADE",
      },
      created_manager_id: {
        type: Sequelize.INTEGER,
        allowNull: false,
        references: { model: "managers", key: "id" },
        onUpdate: "CASCADE",
        onDelete: "CASCADE",
      },
      active: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: true,
      },
      principal: {
        type: Sequelize.BOOLEAN,
        allowNull: false,
        defaultValue: false,
      },
      created_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updated_at: {
        type: Sequelize.DATE,
        allowNull: false,
      },
    });
  },

  down: (queryInterface, Sequelize) => {
    return queryInterface.dropTable("managements");
  },
};
  • Executar migrations npx sequelize db:migrate

Criação dos models

  • Criar arquivo src/models/Manager.js
const { Model, DataTypes } = require("sequelize");

class Manager extends Model {
  static init(sequelize) {
    super.init(
      {
        name: DataTypes.STRING,
        cpf: DataTypes.STRING,
        email: DataTypes.STRING,
        cellphone: DataTypes.STRING,
        password: DataTypes.STRING,
      },
      {
        sequelize,
      }
    );
  }

  static associate(models) {
    this.belongsToMany(models.Condominium, {
      foreignKey: "manager_id",
      through: models.Management,
      as: "condominium",
    });
  }
}

module.exports = Manager;
  • Criar arquivo src/models/Condominium.js
const { Model, DataTypes } = require("sequelize");

class Condominium extends Model {
  static init(sequelize) {
    super.init(
      {
        name: DataTypes.STRING,
        cnpj: DataTypes.STRING,
        ticket: DataTypes.STRING,
      },
      {
        sequelize,
        modelName: "condominiums",
      }
    );
  }

  static associate(models) {
    this.belongsTo(models.Manager, {
      foreignKey: "created_manager_id",
      as: "created_manager",
    });
    this.belongsToMany(models.Manager, {
      foreignKey: "condominium_id",
      through: models.Management,
      as: "managers",
    });
  }
}

module.exports = Condominium;
  • Criar arquivo src/models/Management.js
const { Model, DataTypes } = require("sequelize");

class Management extends Model {
  static init(sequelize) {
    super.init(
      {
        active: DataTypes.BOOLEAN,
        principal: DataTypes.BOOLEAN,
      },
      {
        sequelize,
        tableName: "managements",
      }
    );
  }

  static associate(models) {
    this.belongsTo(models.Manager, {
      foreignKey: "created_manager_id",
      as: "created_manager",
    });
  }
}

module.exports = Management;
  • Modificar o arquivo src/database/index.js

    Aqui estamos inicializando nossos models e as associações entre eles

const Sequelize = require("sequelize");
const dbConfig = require("../config/database");

const Manager = require("../models/Manager");
const Condominium = require("../models/Condominium");
const Management = require("../models/Management");

const connection = new Sequelize(dbConfig);

Manager.init(connection);
Management.init(connection);
Condominium.init(connection);
Condominium.associate(connection.models);
Management.associate(connection.models);

module.exports = connection;