Nessa aula vamos criar nosso primeiro recurso. Para isso vamos seguir um passo a passo que será repetido muitas vezes durante o desenvolvimento, criar a migration, rodar a migration, criar o model, depois incluir o model no arquivo de associações e então incluir suas opções no AdminJs
npx sequelize-cli migration:generate --name create-categories-table
// src/database/migrations/XXXXXXXXXXXXXX-create-categories-table
'use strict';
module.exports = {
async up (queryInterface, Sequelize) {
await queryInterface.createTable('categories', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.DataTypes.INTEGER
},
name: {
allowNull: false,
type: Sequelize.DataTypes.STRING
},
position: {
allowNull: false,
type: Sequelize.DataTypes.INTEGER
},
created_at: {
allowNull: false,
type: Sequelize.DataTypes.DATE
},
updated_at: {
allowNull: false,
type: Sequelize.DataTypes.DATE
}
})
},
async down (queryInterface, Sequelize) {
await queryInterface.dropTable('categories')
}
};
npx sequelize-cli db:migrate
sudo -u postgres psql -d onebitflix_development
\\dt
// src/models/Category.ts
import { sequelize } from '../database'
import { DataTypes, Model, Optional } from 'sequelize'
export interface Category {
id: number
name: string
position: number
}
export interface CategoryCreationAttributes extends Optional<Category, 'id'> {}
export interface CategoryInstance extends Model<Category, CategoryCreationAttributes>, Category {}
export const Category = sequelize.define<CategoryInstance, Category>('Category', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: DataTypes.INTEGER
},
name: {
allowNull: false,
type: DataTypes.STRING
},
position: {
allowNull: false,
type: DataTypes.INTEGER
}
})
// src/models/index.ts
import { Category } from './Category'
export {
Category
}
// src/adminjs/resources/category.ts
import { ResourceOptions } from "adminjs";
export const categoryResourceOptions: ResourceOptions = {
navigation: 'Catálogo',
editProperties: ['name', 'position'],
filterProperties: ['name', 'position', 'createdAt', 'updatedAt'],
listProperties: ['id', 'name', 'position'],
showProperties: ['id', 'name', 'position', 'createdAt', 'updatedAt']
}
// src/adminjs/resources/index.ts
import { ResourceWithOptions } from "adminjs";
import { Category } from "../../models";
import { categoryResourceOptions } from "./category";
export const adminJsResources: ResourceWithOptions[] = [
{
resource: Category,
options: categoryResourceOptions
}
]
// src/adminjs/index.ts
// ...
import { sequelize } from '../database'
import { adminJsResources } from './resources'
// ...
databases: [sequelize],
resources: adminJsResources,
rootPath: '/admin',
//...