# Avaliador

Sistema para avaliar códigos de forma automatizada.

## Como funciona

A ideia central é executar códigos e comparar a saída da execução com o que é esperado a ser produzido, para vários pares entrada-saída preparados anteriormente.

Já que só precisa executar o código e ver a saída que produz, o funcionamento é praticamente o mesmo para qualquer linguagem de programação. E considerando também as questões de segurança que podem surgir, este sistema utilizará containers Docker para executar os códigos.

## Docker

Por utilizar Docker, o ambiente será controlado e isolado, permitindo algum nível de segurança neste sistema. As imagens serão construídas de forma a que dentro do container seja um usuário comum a executar o código. Além disso é possível limitar uso de CPU e Memória, além de instituir um tempo máximo (timeout) de execução caso ocorra uma situação de programa que nunca finaliza sua execução.

# Arquitetura

O sistema é dividido nas seguintes partes:

- Banco de dados: MongoDB
  - Usuários
  - Exercícios e seus pares entrada-saída
  - Avaliação de um código: status e feedback

- Backend: API NodeJS
  - Cadastrar Exercícios com pares entrada-saída de execução
  - Gerenciar avaliação do código (Rota que agenda, obtêm status, etc... da avaliação de um código específico)
  
- Frontend: Site NextJS
  - Autenticar como usuário
  - Listar códigos enviados em cada exercício e seus feedbacks
  - Enviar código para ser avaliado em exercício específico


apt-get install build-essential