Aplicação web para cadastro, autenticação e gerenciamento de tarefas.
- Frontend: React com Vite (React Router)
- Backend: Python com FastAPI
- Banco/Auth: Supabase (Postgres + autenticação e-mail/senha)
- Testes: PyTest
- Node.js (para o frontend)
- Python 3.12+
- uv (gerenciador de dependências do backend)
- Projeto Supabase configurado com tabela
taskse autenticação por e-mail/senha
- Entre na pasta do servidor:
cd server- Crie o arquivo
.enva partir do exemplo e preencha as variáveis:
cp .env.example .envSUPABASE_URL=
SUPABASE_KEY=- Instale as dependências:
uv sync- Execute a API:
uv run uvicorn app.main:app --reloadA API ficará disponível em http://localhost:8000.
- Entre na pasta do cliente:
cd client- Crie o arquivo
.enva partir do exemplo:
cp .env.example .envVITE_API_URL=http://localhost:8000- Instale as dependências:
npm install- Execute o frontend:
npm run devTrabalho01/
├── client/ # Frontend (React + Vite)
│ ├── app/
│ │ ├── components/
│ │ │ ├── auth/ # Componentes de autenticação
│ │ │ ├── home/ # Componentes da página inicial
│ │ │ ├── layout/ # Cabeçalho e rodapé
│ │ │ ├── tasks/ # Formulário, card e exclusão de tarefas
│ │ │ └── ui/ # Componentes de interface (shadcn)
│ │ ├── lib/
│ │ │ ├── auth/ # Contexto, serviço e sessão de autenticação
│ │ │ ├── schemas/ # Validação com Zod
│ │ │ ├── tasks/ # Serviço e formatação de tarefas
│ │ │ └── api.ts # Cliente HTTP da API
│ │ └── routes/ # Páginas: home, login, register, tasks
│ ├── package.json
│ └── vite.config.ts
│
└── server/ # Backend (FastAPI)
├── app/
│ ├── core/ # Configuração e tratamento de erros
│ ├── database/ # Cliente Supabase
│ ├── dependencies/ # Dependência de autenticação (JWT)
│ ├── routers/
│ │ ├── auth.py # Endpoints /auth/signup e /auth/login
│ │ └── tasks.py # CRUD de tarefas (/tasks)
│ ├── schemas/ # Modelos Pydantic (auth e task)
│ └── main.py # Aplicação FastAPI
├── tests/
│ ├── conftest.py # Fixtures e mocks do Supabase
│ ├── test_auth.py # Testes de autenticação
│ └── test_tasks.py # Testes de tarefas
└── pyproject.toml
O sistema é composto por três partes independentes: o frontend (React), a API (FastAPI) e o Supabase (autenticação e banco Postgres). O usuário interage só com a interface; o frontend chama a API; a API fala com o Supabase.
flowchart LR
U[Usuário] --> FE[Frontend<br/>React + Vite]
FE -->|HTTP JSON<br/>Bearer JWT| API[Backend<br/>FastAPI]
API -->|signup / login / get_user| AUTH[Supabase Auth]
API -->|CRUD tabela tasks| DB[(Supabase<br/>Postgres)]
Partes independentes (processos/serviços distintos):
- Frontend (
client/): interface web. Não acessa o banco nem o Auth do Supabase diretamente. - Backend (
server/): API REST (/authe/tasks). Valida o JWT e encaminha as operações ao Supabase. - Supabase Auth: cadastro e login por e-mail/senha; emissão e validação do token.
- Supabase Postgres: persistência da tabela
tasks.
Cada um pode ser implantado, reiniciado ou substituído sem o código dos outros, desde que o contrato HTTP e as variáveis de ambiente (VITE_API_URL, SUPABASE_URL, SUPABASE_KEY) se mantenham.
O que é compartilhado entre os componentes:
- Contrato da API: rotas, JSON e códigos HTTP usados pelo frontend e pelo backend.
- Sessão: o JWT emitido no login/cadastro; o frontend guarda e reenvia; o backend valida no Supabase.
- Dados: usuários no Auth e tarefas no Postgres, acessíveis a qualquer cliente autenticado daquele usuário.
- Não é compartilhado: memória, processos ou arquivos locais entre frontend, API e Supabase.
Sistema de informação (com recursos distribuídos).
O objetivo é compartilhar e persistir dados (contas e tarefas), não paralelizar cálculo e não operar como sistema pervasivo (sensores, IoT, contexto físico). Há processamento na API, mas ele serve à informação, não a um cluster de computação.
O usuário não precisa saber:
- Localização: se a API está em
localhost:8000ou em outro host; se o Auth e o Postgres estão no Supabase. - Acesso: que o frontend usa HTTP/JSON e a API usa o SDK do Supabase (Auth + PostgREST).
- Autenticação interna: como o token é validado (
get_user) ou como a chave do projeto é usada no servidor. - Esquema do banco: nomes de tabela/colunas e o fato de o CRUD ir ao Postgres.
Ele vê telas, formulários e mensagens de erro da interface.
Como o sistema pode crescer, dado o desenho atual:
- Mais usuários/clientes: vários navegadores acessam a mesma API; o frontend é estático e escala à parte.
- Mais carga na API: novas instâncias do FastAPI, apontando para o mesmo Supabase.
- Mais dados: o crescimento de contas e de
tasksfica no Postgres/Auth do Supabase.
Não há, neste projeto, balanceador, fila ou replicação implementados na aplicação.
O que acontece se um componente falhar:
- Frontend indisponível: a interface não abre; API e Supabase continuam de pé, mas o usuário não os usa por essa UI.
- FastAPI indisponível: o frontend não completa as chamadas e mostra que não foi possível conectar ao servidor. Auth e banco não são acessados por este caminho.
- Supabase Auth indisponível: cadastro, login e validação de token falham; as rotas de tarefas autenticadas deixam de funcionar.
- Postgres indisponível: login/cadastro podem ainda falar com o Auth, mas criar/listar/atualizar/excluir tarefas falha.
Não há failover automático na aplicação: a falha aparece como erro HTTP ou de rede na interface.
As dependências de teste (PyTest) estão no pyproject.toml do backend. Na pasta server:
uv syncNa pasta server:
uv run pytest -v10 testes no total:
| Arquivo | Quantidade |
|---|---|
test_auth.py |
6 |
test_tasks.py |
4 |
============================= test session starts =============================
platform win32 -- Python 3.12.13, pytest-9.1.1, pluggy-1.6.0
collected 10 items
tests/test_auth.py::test_cadastro_valido PASSED [ 10%]
tests/test_auth.py::test_cadastro_com_email_ja_usado PASSED [ 20%]
tests/test_auth.py::test_login_valido_devolve_token_e_usuario PASSED [ 30%]
tests/test_auth.py::test_login_com_senha_errada PASSED [ 40%]
tests/test_auth.py::test_autorizacao_sem_token_e_recusada PASSED [ 50%]
tests/test_auth.py::test_autorizacao_com_token_invalido PASSED [ 60%]
tests/test_tasks.py::test_criar_tarefa PASSED [ 70%]
tests/test_tasks.py::test_listar_tarefas PASSED [ 80%]
tests/test_tasks.py::test_atualizar_tarefa PASSED [ 90%]
tests/test_tasks.py::test_excluir_tarefa PASSED [100%]
======================== 10 passed, 1 warning in 0.15s ========================
- Cadastro válido: retorno 201 com token e dados do usuário.
- Cadastro com e-mail já usado: retorno 409 com mensagem de conflito.
- Login válido: retorno 200 com token e dados do usuário.
- Login com senha errada: retorno 401 com mensagem de credenciais inválidas.
- Autorização sem token: acesso a
/tasks/recusado (401 ou 403). - Autorização com token inválido: retorno 401 ao enviar token inválido.
- Criar tarefa: retorno 201 com dados da tarefa e
user_idcorreto. - Listar tarefas: retorno 200 com a lista de tarefas do usuário.
- Atualizar tarefa: retorno 200 com status atualizado.
- Excluir tarefa: retorno 200 com mensagem de sucesso e filtro pelo ID correto.




