Taskee Backend API - Documentação Técnica
Visão Geral
API REST desenvolvida com FastAPI para gerenciamento de eventos gamificados, tarefas, atividades e ranking de participantes. Utiliza Firebase Authentication para autenticação e Cloud Firestore como banco de dados NoSQL.
URL Base: http://localhost:8000
Documentação Interativa: http://localhost:8000/docs
Arquitetura
Stack Tecnológica
- Framework: FastAPI
- Autenticação: Firebase Authentication (JWT)
- Banco de Dados: Cloud Firestore (NoSQL)
- Storage: Firebase Storage
- Testes: Pytest (31 arquivos de teste)
- Containerização: Docker + Docker Compose
Padrão Arquitetural
app/
├── controllers/ # Endpoints HTTP (rotas)
├── services/ # Lógica de negócio
├── models/ # Modelos de dados (Pydantic)
├── schemas/ # Validação de entrada/saída
├── dependencies/ # Injeção de dependências (Firebase, Auth)
└── utils/ # Funções auxiliares
Autenticação e Autorização
Níveis de Segurança
| Nível | Descrição | Dependência |
|---|---|---|
| PUBLIC | Sem autenticação | Nenhuma |
| AUTHENTICATED | Requer token Firebase válido | get_current_user_firebase |
| ADMIN | Requer is_admin=true
|
require_admin_firebase |
Fluxo de Autenticação
- Frontend faz login via Firebase Client SDK (
signInWithEmailAndPassword) - Obtém ID Token com
getIdToken() - Envia token para
/firebase-auth/verify(validação backend) - Backend valida token e retorna dados do usuário
Controle de Plataforma
-
Web Dashboard: Somente admins (
is_admin=true) - Mobile App: Todos usuários ativos
Recursos e Endpoints
1. Account Management (Público)
Prefixo: /account
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /signup |
Criar conta Firebase Auth |
| DELETE | /delete-account |
Deletar conta permanentemente |
| DELETE | /soft-delete-account |
Deletar conta logicamente |
Nota: Login é feito no frontend via Firebase SDK.
2. Firebase Authentication (Público)
Prefixo: /firebase-auth
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /verify |
Validar token Firebase e sincronizar usuário |
| POST | /logout |
Logout (invalidar token) |
Validação de Plataforma:
{
"firebase_token": "eyJhbG...",
"platform": "web" // ou "mobile"
}
3. Password Management (Público)
Prefixo: /password
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /reset/request |
Solicitar reset de senha (email com token válido por 1h) |
4. Users (Autenticado)
Prefixo: /users
| Método | Endpoint | Descrição | Acesso |
|---|---|---|---|
| POST | /create |
Criar usuário (com Firebase UID) | Admin |
| POST | /create-with-firebase |
Criar usuário + Firebase Auth | Admin |
| GET | / |
Listar todos usuários | Admin |
| GET | /{user_id} |
Buscar por ID | Autenticado |
| GET | /uuid/{uuid} |
Buscar por UUID | Autenticado |
| GET | /email/{email} |
Buscar por email | Autenticado |
| PUT | /{user_id} |
Atualizar perfil (próprio ou admin) | Autenticado |
| DELETE | /{user_id} |
Deletar do Firestore | Admin |
| DELETE | /{user_id}/complete |
Deletar Firebase Auth + Firestore | Autenticado |
Modelo User:
{
"id": str,
"firebase_uid": str,
"name": str,
"email": str,
"birth_date": datetime,
"phone_number": str,
"city": str,
"state": str,
"country": str,
"gender": UserGender,
"is_active": bool,
"is_admin": bool
}
5. Events (Autenticado)
Prefixo: /events
| Método | Endpoint | Descrição | Acesso |
|---|---|---|---|
| POST | /create |
Criar evento (com upload de banner) | Admin |
| PUT | /update |
Atualizar evento | Admin |
| GET | /all |
Listar todos eventos | Público |
| GET | /my-events |
Eventos do usuário (admin: todos / user: inscritos) | Autenticado |
Modelo Event:
{
"id": str,
"title": str,
"description": str,
"access_code": str, # Código de inscrição
"field": str,
"start_date": datetime,
"end_date": datetime,
"type": str, # Feira, Workshop, etc.
"status": str, # ongoing, finished
"is_active": bool,
"customization": {
"primary_color": str,
"secondary_color": str,
"tertiary_color": str,
"font": str,
"icon_url": str,
"banner_url": str
},
"tasks": List[Task],
"activities": List[Activity]
}
6. Tasks (Autenticado)
Prefixo: /tasks
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /create/{event_id} |
Criar tarefa em evento |
| GET | /all/{event_id} |
Listar tarefas do evento |
| GET | /{event_id}/{task_id} |
Buscar tarefa específica |
| PUT | /update/{event_id}/{task_id} |
Atualizar tarefa |
| DELETE | /delete/{event_id}/{task_id} |
Deletar tarefa |
Modelo Task:
{
"id": str,
"title": str,
"description": str,
"task_type": str, # question, quiz, challenge
"task_category": str,
"status": str,
"score": int,
"sequence": int,
"min_char": int, # Mínimo de caracteres para resposta
"question": List[Question], # Para quizzes
"is_active": bool
}
7. Activities (Autenticado)
Prefixo: /events/{event_id}/activities
| Método | Endpoint | Descrição |
|---|---|---|
| POST | / |
Criar atividade (com upload de imagem) |
| GET | / |
Listar atividades (ativas por padrão) |
| GET | /{activity_id} |
Buscar atividade específica |
| PUT | /{activity_id} |
Atualizar atividade |
| DELETE | /{activity_id} |
Deletar permanentemente |
| DELETE | /{activity_id}/soft |
Desativar atividade |
| PUT | /{activity_id}/restore |
Reativar atividade |
Modelo Activity:
{
"id": str,
"title": str,
"description": str,
"type": str, # Palestra, Workshop, etc.
"image_url": str,
"start_at": datetime,
"end_at": datetime
}
8. User Tasks (Autenticado)
Prefixo: /user_tasks
Gerencia respostas de usuários em tarefas.
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /upsert/question/{user_id}/{event_id}/{task_id} |
Submeter resposta dissertativa |
| POST | /upsert/quiz/{user_id}/{event_id} |
Submeter quiz (múltipla escolha) |
| POST | /upsert/challenge/{user_id}/{event_id}/{task_id} |
Submeter desafio (upload de imagem) |
| GET | /event/{event_id}/user/{user_id} |
Listar respostas do usuário no evento |
| GET | /{event_id} |
Listar todas respostas do evento |
| GET | /{event_id}/task/{task_id} |
Respostas de tarefa específica |
| GET | /current/{event_id}/{user_id} |
Tarefa atual do usuário |
| GET | /completion/{event_id}/{user_id} |
Status de conclusão das tarefas |
| PUT | /evaluate/{user_task_id} |
Avaliar resposta (admin) |
Modelo UserTask:
{
"id": str, # {user_id}_{task_id}
"user_id": str,
"task_id": str,
"event_id": str,
"answers": [
{
"user_answer": str,
"is_correct": bool,
"submission_type": SubmissionType, # text, image
"submission_url": str # URL Firebase Storage
}
],
"is_validated": bool,
"score": float
}
9. User Events (Autenticado)
Prefixo: /user_event
Gerencia inscrições de usuários em eventos.
| Método | Endpoint | Descrição |
|---|---|---|
| POST | /register |
Inscrever-se em evento (via código de acesso) |
| GET | /event/{event_id}/my-registration |
Buscar inscrição do usuário |
| GET | /my-registrations |
Listar todos eventos inscritos |
Modelo UserEvent:
{
"id": str, # {user_id}_{event_id}
"user_id": str,
"event_id": str,
"total_score": int, # Pontuação consolidada
"enrollment_date": datetime
}
10. Ranking (Público)
Prefixo: /ranking
| Método | Endpoint | Descrição |
|---|---|---|
| GET | /{event_id} |
Ranking completo do evento |
| GET | /{event_id}/user/{user_id} |
Posição específica do usuário |
Resposta Ranking:
{
"event_id": str,
"ranks": [
{
"position": int,
"user_id": str,
"name": str,
"total_score": int
}
]
}
Serviços
AccountService
- Criação de usuários no Firebase Auth
- Deleção física e lógica de contas
FirebaseAuthService
- Validação de tokens JWT
- Controle de acesso por plataforma (web/mobile)
- Atualização de último login
UserService
- CRUD completo de usuários
- Integração Firebase Auth
↔ Firestore - Validação de permissões
EventService
- Gerenciamento de eventos gamificados
- Upload de banners (Firebase Storage)
- Customização de aparência
TaskService
- CRUD de tarefas (question, quiz, challenge)
- Validação de tipos e categorias
- Sequenciamento de tarefas
ActivityService
- CRUD de atividades do evento
- Upload de imagens
- Soft delete (desativação)
UserTaskService
- Submissão de respostas (texto, quiz, imagem)
- Avaliação de respostas (admin)
- Atualização de pontuação no UserEvent
- Validação de respostas de quiz
UserEventService
- Inscrição em eventos via código de acesso
- Controle de pontuação consolidada
- Listagem de eventos do usuário
RankingService
- Geração de ranking por evento
- Ordenação por pontuação
- Busca de posição específica
PasswordService
- Envio de email de reset (token temporário 1h)
Modelos de Dados Principais
Enumerações
class UserGender(str, Enum):
MALE = "male"
FEMALE = "female"
OTHER = "other"
class SubmissionType(str, Enum):
TEXT = "text"
IMAGE = "image"
Testes
Cobertura
- Total de arquivos: 31 testes
-
Estrutura:
- Controllers: 9 arquivos
- Services: 10 arquivos
- Models: 4 arquivos
- Integrações: 8 arquivos
Testes por Módulo
| Módulo | Arquivos de Teste |
|---|---|
| User |
test_user_controller.py, test_user_service.py, test_user_model.py
|
| Task |
test_task_controller.py, test_task.py, test_task_validators.py
|
| Event |
test_event_controller.py, test_event_service.py
|
| Activity |
test_activity_controller.py, test_activity_service_extended.py, test_activity.py
|
| UserTask |
test_user_task_controller.py, test_user_task_service.py, test_user_task_service_extended.py
|
| UserEvent |
test_user_event_controller.py, test_user_event_service.py
|
| Auth |
test_firebase_auth_controller.py, test_firebase_auth_service.py, test_firebase_auth_dependencies.py
|
| Password |
test_password_controller.py, test_password_service.py, test_password_reset_confirm.py
|
| Ranking |
test_ranking_controller.py, test_ranking_service.py
|
| Account |
test_account_controller.py, test_account_service.py
|
| Infrastructure |
test_firebase.py, test_firebase_storage.py, test_main.py, test_routes.py
|
Executar Testes
# Todos os testes
pytest tests/
# Com cobertura
pytest --cov=app --cov-report=term-missing
# Teste específico
pytest tests/test_user_service.py
Configuração e Deploy
Variáveis de Ambiente
Crie .env com:
# Firebase
FIREBASE_CREDENTIALS_PATH=service-account.json
FIREBASE_STORAGE_BUCKET=your-bucket.appspot.com
# API
DEBUG=true
ALLOWED_ORIGINS=http://localhost:5173,https://taskee.work.gd
Instalação Local
# Criar ambiente virtual
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.venv\Scripts\activate # Windows
# Instalar dependências
pip install -r requirements.txt
# Iniciar servidor
uvicorn app.main:app --reload
Docker
# Build e Run
docker-compose up --build
# Ou manualmente
docker build -t taskee_backend .
docker run -p 8000:8000 taskee_backend
CORS e Segurança
Origins Permitidas
allow_origins=[
"http://localhost:5173", # Frontend local
"https://taskee.work.gd", # Produção
"https://www.taskee.work.gd"
]
Proteção de Rotas
- PUBLIC: Signup, login, reset de senha
- AUTHENTICATED: Perfis, eventos, tarefas, atividades
- ADMIN: Criação de usuários, gestão completa
Fluxos Principais
1. Fluxo de Cadastro e Login
1. POST /account/signup (cria Firebase Auth)
2. Frontend: signInWithEmailAndPassword()
3. Frontend: getIdToken()
4. POST /firebase-auth/verify (valida e sincroniza)
→ Retorna dados do usuário + valida plataforma
2. Fluxo de Inscrição em Evento
1. GET /events/all (usuário vê eventos disponíveis)
2. POST /user_event/register (inscreve com access_code)
3. GET /user_event/my-registrations (confirma inscrição)
3. Fluxo de Resolução de Tarefa
1. GET /tasks/all/{event_id} (lista tarefas)
2. POST /user_tasks/upsert/{tipo}/{user_id}/{event_id}/{task_id}
→ Submete resposta (text/quiz/image)
3. Admin: PUT /user_tasks/evaluate/{user_task_id}
→ Avalia e pontua
4. Atualiza automaticamente total_score no UserEvent
5. GET /ranking/{event_id} (visualiza posição)
4. Fluxo de Ranking
1. Usuário completa tarefas → score atualizado em UserEvent
2. GET /ranking/{event_id} → lista ordenada por pontuação
3. GET /ranking/{event_id}/user/{user_id} → posição específica
Dependências Principais
fastapi # Framework web
firebase-admin # Firebase SDK Python
pydantic[email] # Validação de dados
uvicorn # ASGI server
pytest # Framework de testes
pytest-cov # Cobertura de testes
python-multipart # Upload de arquivos
httpx # Cliente HTTP async
Observações Importantes
- Login não é feito na API: Frontend usa Firebase Client SDK
- Tokens expiram em 1 hora: Frontend deve renovar automaticamente
-
Plataforma web é exclusiva para admins: Validado em
/firebase-auth/verify - Pontuação é automática: Atualizada ao avaliar UserTask (quizzes) ou ao submeter (questões abertas precisam avaliação)
- Upload de arquivos: Banner (events), imagens (activities, challenges) → Firebase Storage
- Soft delete: Activities podem ser desativadas sem perder dados
Suporte e Documentação
-
Swagger UI:
http://localhost:8000/docs - Repositório: Estrutura modular com separação clara de responsabilidades
- Padrão: Controllers → Services → Firestore (DDD simplificado)