package br.com.dextra.dextranet.usuario;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import javax.ws.rs.FormParam;
import javax.ws.rs.GET;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.Status;
import br.com.dextra.dextranet.grupo.Grupo;
import br.com.dextra.dextranet.grupo.GrupoJSON;
import br.com.dextra.dextranet.grupo.GrupoRepository;
import br.com.dextra.dextranet.grupo.MembroRepository;
import br.com.dextra.dextranet.grupo.servico.google.Aprovisionamento;
import br.com.dextra.dextranet.grupo.servico.google.GoogleGrupoJSON;
import br.com.dextra.dextranet.rest.config.Application;
import br.com.dextra.dextranet.seguranca.AutenticacaoService;
import com.google.api.services.admin.directory.model.Group;
import com.google.appengine.api.datastore.EntityNotFoundException;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import com.google.gson.JsonObject;
@Path("/usuario")
public class UsuarioRS {
private UsuarioRepository repositorio = new UsuarioRepository();
private GrupoRepository grupoRepositorio = new GrupoRepository();
private MembroRepository MembroRepository = new MembroRepository();
private static Aprovisionamento aprovisionamento = new Aprovisionamento();
@Path("/{id}")
@PUT
@Produces(Application.JSON_UTF8)
public Response atualizar(@PathParam("id") String id, @FormParam("nome") String nome,
@FormParam("apelido") String apelido, @FormParam("area") String area, @FormParam("unidade") String unidade,
@FormParam("ramal") String ramal, @FormParam("telefoneResidencial") String telefoneResidencial,
@FormParam("telefoneCelular") String telefoneCelular, @FormParam("gitHub") String gitHub,
@FormParam("skype") String skype, @FormParam("blog") String blog, @FormParam("ativo") Boolean ativo)
throws EntityNotFoundException, GeneralSecurityException, URISyntaxException {
Usuario usuario = repositorio.obtemPorId(id);
if (!possuiAcesso(usuario)) {
return Response.status(Status.FORBIDDEN).build();
}
if (ativo == null) {
usuario.preenchePerfil(nome, apelido, area, unidade, ramal, telefoneResidencial, telefoneCelular, gitHub,
skype, blog);
usuario.setAtivo(Boolean.TRUE);
} else {
usuario.setAtivo(ativo);
}
repositorio.persiste(usuario);
isDesativacaoUsuario(usuario);
return Response.ok().entity(usuario.getUsuarioJSON()).build();
}
@Path("/{username}")
@GET
@Produces(Application.JSON_UTF8)
public Response obter(@PathParam("username") String username) throws EntityNotFoundException {
Usuario usuario = repositorio.obtemPorUsername(username);
return Response.ok().entity(usuario).build();
}
@Path("/logado")
@GET
@Produces(Application.JSON_UTF8)
public Response obterUsuarioLogado() {
Boolean isInfra = this.usuarioLogadoIsInfra();
Usuario usuario = repositorio.obtemPorUsername(this.obtemUsernameDoUsuarioLogado());
JsonObject usuarioJson = new JsonObject();
usuarioJson.addProperty("id", usuario.getId());
usuarioJson.addProperty("apelido", usuario.getApelido());
usuarioJson.addProperty("username", usuario.getUsername());
usuarioJson.addProperty("gitHub", usuario.getGitHub());
usuarioJson.addProperty("area", usuario.getArea());
usuarioJson.addProperty("blog", usuario.getBlog());
usuarioJson.addProperty("nome", usuario.getNome());
usuarioJson.addProperty("ramal", usuario.getRamal());
usuarioJson.addProperty("skype", usuario.getSkype());
usuarioJson.addProperty("telefoneCelular", usuario.getTelefoneCelular());
usuarioJson.addProperty("telefoneResidencial", usuario.getTelefoneResidencial());
usuarioJson.addProperty("unidade", usuario.getUnidade());
usuarioJson.addProperty("isInfra", isInfra);
usuarioJson.addProperty("md5", usuario.getMD5());
return Response.ok().entity(usuarioJson.toString()).build();
}
@Path("/ajustarbanco")
@GET
@Produces(Application.JSON_UTF8)
public Response ajustarFlagAtivoBanco() throws EntityNotFoundException {
List<Usuario> usuarios = repositorio.lista();
for (Usuario usuario : usuarios) {
if (usuario.isAtivo() == null) {
usuario.setAtivo(true);
repositorio.persiste(usuario);
}
}
return Response.status(Status.OK).build();
}
@Path("/")
@GET
@Produces(Application.JSON_UTF8)
public Response listar(@QueryParam("githubLogin") String githubLogin) throws EntityNotFoundException {
List<Usuario> usuarios;
if (githubLogin == null) {
usuarios = repositorio.listaPor(usuarioLogadoIsInfra());
} else {
Usuario user = repositorio.getByGithub(githubLogin);
if (user == null) {
usuarios = Collections.emptyList();
} else {
usuarios = Arrays.asList(repositorio.getByGithub(githubLogin));
}
}
return Response.ok().entity(usuarios).build();
}
@Path("/github/{githubLogin}")
@GET
@Produces(Application.JSON_UTF8)
public Response byGithub(@PathParam("githubLogin") String githubLogin, @QueryParam("secret") String secret) throws EntityNotFoundException {
final String GITHUB_SECRET = "YvdW97iqWGi0tsqJjj5j";
if (!GITHUB_SECRET.equals(secret)) {
return Response.status(403).build();
}
Usuario user = repositorio.getByGithub(githubLogin);
if (user == null) {
return Response.status(404).build();
}
final String response = String.format("{ user: \"%s\", groups: %s}", user.getUsername(), user.getGrupos());
return Response.ok().entity(response).build();
}
@Path("/url-logout")
@GET
@Produces(Application.JSON_UTF8)
public Response urlDeLogout() {
UserService userService = UserServiceFactory.getUserService();
JsonObject json = new JsonObject();
json.addProperty("url", userService.createLogoutURL("/index.html"));
return Response.ok().entity(json.toString()).build();
}
@Path("/{id}/{idGrupo}/adicionar-usuario-grupo")
@PUT
@Produces(Application.JSON_UTF8)
public Response adicionarUsuarioGrupo(@PathParam("id") String id, @PathParam("idGrupo") String idGrupo)
throws EntityNotFoundException {
Usuario usuario = repositorio.obtemPorId(id);
repositorio.persiste(usuario);
return Response.ok().entity(usuario).build();
}
protected String obtemUsernameDoUsuarioLogado() {
return AutenticacaoService.identificacaoDoUsuarioLogado();
}
protected Boolean usuarioLogadoIsInfra() {
return AutenticacaoService.isUsuarioGrupoInfra();
}
private boolean possuiAcesso(Usuario usuario) {
return usuarioLogadoIsInfra() || usuario.getUsername().equals(this.obtemUsernameDoUsuarioLogado());
}
private void isDesativacaoUsuario(Usuario usuario) throws EntityNotFoundException, GeneralSecurityException,
URISyntaxException {
if (usuario.isAtivo().equals(Boolean.FALSE)) {
List<String> emails = new ArrayList<String>();
emails.add(usuario.getUsername() + Usuario.DEFAULT_DOMAIN);
List<Grupo> grupos = grupoRepositorio.obtemPorIdIntegrante(usuario.getId());
List<GoogleGrupoJSON> servicos = new ArrayList<GoogleGrupoJSON>();
for (Grupo grupo : grupos) {
GrupoJSON grupoJSON = grupo.getGrupoJSON();
servicos = grupoJSON.getServico();
}
removerUsuarioGrupo(emails, servicos);
grupoRepositorio.ajustarProprietarioGrupo(usuario);
MembroRepository.removeMembroDosGruposPor(usuario);
}
}
protected void removerUsuarioGrupo(List<String> emails, List<GoogleGrupoJSON> servicos)
throws GeneralSecurityException, URISyntaxException {
try {
for (GoogleGrupoJSON servico : servicos) {
Group grupo = aprovisionamento.obterGrupo(servico.getEmailDomainGrupo());
aprovisionamento.removerMembros(emails, grupo);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}