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)
- AspNet.Core SDK 7.0.100-rc.2.22477.23
- 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.
- 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
Como formatador de C# está sendo utilizado o csharpier e suas configurações estão no arquivo .csharpierrc.json localizado na raiz deste projeto.
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.
Simplesmente em seu terminal.
git clone https://github.com/GustavoM96/TrainRecord.git
dotnet build
dotnet run --project src/TrainRecord.Api
Simplesmente em seu terminal.
git clone https://github.com/GustavoM96/TrainRecord.git
docker compose up
- release: contém dados de cada release.
- todo: contendo os requesitos de desenvolvimento.
-
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.
- contém imagens utilizadas.
-
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
- Autenticação: Anônimo.
- Detalhes: registrar usuário dentro da plataforma.
Post /api/auth/register
{
"email": "josé[email protected]",
"password": "sd#fd$904&3jkdf",
"firstName": "José",
"lastName": "Silva",
"Role": 1
}
{
"id": "00000000-0000-0000-0000-000000000000",
"email": "josé[email protected]",
"firstName": "José",
"lastName": "Silva",
"Role": 1
}
- Autenticação: Anônimo.
- Detalhes: autenticação do usuário.
Post /api/auth/login
{
"email": "josé[email protected]",
"password": "sd#fd$904&3jkdf"
}
{ "idToken": "fs432jnj543hb-lsdsdasdsadasd-df4545" }
- Autenticação: Dono do Recurso.
- Detalhes: Trocar Senha.
Post /api/auth/changePassword
{
"email": "josé[email protected]",
"password": "sd#fd$904&3jkdf",
"newPassword": "sd#fd$904&3jkdf#NovaSenha"
}
Sem corpo de resposta
- Autenticação: Apenas Adm.
- Detalhes: Obter todos os usuários cadastrados na plataforma.
Get /api/user
sem corpo de requisição
{
"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
}
- Autenticação: Dono do recurso.
- Detalhes: Atualizar dados dos usuário.
Patch /api/user/{userId}
{ "firstName": "José#NomeTrocado" }
{
"id": "00000000-0000-0000-0000-000000000000",
"email": "josé[email protected]",
"firstName": "José#NomeTrocado",
"lastName": "Silva"
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Obter dados de usuário por id.
Get /api/user/{idUser}
sem corpo de requisição
{
{
"id": "00000000-0000-0000-0000-000000000000",
"email": "josé[email protected]",
"firstName": "José",
"lastName": "Silva"
}
}
- Autenticação: Apenas Adm.
- Detalhes: Adicionar uma nova atividade dentro da plataforma.
Post /api/activity
{
"name": "flexão de braço"
}
{
"id": "00000000-0000-0000-0000-000000000000",
"name": "flexão de braço"
}
- Autenticação: usuários autenticados,
- Detalhes: Listar todas as atividade
Get /api/activity
sem corpo de requisição
{
"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
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Adicionar registro de alteração de atividade do aluno.
Post /api/user/{userID}/activity/{id}/record
{
"weight": 20,
"repetition": 4,
"serie": 2
}
{
"userId": "00000000-0000-0000-0000-000000000000",
"activityId": "00000000-0000-0000-0000-000000000000",
"weight": 20,
"repetition": 4,
"serie": 2
}
- 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
sem corpo de requisição
{
"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
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Deletar Record por id.
Delete /api/user/{userId}/record/{recordId}
sem corpo de requisição
sem corpo de resposta
- Autenticação: Apenas o dono do recurso.
- Detalhes: Deletar Record por atividade do aluno.
Delete /api/user/{userId}/activity/{activityId}/record
sem corpo de requisição
sem corpo de resposta
- Autenticação: Apenas o dono do recurso.
- Detalhes: Vincular aluno no professor.
Post /api/teacher/{userId}/student/{studentId}
Sem corpo de requisição
{
"studentId": "00000000-0000-0000-0000-000000000000",
"teacherId": "00000000-0000-0000-0000-000000000001"
}
- Autenticação: Autenticado.
- Detalhes: Listar todas os Professores.
Get /api/teacher
sem corpo de requisição
{
"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
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Listar todas os Alunos por professor.
Get /api/teacher/{userId}/student
sem corpo de requisição
{
"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
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Remover aluno por professor.
Delete /api/teacher/{userId}/student/{studentId}
sem corpo de requisição
sem corpo de resposta
- Autenticação: Apenas o dono do recurso.
- Detalhes: Listar todas os professores do aluno.
Get /api/student/{userId}/teacher
sem corpo de requisição
{
"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
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Vincular aluno no professor.
Post /api/student/{userId}/teacher/{teacherId}
Sem corpo de requisição
{
"studentId": "00000000-0000-0000-0000-000000000000",
"teacherId": "00000000-0000-0000-0000-000000000001"
}
- Autenticação: Apenas o dono do recurso.
- Detalhes: Remover professor por aluno.
Delete /api/student/{userId}/teacher/{teacherId}
sem corpo de requisição
sem corpo de resposta
- Autenticação: Apenas o dono do recurso.
- Detalhes: Listar todas as atividades que o aluno participa.
Get /api/student/{userId}/activity
sem corpo de requisição
{
"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
}
- 0.1.0
- Public release
- Gustavo Henrique Messias GitHub | Porttfolio
This project is licensed under the terms of the MIT license.
Espero que tenha gostado do projeto, se sim, não esqueça de dar a sua ⭐