package br.gov.servicos.editor.conteudo.cartas;
import br.gov.servicos.editor.conteudo.ConteudoVersionado;
import br.gov.servicos.editor.conteudo.ConteudoVersionadoFactory;
import br.gov.servicos.editor.conteudo.TipoPagina;
import br.gov.servicos.editor.security.CheckOrgaoEspecificoController;
import br.gov.servicos.editor.security.TipoPermissao;
import br.gov.servicos.editor.security.UserProfiles;
import lombok.experimental.FieldDefaults;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.servlet.view.RedirectView;
import static br.gov.servicos.editor.conteudo.TipoPagina.fromNome;
import static lombok.AccessLevel.PRIVATE;
import static org.springframework.web.bind.annotation.RequestMethod.POST;
@Controller
@FieldDefaults(level = PRIVATE, makeFinal = true)
class DescartarAlteracoesPaginaController extends CheckOrgaoEspecificoController {
ConteudoVersionadoFactory factory;
UserProfiles userProfiles;
@Autowired
public DescartarAlteracoesPaginaController(ConteudoVersionadoFactory factory, UserProfiles userProfiles) {
this.factory = factory;
this.userProfiles = userProfiles;
}
@ResponseStatus(value = HttpStatus.OK)
@RequestMapping(value = "/editar/api/pagina/{tipo}/{id}/descartar", method = POST)
RedirectView descartar(@PathVariable("tipo") String tipo, @PathVariable("id") String id) throws ConteudoInexistenteException {
TipoPagina tipoPagina = fromNome(tipo);
ConteudoVersionado conteudoVersionado = factory.pagina(id, tipoPagina);
if (!conteudoVersionado.existe()) {
throw new ConteudoInexistenteException(conteudoVersionado);
}
if (!conteudoVersionado.existeNoMaster()) {
throw new IllegalStateException("Descartar um serviço que não foi publicado é equivalente a excluir o serviço");
}
if (!usuarioPodeRealizarAcao(userProfiles, tipoPagina, conteudoVersionado.getOrgaoId())) {
throw new AccessDeniedException("Usuário sem permissão");
}
conteudoVersionado.descartarAlteracoes();
return new RedirectView("/editar/api/pagina/" + tipo + '/' + conteudoVersionado.getId(), true, false);
}
@Override
public TipoPermissao getTipoPermissao() {
return TipoPermissao.DESCARTAR;
}
}