Ejemplo n.º 1
0
        public static async Task <string> Handle(MessageResult result)
        {
            var builder = new MessageBuilder(Constants.DefaultSeparator);
            var userDb  = new DbWriter($"{AppDomain.CurrentDomain.BaseDirectory}User.csv", "Username;Password");
            var cepDb   = new DbWriter($"{AppDomain.CurrentDomain.BaseDirectory}Cep.csv", "UserId;Cep;Logradouro;Bairro;Complemento;Cidade;Uf;DataBusca");

            switch (result.MessageType.ToUpper())
            {
            case "CADASTRAR":
            {
                //TODO: Cadastrar usuário no CSV
                var username = result.GetFieldValue("USERNAME");
                var password = result.GetFieldValue("PASSWORD");


                if (string.IsNullOrWhiteSpace(password) || string.IsNullOrWhiteSpace(username))
                {
                    builder.AddFailure("Usuário ou senha estão vazios ou nulos");
                }
                else if (password.Length < 8)
                {
                    builder.AddFailure("A senha deve possuir pelo menos 8 caracteres");
                }
                else
                {
                    var emailRegex = new Regex(@"^([\w\.\-]+)@([\w\-]+)((\.(\w){2,3})+)$");
                    if (!emailRegex.Match(username).Success)
                    {
                        builder.AddFailure("Email invalido");
                    }
                    else if (userDb.GetLines("Username", username).Count() > 0)
                    {
                        builder.AddFailure("Usuario ja cadastrado");
                    }
                    else
                    {
                        password = UserHelper.Encrypt(password);
                        Console.WriteLine(userDb.InsertLine(new string[] { username, password }));
                        builder.AddSucess();
                    }
                }

                break;
            }

            case "LOGIN":
            {
                var username = result.GetFieldValue("USERNAME");
                var password = result.GetFieldValue("PASSWORD");
                var connectionDurationStr = result.GetFieldValue("CONNECTION_DURATION");

                Int32.TryParse(connectionDurationStr, out int connectionDuration);

                if (connectionDuration <= 0)
                {
                    builder.AddFailure("Tempo de conexão inválido");
                    break;
                }

                if (string.IsNullOrWhiteSpace(username) || string.IsNullOrWhiteSpace(password))
                {
                    builder.AddFailure("Usuário ou senha inválidos");
                    break;
                }

                var userLines = userDb.GetLines("Username", username);

                if (userLines.Count != 1)
                {
                    builder.AddFailure("Usuário ou senha inválidos");
                    break;
                }

                var user = userLines.FirstOrDefault();

                if (user == null || !UserHelper.PasswordEquals(password, user[1]))
                {
                    builder.AddFailure("Usuário ou senha inválidos");
                    break;
                }

                builder.AddSucess();

                builder.AddField("TOKEN", UserHelper.GenerateToken(user[0], connectionDuration));

                break;
            }

            case "CEP":
            {
                var token = result.GetFieldValue("TOKEN");

                var userId = UserHelper.ValidateToken(token);

                if (string.IsNullOrWhiteSpace(userId))
                {
                    builder.AddFailure("Token inválido");
                    break;
                }

                var cep     = result.GetFieldValue("CEP");
                var client  = new ViaCepClient();
                var address = await client.GetAddressByCep(cep);

                if (address.Erro)
                {
                    builder.AddFailure("Endereço não encontrado");
                    break;
                }

                builder.AddSucess();
                builder.AddField("CEP", address.Cep);
                builder.AddField("LOGRADOURO", address.Logradouro);
                builder.AddField("BAIRRO", address.Bairro);
                builder.AddField("COMPLEMENTO", address.Complemento);
                builder.AddField("CIDADE", address.Localidade);
                builder.AddField("UF", address.Uf);

                //Salvar no Historico
                cepDb.InsertLine(new string[] { userId, address.Cep, address.Logradouro, address.Bairro, address.Complemento, address.Localidade, address.Uf, DateTime.Now.ToString() });
                break;
            }

            case "HISTORICO":
            {
                var token = result.GetFieldValue("TOKEN");

                var userId = UserHelper.ValidateToken(token);

                if (string.IsNullOrWhiteSpace(userId))
                {
                    builder.AddFailure("Token inválido");
                    break;
                }

                var results = cepDb.GetLines("UserId", userId);

                if (!results.Any())
                {
                    builder.AddFailure("Histórico vazio");
                    break;
                }

                builder.AddSucess();

                int i = 0;
                foreach (var line in results)
                {
                    builder.AddField("INDEX", i.ToString());
                    builder.AddField("USER_ID", line[0]);
                    builder.AddField("CEP", line[1]);
                    builder.AddField("LOGRADOURO", line[2]);
                    builder.AddField("BAIRRO", line[3]);
                    builder.AddField("COMPLEMENTO", line[4]);
                    builder.AddField("CIDADE", line[5]);
                    builder.AddField("UF", line[6]);
                    builder.AddField("DATA_DA_BUSCA", line[7]);
                    i++;
                }
                break;
            }

            default:
            {
                builder.AddFailure("Mensagem inválida");
                break;
            }
            }

            return(builder.BuildValues());
        }