Do zero ao deploy - Chameleon Devlog #1

Do zero ao deploy - Chameleon Devlog #1

API
Clean Architechture
Desenvolvimento
Chameleon

Introdução: Pokedexe's e Todo's.

Muito se fala sobre desenvolver projetos pessoais: APIs, aplicativos, jogos, automações. É difícil listar todos os benefícios de se construir um projeto end-to-end do zero. Cada um tem um processo diferente, pensa de forma diferente e adquire conhecimento de forma única.

Mas tem algo nos projetos de Pokédex, todo lists e calculadoras que me incomoda: eles não passam de conceitos. É claro, não podemos desmerecer o mérito da construção de nenhum projeto, até um simples "Hello World" tem seu valor, por a mão na massa sempre terá seu mérito.

No entanto, quando comparamos uma API básica de to-do list, fazendo requisições sem autenticação em um nó gratuito do MongoDB Atlas, começamos a entender o abismo que existe entre uma aplicação real e uma prova de conceito.

Quantas vezes começamos um projeto empolgados com a ideia, uma nova stack, um micro SaaS, um clone de algo que usamos e no meio do caminho abandonamos? Às vezes é o burnout, às vezes é a curva de aprendizado, mas na maioria das vezes é só a realidade batendo: começar é delicioso, terminar é trabalhoso. Escrever um README.md bonito é mais legal que lidar com edge cases em produção. Criar uma estrutura de pastas limpa é mais divertido que escrever logs e lidar com tratamento de erros assíncronos. E assim, vamos acumulando repositórios inacabados, que talvez um dia... mas você sabe que não.

Projetos e mais projetos
Quem nunca teve uma ideia de side project enquanto fazia um side project

Daí veio o Chameleon, um projeto que nasceu com um único objetivo: ser finalizado. A proposta é simples, mas completa: fornecer uma API para encurtamento de URLs com tudo o que uma API robusta tem direito: deploy fácil, cache, autenticação, autorização, documentação e uma arquitetura pensada desde o início para ser limpa e extensível.

Sobre o nome, não tem grande significado. Algo sobre os camaleões de camuflarem na natureza assim como seu link longo e extenso de campanha de marketing vai se camuflar numa URL bonitinha? Não gastei tanto tempo pensando nisso.

Por que um encurtador de URL?

É um projeto simples, mas com desafios interessantes:

  • Geração de códigos curtos únicos.
  • Redirecionamento rápido e confiável.
  • Métricas e rastreamento.

Ótimo para exercitar princípios de design de software.

A Stack

O foco aqui era construir algo no ecosistema .NET

  • Linguagem: C# (.NET 9)
  • Frontend: Blazor
  • Database: PostgreSQL (via EF Core)
  • Testes (Unitários e Integração): xUnit, Moq
  • Tooling: Docker, GitHub Actions CI/CD, Redoc

A Arquitetura limpa (Clean Architecture)

Dividir o projeto em camadas foi o passo um. Cada uma com sua responsabilidade numa unidade lógica isolada.

├── Chameleon.API  #  WebAPI e UI
├── Chameleon.Application   # Lógica de aplicação
├── Chameleon.Domain        # Entidades e lógica de domínio
├── Chameleon.Infrastructure # Acesso de dados
├── Chameleon.Tests         # Testes

Funcionalidades atuais

  • Criar uma URL encurtada
  • Redirecionar de URL encurtada para URL original
  • Validação básica de URLs
  • Geração de códigos curtos aleatórios (ainda sem verificação de unicidade, esse vai ser um desafio)

Desafios

Ironicamente o projeto que foi criado para acabar ainda não tem um final definido. É claro, esperamos no mínimo um container deployável com autenticação e métricas de acesso as URLs, mas a questão é: O quão longe precisamos chegar para atingir esse objetivo?

  • Decidir até que ponto separar responsabilidades sem complicar demais.
  • Custos de deploy e domínio web
  • Performance e escalabilidade

Considerações finais

Mesmo sendo um projeto simples, a complexidade está em entregá-lo com um nível de qualidade alto: arquitetura bem definida, respostas padronizadas, autenticação segura, rastreamento eficiente, e uma experiência de uso fluida tanto para quem consome a API quanto para quem usa o painel.

O código está aberto a feedbacks:

Open Source Software Hell Yeah!!! ヽ(・∀・)ノ

Compartilhar este post