{"id":21894360,"url":"https://github.com/ludson96/project-trybesmith","last_synced_at":"2026-04-02T04:48:05.585Z","repository":{"id":103821081,"uuid":"580958347","full_name":"ludson96/project-trybesmith","owner":"ludson96","description":"Projeto para estudo de API RestFul com Node.js com TypeScript, com CRUD MySQL, e JWT para autenticação","archived":false,"fork":false,"pushed_at":"2024-04-10T13:15:27.000Z","size":858,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-03T04:31:55.848Z","etag":null,"topics":["api","crud","docker","docker-compose","eslint","express","expressjs","jwt","jwt-authentication","jwt-token","mysql","node","nodejs","orm","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/ludson96.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"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}},"created_at":"2022-12-21T22:24:17.000Z","updated_at":"2022-12-27T21:33:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"4e56e50d-6a96-410b-8704-a06ecf224928","html_url":"https://github.com/ludson96/project-trybesmith","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-trybesmith","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-trybesmith/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-trybesmith/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ludson96%2Fproject-trybesmith/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ludson96","download_url":"https://codeload.github.com/ludson96/project-trybesmith/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244902928,"owners_count":20529115,"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":["api","crud","docker","docker-compose","eslint","express","expressjs","jwt","jwt-authentication","jwt-token","mysql","node","nodejs","orm","typescript"],"created_at":"2024-11-28T13:22:10.963Z","updated_at":"2025-12-30T20:48:38.456Z","avatar_url":"https://github.com/ludson96.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Repositório do projeto TrybeSmith 👨‍🏭\n## Módulo: BACK-END\n        \n  Repositório possui projeto desenvolvido no período que estive na \u003cb\u003eTrybe\u003c/b\u003e, abordando os conceitos de \u003cb\u003eRESTFul API\u003c/b\u003e com CRUD completo utilizando arquitetura Model-Service-Controller (MSC) com TypeScript. \n  \n## Informações de aprendizados\n- Este é um projeto desenvolvido para me ajudar a aprender `TypeScript`;\n- Meu primeiro projeto usando `TypeScript`;\n- Utilizei o Cliente Rest `Thunder Client`, como extensão, para visualizar o retorno do meu acesso.\n\n## Linguagem usadas\n[![JavaScript][JavaScript-logo]][JavaScript-url]\n[![NodeJS][NodeJS-logo]][NodeJS-url]\n[![Express][Express-logo]][Express-url]\n[![MySQL][MySQL-logo]][MySQL-url]\n[![Docker][Docker-logo]][Docker-url]\n[![Nodemon][Nodemon-logo]][Nodemon-url]\n[![JWT][JWT-logo]][JWT-url]\n[![ESLint][ESLint-logo]][ESLint-url]\n[![TypeScript][TypeScript-logo]][TypeScript-url]\n[![ts-node][ts-node-logo]][ts-node-url]\n[![.ENV][.ENV-logo]][.ENV-url]\n## O que foi desenvolvido\n\u003cp\u003e \n Uma API e um banco de dados, utilizando a arquitetura MSC (model-service-controller), de uma loja de itens medievais, no formato de uma API, utilizando Typescript! \u003cbr\u003e\n \n 1. Desenvolvi endpoints que estarão conectados ao banco de dados seguindo os princípios do REST;\u003cbr\u003e\n 2. Para fazer um post é necessário usuário e login, portanto foi trabalhada a relação entre user e post; \u003cbr\u003e\n 3. Será necessária a utilização de categorias para os posts, trabalhando, assim, a relação de posts para categories e de categories para posts. \u003cbr\u003e\n\u003c/p\u003e\n\n\u003e Arquivo `docker-compose.yml` fornecidos pela Trybe.\n\n## Variáveis de Ambiente\n\nPara rodar esse projeto, atente-se as variáveis de ambiente no seu .env. Existe um arquivo `.env.example` com as informações de configurações.\n## Instruções para instalar e rodar\n\n1. Clone o repo:\n```\n  git clone git@github.com:Ludson96/project-trybesmith.git\n```\n2. Já existe um arquivo docker-compose.yml (Disponibilizado pela Trybe). Bastando usar o comando docker-compose up para rodar o MySQL e o Node pelo docker. Execute os services do docker: `trybesmith (node)` e `trybesmith_db (banco de dados)` \n```\n  docker-compose up -d\n```\n3. Inicie o container node (renomeado para trybesmith):\n```\n  docker exec -it trybesmith bash\n```\n4. Instale as suas dependências:\n```\n  npm install\n```\n5. Execute o servidor (ts-node):\n\n```\n  npm start\n```\nOutra forma de executar é utilizando o `nodemom` (permite fazer alteração em tempo real sem precisar derrubar o servidor e iniciá-lo novamente):\n```\n  npm run dev\n```\n6. Utilizar alguma Plataforma de API para acessar os endpoints e fazer seus devidos experimentos. Exemplos: Postman e Insomnia. Ou uma extensão no VSCode, recomendo utilizar a thunder client.\n\n7. Existe um arquivo chamado Trybesmith.sql. Você pode utilizar ele para criar o banco de dados e suas tabelas. Recomendo que uma ferramenta de design de banco de dados visual, como o [MySQL Workbench](https://dev.mysql.com/downloads/workbench/)\n## Diagrama\n\n![Diagrama de relacionamentos das tabelas](diagrama.png)\n\n\u003e _Imagem disponibilizada pela Trybe_\n## Endpoints\n\n\u003cdetails\u003e\n\n###  Rota de Produto\n\n####  POST `/products`\n- Os produtos enviados são salvos na tabela `products` do banco de dados;\n- O corpo deve ter a seguinte estrutura: \n  - `name` e `amount` é obrigatório;\n  - `name` e `amount` precisa ser uma string;\n  - `name` e `amount` precisa ter mais de 2 caracteres.\n- O endpoint deve receber a seguinte estrutura:\n```json\n  {\n    \"name\": \"Espada longa\",\n    \"amount\": \"30 peças de ouro\"\n  }\n```\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n- O resultado retornado para cadastrar o produto com sucesso deverá ser conforme exibido abaixo, com um _status http_ `201`:\n```json\n  {\n    \"id\": 6,\n    \"name\": \"Espada longa\",\n    \"amount\": \"30 peças de ouro\",\n  }\n```\n\n---\n\n####  GET `/products`\n-  Lista todos os produtos no banco de dados\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n- O resultado retornado para listar produtos com sucesso deverá ser conforme exibido abaixo, com um _status http_ `200`:\n```json\n[\n  {\n    \"id\": 1,\n    \"name\": \"Poção de cura\",\n    \"amount\": \"20 gold\",\n    \"orderId\": null\n  },\n  {\n    \"id\": 2,\n    \"name\": \"Escudo do Herói\",\n    \"amount\": \"100 diamond\",\n    \"orderId\": 1\n  }\n]\n```\n\n---\n\n###  Rota de Usuário\n\n####  POST `/users`\n- Cadastra um novo usuários;\n- As informações de pessoas usuárias cadastradas são salvas na tabela `users` do banco de dados;\n- O corpo deve ter a seguinte estrutura: \n  - `username`, `vocation`, `level`, `password` é obrigatório;\n  - `username`, `vocation`, `password` precisa ser uma string;\n  - `level` precisa ser um number;\n  - `username`, `vocation` precisa ter mais de 2 caracteres;\n  - `level` precisa ser um número maior que 0;\n  - `password` precisa ter 8 ou meias caracteres.\n- O endpoint deve receber a seguinte estrutura:\n```json\n{ \n  \"username\": \"MAX\",\n  \"vocation\": \"swordsman\",\n  \"level\": 10,\n  \"password\": \"SavingPeople\"\n}\n```\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n  - Se a pessoa usuária for cadastrada com sucesso, o resultado deverá ser conforme o exibido abaixo, com um _status http_ `201` e retornando um _token_:\n  ```json\n  {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n  }\n  ```\n\n---\n\n###  Rota de Pedidos\n\n####  GET `/orders`\n- Lista todos os pedidos e os `id`s dos produtos associados a estes.\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n  - Quando houver mais de um pedido, o resultado retornado para listar pedidos com sucesso deverá ser conforme exibido abaixo, com um _status http_ `200`:\n  ```json\n    [\n      {\n        \"id\": 1,\n        \"userId\": 2,\n        \"productsIds\": [1, 2]\n      },\n      {\n        \"id\": 2,\n        \"userId\": 1,\n        \"productsIds\": [3, 4]\n      }\n    ]\n  ```\n\n---\n\n### POST `/orders`\n- Cadastra um pedido\n- Requer autenticação por token `JWT`\n- O endpoint deve receber a seguinte estrutura:\n```json\n  {\n    \"productsIds\": [1, 2]\n  }\n```\n\n\u003e 👉 Para token\n- Se o token não for informado, o resultado retornado deverá ser um _status http_ `401` e\n```json\n  { \"message\": \"Token not found\" }\n```\n\n- Se o token informado não for válido, o resultado retornado deverá ser um _status http_ `401` e\n```json\n  { \"message\": \"Invalid token\" }\n```\n\n\u003cbr\u003e\n\n\u003e 👉 Para products\n  - Se o corpo da requisição não possuir o campo \"productsIds\", o resultado retornado deverá ser um _status http_ `400` e\n  ```json\n    { \"message\": \"\\\"productsIds\\\" is required\" }\n  ```\n\n  - Se o valor do campo \"productsIds\" não for um array, o resultado retornado deverá ser um _status http_ `422` e\n  ```json\n    { \"message\": \"\\\"productsIds\\\" must be an array\" }\n  ```\n\n  - Se o campo \"productsIds\" possuir um array vazio, o resultado retornado deverá ser um _status http_ `422` e\n  ```json\n    { \"message\": \"\\\"productsIds\\\" must include only numbers\" }\n  ```\n\n\u003cbr\u003e\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n  - O resultado retornado para cadastrar um pedido com sucesso deverá ser conforme exibido abaixo, com um _status http_ `201`:\n  ```json\n    {\n      \"userId\": 1,\n      \"productsIds\": [1],\n    }\n  ```\n\n  - O resultado retornado para cadastrar um pedido de vários itens com sucesso deverá ser conforme exibido abaixo, com um _status http_ `201`:\n  ```json\n    {\n      \"userId\": 1,\n      \"productsIds\": [1, 2]\n    }\n  ```\n\n---\n\n###  Rota de Login\n\n####  POST `/login`\n- Realiza o login.\n\n- O endpoint deve receber a seguinte estrutura:\n```json\n  {\n    \"username\": \"string\",\n    \"password\": \"string\"\n  }\n```\n\n\u003e 👉 Para caso haja problemas no login\n  - Se o _login_ não tiver o campo \"username\", o resultado retornado deverá ser um _status http_ `400` e\n  ```json\n    { \"message\": \"\\\"username\\\" is required\" }\n  ```\n\n  - Se o _login_ não tiver o campo \"password\", o resultado retornado deverá ser um _status http_ `400`\n  ```json\n    { \"message\": \"\\\"password\\\" is required\" }\n  ```\n\n  - Se o _login_ tiver o username inválido, o resultado retornado deverá ser um _status http_ `401` e\n  ```json\n    { \"message\": \"Username or password invalid\" }\n  ```\n\n  - Se o login tiver a senha inválida, o resultado retornado deverá ser um _status http_ `401` e\n  ```json\n    { \"message\": \"Username or password invalid\" }\n  ```\n\n\u003cbr\u003e\n\n\u003e 👉 Para caso os dados sejam enviados corretamente\n  - Se o login foi feito com sucesso, o resultado deverá ser um _status http_ `200` e deverá retornar um _token_:\n  ```json\n  {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c\"\n  }\n  ```\n\n\u003c/details\u003e\n\n[JavaScript-logo]: https://img.shields.io/badge/javascript-%23323330.svg?style=for-the-badge\u0026logo=javascript\u0026logoColor=%23F7DF1E\n[JavaScript-url]: https://www.javascript.com/\n[Express-logo]: https://img.shields.io/badge/express.js-%23404d59.svg?style=for-the-badge\u0026logo=express\u0026logoColor=%2361DAFB\n[Express-url]: https://expressjs.com\n[NodeJS-logo]: https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white\n[NodeJS-url]: https://nodejs.org/en/\n[MySQL-logo]: https://img.shields.io/badge/mysql-%2300f.svg?style=for-the-badge\u0026logo=mysql\u0026logoColor=white\n[MySQL-url]: https://www.mysql.com\n[Docker-logo]: https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white\n[Docker-url]: https://www.docker.com\n[Nodemon-logo]: https://img.shields.io/badge/Nodemon-76D04B?logo=nodemon\u0026logoColor=fff\u0026style=for-the-badge\n[Nodemon-url]: https://www.npmjs.com/package/nodemon\n[JWT-logo]: https://img.shields.io/badge/JWT-black?style=for-the-badge\u0026logo=JSON%20web%20tokens\n[JWT-url]: https://jwt.io/\n[ESLint-logo]: https://img.shields.io/badge/ESLint-4B3263?style=for-the-badge\u0026logo=eslint\u0026logoColor=white\n[ESLint-url]: https://eslint.org/\n[TypeScript-logo]: https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\n[TypeScript-url]: https://www.typescriptlang.org/\n[ts-node-logo]: https://img.shields.io/badge/ts--node-3178C6?logo=tsnode\u0026logoColor=fff\u0026style=for-the-badge\n[ts-node-url]: https://www.npmjs.com/package/ts-node-dev\n[.ENV-logo]: https://img.shields.io/badge/.ENV-ECD53F?logo=dotenv\u0026logoColor=000\u0026style=for-the-badge\n[.ENV-url]: https://www.npmjs.com/package/dotenv\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fludson96%2Fproject-trybesmith","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fludson96%2Fproject-trybesmith","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fludson96%2Fproject-trybesmith/lists"}