Skip to content

TrainRecord é uma aplicação desenvolvida em .NET C# com a finalidade de gerenciar atividades de academia para alunos e professores.

License

Notifications You must be signed in to change notification settings

GustavoM96/TrainRecord

Repository files navigation

drawing

TrainRecord🏋️‍♀️

.NET Tests


TrainRecord é uma aplicação desenvolvida em .NET C# com a finalidade de gerenciar atividades de academia para alunos e monitoramento para os professores.

Temos 3 tipos de users:

  • Adm (usuário dono do app)
  • Aluno (usuário que cadastra as atividades realizadas e sua evolução nelas)
  • Professor (usuário que apenas acompanha o desenvolvimento de seus alunos)

Índice 🗂️

Tecnologias 💻

  • AspNet.Core SDK 7.0.100-rc.2.22477.23

Pacotes

  • Mediatr: para gerenciar comandos e queries no padrão CQRS.
  • FluentValidation: para validação dos campos de request.
  • Mapster: para mapeamento dos objetos com Adapt<>().
  • ErrorOr: para retorno de api com erro ou o response.
  • Jwt: para autenticação do usuário.
  • PasswordHasher: hasher de senha do usuário com bcrypt.net.
  • Sqlite: apenas como banco de dados de desenvolvimento.
  • Xunit: projeto de testes de unidade.
  • Moq: mocar dependencias para testes.
  • Testcontainers: gerar conteiners de banco de dados para testes de integração.

Tools

  • csharpier.
  • husky.

para a instalação dos tools deste projeto, basta executar o build do projeto TrainRecord.Api.csproj com o seguinte comando em seu terminal

dotnet build

Prettier

Como formatador de C# está sendo utilizado o csharpier e suas configurações estão no arquivo .csharpierrc.json localizado na raiz deste projeto.

Husky

As mensagens de commits deste repo seguem o seguinte regex ^(feat|fix|ci|chore|docs|test|style|refactor|perf|build|revert)(\(.+?\))?: .{1,}$.

No pré-commit executamos o comando dotnet csharpier . para formatar antes do commit e rodamos os testes para garantir a qualidade do código.

Rodando a aplicação ⚙️

Via Localmente

Simplesmente em seu terminal.

git clone https://github.com/GustavoM96/TrainRecord.git
dotnet build
dotnet run --project src/TrainRecord.Api

Via Docker

Simplesmente em seu terminal.

git clone https://github.com/GustavoM96/TrainRecord.git
docker compose up

Arquitetura 🏛️

Pastas

Docs

  • release: contém dados de cada release.
  • todo: contendo os requesitos de desenvolvimento.

Src

drawing

  • Api - Camada de configuração de api, direcionar os dados de request e response para o usuário.

  • Application - Camada responsável por criar os comandos e queries que conecta a api com a Infrastructure no padrão CQRS.

  • Core - Camada de entidades, enums, exceptions e regras de negócio.

  • Infrastructure - Camada que obtem dados externos como api, banco de dados, filas e outros.

Assets

  • contém imagens utilizadas.

Tests

  • Teste de unidade, para verificar se os comandos e queries estão sendo executado como devem.

  • Testes de integração, para verificar o retorno das respostas api

Documentação API 💼

Diagramas

  • Fluxos do usuário

    drawing
  • Mapeamento das rotas

    drawing
  • Entidades de Banco de dados

    drawing

Rotas Autenticação

Criar conta

  • Autenticação: Anônimo.
  • Detalhes: registrar usuário dentro da plataforma.

Request

Post /api/auth/register
{
  "email": "josé[email protected]",
  "password": "sd#fd$904&3jkdf",
  "firstName": "José",
  "lastName": "Silva",
  "Role": 1
}

Response 201 Created

{
  "id": "00000000-0000-0000-0000-000000000000",
  "email": "josé[email protected]",
  "firstName": "José",
  "lastName": "Silva",
  "Role": 1
}

Login conta

  • Autenticação: Anônimo.
  • Detalhes: autenticação do usuário.

Request

Post /api/auth/login
{
  "email": "josé[email protected]",
  "password": "sd#fd$904&3jkdf"
}

Response 200 Ok

{ "idToken": "fs432jnj543hb-lsdsdasdsadasd-df4545" }

Trocar Senha

  • Autenticação: Dono do Recurso.
  • Detalhes: Trocar Senha.

Request

Post /api/auth/changePassword
{
  "email": "josé[email protected]",
  "password": "sd#fd$904&3jkdf",
  "newPassword": "sd#fd$904&3jkdf#NovaSenha"
}

Response 204 NoContent

Sem corpo de resposta

Rotas Usuário

Listar todas os Usuários

  • Autenticação: Apenas Adm.
  • Detalhes: Obter todos os usuários cadastrados na plataforma.
Get /api/user

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "email": "josé[email protected]",
      "firstName": "José",
      "lastName": "Silva"
    },
    {
      "id": "00000000-0000-0000-0000-000000000001",
      "email": "[email protected]",
      "firstName": "Caio",
      "lastName": "Costa"
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Atualizar dados do usuário

  • Autenticação: Dono do recurso.
  • Detalhes: Atualizar dados dos usuário.
Patch /api/user/{userId}

Request

{ "firstName": "José#NomeTrocado" }

Response 200 Ok

{
  "id": "00000000-0000-0000-0000-000000000000",
  "email": "josé[email protected]",
  "firstName": "José#NomeTrocado",
  "lastName": "Silva"
}

Obter dados de usuário por id

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Obter dados de usuário por id.
Get /api/user/{idUser}

Request

sem corpo de requisição

Response 200 Ok

{
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "email": "josé[email protected]",
      "firstName": "José",
      "lastName": "Silva"
    }
}

