A LABPharmacy Inc, uma renomada empresa do ramo de tecnologia farmacêutica, está expandindo seus serviços. Por conta da expansão, o time de gestão necessita da criação de um sistema online, intitulado Pharmacy Central System (PCS), para gerenciamento de depósitos e medicamentos. Por conta da participação no projeto de front-end, o seu perfil chamou a atenção dos gestores, para agora criar o back-end do sistema que deverá ser codificado em Node, utilizando o framework Express.js com o uso do banco de dados PostgreSQL. A LABPharmacy Inc deseja criar a API Rest da aplicação Pharmacy Central System (PCS), um software para gestão de depósitos e medicamentos, que será utilizado para o controle de estoque dos medicamentos de hospitais e postos de saúde.
A Yensy API é um aplicativo criado com gratidão e dedicação à minha querida namorada, que ofereceu apoio incondicional durante o desenvolvimento deste projeto avaliativo . A missão da Yensy API é facilitar a gestão de farmácias através de uma interface REST desenvolvida em Javascript, proporcionando uma solução eficiente e confiável para administrar o inventário e os estabelecimentos, esta API esta focada no campo farmacêutico para o gerenciamento de Medicamentos, Usuarios, e Depositos.
- Gestão de Inventário: Mantenha um registro completo dos produtos farmacêuticos disponíveis.
- Segurança e Autenticação: Garanta a privacidade e a proteção dos dados através de autenticação segura e acesso controlado por JWT.
- Informações dos Usuarios e Depositos: Armazene informações relevantes dos Usuarios e Depositos os cuais podem ser desativados caso nescesario ou deletados logicamente o que permite garantir a integridade dos registros em caso de deleçao involuntaria.
Esta API representa um sincero agradecimento à minha namorada e a todos aqueles que foram uma fonte de inspiração nesta jornada de desenvolvimento. Juntos, esperamos que a Yensy API simplifique e melhore a gestão de farmácias, contribuindo assim para o bem-estar da comunidade e do setor farmacêutico como um todo. Junte-se à comunidade da Yensy API e descubra uma forma mais eficiente de gerenciar farmácias com facilidade e confiança.
https://real-pink-trout-sock.cyclic.app/
explicaimplementacion.mp4
- Dependências a serem instaladas: Git https://git-scm.com/, NodeJS https://nodejs.org/pt-br, Yarn https://classic.yarnpkg.com/lang/en/docs/install/#debian-stable.
- Abra um Terminal e clone o projeto:
git clone git@github.com:Luis-Vilar/Projeto-BackEnd.git[ENTER]. - Entre na pasta do repositório recém-clonado:
cd Projeto_Backend[ENTER]. - Execute o instalador de dependências:
yarn[ENTER]. - Você deverá criar um arquivo .env, na raiz da pasta do projeto tem um .env_example; se for de sua preferência, renomeie o mesmo arquivo e modifique as variáveis de ambiente com as corretas para você. Neste ponto, você poderá escolher outra base de dados, mas para este projeto foi utilizado PostgreSQL. As variáveis que deve configurar são
HOST(endereço da API, por padrão, localhost para executar no seu computador),DIALECT(dialeto da BD, exemplo: postgres),USERNAMEDB(nome do usuário da sua base de dados),PASSWORDDB(senha do usuário da base de dados),DATABASE(nome da base de dados),JWT_KEY(chave secreta do JWT). As demais estão com valores padrão; caso ache necessário, sinta-se à vontade para mudá-las. - No terminal basta rodar o seguinte script para inicializar a base de dados antes do primeiro uso :
yarn db:create[ENTER]. - {OPCIONAL} Caso queira adicionar registros para testes na Base de dados, pode executar a criação de seeders com o seguinte comando no terminal, depois de finalizar as migrations:
npx sequelize-cli db:seed:all[ENTER]. - Neste ponto, o servidor deveria estar configurado totalmente. Vamos a iniciá-lo com o seguinte comando:
yarn start[ENTER]. - No terminal, deve aparecer a seguinte saída:
╰─$ yarn start yarn run v1.22.19 $ node src/index.js Servidor executando em http://localhost:3000/ Executing (default): SELECT 1+1 AS result Conexão com o banco de dados estabelecida com sucesso! - Com algum cliente REST (recomendo THUNDERCLIENT), vamos criar um usuário no endpoint /api/usuarios com o verbo POST. Siga a documentação para este endpoint no S01..
- Novamente, utilizando o cliente REST, vamos fazer login com nosso usuário recém-criado no endpoint /api/user/login; este nos devolverá um token que será necessário para os demais endpoints, os quais são privados e devem ser inseridos no Header.Authorization da requisição em nosso cliente REST. Siga a documentação no S02.
- Todos os demais endpoints estão especificados na SIGUIENTE DOCUMENTAÇÃO :
No S03, Adicionei um código 401 : só permiti alterar dados do próprio usuário e não de outros. Era pedido também uma resposta 201 com os dados atualizados, mas coloquei 202 para poder enviar uma mensagem de sucesso.
No S04, adicionei o código 401 caso o usuário queira alterar seu próprio estado, o que não faria sentido se tivesse sido desativado por um admin que ele consiga fazer, a mesma coisa se estiver inativo e quiser alterar o estado de outro usuário.
No S05, adicionei o código 401 caso o usuário queira alterar a senha de outro usuário e não a sua própria.
No S07, adicionei o código 409 caso exista o email, que não estava pedido inicialmente, mas achei interessante não permitir dois estabelecimentos com o mesmo email.
No S10, adicionei o código 400 caso o query param seja inválido.
No S13, pedia o código 409 caso existam medicamentos duplicados, mas achei interessante permitir e que a quantidade incremente com a que está no depósito de medicamentos ja que a tabela medicamentos e compartida com todos os estabelecimentos e a propriedade nome e uma unique.
No S14, Adicionei um código 404 caso o medicamento não exista no deposito_medicamentos, só poderá atualizar medicamentos que existem em seu depósito, caso o usuario quera alterar primeiro devera cadastrar o medicamento no seu deposito.
S17, código 401 caso o usuário tente deletar medicamentos que ainda estão relacionados a pelo menos um depósito.
| ENDPOINT | VERBO | S## |
|---|---|---|
| /api/usuarios | POST | S01 |
| /api/usuarios/login | POST | S02 |
| /api/usuarios/:id | PATCH | S03 |
| /api/usuarios/:id/status | PATCH | S04 |
| /api/usuarios/:id/senha | PATCH | S05 |
| /api/usuarios/:id | GET | S06 |
| req exemplo |
|---|
-----| BODY |
{
"nome" : "Nome",
"sobrenome" : "Sobrenome",
"data_nascimento" : "9999-12-31",
"cpf" : "12345678901",
"email" : "email@dominio.com",
"senha" : "Senhafor7&",
"telefone" : "123456789012345",
//opcional "genero" : "genero
}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos 409 - Conflict CPF já cadastrado 409 - Conflict Emails já cadastrado
201 - Created
{
"message": "Usuário cadastrado com sucesso",
"identificador": 1,
"status": "ativo"
}
| req exemplo |
|---|
-----| BODY |
js{
"email" : "email@dominio.com",
"senha" : "Senhafor7&"
}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos 404 - Not Found Usuário não encontrado
200 OK
{
"token": "eyJhbGciOiJsdfIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdGF0dXMiOiJhdGl2byIsImlkIjoxNywiaWF0IjoxNjg5OT
c5NzYwLCJleHAiOjE2OTAwNjYxiiisdfsnkoyueyurwejB9.6rItLA0gs9tJWcjV7HrQ7IYSAn-LIeMgzuDd6iPBKqY"
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
//opcional "nome" : "Nome",
//opcional "sobrenome" : "sobnome",
//opcional "telefone" : "123456789012345",
//oipcional "genero" : "genero"
}
| res exemplo |
|---|
400 - Bad Request Nenhum dado valido para atualizar foi recebido 401 - Unauthorized Sem permissão para atualizar este usuário
202 Accepted
{
"message": "Usuário 1 atualizado com sucesso",
"updated": {
"nome": "Nome",
"sobrenome": "Nome ",
"genero": "genero",
"telefone": "123456789012345"
}
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"status" : "ativo"
}
| res exemplo |
|---|
400 - Bad Request status não informado / invalido
401 - Unauthorized Sem permissão para este endpoint
401 - Unauthorized Voce nao pode mudar seu status, contate um administrador...
404 - Not Found Usuário não encontrado
200 OK
{
"message": "Usuario com id 1 atualizado com o status : ativo/inativo"
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"senha" : "umaSenham1T0fort@"
}
| res exemplo |
|---|
400 - Bad Request Senha não informada 401 - Unauthorized Sem permissão para atualizar este usuário 404 - Not Found Usuario não encontrado 200 - response com erro de validaçao 204 - No Content
| req exemplo |
|---|
-----| HEADER |
| Authorization | token valido gerado no login ver #SO2
-----| BODY |
{}
| res exemplo |
|---|
400 - Bad Request O id X informado não é um número
404 - Not Found Usuário não encontrado
200 OK
{
"id": 1,
"cpf": "12345678901",
"nome": "Nome",
"sobrenome": "Sobrenome",
"genero": "genero",
"data_nascimento": "1990-01-01T00:00:00.000Z",
"email": "email@dominio.com",
"telefone": "123456789012345",
"status": "ativo",
"created_at": "2023-07-17T22:26:16.523Z",
"updated_at": "2023-07-19T18:40:29.946Z"
}
| ENDPOINT | VERBO | S## |
|---|---|---|
| /api/depositos | POST | S07 |
| /api/depositos/:id | PATCH | S08 |
| /api/depositos/:id/status | PATCH | S09 |
| /api/depositos/?status=ativo/inativo | GET | S10 |
| /api/depositos/:id | GET | S11 |
| /api/depositos/:id | DELETE | S12 |
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"razao_social": "Razao Social",
"nome_fantasia": "Nome Fantasia",
"cnpj": "12312317312332",
"email": "email@dodminio.com",
"celular": "11111111111",
"telefone": "11111111111",
"cep": "11111111",
"estado": "Estado ",
"cidade": "Cidade ",
"bairro": "Bairro ",
"logradouro": "Logradouro ",
"numero": "123",
"complemento": "Complemento ",
"latitude": "1.234",
"longitude": "1.234"
}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos
409 - Conflict Usuário já possui um depósito cadastrado
409 - Conflict CNPJ/Email/Razao Social/Nome Fantasia já cadastrado
401 - Unauthorized "Usuário não autorizado
200 - OK
{
"status": "ativo",
"id": 1,
"usuario_id": 1,
"razao_social": "Razao Social",
"cnpj": "12312317352332",
"nome_fantasia": "Nome Fantasia",
"email": "email@dodminio.com",
"telefone": "11111111111",
"celular": "11111111111",
"cep": "11111111",
"logradouro": "Logradouro ",
"numero": "123 ",
"bairro": "Bairro ",
"cidade": "Cidade ",
"estado": "Estado ",
"complemento": "Complemento ",
"latitude": "1.234",
"longitude": "1.234",
"updatedAt": "2023-07-22T00:06:22.115Z",
"createdAt": "2023-07-22T00:06:22.115Z",
"deletedAt": null,
"usuarioId": 17
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"nome_fantasia": "Nome Fantasia",
"celular": "11111111111",
"telefone": "11111111111",
"cep": "123123123",
"estado": "Estado",
"cidade": "Cidade",
"bairro": "Bairro",
"logradouro": "Logradouro",
"numero": "123",
"complemento": null,
"latitude": 12.345,
"longitude": 12.345
}
| res exemplo |
|---|
400 - Bad Request --> Erros de validaçao do body 403 - Forbidden Usuario não autorizado 403 - Forbidden Deposito esta inativo 404 - Not Found Deposito não encontrado 409 - Conflict nome_fantasia ja cadastrado 204 - No Content
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"status":"ativo"
}
| res exemplo |
|---|
400 - Bad Request Id passado por parâmetro obrigatoriamente deve ser numérico 400 - Bad Request Nenhum dado valido para atualizar 404 - Not Found Depósito não encontrado 204 - No Content
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| QUERY PARAMS |
status = inativo/ativo || opcional se não informado devolve todos os depositos
-----| BODY |
{}
| res exemplo |
|---|
400 - Bad Request Status na query params inválido
401 - Unauthorized Usuario não autorizado
200 OK
{
"depositos_inativo": [],
}
{
"depositos_ativo": []
}
{
"depositos_inativo": []
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY | { }
| res exemplo |
|---|
400 - Bad Request Id passado por parâmetro obrigatoriamente deve ser numérico 401 - Unauthorized Usuario não autorizado 404 - Not Found Deposito não encontrado
200 - OK
{
"id": 19,
"status": "ativo",
"razao_social": "RazaoSocial2",
"nome_fantasia": "Nome Fantass",
"cnpj": "12345678951232",
"email": "emr3esaA@dodmin2io.com",
"celular": "11111111111",
"telefone": "11111111111",
"cep": "123123123",
"estado": "Estado",
"cidade": "Cidade",
"bairro": "Bairro",
"logradouro": "Logradouro",
"numero": "123",
"complemento": null,
"latitude": "123",
"longitude": "123",
"usuario": {
"nome": "Chaves",
"email": "chaveta@gmail.com",
"status": "ativo"
}
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY | { }
| res exemplo |
|---|
400 - Bad Request Id passado por parâmetro obrigatoriamente deve ser numérico 403 - Forbidden "Depósito esta ativo, não pode ser deletado" 403 - Forbidden"Depósito esta vinculado a algum medicamento, não pode ser deletado" 404 - Not Found "Depósito não encontrado"
204 - No Content
| ENDPOINT | VERBO | S## |
|---|---|---|
| /api/medicamentos | POST | S13 |
| /api/medicamentos/:id | PATCH | S14 |
| /api/medicamentos?tipo=controlado/naocontrolado | GET | S15 |
| /api/medicamentos/:id | GET | S16 |
| /api/medicamentos/:id | DELETE | S17 |
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"nome_medicamento": "Nome",
"nome_laboratorio" : "Laboratorio",
"dosagem" : 200,
"unidade_dosagem" : "mg",
"tipo" : "Controlado",
"preco_unitario" : 23.33,
"descricao" : "Uma descriçao",
"quantidade" : 600
}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos 401 - Unauthorized Usuario não autorizado 424 - Failed Dependecy Você não tem um deposito cadastrado
200 - OK
{
"message": "Medicamento cadastrado com sucesso",
"medicamento": {
"id": 1,
"nome_medicamento": "Nome",
"nome_laboratorio": "Laboratorio",
"descricao": "Uma descriçao",
"dosagem": 200,
"unidade_dosagem": "mg",
"tipo": "Controlado",
"preco_unitario": 23.33,
"createdAt": "2023-07-21T19:19:24.947Z",
"updatedAt": "2023-07-22T01:48:27.718Z",
"deletedAt": null
},
"medicamento_deposito_novo": {
"quantidade": 600,
"medicamentoId": 1,
"depositoId": 1,
"updatedAt": "2023-07-22T01:48:27.755Z",
"createdAt": "2023-07-22T01:48:27.755Z",
"deletedAt": null
}
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{
"preco_unitario" : 253.33,
"descricao" : "Uma descriçao",
"quantidade" : 600
}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos 400 - Bad Request Nenhum dado valido para atualizar 401 - Unauthorized Usuário não autorizado 404 - Not Found Não existe esse medicamento no seu deposito
200 OK
{
"id": 1,
"nome_medicamento": "Nome",
"nome_laboratorio": "Laboratorio",
"descricao": "Uma descriçao",
"dosagem": 200,
"unidade_dosagem": "mg",
"tipo": "Controlado",
"preco_unitario": 253.33,
"createdAt": "2023-07-21T19:19:24.947Z",
"updatedAt": "2023-07-22T01:54:54.684Z",
"deletedAt": null,
"quantidade": 600
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2 -----| QUERY PARAMS | tipo = controlado/naocontrolado || opcional se não informado devolve todos medicamentos
-----| BODY |
{}
| res exemplo |
|---|
401 - Unauthorized Usuário não autorizado
200 - um array de medicamentos segundo o tipo
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY |
{}
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos, o id do medicamento deve ser um numero
404 - Not Found Medicamento não encontrado
200 - OK
{
"id": 1,
"nome_medicamento": "Medicamento",
"nome_laboratorio": "Laboratório",
"descricao": "Descrição do medicamento",
"dosagem": 1.2,
"unidade_dosagem": "mL",
"tipo": "Controlado",
"preco_unitario": 12.5,
"createdAt": "2021-07-11T00:00:00.000Z",
"updatedAt": "2021-07-11T00:00:00.000Z",
"deletedAt": null,
"medicamento_depositos": [
{
"quantidade": 10,
"deposito": {
"nome_fantasia": "Fantasia",
"logradouro": "Logradouro",
"numero": "123",
"bairro": "Bairro",
"cidade": "Cidade",
"estado": "Estado",
"cep": "22222222"
}
}
]
}
| req exemplo |
|---|
-----| HEADER | | Authorization | token valido gerado no login ver #SO2
-----| BODY | { }
| res exemplo |
|---|
400 - Bad Request Requisição com dados inválidos, o id do medicamento deve ser um numero 401 - Unauthorized "Não é possivel deletar o medicamento pois ele esta associado a 1 deposito(s)" 404 - Not Found Medicamento não encontrado
204 - No Content
