Lista de tarefas (API FastAPI + Frontend Angular PWA) com autenticação JWT.
301
Aplicação completa (API + Frontend PWA) para gerenciar uma lista de tarefas com autenticação JWT, empacotada com Docker Compose. Versões LTS/estáveis: Python 3.12, Node.js 22 LTS, NGINX 1.26 stable.
Além de atender aos requisitos do desafio, este projeto procura demonstrar:
Requisito: apenas Docker (Compose e/ou Make). Nenhum serviço depende de Node/Python instalados na máquina.
| Serviço | Diretório | Stack | Rota pública |
|---|---|---|---|
| backend | ./api | FastAPI + SQLite + Swagger | /api, /doc |
| frontend | ./app | Angular + Material Design | / |
| proxy | ./nginx | NGINX | porta APP_PORT |
| scripts | ./scripts | Cobertura, badges, utilitários | |
| Makefile | ./Makefile | Orquestração (build/start/…) | |
| Coverage | ./docs/cover | Relatórios de cobertura api/app | |
| Badges | ./docs/badges | SVG de cobertura (README) |
http://localhost:8080/http://localhost:8080/apihttp://localhost:8080/docBadges de imagem: nome + tamanho (
lambdadeveloper/afl:api→323MB, etc.). Atualizam automaticamente emmake build/make start/make deploy/make badges. Badges de cobertura:./docs/badges/.
Clone o repositório e acesse o diretório do projeto:
git clone https://github.com/AFLca/desafio-tecnico.git
cd desafio-tecnico
Copie o arquivo de exemplo e ajuste se necessário:
cp .env.example .env
Conteúdo de .env.example:
| Variável | Descrição | Padrão |
|---|---|---|
APP_PORT | Porta publicada do proxy NGINX | 8080 |
SECRET_KEY | Chave secreta para assinar JWT | (altere em produção) |
ALGORITHM | Algoritmo JWT | HS256 |
ACCESS_TOKEN_EXPIRE_MINUTES | Validade do token em minutos | 60 |
DATABASE_URL | URL do SQLite | sqlite:///./data/afl.db |
O projeto inclui um Makefile (inspirado em cornerstone) com os comandos principais:
| Comando | Descrição |
|---|---|
make build | docker compose build + atualiza badges de tamanho |
make start | docker compose up --build --remove-orphans -d (garante .env) |
make stop | docker compose stop |
make down | docker compose down |
make deploy | Build + push das imagens para o Docker Hub lambdadeveloper/afl:{api,app,nginx} |
make coverage | Cobertura api/app via Docker → relatórios em docs/cover + badges em docs/badges |
make badges | Atualiza badges do README com nome e tamanho das imagens |
make clean | Remove containers, volumes, imagens locais, dist e artefatos temporários |
make help | Lista os comandos disponíveis |
Qualquer uma das formas abaixo sobe a stack completa (build + containers):
cp .env.example .env # opcional — o make cria se faltar
make start
Ou com Docker Compose padrão:
cp .env.example .env # necessário se ainda não existir
docker compose up --build --remove-orphans
(make start usa o equivalente em modo detached: docker compose up --build --remove-orphans -d.)
A aplicação ficará disponível em http://localhost:8080 (ou a porta definida em APP_PORT).
make stop # pausa os containers
make down # remove containers e rede
make clean # limpeza completa (inclui volumes e imagens locais)
Requer login no Docker Hub (docker login) com acesso ao namespace lambdadeveloper:
make deploy
Imagens publicadas:
lambdadeveloper/afl:apilambdadeveloper/afl:applambdadeveloper/afl:nginx| Workflow | Quando | O que faz |
|---|---|---|
Testes e cobertura | push/PR em main | make coverage, publica artefatos e atualiza badges em docs/badges/ |
Deploy Docker Hub | após CI ok em push na main | make deploy (build + push) e atualiza badges de tamanho no README |
Atualizar Overview no Docker Hub | push do README.md na main | sincroniza a descrição do repositório no Hub |
Secrets / variables necessários no repositório:
| Nome | Onde | Uso |
|---|---|---|
DOCKERHUB_USERNAME | Variable ou Secret | Usuário do Docker Hub (dono de lambdadeveloper, ou conta com Admin no repo) |
DOCKERHUB_TOKEN | Secret (obrigatório) | Access Token com escopo Read, Write, Delete |
DOCKERHUB_REPOSITORY | Variable (opcional) | Padrão: lambdadeveloper/afl |
Atenção: Variables (
vars.*) e Secrets (secrets.*) são namespaces distintos. Se o username estiver só em Variables,secrets.DOCKERHUB_USERNAMEfica vazio.O workflow de Overview falha com
Error: Forbiddenno PATCH se o token tiver só Read/Write (sem Delete), ou se o username não tiver Admin emlambdadeveloper/afl. Push de imagens pode funcionar com Write; atualizar a descrição exige Delete (nível admin na API do Hub).
docker compose build
docker compose up --build --remove-orphans
docker compose stop
docker compose down
docker compose logs -f
Para rodar em segundo plano (como o make start):
docker compose up --build --remove-orphans -d
cd api
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
mkdir -p data
uvicorn app.main:app --reload --port 8000
http://localhost:8000/apihttp://localhost:8000/doccd app
npm install
npm start
O Angular Dev Server sobe em http://localhost:4200. Para apontar à API local, use um proxy ou acesse via Docker Compose.
Proxy de desenvolvimento sugerido (app/proxy.conf.json):
{
"/api": { "target": "http://localhost:8000", "secure": false },
"/doc": { "target": "http://localhost:8000", "secure": false },
"/openapi.json": { "target": "http://localhost:8000", "secure": false }
}
E rode: ng serve --proxy-config proxy.conf.json
make coverage)make coverage
Gera relatórios HTML/XML em docs/cover/api e docs/cover/app, e badges SVG em docs/badges/ (usadas no cabeçalho do README).
cd api
pip install -r requirements.txt
pytest -v
O pytest falha automaticamente se a cobertura de app/ ficar abaixo de 90%.
Códigos HTTP cobertos pelos testes: 201 (criação), 204 (remoção), 401 (JWT inválido), 403 (tarefa de outro usuário), 404 (inexistente), 422 (validação).
cd app
npm install
npm test -- --watch=false
Inclui testes de páginas, componente de tarefa, serviços, guards e interceptor HTTP.
| Método | Rota | Descrição |
|---|---|---|
POST | /api/auth/register | Cadastro (username, password) |
POST | /api/auth/login | Login (form username/password) → JWT |
Authorization: Bearer <token>)| Método | Rota | Descrição |
|---|---|---|
GET | /api/tarefas | Listar tarefas paginado (skip, limit, opcional status) |
POST | /api/tarefas | Criar tarefa |
GET | /api/tarefas/{id} | Obter tarefa |
PUT | /api/tarefas/{id} | Atualizar tarefa |
DELETE | /api/tarefas/{id} | Excluir tarefa |
Resposta da listagem: { items, total, skip, limit, has_more }.
Campos da tarefa: id, titulo, descricao, status, datahora_criacao, datahora_modificacao, usuario_id.
Status aceitos: pendente, concluida, cancelada.
Ordenação da listagem: pendentes → concluídas → canceladas; dentro de cada status, por datahora_modificacao decrescente. Em tarefas novas, datahora_modificacao inicia igual a datahora_criacao.
No frontend, a tela de tarefas tem topo e background fixos e listagem infinita (sem limite de carga — páginas sucessivas até esgotar). Concluídas usam #9cbc3c e canceladas #9ca2a6; ambas com título tachado. O botão check à direita do título conclui a tarefa.
| Uso | Hex |
|---|---|
| Fundo | #606a72 |
| Frente | #dfe2dd |
| Destaque / concluídas | #9cbc3c |
| Neutro / canceladas | #9ca2a6 |
| Neutro-claro | #b4b6b4 |
O frontend é um Progressive Web App (manifest + Angular Service Worker). Em build de produção, o app pode ser instalado pelo navegador.
Content type
Image
Digest
sha256:2e09c389c…
Size
19.6 MB
Last updated
3 months ago
docker pull lambdadeveloper/afl:nginx