Skip to content

Commit

Permalink
WIP:Cadastro de material
Browse files Browse the repository at this point in the history
  • Loading branch information
leanfj committed Mar 28, 2023
1 parent 9be9761 commit 7466ac3
Show file tree
Hide file tree
Showing 7 changed files with 217 additions and 12 deletions.
10 changes: 9 additions & 1 deletion src/infrastructure/database/models/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ProdutoModel} from "./produto.model";
import { TokenModel } from "./token.model";
import { MaterialModel } from "./material.model";
import { UnidadeMedidaModel } from "./unidadeMedida.model";
import { MaterialProdutoModel } from "./materialProduto.model";

export { ClienteModel, UsuarioModel, TokenModel, ProdutoModel, MaterialModel, UnidadeMedidaModel };

Expand All @@ -15,13 +16,15 @@ export function initModels(sequelize: Sequelize) {
ProdutoModel.initModel(sequelize);
MaterialModel.initModel(sequelize);
UnidadeMedidaModel.initModel(sequelize);
MaterialProdutoModel.initModel(sequelize);
return {
ClienteModel,
UsuarioModel,
TokenModel,
ProdutoModel,
MaterialModel,
UnidadeMedidaModel
UnidadeMedidaModel,
MaterialProdutoModel,
};
}

Expand All @@ -36,4 +39,9 @@ export function initAssociations(sequelize: Sequelize) {
[key: string]: any;
}
);
MaterialProdutoModel.associate(
sequelize.models as {
[key: string]: any;
}
);
}
8 changes: 7 additions & 1 deletion src/infrastructure/database/models/material.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
ForeignKey,
} from "sequelize";
import { UnidadeMedidaModel } from "./unidadeMedida.model";
import { MaterialProdutoModel } from "./materialProduto.model";

export class MaterialModel extends Model<
InferAttributes<MaterialModel>,
Expand Down Expand Up @@ -83,9 +84,14 @@ export class MaterialModel extends Model<
});

MaterialModel.belongsToMany(models.ProdutoModel, {
through: "materiais_produtos",
through: MaterialProdutoModel,
as: "produtos",
foreignKey: "material_id",
});

MaterialModel.hasMany(models.MaterialProdutoModel, {
foreignKey: "material_id",
as: "materiaisProdutos",
});
}
}
79 changes: 79 additions & 0 deletions src/infrastructure/database/models/materialProduto.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
import {
CreationOptional,
DataTypes,
InferCreationAttributes,
InferAttributes,
Model,
Sequelize,
BelongsToManyAddAssociationMixin,
} from "sequelize";
import { MaterialModel } from "./material.model";

export class MaterialProdutoModel extends Model<
InferAttributes<MaterialProdutoModel>,
InferCreationAttributes<MaterialProdutoModel>
> {

declare id: CreationOptional<string>;
declare quantidade: number | null;
declare dataCadastro: CreationOptional<Date | null>;
declare dataAtualizacao: CreationOptional<Date | null>;
declare addMateriais: BelongsToManyAddAssociationMixin<MaterialModel, string>;

static initModel(sequelize: Sequelize): typeof MaterialProdutoModel {
MaterialProdutoModel.init(
{
id: {
type: DataTypes.UUID,
primaryKey: true,
allowNull: false,
unique: true,
defaultValue: DataTypes.UUIDV4,
},
quantidade: {
type: DataTypes.DECIMAL(10, 2)
},
dataCadastro: {
type: "TIMESTAMP",
defaultValue: sequelize.literal("CURRENT_TIMESTAMP"),
allowNull: false,
},
dataAtualizacao: {
type: "TIMESTAMP",
defaultValue: sequelize.literal(
"CURRENT_TIMESTAMP"
),
allowNull: false,
},
},
{
sequelize,
tableName: "materiais_produtos",
timestamps: true,
createdAt: "dataCadastro",
updatedAt: "dataAtualizacao",
}
);

return MaterialProdutoModel;
}


static associate(models: any) {
MaterialProdutoModel.belongsTo(models.MaterialModel, {
foreignKey: "material_id",
as: "material",
});
MaterialProdutoModel.belongsTo(models.ProdutoModel, {
foreignKey: "produto_id",
as: "produto",
});
MaterialProdutoModel.belongsTo(models.UnidadeMedidaModel, {
foreignKey: "unidade_medida_id",
as: "unidadeMedida",
});

}

}

Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import {
CreationOptional,
DataTypes,
InferCreationAttributes,
InferAttributes,
Model,
Sequelize,
BelongsToManyAddAssociationMixin,
} from "sequelize";
import { MaterialModel } from "./material.model";

export class MaterialProdutoUnidadeMedidaModel extends Model<
InferAttributes<MaterialProdutoUnidadeMedidaModel>,
InferCreationAttributes<MaterialProdutoUnidadeMedidaModel>
> {

declare id: CreationOptional<string>;
declare dataCadastro: CreationOptional<Date | null>;
declare dataAtualizacao: CreationOptional<Date | null>;
declare addMateriais: BelongsToManyAddAssociationMixin<MaterialModel, string>;

static initModel(sequelize: Sequelize): typeof MaterialProdutoUnidadeMedidaModel {
MaterialProdutoUnidadeMedidaModel.init(
{
id: {
type: DataTypes.UUID,
primaryKey: true,
allowNull: false,
unique: true,
defaultValue: DataTypes.UUIDV4,
},
dataCadastro: {
type: "TIMESTAMP",
defaultValue: sequelize.literal("CURRENT_TIMESTAMP"),
allowNull: false,
},
dataAtualizacao: {
type: "TIMESTAMP",
defaultValue: sequelize.literal(
"CURRENT_TIMESTAMP"
),
allowNull: false,
},
},
{
sequelize,
tableName: "materiais_produtos_unidades_medidas",
timestamps: true,
createdAt: "dataCadastro",
updatedAt: "dataAtualizacao",
}
);

return MaterialProdutoUnidadeMedidaModel;
}


static associate(models: any) {
MaterialProdutoUnidadeMedidaModel.belongsTo(models.MaterialProdutoModel, {
foreignKey: "material_produto_id",
as: "material_produto",
});
MaterialProdutoUnidadeMedidaModel.belongsTo(models.UnidadeMedidaModel, {
foreignKey: "unidade_medida_id",
as: "unidade_medida",
});

}

}

