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:
usersque armazena informações dos usuários do sistema:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| name | VARCHAR(100) | Nome do usuário. |
| VARCHAR(150) | E-mail do usuário (único). | |
| password | VARCHAR(255) | Senha criptografada do usuário. |
| role | ENUM('admin', 'member') | Nível de acesso do usuário. |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
- Tabela:
teamsque representa os times/equipes de trabalho:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| name | VARCHAR(100) | Nome do time. |
| description | TEXT | Descrição opcional do time. |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
- Tabela:
team_membersque relaciona usuários com times:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| user_id | INTEGER | Referência para o usuário (users.id). |
| team_id | INTEGER | Referência para o time (teams.id). |
| created_at | TIMESTAMP | Data e hora de criação. |
Relacionamento:
user_id→ FK parausers.idteam_id→ FK parateams.id
- Tabela:
tasksarmazena as tarefas criadas:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| title | VARCHAR(200) | Título da tarefa. |
| description | TEXT | Descrição detalhada opcional da tarefa. |
| status | ENUM('pending', 'in_progress', 'completed') | Status da tarefa. |
| priority | ENUM('high', 'medium', 'low') | Prioridade da tarefa. |
| assigned_to | INTEGER | Referência para o usuário responsável pela tarefa (users.id). |
| team_id | INTEGER | Referência para o time ao qual a tarefa pertence (teams.id). |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
Relacionamento:
assigned_to→ FK parausers.idteam_id→ FK parateams.id
- Tabela
tasks_historyque armazena mudanças de status e atualizações das tarefas.
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| task_id | INTEGER | Referência para a tarefa (tasks.id). |
| changed_by | INTEGER | Referência para o usuário que fez a alteração (users.id). |
| old_status | ENUM | Status anterior da tarefa. |
| new_status | ENUM | Novo status da tarefa. |
| changed_at | TIMESTAMP | Data e hora da alteração. |
Relacionamento:
task_id→ FK paratasks.idchanged_by→ FK parausers.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 👋
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:
usersque armazena informações dos usuários do sistema:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| name | VARCHAR(100) | Nome do usuário. |
| VARCHAR(150) | E-mail do usuário (único). | |
| password | VARCHAR(255) | Senha criptografada do usuário. |
| role | ENUM('admin', 'member') | Nível de acesso do usuário. |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
- Tabela:
teamsque representa os times/equipes de trabalho:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| name | VARCHAR(100) | Nome do time. |
| description | TEXT | Descrição opcional do time. |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
- Tabela:
team_membersque relaciona usuários com times:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| user_id | INTEGER | Referência para o usuário (users.id). |
| team_id | INTEGER | Referência para o time (teams.id). |
| created_at | TIMESTAMP | Data e hora de criação. |
Relacionamento:
user_id→ FK parausers.idteam_id→ FK parateams.id
- Tabela:
tasksarmazena as tarefas criadas:
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| title | VARCHAR(200) | Título da tarefa. |
| description | TEXT | Descrição detalhada opcional da tarefa. |
| status | ENUM('pending', 'in_progress', 'completed') | Status da tarefa. |
| priority | ENUM('high', 'medium', 'low') | Prioridade da tarefa. |
| assigned_to | INTEGER | Referência para o usuário responsável pela tarefa (users.id). |
| team_id | INTEGER | Referência para o time ao qual a tarefa pertence (teams.id). |
| created_at | TIMESTAMP | Data e hora de criação. |
| updated_at | TIMESTAMP | Data e hora da última atualização. |
Relacionamento:
assigned_to→ FK parausers.idteam_id→ FK parateams.id
- Tabela
tasks_historyque armazena mudanças de status e atualizações das tarefas.
| Campo | Tipo | Descrição |
|---|---|---|
| id | INTEGER | Identificador único (PK). |
| task_id | INTEGER | Referência para a tarefa (tasks.id). |
| changed_by | INTEGER | Referência para o usuário que fez a alteração (users.id). |
| old_status | ENUM | Status anterior da tarefa. |
| new_status | ENUM | Novo status da tarefa. |
| changed_at | TIMESTAMP | Data e hora da alteração. |
Relacionamento:
task_id→ FK paratasks.idchanged_by→ FK parausers.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