示例#1
0
        public static async Task PublicarEventos <T>(this IMediatorHandler mediator, T ctx) where T : DbContext
        {
            var domainEntities = ctx.ChangeTracker //entidades em memoria (modificando)
                                 .Entries <Entity>()
                                 .Where(x => x.Entity.Notificacoes != null && x.Entity.Notificacoes.Any());

            var domainEvents = domainEntities
                               .SelectMany(x => x.Entity.Notificacoes)
                               .ToList();

            domainEntities.ToList()
            .ForEach(entity => entity.Entity.LimparEventos());

            var tasks = domainEvents
                        .Select(async(domainEvent) => {
                await mediator.PublicarEvento(domainEvent);
            });

            await Task.WhenAll(tasks);
        }
        public static async Task PublicarEventos(this IMediatorHandler mediator, PagamentoContext ctx)
        {
            var domainEntities = ctx.ChangeTracker
                                 .Entries <Entity>()
                                 .Where(x => x.Entity.Notificacoes != null && x.Entity.Notificacoes.Any());

            var domainEvents = domainEntities
                               .SelectMany(x => x.Entity.Notificacoes)
                               .ToList();

            domainEntities.ToList()
            .ForEach(entity => entity.Entity.LimparEventos());

            var tasks = domainEvents
                        .Select(async(domainEvent) => {
                await mediator.PublicarEvento(domainEvent);
            });

            await Task.WhenAll(tasks);
        }
示例#3
0
        public Task Handle(RegistrarUsuarioCommand notification, CancellationToken cancellationToken)
        {
            var usuario = new ApplicationUser {
                UserName = notification.Email, Email = notification.Email, Nome = notification.Nome
            };
            var result = _userManager.CreateAsync(usuario, notification.Senha).Result;

            if (!result.Succeeded)
            {
                NotificarErro(notification.MessageType, $"Usuário já cadastrado com o e-mail: {notification.Email}");
                return(Task.CompletedTask);
            }

            if (!HasNotificationsError())
            {
                _mediator.PublicarEvento(new UsuarioRegistradoEvent(usuario));
            }

            return(Task.CompletedTask);
        }
        public Task <bool> Handle(RegistrarEventoCommand message, CancellationToken cancellationToken)
        {
            var endereco = new Endereco(message.Endereco.Id, message.Endereco.Logradouro, message.Endereco.Numero, message.Endereco.Complemento, message.Endereco.Bairro, message.Endereco.CEP, message.Endereco.Cidade, message.Endereco.Estado, message.Endereco.EventoId.Value);

            var evento = Evento.EventoFactory.NovoEvento(message.Id, message.Nome, message.DescricaoCurta, message.DescricaoLonga,
                                                         message.DataInicio, message.DataFim, message.Gratuito, message.Valor,
                                                         message.Online, message.NomeEmpresa, message.OrganizadorId, endereco, message.CategoriaId);

            if (!EventoValido(evento))
            {
                return(Task.FromResult(false));
            }

            _eventoRepository.Incluir(evento);

            if (Commit())
            {
                _mediator.PublicarEvento(new EventoRegistradoEvent(evento.Id, evento.Nome, evento.DataInicio, evento.DataFim, evento.Gratuito, evento.Valor, evento.Online, evento.NomeEmpresa));
            }

            return(Task.FromResult(true));
        }
示例#5
0
        public async Task <bool> Contratar(Funcionario funcionario)
        {
            if (!funcionario.EhValido())
            {
                Notificar(funcionario.ValidationResult);
                return(false);
            }

            var cargo = await _funcionarioRepository.ObterCargoPorId(funcionario.CargoId);

            if (cargo == null)
            {
                Notificar("Cargo informado inválido");
                return(false);
            }

            if (await FuncionarioContratado(funcionario))
            {
                Notificar($"{funcionario.Nome} já faz parte do quadro de funcionários");
                return(false);
            }

            var senhaAutomatica = funcionario.Usuario.Senha;

            var hash = _passwordHash.GetHashPassword(senhaAutomatica);

            funcionario.Usuario.AdicionarHashSenha(hash);

            if (await _funcionarioRepository.Contratar(funcionario))
            {
                await _mediatorHandler.PublicarEvento(
                    new NovoFuncionarioEvent(funcionario.Email.Endereco, funcionario.Nome, senhaAutomatica));

                return(true);
            }

            Notificar("Erro ao contratar novo funcionário");

            return(false);
        }
示例#6
0
        public async Task <Transacao> RealizarPagamentoPedido(PagamentoPedido pagamentoPedido)
        {
            var pedido = new Pedido
            {
                ID    = pagamentoPedido.PedidoID,
                Valor = pagamentoPedido.Total
            };

            var pagamento = new Pagamento
            {
                Valor           = pagamentoPedido.Total,
                NomeCartao      = pagamentoPedido.NomeCartao,
                NumeroCartao    = pagamentoPedido.NumeroCartao,
                ExpiracaoCartao = pagamentoPedido.ExpiracaoCartao,
                CvvCartao       = pagamentoPedido.CvvCartao,
                PedidoID        = pagamentoPedido.PedidoID
            };

            var transacao = _pagamentoCartaoCreditoFacade.RealizarPagamento(pedido, pagamento);

            if (transacao.StatusTransacao == EStatusTransacao.Pago)
            {
                pagamento.AdicionarEvento(new PagamentoRealizadoEvent(pedido.ID, pagamentoPedido.ClienteID, transacao.PagamentoID, transacao.ID, pedido.Valor));

                _pagamentoRepository.Adicionar(pagamento);

                _pagamentoRepository.AdicionarTransacao(transacao);

                await _pagamentoRepository.UnityOfWork.Commit();

                return(transacao);
            }

            await _mediatorHandler.PublicarNotificacao(new DomainNotification("pagamento", "A operadora recusou o pagamento"));

            await _mediatorHandler.PublicarEvento(new PagamentoRecusadoEvent(pedido.ID, pagamentoPedido.ClienteID, transacao.PagamentoID, transacao.ID, pedido.Valor));

            return(transacao);
        }
        public async Task <bool> Commit()
        {
            foreach (var entry in ChangeTracker.Entries().Where(entry => entry.Entity.GetType().GetProperty("DataCadastro") != null))
            {
                if (entry.State == EntityState.Added)
                {
                    entry.Property("DataCadastro").CurrentValue = DateTime.Now;
                }
                if (entry.State == EntityState.Modified)
                {
                    entry.Property("DataCadastro").IsModified = false;
                }
            }

            var sucesso = await base.SaveChangesAsync() > 0;

            if (sucesso)
            {
                await _mediatorHandler.PublicarEvento(this);
            }

            return(sucesso);
        }
示例#8
0
        public async Task <bool> Matricular(Cliente cliente, Guid planoId)
        {
            if (!cliente.EhValido())
            {
                Notificar(cliente.ValidationResult);

                return(false);
            }

            if (await ClienteMatriculado(cliente))
            {
                Notificar("Cliente já matriculado !");
                return(false);
            }

            var planoDesconto = await _planoRepository.ObterDescontoPlano(planoId);

            if (planoDesconto == null)
            {
                Notificar("Plano sem desconto associado");
                return(false);
            }

            cliente.AdicionarContrato(new Contrato(planoDesconto));

            var hash = _passwordHash.GetHashPassword(cliente.Usuario.Senha);

            cliente.Usuario.AdicionarHashSenha(hash);

            if (await _clienteRepository.Adicionar(cliente))
            {
                await _mediator.PublicarEvento(
                    new CodigoConfirmacaoEvent(cliente.Usuario.Id, cliente.Email.Endereco, cliente.Nome));
            }

            return(true);
        }
示例#9
0
        public async Task <bool> DebitarEstoque(Guid produtoId, int quantidade)
        {
            var produto = await _produtoRepository.ObterPorId(produtoId);

            if (produto == null)
            {
                return(false);
            }

            if (!produto.PossuiEstoque(quantidade))
            {
                return(false);
            }

            produto.DebitarEstoque(quantidade);

            if (produto.QuantidadeEstoque < 10)
            {
                await _bus.PublicarEvento(new ProdutoAbaixoEstoqueEvent(produto.Id, produto.QuantidadeEstoque));
            }

            _produtoRepository.Atualizar(produto);
            return(await _produtoRepository.UnitOfWork.Commit());
        }
示例#10
0
        public void Handle(ExcluirEventoCommand cmd)
        {
            Evento evento = _eventoRepository.ObterEventoCompletoPaginaPorId(cmd.Id);

            if (evento == null)
            {
                return;
            }

            List <Atracao> atracoes = new List <Atracao>();

            evento.AtracoesEventos.ToList().ForEach(x =>
            {
                atracoes.Add(x.Atracao);
                _eventoRepository.RemoverAtracaoEvento(x.AtracaoId, x.EventoId);
            });
            foreach (var atracao in atracoes)
            {
                _eventoRepository.RemoverAtracao(atracao.Id);
            }

            _eventoRepository.RemoverEndereco(cmd.EnderecoId);
            _eventoRepository.Remover(cmd.Id);

            if (Commit())
            {
                _mediator.PublicarEvento(new AtracaoExcluidaEvent(cmd.Id));
            }
        }
