Material de apoio para aprendizagem de desenvolvimento de APIs REST/backend. Além de conceitos, apresentamos como fazer usando o ecossistema Spring Boot.
Objetivo: organizar plataforma colaborativa para avaliações e informações sobre disciplinas de um curso
O CRdb é uma API para classificação e reviews de disciplinas de um curso. Os usuários dessa aplicação são alunos deste curso e irão construir conteúdo sobre as disciplinas de forma colaborativa através de comentários, notas e likes nas disciplinas. O sistema deve usar essa informação construída para rankear as disciplinas do curso.
Não é obrigatória a implantação da aplicação como um serviço na Internet. Mas, para quem estiver com vontade de aprender um pouco sobre esse processo aqui vão dicas.
Por questões de segurança, precisamos de configurações específicas para permitir que um frontend em um domínio se comunique com um backend em outro domínio. Precisamos habilitar CORS - Cross Origin Resource Sharing. Este artigo é bem didático para quem quiser ler um pouco mais sobre isso. Uma forma de habilitar CORS é inserir um @Bean na aplicação com um filtro - ver código exemplo aqui. Outras formas de configuração no spring boot podem ser encontradas aqui.
Data de entrega 13/08/2020, até as 23:59h (mas se quiser usar a madrugada e entregar até as 8h da manhã do dia 14/08 também aceitamos):
Cadastrar usuários no sistema com primeiro nome, ultimo nome, e-mail e senha. O e-mail deve ser o identificador único dos usuários, assim se já existe um usuário com um certo e-mail, outro usuário com o mesmo e-mail não poderá ser cadastrado. Se usuário com o e-mail informado não existir ainda, ele deverá ser criado no sistema. Usuários cadastrados podem se autenticar passando e-mail e senha. Um usuário que foi autenticado via email/senha deve receber um JWT. Esse token será usado posteriormente no header authorization HTTP, para interações futuras com a API.
Dica para API: crie a base do seu projeto no https://start.spring.io/, já indicando dependências que com certeza você vai precisar, como por exemplo, web, jpa, h2 e lombok. Depois na sua IDE de preferência você faz o import como um projeto maven. Isso é menos propenso a dar erros.
Deve ser possível recuperar o nome completo de disciplinas a partir de substrings. Por exemplo, ao pesquisar “sistemas” um json com uma listagem de id e nomes de disciplinas deve ser enviada na resposta HTTP para o cliente.
Com esta funcionalidade o usuário da API pode identificar os nomes das disciplinas e seus respectivos ids cadastradas no CRdb. Esta funcionalidade é pública, pode ser acessada por qualquer usuário, mesmo que não esteja autenticado.
Todos os nomes das disciplinas do curso considerado devem estar em um arquivo json. Para quem preferir, pode usar estes dados deste arquivo json. Apenas os nomes estão aí, IDs únicos devem ser gerados para cada disciplina. As disciplinas já devem ser inseridas no banco de dados antes do uso da aplicação.
Usuários autenticados podem adicionar comentários aos perfis das disciplinas (para entender melhor sobre perfis de disciplinas veja o caso de uso 6). O sistema deve manter o usuário que escreveu o comentário e a data e hora em qeu o comentário foi escrito.
Um usuário autenticado pode apagar comentários que tenha feito anteriormente. Claro que um usuário só pode deletar comentários escritos por ele próprio. A deleção é lógica. Isto significa que o texto do comentário não será mais fornecido pela API, porém, ele é mantido na base de dados. Assim, os comentários devem manter esta informação sobre se o comentário foi apagado ou não. Ao responder uma requisição o backend deve enviar o texto vazio para os comentários apagados. Os comentários apagados, contudo, não devem ser contabilizados para efeitos do ranking (ie. não devem contabilizar no número de comentários que uma disciplina tem).
Um usuário autenticado pode “favoritar” com um like suas disciplinas favoritas, uma por vez, claro. Significa que pode dar um like para a disciplina. Um usuário que já deu like em uma disciplina não pode dar um segundo like. O segundo like deve ser entendido como uma retirada ao like dado anteriormente (desistiu de dar like).
Esta rota deve atualizar o perfil da disciplina mantendo a informação dos usuários que deram like.
Como já deu pra entender, cada disciplina está associada a um perfil. Esta funcionalidade permite que as informações do perfil de uma disciplina com um dado id seja recuperado. Apenas usuários autenticados podem ter acesso a esta funcionalidade. O perfil de uma disciplina mantém informações que são definidas de forma colaborativa pelos usuários do CRdb. As seguintes informações fazem parte do perfil de uma disciplina: likes, coleção de notas dadas pelos alunos sobre a disciplina, coleção de comentários que os alunos escreveram sobre a disciplina. Ao recuperar o perfil da disciplina, deve ser possível ver a nota da disciplina, que deve ser a média aritmética de todas as notas dadas à disciplina, o número de likes e os comentários.
Detalhes da API: para esta rota, a API deve retornar um json com o nome da disciplina, o número de likes, a média das notas dadas pelos alunos sobre a disciplina, coleção de comentários que os alunos escreveram sobre a disciplina, e informar se o usuário interagindo com o sistema (que chamou esta rota) deu like (true ou false) e também marcar de alguma forma que comentários que foram inseridos por esse usuário.
Um usuário autenticado pode ver o ranking das disciplinas de acordo com algum critério de livre escolha. Por exemplo, pelo número de likes, pelo número de comentários, ou pela nota. Os comentários apagados, contudo, não devem ser contabilizados para efeitos do ranking.