{"id":28317692,"url":"https://github.com/estevam5s/nasa","last_synced_at":"2025-08-26T06:40:39.930Z","repository":{"id":151874699,"uuid":"556803554","full_name":"estevam5s/nasa","owner":"estevam5s","description":"Sistema avançado de gerenciamento de banco de dados astronômicos utilizando tecnologias NestJS e GraphQL. Esta solução abrangente implementa operações CRUD para dados planetários do sistema solar, apresentando implantação de banco de dados PostgreSQL containerizado através do Docker Compose.","archived":false,"fork":false,"pushed_at":"2025-06-14T12:12:09.000Z","size":1483,"stargazers_count":1,"open_issues_count":11,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-14T13:22:07.471Z","etag":null,"topics":["apollo-server","apollo-server-express","apollographql","dbeaver","graphql","insomnia","jwt-authentication","nestjs","nestjs-backend","nestjs-graphql","nestjs-postgres","nodejs","nodemon","postgresql-database","prisma4","rest-api","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/estevam5s.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":null,"code_of_conduct":".github/CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null},"funding":{"github":["estevam5s"],"patreon":"estevamsouza","open_collective":null,"ko_fi":"issuehunt.io/u/estevam5s","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":"estevam5s","otechie":null,"lfx_crowdfunding":null,"custom":["https://www.linkedin.com/in/estevam-souza","https://twitter.com/estevamSouza199","https://github.com/estevam5s"]}},"created_at":"2022-10-24T14:43:16.000Z","updated_at":"2024-11-27T15:57:04.000Z","dependencies_parsed_at":"2024-06-05T13:29:21.007Z","dependency_job_id":"f44c7d5a-f992-4677-ad22-48ec41ad6dcd","html_url":"https://github.com/estevam5s/nasa","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/estevam5s/nasa","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estevam5s%2Fnasa","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estevam5s%2Fnasa/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estevam5s%2Fnasa/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estevam5s%2Fnasa/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/estevam5s","download_url":"https://codeload.github.com/estevam5s/nasa/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/estevam5s%2Fnasa/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":261703081,"owners_count":23196894,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apollo-server","apollo-server-express","apollographql","dbeaver","graphql","insomnia","jwt-authentication","nestjs","nestjs-backend","nestjs-graphql","nestjs-postgres","nodejs","nodemon","postgresql-database","prisma4","rest-api","typescript"],"created_at":"2025-05-25T06:12:33.021Z","updated_at":"2025-06-24T15:32:00.759Z","avatar_url":"https://github.com/estevam5s.png","language":"TypeScript","funding_links":["https://github.com/sponsors/estevam5s","https://patreon.com/estevamsouza","https://ko-fi.com/issuehunt.io/u/estevam5s","https://issuehunt.io/r/estevam5s","https://www.linkedin.com/in/estevam-souza","https://twitter.com/estevamSouza199","https://github.com/estevam5s","https://www.buymeacoffee.com/estevamsl"],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n    \u003cimg src=\"https://user-images.githubusercontent.com/83369803/197357210-335a06f9-53f7-4a80-990c-c958a9243807.png\" alt=\"DevSite\" width=\"2000\"\u003e\n\u003c/h1\u003e\n\n\u003ch1 align=\"center\"\u003e\u003c/h1\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"http://nestjs.com/\" target=\"_blank\"\u003e\n    \u003cimg src=\"https://nestjs.com/img/logo_text.svg\" width=\"150\" alt=\"Nest Logo\" /\u003e\n  \u003c/a\u003e\n\u003c/div\u003e\n\n[circleci-image]: https://img.shields.io/circleci/build/github/nestjs/nest/master?token=abc123def456\n[circleci-url]: https://circleci.com/gh/nestjs/nest\n\n  \u003cp align=\"center\"\u003eUma estrutura \u003ca href=\"http://nodejs.org\" target=\"_blank\"\u003eNode.js\u003c/a\u003e progressiva para criar aplicativos do lado do servidor eficientes e escalonáveis 🔥🚀\u003c/p\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=Node\u0026message=v14.15.4\u0026labelColor=339933\u0026color=757575\u0026logoColor=FFFFFF\u0026logo=Node.js\" alt=\"Node.js\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=Npm\u0026message=v6.14.10\u0026labelColor=CB3837\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=npm\" alt=\"Npm\"/\u003e\n    \u003cimg src=\"https://img.shields.io/static/v1.svg?style=flat\u0026label=NestJs\u0026message=v8.2.6\u0026labelColor=E0234E\u0026logoColor=FFFFFF\u0026color=757575\u0026logo=Nestjs\" alt=\"NestJs\"/\u003e\n    \u003ca href=\"https://github.com/rudemex/nestjs-starter/releases/latest\"\u003e\n        \u003cimg alt=\"Last Release\" src=\"https://img.shields.io/github/v/tag/rudemex/nestjs-starter?label=release\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"./license.md\"\u003e\n        \u003cimg alt=\"GitHub license\" src=\"https://img.shields.io/github/license/rudemex/nestjs-starter?style=flat\"\u003e\n    \u003c/a\u003e\n    \u003cbr\u003e\n    \u003ca href=\"https://github.com/rudemex/nestjs-starter/actions/workflows/master.yml\" target=\"_blank\"\u003e\n        \u003cimg alt=\"GitHub Workflow Status\" src=\"https://github.com/rudemex/nestjs-starter/actions/workflows/master.yml/badge.svg?branch=master\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://app.codecov.io/gh/rudemex/nestjs-starter/\" target=\"_blank\"\u003e\n        \u003cimg alt=\"Codecov\" src=\"https://img.shields.io/codecov/c/github/rudemex/nestjs-starter?logoColor=FFFFFF\u0026logo=Codecov\u0026labelColor=#F01F7A\"\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://sonarcloud.io/summary/new_code?id=rudemex_nestjs-starter\" target=\"_blank\"\u003e    \n        \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=rudemex_nestjs-starter\u0026metric=alert_status\" alt=\"sonarcloud\"\u003e\n    \u003c/a\u003e    \n    \u003ca href=\"https://snyk.io/test/github/rudemex/nestjs-starter\" target=\"_blank\"\u003e\n        \u003cimg src=\"https://snyk.io/test/github/rudemex/nestjs-starter/badge.svg\" alt=\"Snyk\"\u003e\n    \u003c/a\u003e\n    \u003cbr/\u003e \n\u003c/p\u003e\n\n\u003c/br\u003e\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"https://img.shields.io/badge/yarn-%232C8EBB.svg?style=for-the-badge\u0026logo=yarn\u0026logoColor=white\" alt=\"yarn\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/nestjs-%23E0234E.svg?style=for-the-badge\u0026logo=nestjs\u0026logoColor=white\" alt=\"NestJs\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/-ApolloGraphQL-311C87?style=for-the-badge\u0026logo=apollo-graphql\" alt=\"Graphql\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/Prisma-3982CE?style=for-the-badge\u0026logo=Prisma\u0026logoColor=white\" alt=\"Prisma.io\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\" alt=\"Docker\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/postgres-%23316192.svg?style=for-the-badge\u0026logo=postgresql\u0026logoColor=white\" alt=\"Prisma\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/-TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\" alt=\"TypeScript\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/-Jest-C21325?style=for-the-badge\u0026logo=jest\" alt=\"Jest\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/-Node.js-339933?style=for-the-badge\u0026logo=node.js\" alt=\"Node.js\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/badge/-JWT-000000?style=for-the-badge\u0026logo=JSONWebTokens\" alt=\"JWT\" /\u003e\n\n---\n\n## Descrição\n\n\u003e Arquitetura padrão para nestjs\n\n*Você consegue [Request Feature][ack-issues] ou [Report Bug][ack-issues] seguindo este link*\n\nNessa postagem criamos um CRUD de planetas, utilizando o o framework [Nest](https://nestjs.com/), GraphQL [GraphQL](https://graphql.org/), Apollo [Apollo](https://www.apollographql.com/), Prisma [Prisma](https://www.prisma.io/), Docker [Docker](https://www.docker.com/), Postgres [Postgres](https://www.postgresql.org/), Jest [Jest](https://jestjs.io/pt-BR/), Node.js [Node.js](https://nodejs.org/en/), JWT [JWT](https://jwt.io/) e o Yarn [Yarn](https://yarnpkg.com/).\n \nAssim podemos criar, deletar, pesquisar e atualizar uma tabela de planetas no banco de dados. Usamos também o [Prisma](https://www.prisma.io/) como ORM e criamos um container com o banco de dados postgres usando o [Docker Compose](https://docs.docker.com/compose/).\n\nEste projeto, foi utilizado conceitos sobre astronomia. O projeto foi criado com o intuito de aprender mais sobre o framework NestJS, GraphQL, Apollo, Prisma, Docker, Postgres, Jest, Node.js, JWT e o Yarn.\n\nEste projeto tem como intuito de mostrar como podemos criar um CRUD de planetas do nosso sistema sola utilizando o NestJS e GraphQL. Além disso, também mostramos como podemos criar um container com o banco de dados postgres usando o Docker Compose. Vamos subir a nossa aplicação usando o Docker Compose e acessar o GraphQL Playground para testar nossas queries e mutations.\n\n---\n\n## Pré-requisitos\n\nAssumimos que todos que chegam aqui são _**`programadores com conhecimento intermediário`**_ e também precisamos entender mais antes de começar para reduzir a lacuna de conhecimento.\n\n1. Entenda [NestJs Fundamental](http://nestjs.com), Main Framework. NodeJs Framework com suporte totalmente TypeScript.\n2. Entenda [Typescript Fundamental](https://www.typescriptlang.org), Linguagem de Programação. Isso nos ajudará a escrever e ler o código.\n3. Entenda [ExpressJs Fundamental](https://nodejs.org), NodeJs Base Framework. Isso nos ajudará a entender como o NestJs Framework funciona.\n4. Entenda [Docker](ref-docker) que pode ajudá-lo a executar o projeto\n5. Entenda [GraphQL](ref-graphql) que pode ajudá-lo a entender como funciona o GraphQL\n6. Entenda [Apollo](ref-apollo) que pode ajudá-lo a entender como funciona o Apollo\n7. Entenda [Prisma](ref-prisma) que pode ajudá-lo a entender como funciona o Prisma\n8. Entenda [Postgres](ref-postgres) que pode ajudá-lo a entender como funciona o Postgres\n9. Entenda [Jest](ref-jest) que pode ajudá-lo a entender como funciona o Jest\n10. Entenda [Node.js](ref-nodejs) que pode ajudá-lo a entender como funciona o Node.js\n11. Entenda [JWT](ref-jwt) que pode ajudá-lo a entender como funciona o JWT\n12. Entenda [Yarn](ref-yarn) que pode ajudá-lo a entender como funciona o Yarn\n13. Opcional, entenda [Docker Compose](ref-docker-compose) que pode ajudá-lo a executar o projeto\n\n---\n\n\u003ch2\u003eÍndice\u003c/h2\u003e\n\n- [Descrição](#descrição)\n- [Pré-requisitos](#pré-requisitos)\n- [Configurar](#configurar)\n- [Ambientes de configuração](#ambientes-de-configuração)\n- [NPM scripts](#npm-scripts)\n- [Exemplo de solicitação](#Exemplo-de-solicitação)\n    - [Para obter os dados dos planetas com gravidade alta na api da nasa](#para-obter-os-dados-dos-planetas-com-gravidade-alta-na-api-da-nasa)\n    - [dado um planeta, instala uma estação de carregamento no planetas](#dado-um-planeta,-instala-uma-estação-de-carregamento-no-planetas)\n    - [Para obter as estações no planeta, irá listar todas as estações instaladas nos planetas](#para-obter-as-estações-no-planeta,-irá-listar-todas-as-estações-instaladas-nos-planetas )\n    - [dado uma estação e um datetime de quanto a recarga irá finalizar, realiza uma recarga](#dado-uma-estação-e-um-datetime-de-quanto-a-recarga-irá-finalizar,-realiza-uma-recarga)\n    - [reservation, que dado uma estação, um usuário e um intervalo de tempo, cria uma reserva da estação para o usuário naquele determinado intervalo de tempo.](#reservation,-que-dado-uma-estação,-um-usuário-e-um-intervalo-de-tempo,-cria-uma-reserva-da-estação-para-o-usuário-naquele-determinado-intervalo-de-tempo.)\n    - [stationHistory, onde será possível visualizar o histórico de recargas de uma estação (mostrar o horário, o tempo de duração da recarga e o usuário que realizou)](#stationHistory,-onde-será-possível-visualizar-o-histórico-de-recargas-de-uma-estação-(mostrar-o-horário,-o-tempo-de-duração-da-recarga-e-o-usuário-que-realizou))\n- [Clonar repositório](#clonar-repositório)\n- [Instalar dependências](#instalar-dependências)\n- [Criar ambiente](#criar-ambiente)\n- [Sem usar o Docker](#sem-usar-o-docker)\n- [Usando o Docker](#ssando-o-docker)\n- [Instalação](#instalação)\n- [Rodando a aplicação](#rodando-a-aplicação)\n- [Iniciar aplicativo](#iniciar-aplicativo)\n- [Testes](#testes)\n    - [Teste específico](#teste-específico)\n- [Migração de banco de dados](#migração-de-banco-de-dados)\n    - [_Create migration_](#create-migration)\n    - [_Run migration_](#run-migration)\n    - [_Revert migration_](#revert-migration)\n- [Iniciando o servidor](#iniciando-o-servidor)\n- [Observação](#observação)\n- [Documentação](#documentação)\n- [Estrutura](#estrutura)\n- [Features](#features)\n- [Features covered](#features-covered)\n- [Rotas](#rotas)\n    - [createUser](#createUser)\n    - [findAll](#findAll)\n    - [findOne](#findOne)\n    - [updateUser](#updateUser)\n    - [removeUser](#removeUser)\n- [Tutorial](#tutorial)\n- [Autenticação](#autenticação)\n- [Deployment](#deployment)\n- [License](#license)\n- [BuyMeACoffee](#buyMeACoffee)\n- [Importante](#importante)\n- [Objetivo](#objetivo)\n- [Todo](#todo)\n- [Database](#database)\n\u003c!-- - [Features](#features)\n    - [CQRS](#cqrs)\n    - [Guard](#guard)\n    - [Functions](#functions)\n        - [_Authentication_](#authentication)\n        - [_Refresh token (incoming)_](#refresh-token-incoming)\n        - [_Manage device login_](#manage-device-login)\n        - [_Two authenticator (incoming)_](#two-authenticator-incoming)\n        - [_CRUD users_](#crud-users)\n        - [_Reset password_](#reset-password)\n        - [_Send mail_](#send-mail)\n        - [_Upload file S3 (incoming)_](#upload-file-s3-incoming)\n        - [_I18n (incoming)_](#i18n-incoming)\n    - [Migrations](#migrations)\n    - [Transformers](#transformers)\n    - [Exceptions filter](#exceptions-filter)\n    - [Rate limiting](#rate-limiting)\n    - [Swagger](#swagger)\n    - [Compodoc](#compodoc)\n    - [Linter](#linter) --\u003e\n\n---\n\n## Configurar\n\n- O NestJs é um framework NodeJs que usa Typescript como linguagem de programação. Ele é baseado no ExpressJs, mas com uma estrutura mais organizada e com algumas funcionalidades extras.\n- Para configurar o projeto, você precisa ter o NodeJs instalado em sua máquina. Você pode baixá-lo [aqui](https://nodejs.org/en/download/).\n- Você também precisa ter o Yarn instalado em sua máquina. Você pode baixá-lo [aqui](https://classic.yarnpkg.com/en/docs/install/#windows-stable).\n- Você também precisa ter o Docker instalado em sua máquina. Você pode baixá-lo [aqui](https://docs.docker.com/get-docker/).\n- Você também precisa ter o Docker Compose instalado em sua máquina. Você pode baixá-lo [aqui](https://docs.docker.com/compose/install/).\n- Ao usar o docker-compose, ele vai fazer o download da imagem do postgres e criar um container para você. Você pode verificar isso usando o comando `docker ps` no seu terminal.\n- Com o docker-compose, você pode subir o container do postgres e o container da aplicação usando o comando `docker-compose up -d` no seu terminal.\n- Como o arquivo docker-compose deve estar:\n    \n```yml\n\nversion: '3'\nservices:\n  app:\n    build: .\n    entrypoint: .docker/entrypoint.sh\n    container_name: postgres\n    ports:\n      - '49153:49153'\n    volumes:\n      - .:/home/node/app\n    depends_on:\n      - db\n\n  db:\n    build: docker/postgres\n    container_name: postgres\n    restart: always\n    tty: true\n    ports:\n      - '49153:49153'\n    volumes:\n      - docker/dbdata:/var/lib/postgresql/data\n    environment:\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgrespw\n      POSTGRES_DB: postgres\n\n  pgadmin:\n    image: dpage/pgadmin4\n    container_name: pgadmin\n    tty: true\n    environment:\n      PGADMIN_DEFAULT_EMAIL: admin@admin.com\n      PGADMIN_DEFAULT_PASSWORD: pgadminpw\n    ports:\n      - '8000:80'\n    depends_on:\n      - db\n    restart: always\n\n```\n\n---\n\n## Ambientes de configuração\n\n- Instale dependências executando ``` yarn install ```\n- Crie o arquivo ***.env*** executando ```cp .env.example .env``` e substitua as variáveis ​​env existentes\n- Crie o arquivo ***ormconfig.json*** executando ```cp ormconfig.example.json ormconfig.json``` e substitua as variáveis ​​env existentes\n- Crie o arquivo ***ormconfig.test.json*** executando ```cp ormconfig.test.example.json ormconfig.test.json``` e substitua as variáveis ​​env existentes\n- O arquivo ***ormconfig.json*** é usado para configurar o Prisma e o TypeORM, enquanto o arquivo ***ormconfig.test.json*** é usado para configurar o TypeORM para testes.\n- Como ficará o arquivo ***.env***:\n    \n```env\n\n# Environment variables declared in this file are automatically made available to Prisma.\n# See the documentation for more detail: https://pris.ly/d/prisma-schema#accessing-environment-variables-from-the-schema\n\n# Prisma supports the native connection string format for PostgreSQL, MySQL, SQLite, SQL Server, MongoDB and CockroachDB (Preview).\n# See the documentation for all the connection string options: https://pris.ly/d/connection-strings\n\nUSER_DATABASE=dbase\nPASSWORD_DATABASE=dbase\nDATABASE=dbase\nDATABASE_URL=\"postgres://postgres:postgrespw@localhost:49153\"\n# DATABASE_URL=\"postgresql://${USER_DATABASE}:${PASSWORD_DATABASE}@localhost:5432/${DATABASE}?schema=public\"\n\n```\n\n---\n\n\u003e Você pode criar o arquivo ***.env.development*** ou ***.env.staging*** ou ***.env.production*** dependendo do seu ambiente\n\n---\n\n## NPM scripts\n\n-   `npm run start` - Start application\n-   `npm run start:watch` - Start application in watch mode\n-   `npm run test` - run Jest test runner\n-   `npm run start:prod` - Build application\n\nAo executar o comando `npm run start`, o NestJs vai executar o arquivo ***main.ts*** que está na raiz do projeto. Esse arquivo é responsável por iniciar o servidor da aplicação.\n\nOs comando do npm é ideal para executar o projeto em modo de desenvolvimento, mas para executar em modo de produção, você precisa usar o comando `npm run start:prod` que vai gerar uma pasta chamada ***dist*** na raiz do projeto. Essa pasta contém os arquivos compilados do projeto. Você pode executar o projeto usando o comando `node dist/main.js`.\n\n---\n\n## Exemplo de solicitação, primeiramente no insomnia\n\n#### Para obter os dados dos planetas com gravidade alta na api da nasa\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\n{\n  \"query\": \n    \"query \n    { \n        suitablePlanets \n        { \n            pl_name,\n            pl_bmassj\n        }\n  }\"\n}\n\n```\n\nOnde pl_name é o nome do planeta e pl_bmassj é a massa do planeta.\n\nE o resultado deste pedido é :\n\n\u003c!-- fazer um servico que consome essa api: ttps://exoplanetarchive.ipac.caltech.edu/TAP/sync?query=select+pl_name,pl_bmassj+from+ps+where+pl_bmassj%3E10\u0026format=json --\u003e\n\n\n\n```json\n\n{\n  \"data\": \n    {\n        \"suitablePlanets\": \n\n        [\n            {\n                \"pl_name\": \"HD 22781 b\",\n                \"pl_bmassj\": 13.65000\n            },\n            {\n                \"pl_name\": \"30 Ari B b\",\n                \"pl_bmassj\": 13.82000\n            },\n            {\n                \"pl_name\": \"BD+20 2457 b\",\n                \"pl_bmassj\": 55.59000\n            },\n            {\n                \"pl_name\": \"HD 13189 b\",\n                \"pl_bmassj\": 10.95000\n            },\n            {\n                \"pl_name\": \"HD 162020 b\",\n                \"pl_bmassj\": 14.40000\n            },\n            {\n                \"pl_name\": \"11 UMi b\",\n                \"pl_bmassj\": 14.74000\n            },\n            {\n                \"pl_name\": \"BD+20 2457 c\",\n                \"pl_bmassj\": 12.47000\n            },\n            {\n                \"pl_name\": \"HD 158996 b\",\n                \"pl_bmassj\": 14.00000\n            },\n            {\n                \"pl_name\": \"tau Gem b\",\n                \"pl_bmassj\": 20.60000\n            },\n            {\n                \"pl_name\": \"NSVS 14256825 b\",\n                \"pl_bmassj\": 14.15000\n            },\n            {\n                \"pl_name\": \"CT Cha b\",\n                \"pl_bmassj\": 17.00000\n            },\n            {\n                \"pl_name\": \"Kepler-75 b\",\n                \"pl_bmassj\": 10.10000\n            },\n            {\n                \"pl_name\": \"b Cen AB b\",\n                \"pl_bmassj\": 10.90000\n            },\n            {\n                \"pl_name\": \"AB Pic b\",\n                \"pl_bmassj\": 13.50000\n            },\n            {\n                \"pl_name\": \"Kepler-407 c\",\n                \"pl_bmassj\": 12.60000\n            },\n            {\n                \"pl_name\": \"HIP 78530 b\",\n                \"pl_bmassj\": 23.00000\n            },\n            {\n                \"pl_name\": \"VHS J125601.92-125723.9 b\",\n                \"pl_bmassj\": 42.80000\n            },\n            {\n                \"pl_name\": \"Kepler-30 d\",\n                \"pl_bmassj\": 17.00000\n            },\n            {\n                \"pl_name\": \"HIP 79098 AB b\",\n                \"pl_bmassj\": 20.50000\n            },\n            {\n                \"pl_name\": \"VHS J125601.92-125723.9 b\",\n                \"pl_bmassj\": 43.30000\n            },\n            {\n                \"pl_name\": \"Oph 11 b\",\n                \"pl_bmassj\": 21.00000\n            },\n            {\n                \"pl_name\": \"ROXs 42 B b\",\n                \"pl_bmassj\": 10.50000\n            },\n            {\n                \"pl_name\": \"KMT-2019-BLG-0371L b\",\n                \"pl_bmassj\": 11.98000\n            },\n            {\n                \"pl_name\": \"HD 106906 b\",\n                \"pl_bmassj\": 11.00000\n            },\n            {\n                \"pl_name\": \"kap And b\",\n                \"pl_bmassj\": 12.80000\n            },\n            {\n                \"pl_name\": \"WISEP J121756.91+162640.2 A b\",\n                \"pl_bmassj\": 22.00000\n            },\n            {\n                \"pl_name\": \"Oph 11 b\",\n                \"pl_bmassj\": 14.00000\n            },\n            {\n                \"pl_name\": \"HIP 78530 b\",\n                \"pl_bmassj\": 23.04000\n            },\n            {\n                \"pl_name\": \"HIP 78530 b\",\n                \"pl_bmassj\": 24.00000\n            },\n            {\n                \"pl_name\": \"Kepler-47 c\",\n                \"pl_bmassj\": 28.00000\n            },\n            {\n                \"pl_name\": \"USco1556 b\",\n                \"pl_bmassj\": 15.00000\n            },\n            {\n                \"pl_name\": \"1RXS J160929.1-210524 b\",\n                \"pl_bmassj\": 12.00000\n            },\n            {\n                \"pl_name\": \"FU Tau b\",\n                \"pl_bmassj\": 16.00000\n            },\n            {\n                \"pl_name\": \"DH Tau b\",\n                \"pl_bmassj\": 11.00000\n            },\n            {\n                \"pl_name\": \"2MASS J01225093-2439505 b\",\n                \"pl_bmassj\": 24.50000\n            },\n            {\n                \"pl_name\": \"2MASS J21402931+1625183 A b\",\n                \"pl_bmassj\": 20.95000\n            },\n            {\n                \"pl_name\": \"PH2 b\",\n                \"pl_bmassj\": 80.00000\n            },\n            {\n                \"pl_name\": \"2MASS J22362452+4751425 b\",\n                \"pl_bmassj\": 12.50000\n            },\n            {\n                \"pl_name\": \"HD 106906 b\",\n                \"pl_bmassj\": 12.95000\n            },\n            {\n                \"pl_name\": \"Kepler-39 b\",\n                \"pl_bmassj\": 17.90000\n            },\n            {\n                \"pl_name\": \"kap And b\",\n                \"pl_bmassj\": 13.61600\n            },\n            {\n                \"pl_name\": \"Kepler-39 b\",\n                \"pl_bmassj\": 20.10000\n            },\n            {\n                \"pl_name\": \"EPIC 248847494 b\",\n                \"pl_bmassj\": 13.00000\n            },\n            {\n                \"pl_name\": \"VHS J125601.92-125723.9 b\",\n                \"pl_bmassj\": 11.20000\n            },\n            {\n                \"pl_name\": \"CFBDSIR J145829+101343 b\",\n                \"pl_bmassj\": 10.50000\n            },\n            {\n                \"pl_name\": \"Kepler-39 b\",\n                \"pl_bmassj\": 18.00000\n            },\n            {\n                \"pl_name\": \"nu Oph b\",\n                \"pl_bmassj\": 22.20600\n            },\n            {\n                \"pl_name\": \"OGLE-2013-BLG-0102L b\",\n                \"pl_bmassj\": 14.00000\n            },\n            {\n                \"pl_name\": \"OGLE-2013-BLG-0102L b\",\n                \"pl_bmassj\": 13.00000\n            },\n            {\n                \"pl_name\": \"OGLE-2019-BLG-0954L b\",\n                \"pl_bmassj\": 14.20000\n            },\n            {\n                \"pl_name\": \"HD 153557 d\",\n                \"pl_bmassj\": 27.31185\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/suitablePlanets.jpeg\" alt=\"suitablePlanets\"\u003e\n\n#### dado um planeta, instala uma estação de carregamento no planetas\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nmutation installStation\n{\n    installStation(planetName:\"teste\")\n    {\n        id,\n        planetName\n    }\n}\n\n```\n\nOnde `installStation` é o nome da mutation e `planetName` é o nome do planeta que você deseja instalar a estação de carregamento.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n\t\"data\": {\n\t\t\"installStation\": {\n\t\t\t\"id\": \"8\",\n\t\t\t\"planetName\": \"Kepler-62 r\"\n\t\t}\n\t}\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/installStation.png\" alt=\"installStation\"\u003e\n\n#### Para obter as estações no planeta, irá listar todas as estações instaladas nos planetas \n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\n{\n    query:\n\t    stations\n        {\n\t        id,\n            planetName\n        }\n}\n\n```\n\nOnde `stations` é o nome do resolver que você quer executar e `id` e `planetName` são os campos que você quer retornar.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n\t\"data\": {\n\t\t\"query\": [\n\t\t\t{\n\t\t\t\t\"id\": \"1\",\n\t\t\t\t\"planetName\": \"teste\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": \"2\",\n\t\t\t\t\"planetName\": \"teste\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": \"3\",\n\t\t\t\t\"planetName\": \"teste\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": \"4\",\n\t\t\t\t\"planetName\": \"teste\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"id\": \"5\",\n\t\t\t\t\"planetName\": \"teste\"\n\t\t\t}\n\t\t]\n\t}\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/stations.png\" alt=\"stations\"\u003e\n\n\n#### dado uma estação e um datetime de quanto a recarga irá finalizar, realiza uma recarga\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nmutation recharge\n{\n\trecharge(data:\n\t\t{\n\t\t\tstationID: 5,fin_recarga:\"2022-10-26\",usuario:\"user\"\n\t\t}\n\t)\n\t{\n\t\tstationID, fin_recarga, usuario\n\t}\n}\n\n```\n\nOnde `rechargeStation` é o nome da mutation e `stationId` é o id da estação que você deseja recarregar e `finishRecharge` é o datetime de quando a recarga irá finalizar.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n\t\"data\": {\n\t\t\"recharge\": {\n\t\t\t\"stationID\": 5,\n\t\t\t\"fin_recarga\": \"2022-10-26T00:00:00.000Z\",\n\t\t\t\"usuario\": \"user\"\n\t\t}\n\t}\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/recharge.png\" alt=\"recharge\"\u003e\n\n#### reservation, que dado uma estação, um usuário e um intervalo de tempo, cria uma reserva da estação para o usuário naquele determinado intervalo de tempo.\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nmutation reservation\n{\n        reservation\n        (\n            stationID: 1\n            usuario: \"João\"\n            inicio: \"2021-06-01T00:00:00.000Z\"\n            fin: \"2021-06-01T01:00:00.000Z\"\n        )\n}\n\n```\n\nOnde `reservation` é o nome da mutation e `stationId` é o id da estação que você deseja reservar, `usuario` é o nome do usuário que irá reservar a estação, `inicio_reserva` é o datetime de quando a reserva irá começar e `fim_reserva` é o datetime de quando a reserva irá finalizar.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n\t\"data\": {\n\t\t\"reservation\": \"Recarga realizada\"\n\t}\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/reservation.png\" alt=\"reservation\"\u003e\n\n#### stationHistory, onde será possível visualizar o histórico de recargas de uma estação (mostrar o horário, o tempo de duração da recarga e o usuário que realizou)\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nquery {\n\tstationHistory(stationID: 2) \n\t{\n\t\tstationID\n\t\tusuario\n\t\tinicio_recarga\n\t\tfin_recarga\n\t}\n} from\n\n```\n\nOnde `stationHistory` é o nome do resolver que você quer executar e `stationID` é o id da estação que você deseja ver o histórico de recargas, `inicio_recarga` é o datetime de quando a recarga começou, `fin_recarga` é o datetime de quando a recarga finalizou e `usuario` é o nome do usuário que realizou a recarga.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"query\": [\n            {\n                \"stationID\": 5,\n                \"inicio_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"fin_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"usuario\": \"user\"\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/stationHistory.png\" alt=\"stationHistory\"\u003e\n\n#### cancelar recarga de uma estação\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\n  mutation cancelRecharge {\n        cancelRecharge(id: 1) {\n            stationID\n\t\t\t\t\t\tusuario\n            inicio_recarga\n            fin_recarga\n        }\n    }\n\n```\n\nOnde `cancelRecharge` é o nome da mutation e `id` é o id da recarga que você deseja cancelar, `stationID` é o id da estação que você deseja cancelar a recarga, `inicio_recarga` é o datetime de quando a recarga começou, `fin_recarga` é o datetime de quando a recarga finalizou e `usuario` é o nome do usuário que realizou a recarga.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"cancelRecharge\": {\n            \"stationID\": 5,\n            \"inicio_recarga\": \"2022-10-26T00:00:00.000Z\",\n            \"fin_recarga\": \"2022-10-26T00:00:00.000Z\",\n            \"usuario\": \"user\"\n        }\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/cancelRecharge.png\" alt=\"cancelRecharge\"\u003e\n\n#### cancelar reserva de uma estação\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\n  mutation cancelStation {\n        cancelStation(reservationID: 1)\n    }\n\n```\n\nOnde `cancelStation` é o nome da mutation e `reservationID` é o id da reserva que você deseja cancelar.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"cancelStation\": \"Reserva cancelada\"\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/cancelStation.png\" alt=\"cancelStation\"\u003e\n\n#### ver o histórico de reservas de uma estação\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nquery {\n    stationHistory(stationID: 2) \n    {\n        stationID\n        usuario\n        inicio_reserva\n        fim_reserva\n    }\n} from\n\n```\n\nOnde `stationHistory` é o nome do resolver que você quer executar e `stationID` é o id da estação que você deseja ver o histórico de reservas, `inicio_reserva` é o datetime de quando a reserva começou, `fim_reserva` é o datetime de quando a reserva finalizou e `usuario` é o nome do usuário que realizou a reserva.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"query\": [\n            {\n                \"stationID\": 5,\n                \"inicio_reserva\": \"2022-10-26T00:00:00.000Z\",\n                \"fim_reserva\": \"2022-10-26T00:00:00.000Z\",\n                \"usuario\": \"user\"\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/stationHistory.png\" alt=\"stationHistory\"\u003e\n\n#### ver o histórico de reservas de um usuário\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nquery {\n    userHistory(usuario: \"user\") \n    {\n        stationID\n        usuario\n        inicio_reserva\n        fim_reserva\n    }\n} from\n\n```\n\nOnde `userHistory` é o nome do resolver que você quer executar e `usuario` é o nome do usuário que você deseja ver o histórico de reservas, `inicio_reserva` é o datetime de quando a reserva começou, `fim_reserva` é o datetime de quando a reserva finalizou e `stationID` é o id da estação que o usuário reservou.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"query\": [\n            {\n                \"stationID\": 5,\n                \"inicio_reserva\": \"2022-10-26T00:00:00.000Z\",\n                \"fim_reserva\": \"2022-10-26T00:00:00.000Z\",\n                \"usuario\": \"user\"\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/userHistory.png\" alt=\"userHistory\"\u003e\n\n#### ver o histórico de recargas de um usuário\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nquery {\n    userHistory(usuario: \"user\") \n    {\n        stationID\n        usuario\n        inicio_recarga\n        fin_recarga\n    }\n} from\n\n```\n\nOnde `userHistory` é o nome do resolver que você quer executar e `usuario` é o nome do usuário que você deseja ver o histórico de recargas, `inicio_recarga` é o datetime de quando a recarga começou, `fin_recarga` é o datetime de quando a recarga finalizou e `stationID` é o id da estação que o usuário recarregou.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"query\": [\n            {\n                \"stationID\": 5,\n                \"inicio_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"fin_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"usuario\": \"user\"\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/userHistory.png\" alt=\"userHistory\"\u003e\n\n#### ver o histórico de recargas de uma estação\n\n`POST http://localhost:3000/graphql` com o seguinte corpo :\n\n```graphql\n\nquery {\n    stationHistory(stationID: 2) \n    {\n        stationID\n        usuario\n        inicio_recarga\n        fin_recarga\n    }\n} from\n\n```\n\nOnde `stationHistory` é o nome do resolver que você quer executar e `stationID` é o id da estação que você deseja ver o histórico de recargas, `inicio_recarga` é o datetime de quando a recarga começou, `fin_recarga` é o datetime de quando a recarga finalizou e `usuario` é o nome do usuário que realizou a recarga.\n\nE o resultado deste pedido é:\n\n```json\n\n{\n    \"data\": {\n        \"query\": [\n            {\n                \"stationID\": 5,\n                \"inicio_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"fin_recarga\": \"2022-10-26T00:00:00.000Z\",\n                \"usuario\": \"user\"\n            }\n        ]\n    }\n}\n\n```\n\n\u003cimg src=\".assets/insomnia/stationHistory.png\" alt=\"stationHistory\"\u003e\n\n---\n\n#### Clonar repositório\n\nClone rest-api-nasa com git.\n\n```bash\n# Clone this repository\n$ git clone https://github.com/estevam5s/rest-api-nasa\n```\n\n#### Instalar dependências\n\nEste projeto precisa de algumas dependências. Vamos instalá-lo.\n\n```bash\n# yarn\n$ yarn install\n#or\n# npm\n$ npm install\n```\n\n#### Criar ambiente\n\nFaça seu próprio ambiente com cópia de `.env.example` e edite algum valor. Por exemplo, você pode mudar o nome do aplicativo.\n\n```bash\n# Copy environment\n$ cp .env.example .env\n```\n\n- ### Sem usar o Docker\n\nVocê tem que instalar `Mysql`, `Redis`, `Postgres` e substituir as respectivas variáveis ​​env no arquivo env que se envontra na raiz do projeto.\n\n```bash\n# development\n$ yarn db:setup:local\n```\n\n- ### Usando o Docker\n\nÉ ideal que use o Docker para executar o projeto como o docker-compose já está configurado para executar o projeto.\n\nAo rodar o projeto com o docker-compose, você não precisa instalar o `Mysql`, `Redis`, `Postgres` e substituir as respectivas variáveis ​​env no arquivo env que se envontra na raiz do projeto.\n\nELe ficará em execução em segundo plano e você pode acessar o banco de dados usando o `localhost:3306` para o `Mysql`, `localhost:5432` para o `Postgres` e `localhost:6379` para o `Redis`.\n\n```bash\n# Start docker -\u003e mysql, redis, postgres -\u003e Iniciar o docker em segundo plano\n$ docker-compose up -d\n```\n\n\u003e Você pode usar o arquivo `docker-compose.dev.yml` para o ambiente de desenvolvimento e o arquivo `docker-compose.prod.yml` para o ambiente de produção.\n\n---\n\n## Instalação\n\n```bash\n# Instalação das dependências -\u003e yarn ou npm\n$ yarn\n\n# Iniciar container com banco de dados postgress (Você precisa ter o docker instalado!):\n$ yarn up:db\n\n# Migração dos models definidos no schema.prisma para o banco de dados\n$ yarn prisma migrate dev\n```\n\n## Rodando a aplicação\n\n\u003e Se a versão do mongodb \u003c 5, [Leia esta seção para ajustar a configuração do mongoose.](#adjust-mongoose-setting)\n\nFinalmente, Felicidades 🍻🍻!!! passamos todas as etapas.\n\nAgora, o projeto pode ser visto em `http://localhost:3000`.\n\nAgora podemos executar rest-api-nasa e usar todos os recursos.\n\n```bash\n# development -\u003e http://localhost:3000 (http://localhost:3000/graphql)\n$ yarn start\n\n# watch mode -\u003e Para desenvolvimento (reinicia o servidor automaticamente quando os arquivos são alterados)\n$ yarn start:dev\n\n# production mode -\u003e Para produção (compila o código e executa o código compilado)\n$ yarn start:prod\n```\n\n## Iniciar aplicativo\n\nPara ambiente de desenvolvimento, você pode usar o comando `yarn start:dev` para iniciar o servidor. O servidor será iniciado na porta 3000. Você pode acessar o servidor em `http://localhost:3000`. O servidor será reiniciado automaticamente se você alterar qualquer um dos arquivos de origem. Você pode usar o comando `yarn start:debug` para iniciar o servidor em modo de depuração. Você pode usar o comando `yarn start:prod` para iniciar o servidor em modo de produção. O servidor será iniciado na porta 3000. Você pode acessar o servidor em `http://localhost:3000`. O servidor será reiniciado automaticamente se você alterar qualquer um dos arquivos de origem.\n\n```bash\n# development -\u003e http://localhost:3000 (http://localhost:3000/graphql) -\u003e Para desenvolvimento (reinicia o servidor automaticamente quando os arquivos são alterados)\n$  yarn migration:run\n\n# watch mode -\u003e Para desenvolvimento (reinicia o servidor automaticamente quando os arquivos são alterados) -\u003e Para desenvolvimento (reinicia o servidor automaticamente quando os arquivos são alterados)\n$  yarn start:dev\n```\n\nPara ambiente de produção você pode usar o comando `yarn start:prod` para iniciar o servidor. O servidor será iniciado na porta 3000. Você pode acessar o servidor em `http://localhost:3000`. O servidor será reiniciado automaticamente se você alterar qualquer um dos arquivos de origem.\n\n```bash\n# production mode -\u003e Para produção (compila o código e executa o código compilado) -\u003e Para produção (compila o código e executa o código compilado)\n$  yarn migration:run\n\n# production mode -\u003e Para produção (compila o código e executa o código compilado) -\u003e Para produção (compila o código e executa o código compilado)\n$  yarn start:prod\n```\n\n## Testes\n\n```bash\n# unit tests -\u003e Para testes unitários (testes de unidade)\n$ yarn test\n\n# e2e tests -\u003e Para testes de integração (testes de integração) só em ambiente de desenvolvimento\n$ yarn test:e2e\n\n# test coverage -\u003e Para testes de cobertura (testes de cobertura) só em ambiente de desenvolvimento\n$ yarn test:cov\n```\n\nrest-api-nasa fornece 3 testes de automação `testes unitários`, `testes de integração` e `testes e2e`.\n\n```bash\n# Unit testing\n$ yarn test\n```\n\n#### Teste específico\n\nPara testes de unidade\n\n```bash\n# Unit testing\n$ yarn test:unit\n```\n\nPara testes de integração (testes de integração)\n\n```bash\n# Integration testing\n$ yarn test:integration\n```\n\nPara testes E2E \n\n```bash\n# E2E testing\n$ yarn test:e2e\n```\n\n[Jump to details](#environment)\n\n#### Migração de banco de dados\n\n- #### _Create migration_\n\nCrie uma nova migração executando\n\n```bash\n$ yarn migration:generate {name-of-migration}\n```\n\nA nova migração será criada em ```src/databases/migrations```.\n\n- #### _Run migration_\n\n```bash\n$ yarn migration:run\n```\n\n- #### _Revert migration_\n\n```bash\n$ yarn migration:revert\n```\n\n\u003e Se você deseja implementar `transaction`, você deve instalar o `Mongodb Replication Set`. Você precisa executar o `mongodb`. Existem tantas opções que você pode fazer por conta própria com a pesquisa no `google`.\n\nMigração de banco de dados rest-api-nasa usada [NestJs-Command](https://gitlab.com/aa900031/nestjs-command)\n\nPara migrar o banco de dados, você pode usar o comando `yarn migration:run` para iniciar o servidor. O servidor será iniciado na porta 3000. Você pode acessar o servidor em `http://localhost:3000`. O servidor será reiniciado automaticamente se você alterar qualquer um dos arquivos de origem.\n\n```bash\n# Migrate\n$ yarn migrate\n```\n\nFor rollback\n\n```bash\n# Rollback\n$ yarn rollback\n```\n\n## Iniciando o servidor\n\n```bash\n# development\n$ yarn start\n\n# watch mode\n$ yarn start:dev\n\n# production mode\n$ yarn start:prod\n```\n\n## Observação\n\n```bash\n# Para remover o container criado:\n$ yarn rm:db\n```\n\n---\n\n## Documentação\n\nAntes de começarmos, precisamos instalar alguns pacotes e ferramentas que usaremos para criar nossa aplicação.\nA versão recomendada é a versão LTS para cada ferramenta e pacote, pois é a versão mais estável e com mais suporte.\nCaso instale uma versão diferente, pode ocorrer erros e bugs, e não é recomendado.\n\n\u003e Certifique-se de que as ferramentas foram instaladas com sucesso.\n\n* [NodeJs](https://nodejs.org)\n* [Yarn](https://yarnpkg.com)\n* [Git](https://git-scm.com)\n* [Docker](https://www.docker.com)\n* [Docker Compose](https://docs.docker.com/compose/install/)\n* [Postman](https://www.postman.com)\n\nPara mais informações, acesse a [documentação](https://docs.nestjs.com/).\n\n---\n\n## Estrutura ┃\n\n```bash\n\n📦{your-app}\n ┣ 📂.assets\n ┣ 📂.github\n ┃ ┃ ┃ ┗ 📂workflows\n ┃ ┣ ┣ ┣ ┣ 📜ci.yml\n ┃ ┗ ┗ ┗ ┗ 📜release.yml\n ┣ 📂.husky\n ┃ ┣ 📜commit-msg\n ┃ ┗ 📜pre-commit\n ┣ 📂dist\n ┃ ┃ ┣ 📂src\n ┃ ┣ ┣ ┣ 📂app\n ┃ ┣ ┣ ┣ ┣ 📂controllers\n ┃ ┣ ┣ ┣ ┃ ┣ 📜app.controller.js\n ┃ ┣ ┣ ┣ ┃ ┗ 📜app.controller.spec.js\n ┃ ┣ ┣ ┣ ┣ 📂entities\n ┃ ┣ ┣ ┣ ┃ ┗ 📜app.entity.js\n ┃ ┣ ┣ ┣ ┣ 📂services\n ┃ ┣ ┣ ┣ ┃ ┣ 📜app.service.js\n ┃ ┣ ┣ ┣ ┃ ┗ 📜app.service.spec.js\n ┃ ┣ ┣ ┣ ┗ 📜app.module.js\n ┃ ┃ ┃ ┣ 📂databases\n ┃ ┣ ┣ ┣ ┣ 📂migrations\n ┃ ┣ ┣ ┣ ┃ ┗ 📜1589810000000-InitialMigration.js\n ┃ ┣ ┣ ┣ ┣ 📂seeders\n ┃ ┣ ┣ ┣ ┃ ┗ 📜1589810000000-InitialSeeder.js\n ┃ ┣ ┣ ┣ ┗ 📜database.module.js\n ┃ ┣ ┣ ┣ 📂main\n ┃ ┣ ┣ ┣ ┣ 📜main.js\n ┃ ┣ ┣ ┣ ┗ 📜main.spec.js\n ┃ ┣ ┣ ┣ 📂modules\n ┃ ┣ ┣ ┣ ┣ 📂nasa\n ┃ ┣ ┣ ┣ ┃ ┣ 📂controllers\n ┃ ┣ ┣ ┣ ┃ ┃ ┣ 📜nasa.controller.js\n ┃ ┣ ┣ ┣ ┃ ┃ ┗ 📜nasa.controller.spec.js\n ┃ ┣ ┣ ┣ ┃ ┣ 📂entities\n ┃ ┣ ┣ ┣ ┃ ┃ ┗ 📜nasa.entity.js\n ┃ ┣ ┣ ┣ ┃ ┣ 📂services\n ┃ ┣ ┣ ┣ ┃ ┃ ┣ 📜nasa.service.js\n ┃ ┣ ┣ ┣ ┃ ┃ ┗ 📜nasa.service.spec.js\n ┃ ┣ ┣ ┣ ┃ ┗ 📜nasa.module.js\n ┃ ┣ ┣ ┣ ┗ 📂users\n ┃ ┣ ┣ ┣ ┃ ┣ 📂controllers\n ┃ ┃ ┣ ┣ ┣ ┃ ┣ 📜users.controller.js\n ┃ ┃ ┣ ┣ ┣ ┃ ┗ 📜users.controller.spec.js\n ┃ ┃ ┣ ┣ ┣ ┣ 📂entities\n ┃ ┃ ┣ ┣ ┣ ┃ ┗ 📜users.entity.js\n ┃ ┃ ┣ ┣ ┣ ┣ 📂services\n ┃ ┃ ┣ ┣ ┣ ┃ ┣ 📜users.service.js\n ┃ ┃ ┣ ┣ ┣ ┃ ┗ 📜users.service.spec.js\n ┃ ┗ ┗ ┗ ┗ ┗ 📜users.module.js\n ┣ 📂docker\n ┃ ┃ ┃ ┃ ┃ ┣ 📂postgres\n ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜Dockerfile\n ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜init.sql\n ┃ ┃ ┃ ┃ ┃ ┣ 📜docker-compose.yml\n ┃ ┗ ┗ ┗ ┗ ┗ 📜docker-compose.yml.example\n ┣ 📂docs\n ┃ ┃ ┃ ┃ ┃ ┣ 📜apidoc.json\n ┃ ┃ ┃ ┃ ┃ ┣ 📜apidoc.yml\n ┃ ┃ ┃ ┃ ┃ ┣ 📜index.html\n ┃ ┗ ┗ ┗ ┗ ┗ 📜index.js\n ┣ 📂.vscode\n ┃ ┣ 📜launch.json\n ┃ ┗ 📜settings.json\n ┣ 📂prisma\n ┃ ┃ ┣ 📂migration\n ┃ ┃ ┃ ┣ 📂20200526190000_planets\n ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜README.md\n ┃ ┃ ┃ ┃ ┃ ┣ 📜prisma.module.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📜prisma.service.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜schema.prisma\n ┃ ┗ ┗ ┗ ┗ ┗ 📜seed.ts\n ┣ 📂src\n ┃ ┣ 📂database\n ┃ ┃ ┗ 📜database.module.ts\n ┃ ┣ 📂common\n ┃ ┃ ┣ 📂decorators\n ┃ ┃ ┃ ┗ 📜auth-user.decorator.ts\n ┃ ┣ 📂graphql\n ┃ ┃ ┣ 📂dto\n ┃ ┃ ┃ ┣ 📜create-user.input.ts\n ┃ ┃ ┃ ┣ 📜login.input.ts\n ┃ ┃ ┃ ┗ 📜update-user.input.ts\n ┃ ┃ ┃ ┣ 📂entities\n ┃ ┃ ┃ ┃ ┣ 📜user.entity.ts\n ┃ ┃ ┃ ┃ ┗ 📜user.model.ts\n ┃ ┃ ┃ ┣ 📂guards\n ┃ ┃ ┃ ┃ ┗ 📜auth.guard.ts\n ┃ ┃ ┃ ┣ 📂resolvers\n ┃ ┃ ┃ ┃ ┣ 📜auth.resolver.ts\n ┃ ┃ ┃ ┃ ┣ 📜user.resolver.ts\n ┃ ┃ ┃ ┃ ┗ 📜user.resolver.spec.ts\n ┃ ┃ ┃ ┃ ┣ 📂services\n ┃ ┃ ┃ ┃ ┃ ┣ 📜auth.service.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📜auth.service.spec.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📜user.service.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜user.service.spec.ts\n ┃ ┃ ┃ ┗ ┗ 📜graphql.module.ts\n ┃ ┃ ┣ 📂planets\n ┃ ┃ ┃ ┣ 📂dto\n ┃ ┃ ┃ ┃ ┣ 📜create-planet.input.ts\n ┃ ┃ ┃ ┃ ┣ 📜update-planet.input.ts\n ┃ ┃ ┃ ┃ ┗ 📜update-planet.input.spec.ts\n ┃ ┃ ┃ ┣ 📂entities\n ┃ ┃ ┃ ┃ ┣ 📜planet.entity.ts\n ┃ ┃ ┃ ┃ ┗ 📜planet.model.ts\n ┃ ┃ ┃ ┃ ┣ 📂resolvers\n ┃ ┃ ┃ ┃ ┃ ┣ 📜planet.resolver.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜planet.resolver.spec.ts\n ┃ ┃ ┃ ┃ ┣ 📂services\n ┃ ┃ ┃ ┃ ┃ ┣ 📜planet.service.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜planet.service.spec.ts\n ┃ ┃ ┃ ┃ ┗ ┗ 📜planets.module.ts\n ┃ ┃ ┃ ┣ 📂recharge\n ┃ ┃ ┃ ┃ ┣ 📂dto\n ┃ ┃ ┃ ┃ ┃ ┣ 📜create-recharge.input.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📜update-recharge.input.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜update-recharge.input.spec.ts\n ┃ ┃ ┃ ┃ ┣ 📂entities\n ┃ ┃ ┃ ┃ ┃ ┣ 📜recharge.entity.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜recharge.model.ts\n ┃ ┃ ┃ ┃ ┣ 📂resolvers\n ┃ ┃ ┃ ┃ ┃ ┣ 📜recharge.resolver.ts\n ┃ ┃ ┃ ┃ ┃ ┗ 📜recharge.resolver.spec.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📂services\n ┃ ┃ ┃ ┃ ┃ ┃ ┣ 📜recharge.service.ts\n ┃ ┃ ┃ ┃ ┃ ┃ ┗ 📜recharge.service.spec.ts\n ┃ ┃ ┃ ┃ ┃ ┗ ┗ 📜recharge.module.ts\n ┃ ┃ ┃ ┃ ┣ 📂station\n ┃ ┃ ┃ ┃ ┃ ┣ 📂dto\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ 📜create-station.input.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ 📜update-station.input.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┗ 📜update-station.input.spec.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ 📂entities\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜station.entity.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜station.model.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ 📂resolvers\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜station.resolver.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜station.resolver.spec.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ 📂services\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜station.service.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜station.service.spec.ts\n ┃ ┃ ┃ ┃ ┗ ┗ 📜station.module.ts\n ┃ ┃ ┃ ┃ ┃ ┣ 📂users\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📂dto\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜create-user.input.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜login.input.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜update-user.input.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📂entities\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜user.entity.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜user.model.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📂guards\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜auth.guard.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📂resolvers\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜auth.resolver.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜user.resolver.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜user.resolver.spec.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📂services\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜auth.service.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜auth.service.spec.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┣ 📜user.service.ts\n ┃ ┣ ┣ ┣ ┣ ┣ ┣ ┣ ┗ 📜user.service.spec.ts\n ┃ ┗ ┗ ┗ ┗ ┗ ┗ ┗ 📜graphql.module.ts\n ┣ 📜.dockerignore\n ┣ 📜.editorconfig\n ┣ 📜.env\n ┣ 📜.eslintignore\n ┣ 📜.eslintrc.js\n ┣ 📜.gitattributes\n ┣ 📜.gitconfig\n ┣ 📜.gitignore\n ┣ 📜.gitignore_global\n ┣ 📜.huskyrc\n ┣ 📜.nvmrc\n ┣ 📜.prettierignore\n ┣ 📜.prettierrc\n ┣ 📜.prettierrc.ts\n ┣ 📜.commitlint.config.js\n ┣ 📜Dockerfile\n ┣ 📜gulpfile.js\n ┣ 📜nest-cli.json\n ┣ 📜nodemon-debug.json\n ┣ 📜nodemon.json\n ┣ 📜ormconfig.json\n ┣ 📜package-lock.json\n ┣ 📜package.json\n ┣ 📜README.md\n ┣ 📜renovate.json\n ┣ 📜tsconfig.build.json\n ┣ 📜tsconfig.json\n ┣ 📜yarn.lock\n\n```\n\n---\n\n## Features\n\n- ✅ Authentication and Authorization (JWT, OAuth2, API Key, Basic Auth, Role Management) [NestJS Passport](https://docs.nestjs.com/techniques/authentication)\n- ✅ [NestJS 8](https://nestjs.com/)\n- ✅ Database Migration (NestJs-Command) [TypeORM](https://typeorm.io/#/)\n- ✅ Next generation build system with [Nx](https://nx.dev/)\n- ✅ Unit Testing with [Jest](https://jestjs.io/)\n- ✅ End-to-End Testing with [Cypress](https://www.cypress.io/)\n- ✅ Linter with EsLint for Typescript [EsLint](https://eslint.org/)\n- ✅ [ESLint](https://eslint.org/)\n- ✅ [Prettier](https://prettier.io/)\n- ✅ [Husky](https://typicode.github.io/husky/#/)\n- ✅ Support CI/CD with Github Action or Jenkins or CircleCI or TravisCI or GitlabCI or Bitbucket Pipelines [CI/CD](https://docs.nestjs.com/recipes/ci-cd)\n- ✅ Support Docker Installation [Docker](https://www.docker.com/)\n- ✅ [Prisma](https://www.prisma.io/)\n- ✅ [GraphQL](https://graphql.org/)\n- ✅ [Apollo GraphQL](https://www.apollographql.com/)\n- ✅ [Postgres](https://www.postgresql.org/)\n- ✅ [TypeScript](https://www.typescriptlang.org/)\n\n---\n\n## Features covered\n\n-   📱 **NestJS** — latest version\n-   🎉 **TypeScript** - Type checking\n-   ⚙️ **Dotenv** - Supports environment variables\n-   🗝 **Authentication** - JWT, RSA256, oauth\n-   🏪 **MikroORM** - Database ORM\n-   🏪 **PostgreSQL** - Open-Source Relational Database\n-   🧠 **Configuration** - Single config for all\n-   📃 **Swagger** - API Documentation\n-   🐳 **Docker Compose** - Container Orchestration\n-   😴 **Insomnia** - Insomnia config for endpoints\n-   📏 **ESLint** — Pluggable JavaScript linter\n-   💖 **Prettier** - Opinionated Code Formatter\n\n\u003cdetails\u003e\n\u003csummary\u003e💬 Para ver detalhadamente todas as propriedades da configuração do package.json, clique aqui..\u003c/summary\u003e\n\n\u003c!-- arquivo package.json --\u003e\n``` json\n\n{\n  \"name\": \"backend-graphql\",\n  \"version\": \"0.0.1\",\n  \"description\": \"\",\n  \"author\": \"\",\n  \"private\": true,\n  \"license\": \"UNLICENSED\",\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"https://github.com/estevam5s/api-nasa-nest\"\n  },\n  \"scripts\": {\n    \"prebuild\": \"rimraf dist\",\n    \"build\": \"nest build\",\n    \"format\": \"prettier --write \\\"src/**/*.ts\\\" \\\"test/**/*.ts\\\"\",\n    \"start\": \"nest start\",\n    \"start:dev\": \"nest start --watch\",\n    \"start:debug\": \"nest start --debug --watch\",\n    \"start:prod\": \"node dist/main\",\n    \"lint\": \"eslint \\\"{src,apps,libs,test}/**/*.ts\\\" --fix\",\n    \"test\": \"jest\",\n    \"test:watch\": \"jest --watch\",\n    \"test:cov\": \"jest --coverage\",\n    \"test:debug\": \"node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand\",\n    \"test:e2e\": \"jest --config ./test/jest-e2e.json\",\n    \"up:db\": \"docker-compose -f ./docker/docker-compose.yml --env-file .env  up -d\",\n    \"rm:db\": \"docker rm -f postgres\"\n  },\n  \"dependencies\": {\n    \"@nestjs/apollo\": \"^10.0.9\",\n    \"@nestjs/axios\": \"^0.1.0\",\n    \"@nestjs/common\": \"^8.0.0\",\n    \"@nestjs/core\": \"^8.0.0\",\n    \"@nestjs/graphql\": \"^10.0.10\",\n    \"@nestjs/platform-express\": \"^8.0.0\",\n    \"@types/axios\": \"^0.14.0\",\n    \"apollo-server-express\": \"^3.6.7\",\n    \"class-transformer\": \"^0.5.1\",\n    \"class-validator\": \"^0.13.2\",\n    \"graphql\": \"^16.4.0\",\n    \"husky\": \"8.0.1\",\n    \"reflect-metadata\": \"^0.1.13\",\n    \"rimraf\": \"^3.0.2\",\n    \"rxjs\": \"^7.2.0\"\n  },\n  \"devDependencies\": {\n    \"@nestjs/cli\": \"^8.0.0\",\n    \"@nestjs/schematics\": \"^8.0.0\",\n    \"@nestjs/testing\": \"^8.0.0\",\n    \"@prisma/client\": \"^3.13.0\",\n    \"@types/express\": \"^4.17.13\",\n    \"@types/jest\": \"27.4.1\",\n    \"@types/node\": \"^16.0.0\",\n    \"@types/supertest\": \"^2.0.11\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.0.0\",\n    \"@typescript-eslint/parser\": \"^5.0.0\",\n    \"eslint\": \"^8.0.1\",\n    \"eslint-config-prettier\": \"^8.3.0\",\n    \"eslint-plugin-prettier\": \"^4.0.0\",\n    \"gulp\": \"^4.0.2\",\n    \"gulp-typescript\": \"^6.0.0-alpha.1\",\n    \"jest\": \"^27.2.5\",\n    \"prettier\": \"^2.3.2\",\n    \"prisma\": \"^3.13.0\",\n    \"source-map-support\": \"^0.5.20\",\n    \"supertest\": \"^6.1.3\",\n    \"ts-jest\": \"^27.0.3\",\n    \"ts-loader\": \"^9.2.3\",\n    \"ts-node\": \"^10.0.0\",\n    \"tsconfig-paths\": \"^3.10.1\",\n    \"typescript\": \"^4.3.5\"\n  },\n  \"husky\": {\n    \"hooks\": {\n      \"pre-commit\": \"prettier --write . \u0026\u0026 git add -A .\",\n      \"pre-push\": \"npm run lint\",\n      \"post-merge\": \"$_SCRIPT\",\n      \"post-checkout\": \"$_SCRIPT\",\n      \"post-rewrite\": \"$_SCRIPT\",\n      \"post-commit\": \"$_SCRIPT\"\n    }\n  },\n  \"lint-staged\": {\n    \"*\": \"prettier --write\",\n    \"src/**/*.{js,jsx,json,css}\": [\n      \"prettier --single-quote --write\",\n      \"git add\"\n    ]\n  },\n  \"jest\": {\n    \"moduleFileExtensions\": [\n      \"js\",\n      \"json\",\n      \"ts\"\n    ],\n    \"rootDir\": \"src\",\n    \"testRegex\": \".*\\\\.spec\\\\.ts$\",\n    \"transform\": {\n      \"^.+\\\\.(t|j)s$\": \"ts-jest\"\n    },\n    \"resolutions\": {\n      \"normalize-url\": \"6.0.1\",\n      \"glob-parent\": \"6.0.0\"\n    },\n    \"bugs\": {\n      \"url\": \"https://github.com/estevam5s/api-nasa-nest\"\n    },\n    \"keywords\": [\n      \"github\",\n      \"profile\",\n      \"readme\"\n    ],\n    \"testTimeout\": 30000,\n    \"moduleNameMapper\": {\n      \"^@entities\": \"\u003crootDir\u003e/entities/index\",\n      \"^@common/(.*)$\": \"\u003crootDir\u003e/common/$1\",\n      \"^@modules/(.*)$\": \"\u003crootDir\u003e/modules/$1\",\n      \"^@lib/(.*)$\": \"\u003crootDir\u003e/lib/$1\"\n    },\n    \"lint-staged\": {\n      \"*.{ts,tsx}\": [\n        \"eslint --cache --fix\",\n        \"prettier --write\"\n      ],\n      \"*.{json,md,scss,yaml,yml}\": [\n        \"prettier --write\"\n      ]\n    },\n    \"collectCoverageFrom\": [\n      \"**/*.(t|j)s\"\n    ],\n    \"coverageDirectory\": \"../coverage\",\n    \"testEnvironment\": \"node\"\n  }\n}\n\n```\n\n\u003c/details\u003e\n\n---\n\n## Rotas\n\n```\n\nMapped {/graphql, POST} route +1ms\n\n```\n\nDiferentemente das APIs Rest onde existem os métodos get, post, delete, update e path, em uma API do tipo GraphQL existe somente uma rota com o método post com \u003cstrong\u003equerys\u003c/strong\u003e e \u003cstrong\u003emutations\u003c/strong\u003e.\n\n```graphql\n\n# ------------------------------------------------------\n# THIS FILE WAS AUTOMATICALLY GENERATED (DO NOT MODIFY)\n# ------------------------------------------------------\n\ntype Planet {\n  pl_name: String!\n  pl_bmassj: Float!\n}\n\ntype Recharge {\n  stationID: Float!\n  usuario: String!\n  inicio_recarga: DateTime!\n  fin_recarga: DateTime!\n}\n\n\"\"\"\nA date-time string at UTC, such as 2019-12-03T09:54:33Z, compliant with the date-time format.\n\"\"\"\nscalar DateTime\n\ntype Station {\n  id: ID!\n  planetName: String!\n}\n\ntype User {\n  id: ID!\n  email: String!\n  name: String!\n}\n\ntype Query {\n  users: [User!]!\n  user(id: Int!): User!\n  suitablePlanets: [Planet!]!\n  stations: [Station!]!\n}\n\ntype Mutation {\n  createUser(createUserInput: CreateUserInput!): User!\n  updateUser(updateUserInput: UpdateUserInput!): User!\n  removeUser(id: Int!): User!\n  installStation(planetName: String!): Station!\n  recharge(data: CreateRechargeInput!): Recharge!\n}\n\ninput CreateUserInput {\n  name: String!\n  email: String!\n}\n\ninput UpdateUserInput {\n  id: Int!\n  email: String\n  name: String\n}\n\ninput CreateRechargeInput {\n  stationID: Float!\n  fin_recarga: DateTime!\n  usuario: String!\n}\n\n```\n\npara realizar as querys e mutations abra o Insomnia:\n\n\u003cdetails\u003e\n\n\u003csummary\u003eInsomnia\u003c/summary\u003e\n\n```json\n\n{\n\n    \"__schema\": {\n\n        \"queryType\": {\n\n            \"name\": \"Query\"\n\n        },\n        \"mutationType\": {\n\n            \"name\": \"Mutation\"\n\n        },\n\n        \"subscriptionType\": null,\n\n        \"types\": [\n\n        {\n\n            \"kind\": \"OBJECT\",\n\n            \"name\": \"Planet\",\n\n            \"fields\": [\n\n            {\n\n            \"name\": \"pl_name\",\n\n            \"args\": [],\n\n            \"type\": {\n\n            \"kind\": \"NON_NULL\",\n\n            \"name\": null,\n\n            \"ofType\": {\n\n                \"kind\": \"SCALAR\",\n\n                \"name\": \"String\",\n\n                \"ofType\": null\n\n            }\n\n        },\n\n        \"isDeprecated\": false,\n\n        \"deprecationReason\": null\n\n    },\n\n    {\n\n        \"name\": \"pl_bmassj\",\n\n        \"args\": [],\n\n        \"type\": {\n\n            \"kind\": \"NON_NULL\",\n\n            \"name\": null,\n\n            \"ofType\": {\n\n                \"kind\": \"SCALAR\",\n\n                \"name\": \"Float\",\n\n                \"ofType\": null\n\n            }\n\n        },\n\n        \"isDeprecated\": false,\n\n        \"deprecationReason\": null\n\n        }\n\n    ],\n\n    \"inputFields\": null,\n\n    \"interfaces\": [],\n\n    \"enumValues\": null,\n\n    \"possibleTypes\": null\n\n},\n\n```\n\n\u003c/details\u003e\n\nOu, para realizar as querys e mutations abra o navegador em http://localhost:3000/graphql:\n\n\u003cimg src=\".assets/playground.png\" alt=\"Playground GraphQL Apollo\"/\u003e\n\n---\n\n## createUser\n\n```graphql\n\nmutation {\n  createUser(\n    createUserInput: { name: \"tpaphysics\", email: \"tpaphysics@t.com\" }\n  ) {\n    id\n    name\n    email\n  }\n}\n\n```\n\n## findAll\n\n```graphql\n\nquery {\n  users {\n    id\n    email\n    name\n  }\n}\n\n```\n\n## findOne\n\n```graphql  \n\nquery {\n  user(id: 12) {\n    id\n    email\n    name\n  }\n}\n\n```\n\n## updateUser  \n\n```graphql\n\nmutation {\n  updateUser(updateUserInput: { id: 1, name: \"tpaphysics\" }) {\n    id\n    name\n    email\n  }\n}\n\n```\n\n## removeUser\n\n```graphql\n\nmutation {\n  removeUser(id: 2) {\n    id\n    name\n    email\n  }\n}\n\n```\n\n---\n\n## Tutorial\n[Nest.js | Middleware, Pipes \u0026 Interceptors Explained By Example](https://www.youtube.com/watch?v=x1W3FJ1RJlM) \n\n- Middleware ✅\n- Guards ✅\n- Interceptors ✅\n- Pipes ✅\n- Exception Filters ✅\n- Custom Decorators ✅\n- Custom Providers ✅\n- Custom Modules ✅\n- Custom CLI ✅\n- Custom NestFactory ✅\n\n\u003c!-- importar a imagem da pasta .assets --\u003e\n\n\u003cimg src=\".assets/output1.png\" alt=\"NestJS\"\u003e\n\n- Pipes ✅\n\n\u003cimg src=\".assets/pipe.png\" alt=\"NestJS\"\u003e\n\n- Filters ✅\n\n\u003cimg src=\".assets/filter.png\" alt=\"NestJS\"\u003e\n\n\u003c!-- BADGE LINKS --\u003e\n[ack-contributors-shield]: https://img.shields.io/github/contributors/estevam5s/rest-api-nasa?style=for-the-badge\n[ack-forks-shield]: https://img.shields.io/github/forks/estevam5s/rest-api-nasa?style=for-the-badge\n[ack-stars-shield]: https://img.shields.io/github/stars/estevam5s/rest-api-nasa?style=for-the-badge\n[ack-issues-shield]: https://img.shields.io/github/issues/estevam5s/rest-api-nasa?style=for-the-badge\n[ack-license-shield]: https://img.shields.io/github/license/estevam5s/rest-api-nasa?style=for-the-badge\n[nestjs-shield]: https://img.shields.io/badge/nestjs-%23E0234E.svg?style=for-the-badge\u0026logo=nestjs\u0026logoColor=white\n[nodejs-shield]: https://img.shields.io/badge/Node.js-339933?style=for-the-badge\u0026logo=nodedotjs\u0026logoColor=white\n[typescript-shield]: https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\n[mongodb-shield]: https://img.shields.io/badge/MongoDB-white?style=for-the-badge\u0026logo=mongodb\u0026logoColor=4EA94B\n[jwt-shield]: https://img.shields.io/badge/JWT-000000?style=for-the-badge\u0026logo=JSON%20web%20tokens\u0026logoColor=white\n[jest-shield]: https://img.shields.io/badge/-jest-%23C21325?style=for-the-badge\u0026logo=jest\u0026logoColor=white\n[yarn-shield]: https://img.shields.io/badge/yarn-%232C8EBB.svg?style=for-the-badge\u0026logo=yarn\u0026logoColor=white\n[docker-shield]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[github-shield]: https://img.shields.io/badge/GitHub-100000?style=for-the-badge\u0026logo=github\u0026logoColor=white\n[linkedin-shield]: https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white\n[instagram-shield]: https://img.shields.io/badge/Instagram-E4405F?style=for-the-badge\u0026logo=instagram\u0026logoColor=white\n\n\u003c!-- CONTACTS --\u003e\n[author-linkedin]: https://linkedin.com/in/estevam5s\n[author-instagram]: https://www.instagram.com/___ac.k\n[author-email]: mailto:ack@baibay.id\n[author-github]: https://github.com/estevam5s\n\n\u003c!-- Repo LINKS --\u003e\n[ack-repo]: https://github.com/estevam5s/rest-api-nasa\n[ack-e2e]: /e2e\n[ack-issues]: https://github.com/estevam5s/rest-api-nasa/issues\n[ack-stars]: https://github.com/estevam5s/rest-api-nasa/stargazers\n[ack-forks]: https://github.com/estevam5s/rest-api-nasa/network/members\n[ack-contributors]: https://github.com/estevam5s/rest-api-nasa/graphs/contributors\n[ack-history]: https://github.com/estevam5s/rest-api-nasa/commits/main\n\n\u003c!-- ack microservice --\u003e\n[ack-microservice-repo]: https://github.com/estevam5s/ack-microservice-mongoose\n\n\u003c!-- license --\u003e\n[license]: LICENSE.md\n\n\u003c!-- Documents --\u003e\n[ack-docs]: https://estevam5s.github.io/ack-nestjs-boilerplate-docs/\n\n\u003c!-- Reference --\u003e\n[ref-nestjs]: http://nestjs.com\n[ref-mongoose]: https://mongoosejs.com/\n[ref-mongodb]: https://docs.mongodb.com/\n[ref-nodejs-best-practice]: https://github.com/goldbergyoni/nodebestpractices\n[ref-nodejs]: https://nodejs.org/\n[ref-typescript]: https://www.typescriptlang.org/\n[ref-jwt]: https://jwt.io\n[ref-jest]: https://jestjs.io/docs/getting-started\n[ref-docker]: https://docs.docker.com\n[ref-yarn]: https://yarnpkg.com\n[ref-postman-import-export]: https://learning.postman.com/docs/getting-started/importing-and-exporting-data/\n\n---\n\n# Authentication\n\nEsses aplicativos usam JSON Web Token (JWT) para lidar com a autenticação. O token é passado com cada solicitação usando o cabeçalho `Authorization` com esquema `Token`. O middleware de autenticação JWT trata da validação e autenticação do token.\n\n---\n\n# Deployment\n\nVocê precisa ter o docker e o docker-compose instalados. Além disso, como estamos usando makefiles para implantação, você precisa ter o make instalado.\n\n```sh\n\n  env=dev make deploy    # deploys dev environment\n  env=prod make deploy   # deploys prod environment\n\n```\n\nA senha para `redis` e `rabbitmq` é `test@1234` pode ser alterada no arquivo make no script `deploy`\n\n[![Deploy](https://www.herokucdn.com/deploy/button.png)](https://heroku.com/deploy)\n\n---\n\n## License\n\nMIT License\n\nDireitos autorais (c) 2022\n\nÉ concedida permissão, gratuitamente, a qualquer pessoa que obtenha uma cópia\ndeste software e arquivos de documentação associados (o \"Software\"), para lidar\nno Software sem restrição, incluindo, sem limitação, os direitos\nusar, copiar, modificar, mesclar, publicar, distribuir, sublicenciar e/ou vender\ncópias do Software, e para permitir que as pessoas a quem o Software é\nequipado para tal, nas seguintes condições:\n\nO aviso de direitos autorais acima e este aviso de permissão devem ser incluídos em todos os\ncópias ou partes substanciais do Software.\n\nO SOFTWARE É FORNECIDO \"COMO ESTÁ\", SEM GARANTIA DE QUALQUER TIPO, EXPRESSA OU\nIMPLÍCITA, INCLUINDO, MAS NÃO SE LIMITANDO ÀS GARANTIAS DE COMERCIALIZAÇÃO,\nADEQUAÇÃO A UM DETERMINADO FIM E NÃO VIOLAÇÃO. EM NENHUM CASO A\nAUTORES OU DETENTORES DE DIREITOS AUTORAIS SERÃO RESPONSÁVEIS POR QUALQUER REIVINDICAÇÃO, DANOS OU OUTROS\nRESPONSABILIDADE, SEJA EM UMA AÇÃO DE CONTRATO, ATO ILÍCITO OU DE OUTRA FORMA, DECORRENTE DE,\nFORA OU EM CONEXÃO COM O SOFTWARE OU O USO OU OUTRAS NEGOCIAÇÕES NO\nPROGRAMAS.\n\n---\n\n## BuyMeACoffee\n\n\u003ca href=\"https://www.buymeacoffee.com/estevamsl\" target=\"_blank\"\u003e\u003cimg src=\"https://cdn.buymeacoffee.com/buttons/v2/default-red.png\" alt=\"Buy Me A Coffee\" width=\"150\" \u003e\u003c/a\u003e\n\n---\n\n## Importante\n\n\u003e rest-api-nasa ainda em fase de tentativa e erro e o teste será baseado em projetos ou casos reais. Portanto, haverá (sempre) novas atualizações e novos recursos.\n\nSe você alterar o valor do env de `APP_MODE` para `secure`, isso acionará mais `Middleware` e `Guard`.\n\n1. `TimestampMiddleware`, tolerante a 5 minutos de solicitação.\n2. `UserAgentMiddleware`, whitelist do agente do usuário.\n3. `ApiKeyGuard`, verifique a chave api com base no banco de dados.\n4. `CorsMiddleware`, verifique os cors com base nas configurações.\n\nVocê pode ver nosso `arquivo de teste e2e` ou ler a documentação em [seção ambiente][ack-doc-env].\n\n---\n\n## Objetivo\n\nrest-api-nasa tem algum objetivo.\n\n- Simples, escalável e seguro\n- Evite o código de espaguete\n- Baseado em componentes\n- Componente reutilizável\n- Fácil manutenção\n- Suporte para todos os padrões de microsserviço\n\n---\n\n## Todo\n\nPróximo desenvolvimento\n\n- [x] Importar dados do formulário excel\n- [x] Versão 2. Nova estrutura de pastas, novo decorador de upload de arquivos\n- [x] Reduza o uso de mixin\n- [x] Carregar atualização múltipla do arquivo\n- [x] Arquivo grande upload para s3 para vídeo e áudio. usando array de pedaço\n- [x] Renomeie o repositório de `ack-nestjs-boilerplate-mongoose` para `rest-api-nasa`\n- [x] Mensagem en,id\n- [x] Otimize o código, remova o código desnecessário\n- [x] Atualizar teste de unidade\n- [x] Atualizar teste E2E\n- [x] Resposta Excel, converte a resposta do controlador em excel `res.send()`\n- [ ] Token básico como ApiKey\n- [ ] Atualizar Documentação\n---\n\n## Database\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://mikro-orm.io/\" target=\"blank\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/mikro-orm/mikro-orm/master/docs/static/img/logo-readme.svg?sanitize=true\" width=\"320\" alt=\"Mikro Orm\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\nA base de código de exemplo usa [MikroORM](https://mikro-orm.io/) com um banco de dados Postgres.\n\nCopie o arquivo env de amostra e ajuste as configurações de conexão e outras configurações (jwt, redis, mail, etc) respectivamente no arquivo env de amostra\n\n`Nota`: Os arquivos Env são mantidos na pasta env. A validação de configuração permite 4 ambientes ['dev', 'prod', 'test','stage']. O nome do arquivo env\ndeve ter o formato .env.[ambiente] Ex. (.env.dev). O env a ser usado deve ser fornecido durante a execução de qualquer script como NODE_ENV=dev npm run dev\n\nInicie o servidor Postgres local e execute `NODE_ENV=dev make migrate` para aplicar as migrações\n\nAgora você pode iniciar o aplicativo com `NODE_ENV=dev npm run start`.\n\nNota: Se você estiver usando o Windows, `SET NODE_ENV=dev npm run start`\n\nO env de amostra é gerado usando [sample-env](https://www.github.com/rubiin/sample-env)\n\n---\n\n## **👨‍🚀 Autor**\n\n\u003c!-- colocar uma imagem do autor --\u003e\n\n👋 Meus contatos!\n\n[![Github][github-shield]][author-github]\n[![Linkedin Badge](https://img.shields.io/badge/-LinkedIn-blue?style=for-the-badge\u0026logo=Linkedin\u0026logoColor=white\u0026link=https://www.linkedin.com/in/estevam-souza)](https://www.linkedin.com/in/estevam-souza)\n[![Gmail Badge](https://img.shields.io/badge/-Gmail-c14438?style=for-the-badge\u0026logo=Gmail\u0026logoColor=white\u0026link=mailto:physics.posgrad.@gmail.com)](mailto:estevamsouzalaureth@gmail.com)\n\n\u003c!-- CONTACTS --\u003e\n[author-linkedin]: https://linkedin.com/in/estevam5s\n[author-email]: mailto:ack@baibay.id\n[author-github]: https://github.com/estevam5s\n\nFeito com ❤️ por [Estevam Souza](https://github.com/estevam5s)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festevam5s%2Fnasa","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Festevam5s%2Fnasa","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Festevam5s%2Fnasa/lists"}