10 changes: 8 additions & 2 deletions src/infrastructure/database/models/produto.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import {
BelongsToManyAddAssociationMixin,
} from "sequelize";
import { MaterialModel } from "./material.model";
import { MaterialProdutoModel } from "./materialProduto.model";

export class ProdutoModel extends Model<
InferAttributes<ProdutoModel>,
Expand All @@ -19,7 +20,7 @@ export class ProdutoModel extends Model<
declare descricao: string | null;
declare codigo: string | null;
declare valorVenda: number | null;
declare valorCusto: string | null;
declare valorCusto: number | null;
declare prazoProducao: string | null;
declare dataCadastro: CreationOptional<Date | null>;
declare dataAtualizacao: CreationOptional<Date | null>;
Expand Down Expand Up @@ -83,10 +84,15 @@ export class ProdutoModel extends Model<
static associate(models: any) {

ProdutoModel.belongsToMany(models.MaterialModel, {
through: "materiais_produtos",
through: MaterialProdutoModel,
as: "materiais",
foreignKey: "produto_id"
});

ProdutoModel.hasMany(models.MaterialProdutoModel, {
foreignKey: "produto_id",
as: "materiais_produtos"
})
}

}
13 changes: 9 additions & 4 deletions src/infrastructure/database/models/unidadeMedida.model.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import {
Model,
Sequelize,
} from "sequelize";
import { MaterialProdutoModel } from "./materialProduto.model";

export class UnidadeMedidaModel extends Model<
InferAttributes<UnidadeMedidaModel>,
Expand Down Expand Up @@ -44,9 +45,7 @@ export class UnidadeMedidaModel extends Model<
},
dataAtualizacao: {
type: "TIMESTAMP",
defaultValue: sequelize.literal(
"CURRENT_TIMESTAMP"
),
defaultValue: sequelize.literal("CURRENT_TIMESTAMP"),
allowNull: false,
},
},
Expand All @@ -59,8 +58,14 @@ export class UnidadeMedidaModel extends Model<
}
);


return UnidadeMedidaModel;
}

static associate(models: any) {
UnidadeMedidaModel.hasMany(models.MaterialProdutoUnidadeMedidaModel, {
foreignKey: "unidade_medida_id",
as: "materiais_produtos_unidades_medidas",
});

}
}
38 changes: 34 additions & 4 deletions src/infrastructure/repositories/produto/produtoDB.repository.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,16 @@ import { AppError } from "../../../core/shared/appError";
import { Produto } from "../../../domain/entities/produto/produto.entity";
import { ProdutoMapper } from "../../../domain/mappers/produto/produto.mapper";
import { ProdutoRepository } from "../../../domain/repositories/produto/produto.repository";
import { MaterialModel, ProdutoModel } from "../../database/models";
import {
MaterialModel,
ProdutoModel,
UnidadeMedidaModel,
} from "../../database/models";
import { ProdutoRepositoryErrors } from "./produtoRepositoryErrors";
import { MaterialRepositoryErrors } from "../material/materialRepositoryErrors";
import { Material } from "../../../domain/entities/material/material.entity";
import { UnidadeMedida } from "../../../domain/entities/unidadeMedida/unidadeMedida.entity";
import { MaterialMapper } from "../../../domain/mappers/material/material.mapper";

type Response = Either<AppError.UnexpectedError, Result<Produto | Produto[]>>;

Expand Down Expand Up @@ -141,7 +148,30 @@ export class ProdutoDBRepository implements ProdutoRepository {
async insertMaterial(id: string, input: any): Promise<Response> {
try {
const produtoData = await ProdutoModel.findByPk(id.toString());
const materialData = await MaterialModel.findByPk(input.material.id.toString());
const materialData = await MaterialModel.findByPk(
input.material.id.toString()
);
const unidadeMedidaData = await UnidadeMedidaModel.findByPk(
input.unidadeMedida.id.toString()
);

const material = Material.create(
{
titulo: materialData.titulo,
descricao: materialData.descricao,
valor: materialData.valor,
unidadeMedida: UnidadeMedida.create(
{
nome: unidadeMedidaData.nome,
nomenclatura: unidadeMedidaData.nomenclatura,
categoria: unidadeMedidaData.categoria,
},
new UniqueEntityID(unidadeMedidaData.id.toString())
),
quantidade: input.material.quantidade,
},
new UniqueEntityID(materialData.id.toString())
);

if (!produtoData) {
return left(new ProdutoRepositoryErrors.ProdutoNotExists());
Expand All @@ -150,14 +180,14 @@ export class ProdutoDBRepository implements ProdutoRepository {
if (!materialData) {
return left(new MaterialRepositoryErrors.MaterialNotExists());
}

const updatedProduto = await produtoData.addMateriais(materialData, {
returning: true,
});

return right(
Result.ok<Produto>(
ProdutoMapper.toDomain(updatedProduto[1][0].dataValues)
ProdutoMapper.toDomain(updatedProduto[0].dataValues)
)
);
} catch (error) {
Expand Down

0 comments on commit 7466ac3

Please sign in to comment.