示例#11
0
        private async Task <object> GerarTokenUsuario(LoginViewModel login)
        {
            Usuario usuario = _usuarioRepository.BuscarPorEmailSenha(login.Email, login.Senha);

            var identity = await GetClaims(usuario);

            if (identity == null)
            {
                await _mediator.PublicarEvento(new DomainNotification("Identity", "Usuário não encontrado."));

                return(Response());
            }

            var claims = new[]
            {
                new Claim(JwtRegisteredClaimNames.UniqueName, usuario.NomeRazaoSocial),
                new Claim(JwtRegisteredClaimNames.Email, usuario.Email),
                new Claim(JwtRegisteredClaimNames.Sub, usuario.Empresa != null ? usuario.EmpresaId.ToString() : usuario.ClienteId.ToString()),
                new Claim(JwtRegisteredClaimNames.Jti, await _jwtTokenOptions.JtiGenerator()),
                new Claim(JwtRegisteredClaimNames.Iat, ToUnixEpochDate(_jwtTokenOptions.IssuedAt).ToString(), ClaimValueTypes.Integer64),
                identity.FindFirst("EventFinder")
            };



            var jwt = new JwtSecurityToken(
                issuer: _jwtTokenOptions.Issuer,
                audience: _jwtTokenOptions.Audience,
                claims: claims.AsEnumerable(),
                notBefore: _jwtTokenOptions.NotBefore,
                expires: _jwtTokenOptions.Expiration,
                signingCredentials: _jwtTokenOptions.SigningCredentials);

            var encodedJwt = new JwtSecurityTokenHandler().WriteToken(jwt);

            if (usuario.EmpresaId != null)
            {
                var empresa = _empresaRepository.BuscarPorEmail(login.Email);

                var response = new
                {
                    access_token = encodedJwt,
                    expires_in   = (int)_jwtTokenOptions.ValidFor.TotalSeconds,
                    user         = new
                    {
                        id     = empresa.Id,
                        nome   = empresa.RazaoSocial,
                        email  = empresa.Email,
                        claims = claims.Select(x => new { x.Type, x.Value })
                    }
                };
                return(response);
            }
            else
            {
                var cliente = _clienteRepository.ObterPorId(usuario.ClienteId.Value);

                var response = new
                {
                    access_token = encodedJwt,
                    expires_in   = (int)_jwtTokenOptions.ValidFor.TotalSeconds,
                    user         = new
                    {
                        id     = cliente.Id,
                        nome   = cliente.Nome,
                        email  = cliente.Email,
                        claims = claims.Select(x => new { x.Type, x.Value })
                    }
                };
                return(response);
            }
        }
示例#12
0
        public void Handle(IncluirFuncionarioCommand cmd)
        {
            Funcionario funcionario = new Funcionario(cmd.Id, cmd.Nome, cmd.Email, cmd.Telefone, cmd.Facebook, cmd.Cargo, cmd.Sexo, cmd.EmpresaId, cmd.EquipeId);

            if (!funcionario.IsValid())
            {
                NotificarValidacoesErro(funcionario.ValidationResult);
                return;
            }

            _repository.IncluirFuncionario(funcionario);

            if (Commit())
            {
                _mediator.PublicarEvento(new FuncionarioAdicionadoEvent(funcionario.Id, funcionario.Nome, funcionario.Email, funcionario.Telefone, funcionario.Facebook, funcionario.Cargo, funcionario.Sexo, funcionario.EmpresaId, funcionario.EquipeId));
            }
        }
示例#13
0
 protected void NotifyError(string code, string message)
 {
     _bus.PublicarEvento(new DomainNotification(code, message));
 }
示例#14
0
 protected void NotificarErro(string codigo, string mensagem)
 {
     _mediator.PublicarEvento(new NotificacaoDominio(codigo, mensagem));
 }
示例#15
0
        public void Handle(ExcluirPublicacaoCommand cmd)
        {
            Publicacao publicacao = PublicacaoExistente(cmd.ClienteId, cmd.EventoId, cmd.MessageType);

            if (publicacao != null)
            {
                _repository.RemoverPublicacao(publicacao.ClienteId, publicacao.EventoId);

                if (Commit())
                {
                    _mediator.PublicarEvento(new PublicacaoExcluidaEvent(publicacao.ClienteId, publicacao.EventoId));
                }
            }
        }
示例#16
0
 protected void NotificarErro(string codigo, string mensagem)
 {
     _mediator.PublicarEvento(new DomainNotification(codigo, mensagem));
 }
示例#17
0
 protected void NotificarErro(string propertyName, string errorMessage)
 {
     _mediator.PublicarEvento(new DomainNotification(propertyName, errorMessage));
 }