Rotas Atividade

Adicionar uma nova atividade

  • Autenticação: Apenas Adm.
  • Detalhes: Adicionar uma nova atividade dentro da plataforma.
Post /api/activity

Request

{
  "name": "flexão de braço"
}

Response 201 Created

{
  "id": "00000000-0000-0000-0000-000000000000",
  "name": "flexão de braço"
}

Listar todas as atividade

  • Autenticação: usuários autenticados,
  • Detalhes: Listar todas as atividade
Get /api/activity

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "name": "flexão de braço"
    },
    {
      "id": "00000000-0000-0000-0000-000000000001",
      "name": "pular corda"
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Rotas Record

Adicionar record de atividade

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Adicionar registro de alteração de atividade do aluno.
Post /api/user/{userID}/activity/{id}/record

Request

{
  "weight": 20,
  "repetition": 4,
  "serie": 2
}

Response 201 Created

{
  "userId": "00000000-0000-0000-0000-000000000000",
  "activityId": "00000000-0000-0000-0000-000000000000",
  "weight": 20,
  "repetition": 4,
  "serie": 2
}

Listar todos os records de uma atividade do aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Listar todas os records de um aluno em uma atividade.
Get /api/user/{userId}/activity/{activityId}/record

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "userId": "00000000-0000-0000-0000-000000000000",
      "activityId": "00000000-0000-0000-0000-000000000000",
      "weight": 0,
      "repetition": 30,
      "serie": 2,
      "id": "00000000-0000-0000-0000-000000000000"
    },
    {
      "userId": "00000000-0000-0000-0000-000000000000",
      "activityId": "00000000-0000-0000-0000-000000000000",
      "weight": 0,
      "repetition": 100,
      "serie": 5,
      "id": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Deletar Record por id

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Deletar Record por id.
Delete /api/user/{userId}/record/{recordId}

Request

sem corpo de requisição

Response 204 NoContent

sem corpo de resposta

Deletar Record por atividade do aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Deletar Record por atividade do aluno.
Delete /api/user/{userId}/activity/{activityId}/record

Request

sem corpo de requisição

Response 204 NoContent

sem corpo de resposta

Rotas de Professor

Vincular professor no aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Vincular aluno no professor.
Post /api/teacher/{userId}/student/{studentId}

Request

Sem corpo de requisição

Response 200 Ok

{
  "studentId": "00000000-0000-0000-0000-000000000000",
  "teacherId": "00000000-0000-0000-0000-000000000001"
}

Listar todas os Professores

  • Autenticação: Autenticado.
  • Detalhes: Listar todas os Professores.
Get /api/teacher

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "email": "prof.josé[email protected]",
      "firstName": "José",
      "lastName": "Silva",
      "Role": 2
    },
    {
      "id": "00000000-0000-0000-0000-000000000001",
      "email": "[email protected]",
      "firstName": "Caio",
      "lastName": "Costa",
      "Role": 2
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Listar todas os Alunos por professor

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Listar todas os Alunos por professor.
Get /api/teacher/{userId}/student

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "email": "aluno.josé[email protected]",
      "firstName": "José",
      "lastName": "Silva",
      "Role": 1
    },
    {
      "id": "00000000-0000-0000-0000-000000000001",
      "email": "[email protected]",
      "firstName": "Caio",
      "lastName": "Costa",
      "Role": 1
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Remover aluno por professor

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Remover aluno por professor.
Delete /api/teacher/{userId}/student/{studentId}

Request

sem corpo de requisição

Response 204 NoContent

sem corpo de resposta

Rotas de Aluno

Listar todas os professores do aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Listar todas os professores do aluno.
Get /api/student/{userId}/teacher

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "id": "00000000-0000-0000-0000-000000000000",
      "email": "prof.josé[email protected]",
      "firstName": "José",
      "lastName": "Silva",
      "Role": 2
    },
    {
      "id": "00000000-0000-0000-0000-000000000001",
      "email": "[email protected]",
      "firstName": "Caio",
      "lastName": "Costa",
      "Role": 2
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Vincular aluno no professor

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Vincular aluno no professor.
Post /api/student/{userId}/teacher/{teacherId}

Request

Sem corpo de requisição

Response 200 Ok

{
  "studentId": "00000000-0000-0000-0000-000000000000",
  "teacherId": "00000000-0000-0000-0000-000000000001"
}

Remover professor por aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Remover professor por aluno.
Delete /api/student/{userId}/teacher/{teacherId}

Request

sem corpo de requisição

Response 204 NoContent

sem corpo de resposta

Listar todas as atividades do aluno

  • Autenticação: Apenas o dono do recurso.
  • Detalhes: Listar todas as atividades que o aluno participa.
Get /api/student/{userId}/activity

Request

sem corpo de requisição

Response 200 Ok

{
  "items": [
    {
      "name": "pular corda",
      "id": "00000000-0000-0000-0000-000000000000"
    },
    {
      "name": "flexão de braço",
      "id": "00000000-0000-0000-0000-000000000000"
    }
  ],
  "perPage": 2,
  "pageNumber": 4
}

Release 📦

  • 0.1.0
    • Public release

Autores 🧑‍🤝‍🧑

License 🪪

This project is licensed under the terms of the MIT license.

Star ⭐

Espero que tenha gostado do projeto, se sim, não esqueça de dar a sua ⭐

About

TrainRecord é uma aplicação desenvolvida em .NET C# com a finalidade de gerenciar atividades de academia para alunos e professores.

Resources

License

Code of conduct

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages