public async Task <IHttpActionResult> ConviteEventoEnvio(EnvioConviteEventoViewModel envioConviteViewModel)
        {
            // Cria Context Request do Controller da View enviada por Email
            var controller = Util.Utilidades.CreateController <ConviteController>();
            var context    = controller.ControllerContext.RequestContext;

            var eventoConvite    = Db.Eventos.ToList().SingleOrDefault(e => e.Id == envioConviteViewModel.Id_Evento);
            var usuarioExist     = Db.Users.ToList().Exists(u => u.UserName == envioConviteViewModel.Email);
            var claimPrincipal   = (ClaimsPrincipal)Thread.CurrentPrincipal;
            var exist            = claimPrincipal.Claims.ToList().Exists(c => c.Type == "id_usuario");
            var id_usuarioLogado = claimPrincipal.Claims.SingleOrDefault(c => c.Type == "id_usuario").Value;
            var organizador      = bool.Parse(claimPrincipal.Claims.SingleOrDefault(c => c.Type == "organizador").Value);
            var usuarioLogado    = Db.Users.ToList().SingleOrDefault(u => u.Id == id_usuarioLogado);

            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            if (eventoConvite == null)
            {
                return(BadRequest("Este Evento não existe."));
            }

            if (!organizador)
            {
                return(BadRequest("É Necessário ser um Organizador para Enviar um Convite"));
            }

            if (usuarioExist)
            {
                //Verifica se usuario ja esta vinculado com evento
                var eventoUsuarioExist = (from eventoUsuario in Db.Evento_Usuarios
                                          join evento in Db.Eventos on eventoUsuario.Id_Evento equals evento.Id
                                          where eventoUsuario.Id_Usuario == id_usuarioLogado &&
                                          eventoUsuario.Id_Evento == envioConviteViewModel.Id_Evento &&
                                          eventoUsuario.Deletado == false &&
                                          evento.Deletado == false
                                          select eventoUsuario).SingleOrDefault();

                if (eventoUsuarioExist != null)
                {
                    return(BadRequest("Este Usuario já esta vinculado com este Evento"));
                }
            }


            var dataExpira = DateTime.Now + TimeSpan.FromDays(7); // Expira em 7 Dias

            TokenEnvio token = new TokenEnvio()
            {
                Token    = Guid.NewGuid().ToString(),
                ExpiraEm = dataExpira,
                Ativo    = true
            };

            var tokenCriado = _tokenEnvioRepository.Criar(token);

            envioConviteViewModel.Id_Evento = eventoConvite.Id;
            envioConviteViewModel.Id_usuario_organizador = usuarioLogado.Id;
            envioConviteViewModel.Usuario_Organizador    = usuarioLogado;
            envioConviteViewModel.Evento = eventoConvite;
            envioConviteViewModel.Token  = tokenCriado.Token;

            var viewString = Util.Utilidades.RenderViewToString(new ControllerContext(context, controller), "ConviteUsuarioPrincipal", envioConviteViewModel);

            var message = new MailMessage();

            message.To.Add(new MailAddress(envioConviteViewModel.Email));
            message.From       = (new MailAddress("*****@*****.**"));
            message.Body       = string.Format(viewString, envioConviteViewModel.Email);
            message.IsBodyHtml = true;
            message.Subject    = "Convite para Particiar de Evento";

            using (var smtp = new SmtpClient())
            {
                var credenciais = new NetworkCredential()
                {
                    UserName = "******",
                    Password = "******"
                };

                smtp.Credentials = credenciais;
                smtp.Host        = "smtp.gmail.com";
                smtp.Port        = 587;
                smtp.EnableSsl   = true;
                await smtp.SendMailAsync(message);

                return(Ok("Convite Enviado"));
            }
        }
        public async Task <IHttpActionResult> ConviteFuncionarioEnvio(EnvioConviteFuncionarioViewModel envioConviteFuncionarioViewModel)
        {
            // Cria Context Request do Controller da View enviada por Email
            var controller = Util.Utilidades.CreateController <ConviteController>();
            var context    = controller.ControllerContext.RequestContext;

            var usuarioExist     = Db.Users.ToList().Exists(u => u.UserName == envioConviteFuncionarioViewModel.Email);
            var claimPrincipal   = (ClaimsPrincipal)Thread.CurrentPrincipal;
            var id_usuarioLogado = claimPrincipal.Claims.SingleOrDefault(c => c.Type == "id_usuario").Value;
            var usuarioPrincipal = bool.Parse(claimPrincipal.Claims.SingleOrDefault(c => c.Type == "usuarioprincipal").Value);
            var usuarioLogado    = Db.Users.SingleOrDefault(u => u.Id == id_usuarioLogado);

            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            if (!usuarioPrincipal)
            {
                return(BadRequest("É Necessário ser um Usuario Principal para Enviar um Convite"));
            }

            if (usuarioExist)
            {
                //Verifica se usuario ja esta vinculado com o usuario Principal
                var id_usuarioPrincipal =
                    (from usuario in Db.Users
                     where usuario.UserName == envioConviteFuncionarioViewModel.Email
                     select usuario.Id_Usuario_Principal).SingleOrDefault();

                if (id_usuarioPrincipal == id_usuarioLogado)
                {
                    BadRequest("Este Usuario já esta Vinculado a seu grupo de Funcionários");
                }

                if (id_usuarioPrincipal != null && id_usuarioPrincipal != id_usuarioLogado)
                {
                    BadRequest("Este Usuario esta Vinculado a Outro Usuario Principal");
                }
            }

            var dataExpira = DateTime.Now + TimeSpan.FromDays(7); // Expira em 7 Dias

            TokenEnvio token = new TokenEnvio()
            {
                Token    = Guid.NewGuid().ToString(),
                ExpiraEm = dataExpira,
                Ativo    = true
            };

            var tokenCriado = _tokenEnvioRepository.Criar(token);

            envioConviteFuncionarioViewModel.Id_usuario_principal = id_usuarioLogado;
            envioConviteFuncionarioViewModel.Usuario_Principal    = usuarioLogado;
            envioConviteFuncionarioViewModel.Token = tokenCriado.Token;

            var viewString = Util.Utilidades.RenderViewToString(new ControllerContext(context, controller), "ConviteFuncionario", envioConviteFuncionarioViewModel);

            var message = new MailMessage();

            message.To.Add(new MailAddress(envioConviteFuncionarioViewModel.Email));
            message.From       = (new MailAddress("*****@*****.**"));
            message.Body       = string.Format(viewString, envioConviteFuncionarioViewModel.Email);
            message.IsBodyHtml = true;
            message.Subject    = "Convite para Grupo de Funcionários";

            using (var smtp = new SmtpClient())
            {
                var credenciais = new NetworkCredential()
                {
                    UserName   = "******"
                    , Password = "******"
                };

                smtp.Credentials = credenciais;
                smtp.Host        = "smtp-relay.gmail.com";
                smtp.Port        = 587;
                smtp.EnableSsl   = true;
                await smtp.SendMailAsync(message);

                return(Ok("Convite Enviado"));
            }
        }