/crud-mks

Crud realizado para o teste da vaga

Primary LanguageTypeScript

šŸ“½ Cinema MKS šŸ“½

PropĆ³sito

Projeto feito durante o processo seletivo da MKS Sistemas e tem como objetivo avaliar habilidades tĆ©cnicas atravez da construĆ§Ć£o de uma API CRUD para um sistema de filme usando das ferramentas TypeScript, Nest.js, TypeORM, Swagger, Docker, Redis e PostgreSQL, e utilizando da autenticaĆ§Ć£o JWT para obrigar o usuĆ”rio estar autenticado ao consumir o CRUD.

Sobre

Um sistema de catalogo de filmes onde a API deve: Retornar todos os filmes disponiveis, armazenar o filme que o usuĆ”rio enviou na request, permitir que seja feita a alteraĆ§Ć£o de um filme e tambĆ©m a remoĆ§Ć£o do mesmo. TambĆ©m foi implementado o sistema de cadastro e login de usuĆ”rio para que cada usuĆ”rio possa criar sua conta e realizar as request, por isso, somente o usuĆ”rio logado consegue consumir o CRUD de filmes.

Tecnologias utilizadas e nivel de experiĆŖncia

Projeto feito com base na arquitetura Model-Service-Controller.

  • Typescript - 0 de experiĆŖncia anterior.
  • NestJs - 0 de experiĆŖncia anterior.
  • TypeOrm - 0 de experiĆŖncia anterior.
  • Swagger - experiĆŖncia academica de 1 ano.
  • Docker - experiĆŖncia profissional e acadĆŖmica de 1 ano
  • Redis - 0 de experiĆŖncia anterior.
  • PostgresSQL - 6 meses de experiĆŖncia acadĆŖmica.
  • Render (Deploy) - 0 de experiĆŖncia anterior.

Funcionamento usuario

POST /api/v1/usuario (Cadastro de usuƔrio):

Espera que no body da requisiĆ§Ć£o venha os dados do usuĆ”rio e os insere na tabela usuario_model do banco de dados.

Exemplo
  {
    "userName": "leandrocotrim",
    "password": "senha123",
    "id": 1,
    "online": false
  }

POST /api/v1/usuario/login (Realiza o login do usuƔrio):

Espera que no body da requisiĆ§Ć£o venha os dados do usuĆ”rio, verifica se condizem com um usuĆ”rio do banco e retorna um token JWT de acesso, que tambĆ©m Ć© armazenado no redis.

Exemplo
{
  "online": true,
  "auth_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImlhdCI6MTcwMTE3NTY4NH0.eHw5vARTyqJQwAXiMboR-Ni9KUDg36cn6U6QFXB42dM"
}

POST /api/v1/usuario/logout (Realiza o logout do usuƔrio):

Espera que no header da requisiĆ§Ć£o venha user_id e x-acess-token , verifica se condizem com um usuĆ”rio do banco e realiza o logout definindo o status online para false e o valor armazenado no redis em branco.

Exemplo de entrada
  {
    "user_id": 1,
    "x-acess-token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjEsImlhdCI6MTcwMTE0MjQwM30.XyXoimPmbOJaSRF06dgQa_2PXmcvylbA6RwnJfyYFLQ"
  }

GET /api/v1/usuario (Retorna todos os usuarios e seus status):

Essa requisiĆ§Ć£o espera conter o token gerado no login em seu header na chave x-acess-token, junto com o id do usuĆ”rio tambĆ©m em um header na chave user_id

Exemplo de retorno
[
  {
    "userName": "leandrocotrim",
    "password": "senha123",
    "online": true
  },
  {
    "userName": "gabrielcotrim",
    "password": "senha321",
    "online": true
  }...
 ]

PUT /api/v1/usuario/:id/ (Altera o usuƔrio):

Essa requisiĆ§Ć£o espera conter o user_id e token gerado no login em seu header na chave e tambĆ©m um body contendo os novos dadosx-acess-token

Altera o usuĆ”rio especificado na URL da requisiĆ§Ć£o, para o novo body informado.

Exemplo de retorno da URL `/api/v1/usuario/1`
 {
   "userName": "loginNovo",
   "password": "senhaNova"
 }

DELETE /api/v1/usuario/:id (Remove o usuario):

