Skip to content

FullStack-Education/M3P-BackEnd-Squad1

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

56 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Scholargate - Plataforma de Gestão para Educação

Sobre o projeto

O sistema Scholargate consiste em uma aplicação web direcionada à gestão de um ambiente educacional, ela engloba o cadastramento de Professores, Alunos, Cursos, Turmas, Matérias e Notas, bem como realiza a gestão e controle desses relacionamentos.

O Software foi desenvolvido pensando na integração das informações com um sistema de dados sólido, escalável, que permita a alocação e acesso célere aos recursos educacionais necessários à atividade de ensino.

Com a implementação de recursos de tecnologia da informação certamente poderemos imprimir agilidade e eficiência de gestão no trato administrativo de sistemas e estruturas de ensino, seja ele básico ou superior.

Não menos importante, ainda podemos citar a facilidade de acesso aos dados por parte de qualquer usuário por meio da rede mundial de computadores, disponibilizando as informações em qualquer tempo e local do globo, desde que provido de acesso a internet.

Tecnologias utilizadas

Back end

  • Java
  • Spring Boot
  • Spring Security - JWT Token
  • Swaggeg para documentação
  • JPA / Hibernate
  • Maven
  • PostegreSQL (cliente ou docker)
  • Docker (Dockerfile e Docker-compose)

Artefato

modulo1_proj.avaliativo

Swagger - Lista de endpoints e retorno

http://localhost:8080/v3/api-docs

http://localhost:8080/swagger-ui/index.html

Clonar repositório - Back-end

https://github.com/FullStack-Education/M3P-BackEnd-Squad1

Clonar repositório - Front-end

https://github.com/FullStack-Education/M3P-FrontEnd-Squad1

Trello

https://trello.com/b/n0OCGxwR/m3p-backend-squad-1

Execução e cuidados

Inicialmente, gizamos que a presente aplicação foi refatorada para uso do front-end acima referenciado, mas nada obsta ao seu uso por meio dos endpoins disponibilizados.

