- Emanuel Marinho De Jesus Chagas - SP3126617 - EmanuelMJC
- Fabricio Guerra da Silva - SP313671X - Guerrafa
- Gabriel Scopono de Souza - SP3123529 - Scopono
- Nicollas Smid de Oliveira - SP3126412 - Smid1
API do aplicativo Decoreba - Sistema de flashcards com repetição espaçada.
- Node.js com Express.js
- SQLite para banco de dados
- JWT para autenticação
- bcrypt para hash de senhas
- CORS para gerenciamento de requisições cross-origin
-
Clone o repositório e instale as dependências:
npm install
-
Configure as variáveis de ambiente:
# Copie o arquivo de exemplo cp .env.example .env # Edite o arquivo .env com suas configurações
-
Inicie o servidor de desenvolvimento:
npm run dev
id- INTEGER PRIMARY KEY AUTOINCREMENTusername- TEXT NOT NULL UNIQUEemail- TEXT NOT NULL UNIQUEpassword- TEXT NOT NULL (hash bcrypt)
id- INTEGER PRIMARY KEY AUTOINCREMENTuser_id- INTEGER NOT NULL (FK para users)name- TEXT NOT NULLdescription- TEXTcreated_at- DATETIME DEFAULT CURRENT_TIMESTAMP
id- INTEGER PRIMARY KEY AUTOINCREMENTdeck_id- INTEGER NOT NULL (FK para decks)front- TEXT NOT NULL (frente do card)back- TEXT NOT NULL (verso do card)difficulty- TEXT DEFAULT 'new' ('new', 'again', 'hard', 'medium', 'easy')last_studied- DATETIMEnext_review- DATETIMEcreated_at- DATETIME DEFAULT CURRENT_TIMESTAMP
id- INTEGER PRIMARY KEY AUTOINCREMENTuser_id- INTEGER NOT NULL (FK para users)name- TEXT NOT NULL UNIQUE (para o mesmo user_id)
card_id- INTEGER NOT NULL (FK para cards, ON DELETE CASCADE)tag_id- INTEGER NOT NULL (FK para tags, ON DELETE CASCADE)- PRIMARY KEY (card_id, tag_id) - Garante unicidade da associaçã
id- INTEGER PRIMARY KEY AUTOINCREMENTuser_id- INTEGER NOT NULL (FK para users)deck_id- INTEGER (FK para decks, NULLable se for por tag)tag_id- INTEGER (FK para tags, NULLable se for por deck)correct_count- INTEGER NOT NULLincorrect_count- INTEGER NOT NULLsession_date- DATETIME DEFAULT CURRENT_TIMESTAMP
Todas as rotas, exceto POST /auth/register e POST /auth/login, requerem autenticação via Bearer Token
Registra um novo usuário.
Body:
{
"username": "usuario",
"email": "usuario@email.com",
"password": "senha123"
}Autentica um usuário e retorna JWT token.
Body:
{
"email": "usuario@email.com",
"password": "senha123"
}Response:
{
"message": "Login realizado com sucesso!",
"token": "jwt_token_aqui",
"user": {
"id": 1,
"username": "usuario",
"email": "usuario@email.com"
}
}Lista todos os decks do usuário autenticado, incluindo contagem total de cards e cards prontos para revisão.
Obtém um deck específico por ID.
Cria um novo deck.
Body:
{
"name": "Inglês Básico",
"description": "Vocabulário básico de inglês"
}Atualiza um deck existente.
Remove um deck e todos os cards associados.
Retorna cards prontos para revisão baseado na repetição espaçada.
Lógica de repetição:
- Cards
new: sempre retornados - Cards
easy: revisão após 4 dias - Cards
medium: revisão após 2 dias - Cards
hard: revisão após 1 dia
Lista todos os cards de um deck específico, incluindo suas tags associadas.
Cria um novo card em um deck. Pode incluir tags (nomes das tags). Se a tag não existir, ela será criada e associada.
Body:
{
"front": "Hello",
"back": "Olá",
"tags": ["Vocabulário", "Saudações"]
}Obtém um card específico por ID, incluindo suas tags associadas.
Atualiza um card existente. Pode atualizar front, back e as tags (substituindo associações existentes).
Body:
{
"front": "Good morning",
"back": "Bom dia",
"tags": ["Vocabulário", "Manhã"]
}Remove um card.
Marca a dificuldade de um card após o estudo com um rating de 1 a 5.
Body:
{
"rating": 3 // 1: Não lembrei/errei, 2: Difícil, 3: Lembrei com ressalvas, 4: Fácil, 5: Na ponta da língua
}Response (exemplo):
{
"message": "Dificuldade marcada com sucesso!",
"new_difficulty": "medium",
"next_review": "2023-11-01T15:30:00.000Z"
}Reseta o progresso de estudo de um card individual (difficulty='new', last_studied=NULL, next_review=NULL).
Reseta o progresso de estudo de todos os cards de um deck específico.
Retorna cards prontos para revisão de um deck específico, ordenados pela lógica de SRS. Inclui tags dos cards.
Retorna cards prontos para revisão associados a uma tag específica, ordenados pela lógica de SRS. Inclui tags dos cards.
Lista todas as tags criadas pelo usuário autenticado.
Lista todas as tags associadas a um card específico.
Cria uma nova tag para o usuário.
Body:
{
"name": "Programação"
}Associa uma tag existente a um card.
Body:
{
"tagId": 5 // ID da tag a ser associada
}Remove uma tag. Todas as associações card_tags com esta tag serão removidas automaticamente.
Remove a associação de uma tag específica a um card.
Registra uma nova sessão de estudo.
Body (exemplo - por deck):
{
"deckId": 1,
"correctCount": 10,
"incorrectCount": 2
}Body (exemplo - por tag):
{
"tagId": 3,
"correctCount": 5,
"incorrectCount": 1
}Obtém o histórico de todas as sessões de estudo do usuário. Suporta filtros por deckId, tagId, limit e offset.
GET /reports/history?deckId=1&limit=10&offset=0
Retorna estatísticas gerais de estudo do usuário (total de acertos, erros, sessões).
Retorna estatísticas de estudo agrupadas por deck.
Retorna estatísticas de estudo agrupadas por tag.
Para acessar rotas protegidas, inclua o token JWT no header:
Authorization: Bearer seu_jwt_token_aqui
O sistema implementa repetição espaçada baseada em 5 níveis de dificuldade, ajustando a data da próxima revisão dinamicamente:
- Rating 1: "Não lembrei/errei" (difficulty: 'again'): Em 10 minutos
- Rating 2: "Díficil de lembrar/Lembrei só algumas partes" (difficulty: 'hard'): Em 1 dia
- Rating 3: "Lembrei, mas esqueci alguns pontos" (difficulty: 'medium'): Em 3 dias
- Rating 4: "Foi fácil de lembrar" (difficulty: 'easy'): Em 7 dias
- Rating 5: "A resposta está na ponta da língua" (difficulty: 'easy'): Em 14 dias
O algoritmo considera:
- Cards marcados como new (nunca estudados) ou again são priorizados.
- Cards com
next_reviewvencido ou null são retornados - Ordenação por difficulty e next_review para garantir a melhor sequência de estudo.
- Registro/Login - Criar conta e obter token de autenticação.
- Gerenciar Decks - Criar, visualizar, atualizar e deletar baralhos para organizar cards.
- Gerenciar Tags - Criar, visualizar e deletar tags para categorizar cards de forma flexível.
- Adicionar Cards - Criar flashcards em um deck, associando-os a uma ou mais tags no momento da criação ou posteriormente.
- Estudar por Deck ou Tag - Usar /decks/:deckId/study ou /decks/study/tag/:tagId para obter cards prontos para revisão.
- Marcar Dificuldade - Após estudar cada card, marcar sua dificuldade (rating 1-5) para agendar a próxima revisão.
- Monitorar Progresso - Consultar os endpoints /reports para visualizar histórico de sessões e estatísticas gerais ou por deck/tag.
- Resetar Progresso - Caso necessário, resetar o progresso de estudo de cards individuais ou de um deck inteiro.
Copie o arquivo .env.example para .env e configure as seguintes variáveis:
PORT=3000
DATABASE_URL=./src/database/decoreba.sqlite
JWT_SECRET=sua_chave_secreta_super_forte_aqui
``