Gerenciador de tarefas

Conheça o projeto

Nesse desafio, você vai desenvolver uma API para um sistema de Gerenciamento de Tarefas com Node.js. Os usuários poderão criar contas, autenticar-se com segurança e gerenciar suas tarefas. Cada tarefa poderá ser atribuída a membros do time, classificada por status e prioridade, e o progresso poderá ser acompanhado de forma simples e organizada.

Instruções

Estrutura, regras e requisitos do projeto

1. Requisitos

Tecnologias e Recursos

  • Backend Node.js:
    • Framework: Express.js;
    • Banco de dados: PostgreSQL;
    • ORM: Prisma.
  • Testes:
    • Framework de testes: Jest
  • Deploy:
    • Deploy do backend em Render.
  • Outros:
    • Docker;
    • TypeScript;
    • Validação com Zod;
    • JWT.

2. Funcionalidades da aplicação

Autenticação e Autorização

  • Deve ser possível criar uma conta e iniciar uma sessão;
  • JWT para autenticação;
  • Níveis de acesso:
    • Administrador: gerencia usuários e equipes;
    • Membro: gerencia tarefas atribuídas.

Gerenciamento de Times

  • Apenas o usuário admin pode criar e editar times;
  • Apenas o usuário admin pode adicionar ou remover membros do time.

Tarefas

  • CRUD de tarefas (criar, ler, atualizar, deletar);
  • Status: "Pendente", "Em progresso", "Concluído";
  • Prioridade: "Alta", "Média", "Baixa";
  • Atribuição de tarefas para membros específicos.

Usuário Admin

  • Visualizar e gerenciar todas as tarefas, usuários e times.

Member

  • Visualiza tarefas do time;
  • Pode editar apenas suas tarefas.

Exemplo de estrutura para o banco de dados

  • Tabela: users que armazena informações dos usuários do sistema:
CampoTipoDescrição
idINTEGERIdentificador único (PK).
nameVARCHAR(100)Nome do usuário.
emailVARCHAR(150)E-mail do usuário (único).
passwordVARCHAR(255)Senha criptografada do usuário.
roleENUM('admin', 'member')Nível de acesso do usuário.
created_atTIMESTAMPData e hora de criação.
updated_atTIMESTAMPData e hora da última atualização.

  • Tabela: teams que representa os times/equipes de trabalho:
CampoTipoDescrição
idINTEGERIdentificador único (PK).
nameVARCHAR(100)Nome do time.
descriptionTEXTDescrição opcional do time.
created_atTIMESTAMPData e hora de criação.
updated_atTIMESTAMPData e hora da última atualização.

  • Tabela: team_members que relaciona usuários com times:
CampoTipoDescrição
idINTEGERIdentificador único (PK).
user_idINTEGERReferência para o usuário (users.id).
team_idINTEGERReferência para o time (teams.id).
created_atTIMESTAMPData e hora de criação.

Relacionamento:

  • user_id → FK para users.id
  • team_id → FK para teams.id

  • Tabela: tasks armazena as tarefas criadas:
CampoTipoDescrição
idINTEGERIdentificador único (PK).
titleVARCHAR(200)Título da tarefa.
descriptionTEXTDescrição detalhada opcional da tarefa.
statusENUM('pending', 'in_progress', 'completed')Status da tarefa.
priorityENUM('high', 'medium', 'low')Prioridade da tarefa.
assigned_toINTEGERReferência para o usuário responsável pela tarefa (users.id).
team_idINTEGERReferência para o time ao qual a tarefa pertence (teams.id).
created_atTIMESTAMPData e hora de criação.
updated_atTIMESTAMPData e hora da última atualização.

Relacionamento:

  • assigned_to → FK para users.id
  • team_id → FK para teams.id

  • Tabela tasks_history que armazena mudanças de status e atualizações das tarefas.
CampoTipoDescrição
idINTEGERIdentificador único (PK).
task_idINTEGERReferência para a tarefa (tasks.id).
changed_byINTEGERReferência para o usuário que fez a alteração (users.id).
old_statusENUMStatus anterior da tarefa.
new_statusENUMNovo status da tarefa.
changed_atTIMESTAMPData e hora da alteração.

Relacionamento:

  • task_id → FK para tasks.id
  • changed_by → FK para users.id

3. Desenvolvendo o projeto

Para desenvolver esse projeto, recomendamos utilizar as principais tecnologias que utilizamos durante o desenvolvimento do primeiro módulo da formação.

Caso você tenha alguma dificuldade você pode ir no nosso fórum e deixar sua dúvida por lá!

Após terminar o desafio, caso você queira, você pode tentar dar o próximo passo e deixar a aplicação com a sua cara. Tente mudar o layout, cores, ou até adicionar novas funcionalidades para ir além! 🚀


4. Entrega

Após concluir o desafio, você deve enviar a URL do seu código no Github.

Além disso, que tal fazer um post no LinkedIn compartilhando o seu aprendizado e contando como foi a experiência? É uma excelente forma de demonstrar seus conhecimentos e atrair novas oportunidades!

Obs: Se você se sentir à vontade, pode postar um print do resultado final e nos marcar! Vai ser incrível acompanhar a sua evolução! 💜


5. Considerações finais

Lembre-se que o intuito de um desafio é te impulsionar, por isso, dependendo do desafio, pode ser que você precise ir além do que foi discutido em sala de aula. Mas isso não é algo ruim: ter autonomia para buscar informações extras é uma habilidade muito valiosa e vai ser ótimo pra você treinar ela aqui com a gente!

E lembre-se: tenha calma! Enfrentar desafios faz parte do seu processo de aprendizado!

Se precisar de alguma orientação ou suporte, estamos aqui com você! Bons estudos e boa prática! 💜


Feito com 💜 por Rocketseat 👋

Tarefas

Use este checklist para ajudar a organizar a sua entrega

Projetos relacionados