A execução da aplicação não reclama maiores cuidados, havendo o arquivo data.sql a gerar os cadastros iniciais para operação do sistemas. Salientamos, todavia, que o aspecto de usuário encontra-se dissociado da role posteriormente a se agregada. A exemplo disso temos o usuário 'admin', com senha '123', que encontra-se dissociado de qualquer outro papel Aluno ou Professor. A tentativa de se criar entidade Aluno/Professor sem usuário relacionado irá retornar um erro.

    public DtoAlunoResponse criarAluno(DtoAlunoRequest aluno) {
        if (!usuarioRepo.existsById(aluno.getUsuario_id())){
            logger.error("Necessário um usuário cadastrado para se criar novo Aluno");
            throw new ResponseStatusException(
                    HttpStatus.NOT_FOUND, "Impossível criar um Aluno sem um usuário não cadastrado."
            );
        }

Caso o cliente deseje criar um novo perfil, deverá inicialmente logar como administrador e realizar os cadastros mediante o token de autenticação fornecido pelo Spring Security. Nada obstante, reiteramos, o cadastro de Professor ou Aluno, importa no registro de um usuário respectiovo, o qual comporta senha/login e papel/role.

Sendo feito o uso do front-end em conjunto, o cadastramento das duas entidades é feito de forma automática pela aplicação em Angular, já aqui depende de requisição distinta e sequencial.

Qualquer que seja o caso, é primordial efetivar o cadastramento de novo ADMIN com senha diversa da padrão (login: root / senha:root).

Independente dos dados 'mockados', acrescentamos ainda a importância da ordem de cadastros junto ao sistema, em face de suas inequívocas dependências que visam a garantia da integridade dos dados.

Assim, a ordem seguida pelas requisições do Postman é sugerida (arquivo presente no projeto "/postman"), dado que, a exemplo do cadastro de Notas, não poderão elas ser cadastradas sem o anterior cadastro de Curso, Turma e Aluno.

A atribuição de Professor a um Curso ou Turma, entretanto, foi propositalemente deixada em aberto, dado que tais elementos podem ser criados posteriormente, com a inclusão do Docente, permitindo que seja alterado o Professor, ou outro seja atribuído.

Para uso do Postman pode-se usar o login inicial de admin:

        {
        "login": "admin",
        "senha": "123"
        }

Anotamos que os mocks inseridos através do data.sql não contemplam necessariamente todos os campos de preenchimento obrigatório do Front-End, servindo apenas de 'start' ou exemplo para a inicialização do sistema.

Por fim, colacionamos as especificações do application.properties:

spring.application.name=modulo1_proj.avaliativo

server.error.include-message=always

modulo1_proj.avaliativo.security.token.secret=${JWT_SECRET:senha-secreta}

spring.datasource.url=jdbc:postgresql://localhost:${PORT:5432}/${POSTGRES_DB:postgres}
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always

spring.jpa.show-sql=true

Modelo para application.properties

spring.application.name=modulo1_proj.avaliativo

server.error.include-message=always

modulo1_proj.avaliativo.security.token.secret=${JWT_SECRET:senha-secreta}

spring.datasource.url=jdbc:postgresql://localhost:${PORT:5432}/${POSTGRES_DB:postgres}
spring.datasource.username=postgres
spring.datasource.password=postgres

spring.jpa.hibernate.ddl-auto=update
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect

spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always

spring.jpa.show-sql=true

Considerações sobre a Segurança (importante!)

O sistema de segurança faz uso de autenticação stateless (Bearer Authentication), enviando um token ao usuario cadastrado que solicite login e, através dele, gerenciando as suas credenciais e "role" de acesso ao sistema.

Uma fez feito um cadastro de usuário, o seu login é armazenado no banco de dados (String), bem como sua senha em criptografada (hash).

Ao enviar suas credenciais para o serviço de login (POST) o sistema criptografa a senha recebida e a compara com a hash presente no banco de dados. Sendo positiva a comparação, retorna o token de autenticação ao usuário sem guardar estado.

Desta forma, o usuário ao se valer do Postman deverá incialmente realizar seu login com o usuário pretendido, recebendo o token de autenticação.

Na sequência, poderá realizar as operações em cada endpoint fazendo uso da chave/tolken recebida junto a guia ou header "Authentication".

Melhorias a serem implementadas

Como sugestões ao aprimoramento do projeto podemos citar o controle em cascata para a deleção ou atualização de dados, que pode não ser exatamente oportuna em um sistema educacional, notadamente onde a preservação do histórico escolar e notas é de interesse da instituição e dos próprios alunos.

Também vale acrescentar a utilidade de se adicionar a funcionalidade de cálculo de média por matéria, item não previsto no projeto.

MER - Relacionamento entre entidades

MER

Endpoints disponibilizados

Os endpoints encontram-se listados abaixo, a par da própria docunmentação com Swagger do projeto. Reiteramos que a aplicação foi desenvolvida para uso conjunto com o front-end, nada obstante responde a qualquer outra nos termos aqui apresentados.

POST /dashboard

Funcionalidade nova agregada ao projeto final objetivando o retorno dos dados de número de alunos cadastrados, docentes e turmas. Integra estrura própria dentro da aplicação, trabalhando com os respectivos services para prover as estatísticas de uso do software.

@RestController
@RequestMapping("/dashboard")
public class DashboardController {

    private static final Logger logger = LoggerFactory.getLogger(DashboardController.class);
    private final DashBoadService dashBoadService;

    public DashboardController(DashBoadService dashBoadService) {
        this.dashBoadService = dashBoadService;
    }

    @GetMapping
    public ResponseEntity<DtoDashBoard> listarCursos() {
        logger.info("Solicitadas estatísticas para DashBoard.");
        return ResponseEntity.status(HttpStatus.OK).body(dashBoadService.buscarEstatisticas());
    }
}

POST /login

Direcionado ao acesso e login no sistema por parte de qualquer usuário cadastrado.

POST /cadastro

Acesso ao cadastramento de novos usuários. Aqui será necessário indicar o Papel/Role do usuário, podendo ser ADMIN, PEDAGOGICO, PROFESSOR, RECRUITER ou ALUNO.

POST /docentes

Direcionado ao cadastramento de novos docentes, que deverão ser usuários pré-cadastrados (a serem indicados pelo respectivo id).

GET /docentes/id

Recupera os dados de um docente pelo ID indicado.

PUT /docentes/id

Altera os dados cadastrais do docente indicado pelo respectivo ID.

DELETE /docentes/id

Dedicado à exclusão do docente indicado pelo ID.

GET /docentes

Lista todos os docentes cadastrados no sistema, listando por ID.

POST /turmas

Endpoint destinado a fazer o cadastro de novas Turmas.

GET /turmas/id

Destinado a recuperar os dados de uma turma, indicada pelo seu ID de cadastro.

PUT /turmas/id

Ponto destinado a alterar as informações cadastrais de uma determinada turma, indicada pelo ID.

DELETE /turmas/id

Destinado a excluir determinada turma (indicada por ID).

GET /turmas

Serve a listar todas as turmas cadastradas no sistema.

POST /alunos

Serve para cadastrar um novo Aluno, que, a semelhança de Docente, deve ser previamente cadastrado como Usuário (o qual será indicado pelo ID).

GET /alunos/id

Recupera os dados cadastrais de um Aluno indicado pelo ID.

PUT /alunos/id

Edita as informações cadastrais de um Aluno indicado pelo ID.

DELETE /alunos/id

Exclui um determinado aluno do banco de dados, indicado pelo ID.

GET /alunos

Retorna a listagem de todos os alunos cadastrados no sistema.

POST /cursos

Destinado ao cadastramento de novos Cursos.

GET /cursos/id

Retorna os dados do Curso indicado pelo seu ID.

PUT /cursos/id

Edita os dados cadastrais do Curso indicado pelo seu ID.

DELETE /cursos/id

Exclui da base de dados o Curso indicado pelo seu ID de cadastro.

GET /cursos

Retorna a listagem de todos os cursos cadastrados no sistema.

GET /cursos/{id_curso}/materias

Retorna todas as matérias cadastradas em um determinado curso, este indicado por ID.

POST /materias

Cadastra uma nova matéria em um curso, este a ser indicado na requisição (body).

GET /materias/id

Retorna os dados de uma determinada matéria cadastrada.

PUT /materias/id

Altera os dados cadastrais de uma determinada matéria.

DELETE /materias/id

Exclui da base de dados a matéria indicada pelo seu ID.

GET /alunos/{id_aluno}/notas

Retorna todas as notas de um determinado aluno, indicado pelo seu ID. Caso seja chamado por aluno, retornará apenas as suas próprias notas.

POST /notas

Cadastra nova nota no sistema. Salientamos que notas só podem ser cadastradas em usuários que possuam a role "ALUNO".

GET /notas/id

Retorna o valor de uma determinada nota, identificada pelo seu ID de cadastro.

PUT /notas/id

Edita o valor de uma determinada nota, indicada pelo seu ID.

DELETE /notas/id

Exclui da base de dados uma determinada nota, indicada pelo seu ID.

GET /alunos/{id}/pontuacao

Retorna a pontuação total de um aluno, indicado pelo ID, conforme a métrica solicitada pelo projeto.

Autores

David Alves Dutra

Barbara Calderon

Luís Pedro Trindade

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •