package com.agendaestudantil.servico; import com.agendaestudantil.dto.RespostaDisciplinaDTO; import com.agendaestudantil.entidade.Disciplina; import com.agendaestudantil.excecao.ExcecaoRecursoNaoEncontrado; import com.agendaestudantil.repositorio.DisciplinaRepositorio; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.web.server.ResponseStatusException; import java.util.List; @Service public class DisciplinaServico { private static final Logger log = LoggerFactory.getLogger(DisciplinaServico.class); private final DisciplinaRepositorio disciplinaRepositorio; public DisciplinaServico(DisciplinaRepositorio disciplinaRepositorio) { this.disciplinaRepositorio = disciplinaRepositorio; } private void validarAcesso(String estudanteId) { String authUser = SecurityContextHolder.getContext().getAuthentication().getName(); if (!authUser.equals(estudanteId)) { log.error("Acesso negado. Usuário {} tentou acessar recurso do estudante {}", authUser, estudanteId); throw new ResponseStatusException(HttpStatus.FORBIDDEN, "Acesso negado"); } } public RespostaDisciplinaDTO criarDisciplina(Disciplina disciplina, String estudanteId) { log.debug("Criando disciplina para estudante: {}", estudanteId); validarAcesso(estudanteId); disciplina.setEstudanteId(estudanteId); Disciplina salva = disciplinaRepositorio.save(disciplina); return toDTO(salva); } public List listarPorEstudante(String estudanteId) { log.debug("Listando disciplinas para estudante: {}", estudanteId); validarAcesso(estudanteId); return disciplinaRepositorio.findByEstudanteId(estudanteId).stream() .map(this::toDTO) .toList(); } public RespostaDisciplinaDTO buscarPorId(String id, String estudanteId) { Disciplina disciplina = getDisciplinaEntity(id); validarAcesso(disciplina.getEstudanteId()); return toDTO(disciplina); } public RespostaDisciplinaDTO atualizarDisciplina(String id, Disciplina disciplinaAtualizada, String estudanteId) { Disciplina disciplina = getDisciplinaEntity(id); validarAcesso(disciplina.getEstudanteId()); disciplina.setNome(disciplinaAtualizada.getNome()); disciplina.setProfessor(disciplinaAtualizada.getProfessor()); disciplina.setSala(disciplinaAtualizada.getSala()); disciplina.setCor(disciplinaAtualizada.getCor()); return toDTO(disciplinaRepositorio.save(disciplina)); } public void excluirDisciplina(String id, String estudanteId) { Disciplina disciplina = getDisciplinaEntity(id); validarAcesso(disciplina.getEstudanteId()); disciplinaRepositorio.delete(disciplina); } private Disciplina getDisciplinaEntity(String id) { return disciplinaRepositorio.findById(id) .orElseThrow(() -> new ExcecaoRecursoNaoEncontrado("Disciplina não encontrada")); } private RespostaDisciplinaDTO toDTO(Disciplina disciplina) { return new RespostaDisciplinaDTO( disciplina.getId(), disciplina.getEstudanteId(), disciplina.getNome(), disciplina.getProfessor(), disciplina.getSala(), disciplina.getCor() ); } }