Gerando CRUD de Product e Client no CrazyStack Node.js
Nesta aula, você aprenderá como criar as funcionalidades básicas de um CRUD (Create, Read, Update e Delete) para o recurso "Client" e "Product". O objetivo é que você possa aplicar o mesmo padrão utilizado na criação do CRUD de "Categoria" e assim, possa desenvolver CRUDs para outros recursos da aplicação com facilidade. Serão criadas as seguintes interfaces de repositório:
- addClientRepository
- loadClientRepository
- loadClientByPageRepository
- deleteClientRepository
- updateClientRepository
Além disso, serão criados os seguintes casos de uso:
- addClient
- loadClient
- loadClientByPage
- deleteClient
- updateClient
Você também poderá aplicar as técnicas de validação de dados e tratamento de erros aprendidas nas aulas anteriores. Ao final desta aula, você terá uma base sólida para o desenvolvimento de futuros recursos da aplicação.
export type ClientData = {
_id?: string;
createdById: string;
name: string;
active?: boolean;
createdAt?: Date;
updatedAt?: Date;
cpf?: string;
phone?: string;
clientId: string;
ownerId: string;
birthDate?: Date;
appointmentsTotal?: number;
};
export type ClientPaginated = {
clients: ClientData[];
total: number;
};
export class ClientEntity {
createdById: string;
name: string;
active?: boolean;
createdAt?: Date;
updatedAt?: Date;
cpf?: string;
phone?: string;
clientId: string;
ownerId: string;
birthDate?: Date;
appointmentsTotal?: number;
constructor(data: ClientData) {
this.createdById = data.createdById;
this.name = data.name;
this.active = false;
this.createdAt = new Date();
this.updatedAt = new Date();
this.phone = data.phone;
this.cpf = data.cpf;
this.clientId = data.clientId;
this.ownerId = data.ownerId;
this.birthDate = data.birthDate;
this.appointmentsTotal = 0;
}
}
A entidade "Client" representa um cliente que pode ser cadastrado na API de agendamentos online. Essa entidade tem informações como o nome do cliente, se ele está ativo, a data de criação e atualização, CPF, telefone, ID do usuário dono do cliente, ID do dono, data de nascimento e total de compromissos.
A classe "ClientEntity" é uma classe construtora que permite criar instâncias da entidade com base em um objeto do tipo "ClientData". Além disso, a entidade "ClientPaginated" é um tipo que permite paginar os clientes retornados na API e contém o array de clientes e o total de clientes retornados.
A entidade cliente (ClientEntity) tem uma propriedade chamada "clientId" que armazena o ID do usuário (ClientEntity) relacionado a esse cliente. Isso significa que cada cliente tem uma referência para o usuário relacionado a ele. Essa relação é criada quando um usuário é cadastrado na aplicação e é associado a um cliente específico. E também tem a propriedade "ownerId" que armazena o ID do estabelecimento onde esse cliente comprou.
A entidade ClientData representa os dados de um cliente na API de agendamentos online. Cada campo representa uma informação específica sobre o cliente. Alguns dos campos incluem:
-
_id: um identificador único gerado pelo banco de dados para o cliente.
-
createdById: o ID do usuário que criou o cliente.
-
name: o nome do cliente.
-
active: indica se o cliente está ativo ou inativo.
-
createdAt: a data em que o cliente foi criado.
-
updatedAt: a data em que o cliente foi atualizado pela última vez.
-
cpf: o CPF do cliente.
-
phone: o número de telefone do cliente.
-
clientId: o ID do usuário associado ao cliente.
-
ownerId: o ID do proprietário do cliente.
-
birthDate: a data de nascimento do cliente.
-
appointmentsTotal: a quantidade total de compromissos do cliente.
Essa entidade se relaciona com a entidade ClientData porque o campo clientId armazena o ID do usuário associado ao cliente. Isso permite que a API faça consultas para recuperar informações do usuário relacionado ao cliente. E o campo ownerId armazena o ID do profissional proprietário do cliente.
export type ProductData = {
_id?: string;
createdById: string;
name: string;
active?: boolean;
createdAt?: Date;
updatedAt?: Date;
quantity: number;
};
export type ProductPaginated = {
products: ProductData[];
total: number;
};
export class ProductEntity {
createdById: string;
name: string;
active?: boolean;
createdAt?: Date;
updatedAt?: Date;
quantity: number;
constructor(data: ProductData) {
this.createdById = data.createdById;
this.name = data.name;
this.active = false;
this.createdAt = new Date();
this.updatedAt = new Date();
this.quantity = data.quantity;
}
}
A entidade "Product" representa um produto na API de agendamentos online. Ela tem diversos campos, como:
- createdById: ID do usuário que criou o produto.
- name: nome do produto.
- active: indica se o produto está ativo ou não.
- createdAt: data em que o produto foi criado.
- updatedAt: data em que o produto foi atualizado pela última vez.
- quantity: quantidade do produto.
A entidade "ProductEntity" é uma classe que representa esses dados, e é criada a partir de um objeto do tipo "ProductData". Ela possui métodos construtores que permitem criar uma instância dessa entidade a partir de um objeto "ProductData".
A entidade Product relaciona-se com a entidade Service porque pode ser necessário para realizar um determinado serviço uma quantidade específica de um produto. O campo 'productId' na entidade Service indica qual produto é necessário para realizar o serviço e o campo 'productsQuantityNeeded' indica a quantidade necessária desse produto. A entidade Product também armazena informações sobre a quantidade disponível de cada produto, que pode ser utilizada para verificar se a quantidade necessária está disponível antes de agendar o serviço.