Essa requisiĆ§Ć£o espera conter o token gerado no login em seu header na chave x-acess-token
Remove o usuario especificado pela URL.

Exemplo de retorno da URL `/api/v1/usuario/1`
{
  "data": "O usuario com o id 2 foi deletado com sucesso!"
}

Funcionamento filme

POST /api/v1/filme (Cadastro de filme):

Espera que no body da requisiĆ§Ć£o venha os dados do filme e os insere na tabela filme_model do banco de dados. TambĆ©m espera conter o token gerado no login em seu header na chave x-acess-token, junto com o id do usuĆ”rio tambĆ©m em um header na chave user_id

Exemplo de retorno
  {
    "nome": "Homem-Aranha 4",
    "genero": "Super-heroi",
    "lancamento": 2025,
    "duracao": "02:19",
    "id": 4
  }

GET /api/v1/filme (Retorna todos os filmes e seus status):

Essa requisiĆ§Ć£o espera conter o token gerado no login em seu header na chave x-acess-token, junto com o id do usuĆ”rio tambĆ©m em um header na chave user_id

Exemplo de retorno
"data": [
    {
      "id": 2,
      "nome": "Homem-Aranha 3",
      "genero": "Super-heroi",
      "lancamento": 2007,
      "duracao": "02:19"
    },
    {
      "id": 3,
      "nome": "Xmen",
      "genero": "Super-heroi",
      "lancamento": 2007,
      "duracao": "02:19"
    },
    {
      "id": 4,
      "nome": "Homem-Aranha 4",
      "genero": "Super-heroi",
      "lancamento": 2025,
      "duracao": "02:19"
    }
  ]

PUT /api/v1/filme/:id/ (Altera o filme):

Essa requisiĆ§Ć£o espera conter o user_id e token gerado no login em seu header na chave e tambĆ©m um body contendo os novos dadosx-acess-token

Altera o filme especificado na URL da requisiĆ§Ć£o, para o novo body informado.

Exemplo de retorno da URL `/api/v1/filme/1`
 {
   "id": 2,
   "nome": "Homem-Aranha 3",
   "genero": "Super-heroi",
   "lancamento": 2007,
   "duracao": "02:19"
 }

DELETE /api/v1/filme/:id (Remove o filme):

Essa requisiĆ§Ć£o espera conter o token gerado no login em seu header na chave x-acess-token
Remove o filme especificado pela URL.

Exemplo de retorno da URL `/api/v1/filme/1`
{
  "data": "O filme com o id 4 foi deletado com sucesso!"
}

ā˜ Deploy ā˜


Atualmente estou utilizando a plataforma Render para realizar o deploy da aplicaĆ§Ć£o e os bancos, Ć© possĆ­vel acessar o deploy realizado neste link: https://cinme-mks.onrender.com/api/v1/swagger

Como rodar localmente šŸ‘Øā€šŸ’»


āš ļø NecessĆ”rio Docker e Docker-Compose āš ļø

  1. Clone o repositĆ³rio
$ git clone https://github.com/leandroSalesCotrim/crud-mks.git
  1. Entre na pasta raĆ­z do projeto
$ cd crud-mks
  1. Instale as dependencias
$ npm install
  1. Crie um arquivo .env contendo o conteudo abaixo
POSTGRES_DB=mksCinema
POSTGRES_USER=mksUser
POSTGRES_PASSWORD=mksPassword


POSTGRES_HOST=nest-postgres
REDIS_HOST=nest-redis

JWT_SECRET=segredoSecreto
  1. Suba os containers jĆ” configurado com a aplicaĆ§Ć£o e bancos
$ docker-compose up

āš ļø Extra āš ļø

Caso queira modificar a aplicaĆ§Ć£o e ir realizando testes vocĆŖ pode executar apenas os comandos abaixo

  1. Liste os container para visualizar o id dos container dos bancos redis e postgres
$ docker ps -a
  1. Inicie o container do postgres
$ docker start id_do_container_postgres
  1. Inicie o container do redis
$ docker start id_do_container_redis

5)Altere as varivaveis do arquivo .env para utilizar o localhost

REDIS_HOST=localhost
POSTGRES_HOST=localhost

6)Incie a aplicaĆ§Ć£o localmente

$ npm run start:dev