{"id":50954863,"url":"https://github.com/peulearning/beworker-test","last_synced_at":"2026-06-18T05:30:54.978Z","repository":{"id":355974886,"uuid":"1229912264","full_name":"peulearning/beworker-test","owner":"peulearning","description":"O teste técnico proposto pela BeWorker tem como objetivo avaliar habilidades no desenvolvimento backend por meio da construção de uma API RESTful voltada para o gerenciamento dinâmico de links.  ","archived":false,"fork":false,"pushed_at":"2026-05-06T03:43:48.000Z","size":88866,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-05-06T05:28:09.866Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/peulearning.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,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-05T13:55:05.000Z","updated_at":"2026-05-06T03:43:52.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/peulearning/beworker-test","commit_stats":null,"previous_names":["peulearning/beworker-test"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/peulearning/beworker-test","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peulearning%2Fbeworker-test","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peulearning%2Fbeworker-test/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peulearning%2Fbeworker-test/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peulearning%2Fbeworker-test/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/peulearning","download_url":"https://codeload.github.com/peulearning/beworker-test/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/peulearning%2Fbeworker-test/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34478105,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-18T02:00:06.871Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"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":[],"created_at":"2026-06-18T05:30:51.631Z","updated_at":"2026-06-18T05:30:54.972Z","avatar_url":"https://github.com/peulearning.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🚀 Teste Técnico BeWorker — JR/Pleno Backend\n\n```\nImportante : Este código e totalmente livre e não tem nenhum fim comercial, apenas acerca de testar minhas habilidades e pensamento crítico de um desenvolvedor. As instruções para funcionamento do projeto se encontra no final deste README.\n```\n\n---\n\n## 1. Como você modelou as entidades?\n\nA modelagem foi baseada nos principais conceitos do domínio proposto: **usuários, projetos, links, parâmetros e redirecionamento**, seguindo uma abordagem relacional e normalizada.\n\nAs relações foram definidas da seguinte forma:\n\n* **Usuário → Projeto (1:N)**\n  Um usuário pode possuir múltiplos projetos, permitindo organização por contexto (ex: campanhas, canais, etc).\n\n* **Projeto → Link (1:N)**\n  Cada projeto agrupa múltiplos links, funcionando como um container lógico.\n\n* **Link → Parâmetros (N:N)**\n  A relação entre links e parâmetros foi modelada como muitos-para-muitos através de uma tabela intermediária (`LinkParameter`).\n  Isso permite que:\n\n  * um link tenha múltiplos parâmetros\n  * um parâmetro seja reutilizado em vários links\n\n* **Link → Redirect (1:1 opcional)**\n  O redirecionamento foi modelado como uma entidade separada, associada de forma opcional ao link.\n\nAlém disso:\n\n* Os identificadores utilizam **UUID**, evitando exposição de IDs sequenciais\n* O banco de dados utilizado é **relacional (MySQL)**\n* A modelagem foi implementada com **Prisma ORM**, garantindo tipagem forte e integridade dos dados\n\n---\n\n## 2. Quais decisões você tomou e por quê?\n\nDurante o desenvolvimento, algumas decisões arquiteturais foram fundamentais:\n\n### 🔹 Separação dos parâmetros em entidade própria\n\n* Permite reutilização entre múltiplos links\n* Evita duplicação de dados\n* Facilita manutenção em larga escala\n\n### 🔹 Uso de relacionamento muitos-para-muitos (Link ↔ Parameter)\n\n* Flexibiliza a associação entre links e parâmetros\n* Permite combinações dinâmicas sem alterar a estrutura do banco\n\n### 🔹 Redirecionamento como entidade separada (1:1)\n\n* Nem todo link precisa de redirect\n* Mantém o modelo flexível e extensível\n* Permite evoluções futuras (ex: múltiplos destinos, tracking, etc.)\n\n### 🔹 Uso de UUID como identificador\n\n* Evita exposição de IDs sequenciais\n* Melhora segurança em endpoints públicos\n\n### 🔹 Estrutura modular por domínio\n\n* Organização por responsabilidade (users, projects, links, parameters)\n* Facilita manutenção e evolução do sistema\n\n### 🔹 Uso de JWT para autenticação\n\n* Garante que cada usuário acesse apenas seus próprios dados\n* Permite proteger rotas com middleware\n\n### 🔹 Seed inicial\n\n* Permite testar rapidamente o sistema\n* Facilita validação funcional sem setup manual\n\n---\n\n## 3. Como sua solução resolve o problema de escala na edição de links?\n\nO problema apresentado envolve a dificuldade de gerenciar links manualmente quando há necessidade de alteração em massa (como UTMs ou destinos).\n\nA solução proposta resolve esse problema através de **geração dinâmica de links**.\n\n### 🔹 Principais pontos da solução:\n\n* Os links são armazenados como **templates (baseUrl)**\n* Os parâmetros são entidades separadas e reutilizáveis\n* A URL final é **gerada em tempo de execução**, através do endpoint:\n\n```\nGET /links/:id/generate\n```\n\n### 🔹 Como isso resolve o problema:\n\n* **Elimina a necessidade de editar links manualmente**\n* Permite alterar parâmetros uma única vez e refletir em múltiplos links\n* Reduz redundância de dados\n* Facilita manutenção em larga escala\n\n### 🔹 Exemplo prático:\n\nEm vez de armazenar:\n\n```\nhttps://example.com?utm_source=facebook\u0026utm_campaign=black\n```\n\nO sistema armazena:\n\n* baseUrl: `https://example.com`\n* parâmetros:\n\n  * utm_source=facebook\n  * utm_campaign=black\n\nE gera dinamicamente:\n\n```\nhttps://example.com?utm_source=facebook\u0026utm_campaign=black\n```\n\n### 🔹 Sobre o redirecionamento\n\nCaso o link possua um redirect configurado:\n\n* A API responde com um **HTTP 302 (redirect real)**\n* Simulando o comportamento real de navegação\n\nIsso permite que o sistema funcione não apenas como gerador de links, mas também como intermediador de navegação.\n\n---\n\n## ✅ Conclusão\n\nA solução proposta transforma links estáticos em estruturas dinâmicas, reutilizáveis e escaláveis, reduzindo esforço operacional e permitindo maior flexibilidade na gestão de campanhas.\n\n---\n\n## Instruções\n---\n\n## ⚙️ Como executar o projeto\n\n### 📌 Pré-requisitos\n\n* Node.js (\u003e= 18)\n* MySQL\n* npm ou yarn\n\n---\n\n### 🔧 1. Clone o repositório\n\n```bash\ngit clone https://github.com/seu-usuario/bework-test.git\ncd bework-test\n```\n\n---\n\n### 📦 2. Instale as dependências\n\n```bash\nnpm install\n```\n\n---\n\n### 🔐 3. Configure as variáveis de ambiente\n\nCrie um arquivo `.env` na raiz:\n\n```env\nDATABASE_URL=\"mysql://root:@localhost:3306/beworker\"\nJWT_SECRET=\"supersecret\"\nPORT=3000\n```\n\n---\n\n### 🧱 4. Execute as migrações\n\n```bash\nnpx prisma migrate dev\n```\n\n---\n\n### 🌱 5. Rodar seed (dados iniciais)\n\n```bash\nnpx prisma db seed\n```\n\n---\n\n### 🚀 6. Iniciar servidor\n\n```bash\nnpm run dev\n```\n\nServidor disponível em:\n\n```bash\nhttp://localhost:3000\n```\n\n---\n\n### 🧪 Teste com Insomnia/Postman\n\n1. Faça login em `/auth/login`\n2. Copie o token JWT\n3. Utilize no header:\n\n```http\nAuthorization: Bearer SEU_TOKEN\n```\n\n---\n\n### 🔗 Endpoint principal\n\n```http\nGET /links/:id/generate\n```\n\n---\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeulearning%2Fbeworker-test","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpeulearning%2Fbeworker-test","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpeulearning%2Fbeworker-test/lists"}