{"id":27919505,"url":"https://github.com/jscodedevlopment/teknix-backend","last_synced_at":"2026-04-25T12:35:53.336Z","repository":{"id":248595773,"uuid":"827482711","full_name":"JsCodeDevlopment/teknix-backend","owner":"JsCodeDevlopment","description":"Backend realizado para um teste técnico com o intuito de possuir autenticação e CRUD de produtos.","archived":false,"fork":false,"pushed_at":"2024-07-25T15:51:50.000Z","size":2006,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-06T19:49:59.836Z","etag":null,"topics":["express","jwt","pinned","sequelize","swagger","typescript"],"latest_commit_sha":null,"homepage":"https://teknix-backend.vercel.app","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/JsCodeDevlopment.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,"zenodo":null}},"created_at":"2024-07-11T18:25:19.000Z","updated_at":"2025-02-24T23:25:46.000Z","dependencies_parsed_at":"2024-07-16T01:31:38.150Z","dependency_job_id":"d4a740ad-04f1-42d0-9a8f-8459f3cdb27a","html_url":"https://github.com/JsCodeDevlopment/teknix-backend","commit_stats":null,"previous_names":["jscodedevlopment/teknix-backend"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/JsCodeDevlopment/teknix-backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2Fteknix-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2Fteknix-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2Fteknix-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2Fteknix-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/JsCodeDevlopment","download_url":"https://codeload.github.com/JsCodeDevlopment/teknix-backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/JsCodeDevlopment%2Fteknix-backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32262801,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-25T09:15:33.318Z","status":"ssl_error","status_checked_at":"2026-04-25T09:15:31.997Z","response_time":59,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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":["express","jwt","pinned","sequelize","swagger","typescript"],"created_at":"2025-05-06T19:31:19.369Z","updated_at":"2026-04-25T12:35:53.317Z","avatar_url":"https://github.com/JsCodeDevlopment.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Teknix - Back-end Typescript + Clean Architecture\n\n## 💬 Descrição.\n\nEste projeto é uma api com sistema de autenticação e CRUD de produtos.\n\n## 🚧 Estrutura do Projeto.\nA arquitetura segue o padrão de Clean Architecture e Inversão de Dependência. As principais camadas são:\n- Domain: Define as entidades, gateways e interfaces do domínio.\nContém as definições de entidades, gateways e interfaces. Essa camada representa o domínio da aplicação e define a lógica de negócios e regras.\n- Factories: Define a criação de repositórios, rotas e casos de uso.\nContém a lógica para criar instâncias de repositórios, rotas e casos de uso.\n- Infra: Implementa repositórios, rotas, Sequelize e serviços.\nContém implementações específicas de infraestrutura, como repositórios, rotas, e serviços.\n- Main: Configura o aplicativo, middlewares, e documentação Swagger.\n- Usecases: Implementa casos de uso e DTOs.\n\n📂 **Esquema de pastas:** Este projeto segue os princípios da Clean Architecture, dividindo o código em camadas bem definidas:\n```\n  src\n├── domain\n│   ├── product\n│   │   ├── entity\n│   │   ├── gateway\n│   │   └── interfaces\n│   └── user\n│       ├── entity\n│       ├── gateway\n│       └── interfaces\n├── factories\n│   ├── repositories\n│   │   ├── product\n│   │   └── user\n│   ├── routes\n│   │   ├── auth\n│   │   ├── product\n│   │   └── user\n│   └── useCases\n│       ├── auth\n│       ├── product\n│       └── user\n├── infra\n│   ├── repositories\n│   │   ├── product\n│   │   └── user\n│   ├── routes\n│   │   ├── auth\n│   │   │   ├── login\n│   │   │   ├── me\n│   │   │   ├── products\n│   │   │   │   ├── create\n│   │   │   │   │   └── dto\n│   │   │   │   ├── delete\n│   │   │   │   │   └── dto\n│   │   │   │   ├── list\n│   │   │   │   │   └── dto\n│   │   │   │   ├── listById\n│   │   │   │   │   └── dto\n│   │   │   │   └── update\n│   │   │   │       └── dto\n│   │   │   ├── user\n│   │   │   │   ├── create\n│   │   │   │   │   └── dto\n│   │   │   │   ├── delete\n│   │   │   │   │   └── dto\n│   │   │   │   ├── list\n│   │   │   │   │   └── dto\n│   │   │   │   └── listById\n│   │   │   │       └── dto\n│   ├── sequelize\n│   │   ├── migrations\n│   │   ├── models\n│   │   │   ├── product\n│   │   │   └── user\n│   └── services\n│       ├── encryptor\n│       └── tokenGenerator\n├── main\n│   ├── @types\n│   ├── adapters\n│   │   └── http\n│   │       └── interfaces\n│   ├── api\n│   │   ├── config\n│   │   └── interfaces\n│   ├── docs\n│   │   └── swagger\n│   │       ├── components\n│   │       │   ├── auth\n│   │       │   │   └── schema\n│   │       │   ├── products\n│   │       │   │   └── schema\n│   │       │   └── user\n│   │       │       └── schema\n│   │       ├── config\n│   │       ├── responses\n│   │       └── schemas\n│   └── middlewares\n└── usecases\n    ├── auth\n    │   ├── generateToken\n    │   │   └── dto\n    │   ├── login\n    │   │   └── dto\n    ├── errors\n    ├── product\n    │   ├── create\n    │   │   └── dto\n    │   ├── delete\n    │   │   └── dto\n    │   ├── list\n    │   │   └── dto\n    │   ├── listById\n    │   │   └── dto\n    │   └── update\n    │       └── dto\n    └── user\n        ├── create\n        │   └── dto\n        ├── delete\n        │   └── dto\n        ├── list\n        │   └── dto\n        └── listById\n            └── dto\n```\n## ⚙ Resumo da Estrutura.\n\n- **Entidade:** Define a estrutura e lógica de negócios básica da(s) Entidade(s).\n- **Caso de Uso (UseCase):** Implementa a lógica de aplicação específica para criação, edição, deleção, listage ou atualização de uma entidade.\n- **Configurações de Rota:** Define a abstração para as rotas HTTP.\n- **Rota Específica:** Implementa a lógica da rota para executar uma ação feita no usecase.\n- **Ponto de Entrada (Main):** Configura e inicializa a aplicação, incluindo a injeção de dependências.\n\n## 🪀 Fluxo da Aplicação.\n\n### Recepção da Requisição:\n- Cliente: Envia uma requisição HTTP para o servidor (por exemplo, POST /products para criar um novo produto).\n- Infraestrutura de Roteamento: As rotas são configuradas na camada infra/routes. As rotas direcionam a requisição para os controladores apropriados (por exemplo, product.route.ts).\n\n### Tratamento da Requisição:\n- Middlewares: Antes de alcançar o controlador, a requisição passa pelos middlewares definidos (por exemplo, autenticação, validação).\n- Controladores: Os controladores na camada infra/routes recebem a requisição e chamam o caso de uso correspondente.\n\n### Caso de Uso (UseCase):\n- O caso de uso recebe o DTO de entrada.\n- Cria uma instância da entidade Product usando o método Ex.: Product.create.\n- Interage com o repositório Ex.: (ProductGateway) para persistir o produto no banco de dados.\n- Gera um DTO de saída Ex.: (CreateProductOutputDto) com os dados do produto criado.\n\n### Interação com o Domínio:\n- Camada de Domínio (domain): O caso de uso interage com as entidades e interfaces de domínio (por exemplo, Product entity) para realizar a lógica de negócios.\n\n### Repositório (Gateway):\n- Camada de Repositórios (factories/repositories e infra/repositories): O caso de uso utiliza os repositórios para acessar e manipular os dados no banco de dados. A implementação do repositório está na camada infra/repositories, mas a interface do repositório é definida na camada factories/repositories.\n- Sequelize: Os repositórios utilizam o Sequelize para interagir com o banco de dados, e os modelos são definidos na camada infra/sequelize/models.\n\n### Persistência dos dados:\n- Banco de Dados: Os dados são armazenados no banco de dados PostgreSQL conforme definido nos modelos Sequelize. As operações CRUD são realizadas por meio dos métodos do Sequelize.\n\n### Resposta da Rota:\n- Casos de Uso e Controladores: Após a execução do caso de uso, o controlador formata a resposta e a envia de volta ao cliente.\n- Swagger: A documentação Swagger, configurada na pasta main/docs/swagger, descreve as APIs e suas rotas. A documentação é gerada a partir das definições e schemas Swagger e está acessível para os desenvolvedores via Swagger UI.\n\n### 📱 Exemplo de Fluxo de Criação de Produto\n- Requisição: O cliente envia uma requisição POST /products com um corpo JSON contendo os dados do produto.\n- Middleware: O middleware de autenticação verifica o token JWT. Se válido, o request prossegue.\n- Controlador: O controlador CreateProductController recebe a requisição e chama CreateProductUseCase.\n- Caso de Uso: CreateProductUseCase valida os dados e utiliza o repositório para persistir o produto.\n- Repositório: O repositório ProductRepository usa o Sequelize para salvar o produto no banco de dados.\n- Resposta: O controlador formata a resposta e a envia ao cliente. A resposta é documentada no Swagger para referência.\n\n## 🎯 Instalação.\n1°→ Instalação das dependências:\n```bash\nnpm install\n# ou\nyarn install\n```\n2°→ Configure o banco de dados no arquivo `.env` crie um arquivo `.env` e cole o código abaixo:\n```env\nDB_HOST=\"localhost\"\nDB_NAME=\"teknix-express\"\nDB_USER=\"postgres\"\nDB_PASS=\"password\"\nDB_PORT=5432\nDB_DIALECT=\"postgres\"\n\nJWT_SECRET=\"token-verification\"\n\nWHITELIST_URLS=\"http://localhost:8000\"\n```\n3°→ Subir o container no docker:\n```bash\ndocker compose up -d\n```\n4°→ Execute as migrações do Sequelize para configurar o banco de dados:\n```bash\nnpm run migrate:up\n# ou\nyarn migrate:up\n```\n5°→ Execute a aplicação:\n```bash\nnpm run dev\n# ou\nyarn dev\n\n```\n\n## 💻 Tecnologias Utilizadas.\n\n \u003cdiv align=\"center\"\u003e\n  \u003cimage src=\"https://img.shields.io/badge/TypeScript-007ACC?style=for-the-badge\u0026logo=typescript\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Sequelize-52B0E7?style=for-the-badge\u0026logo=Sequelize\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Express%20js-000000?style=for-the-badge\u0026logo=express\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/Swagger-85EA2D?style=for-the-badge\u0026logo=Swagger\u0026logoColor=white\" /\u003e\n  \u003cimage src=\"https://img.shields.io/badge/JWT-000000?style=for-the-badge\u0026logo=JSON%20web%20tokens\u0026logoColor=white\" /\u003e\n\u003c/div\u003e\n\n## 👨‍💻 Desenvolvedor.\n\n| Foto                                                                                                                           | Nome                                                 | Cargo               |\n| ------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | ------------------- |\n| \u003cimg src=\"https://avatars.githubusercontent.com/u/100796752?s=400\u0026u=ae99bd456c6b274cd934d85a374a44340140e222\u0026v=4\" width=\"100\"\u003e | [Jonatas Silva](https://github.com/JsCodeDevlopment) | FullStack Developer |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscodedevlopment%2Fteknix-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjscodedevlopment%2Fteknix-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjscodedevlopment%2Fteknix-backend/lists"}