Nessa aula vamos fazer um procedimento parecido com o da última aula, mas vamos criar também a primeira associação entre tabelas/modelos.
// No terminal
npx sequelize-cli migration:generate --name create-courses-table
// src/database/migrations/XXXXXXXXXXXXXX-create-titles-table.js
'use strict';
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.createTable('courses', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.DataTypes.INTEGER
},
name: {
allowNull: false,
type: Sequelize.DataTypes.STRING
},
synopsis: {
allowNull: false,
type: Sequelize.DataTypes.TEXT
},
thumbnail_url: {
type: Sequelize.DataTypes.STRING
},
featured: {
defaultValue: false,
type: Sequelize.DataTypes.BOOLEAN
},
category_id: {
allowNull: false,
type: Sequelize.DataTypes.INTEGER,
references: { model: 'categories', key: 'id' },
onUpdate: 'CASCADE',
onDelete: 'RESTRICT'
},
created_at: {
allowNull: false,
type: Sequelize.DataTypes.DATE
},
updated_at: {
allowNull: false,
type: Sequelize.DataTypes.DATE
}
})
},
async down (queryInterface, Sequelize) {
await queryInterface.dropTable('courses')
}
};
// src/models/Course.ts
import { sequelize } from '../database'
import { DataTypes, Model, Optional } from 'sequelize'
export interface Course {
id: number
name: string
synopsis: string
thumbnailUrl: string
featured: boolean
categoryId: number
}
export interface CourseCreationAttributes extends Optional<Course, 'id' | 'thumbnailUrl' | 'featured' > {}
export interface CourseInstance extends Model<Course, CourseCreationAttributes>, Course {}
export const Course = sequelize.define<CourseInstance, Course>('Course', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER
},
name: {
allowNull: false,
type: DataTypes.STRING
},
synopsis: {
allowNull: false,
type: DataTypes.TEXT
},
thumbnailUrl: {
type: DataTypes.STRING
},
featured: {
defaultValue: false,
type: DataTypes.BOOLEAN
},
categoryId: {
allowNull: false,
type: DataTypes.INTEGER,
references: { model: 'categories', key: 'id' },
onUpdate: 'CASCADE',
onDelete: 'RESTRICT'
}
})
// src/models/index.ts
import { Category } from './Category'
import { Course } from './Course'
Category.hasMany(Course)
Course.belongsTo(Category)
export {
Course,
Category
}
// src/adminjs/resources/course.ts
import { ResourceOptions } from "adminjs";
export const courseResourceOptions: ResourceOptions = {
navigation: 'Catálogo',
editProperties: ['name', 'synopsis', 'uploadThumbnail', 'featured', 'categoryId'],
filterProperties: ['name', 'synopsis', 'featured', 'categoryId', 'createdAt', 'updatedAt'],
listProperties: ['id', 'name', 'featured', 'categoryId'],
showProperties: ['id', 'name', 'synopsis', 'featured', 'thumbnailUrl', 'categoryId', 'createdAt', 'updatedAt']
}
// src/adminjs/resources.ts
import { ResourceWithOptions } from "adminjs";
import { Category, Course } from "../../models";
import { categoryResourceOptions } from "./category";
import { courseResourceOptions } from "./course";
export const adminJsResources: ResourceWithOptions[] = [
{
resource: Course,
options: courseResourceOptions
},
{
resource: Category,
options: categoryResourceOptions
},
]