Beispiel #1
0
        public BlacklistQueryResult Search(SearchCompanyBlacklistRequest model)
        {
            Establish.For(model, nameof(model)).IsNotNull()
            .Property(x => x.Name, nameof(model.Name), e => e.IsNotNullOrEmpty())
            .Property(x => x.CountryCode, nameof(model.CountryCode), e => e.IsNotNullOrEmpty().HasExactLength(2));

            // name and country are manditory
            var query = new DplSearch();

            query.AddClause(DplFields.Name, DplSearchMatchType.Similar, model.Name);
            query.AddClause(DplFields.CountryCode, DplSearchMatchType.Exact, model.CountryCode);

            if (!string.IsNullOrEmpty(model.City))
            {
                query.AddClause(DplFields.City, DplSearchMatchType.Exact, model.City);
            }
            if (model.Uri != null && Uri.IsWellFormedUriString(model.Uri, UriKind.Absolute))
            {
                var uri = new Uri(model.Uri, UriKind.Absolute);

                query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, uri.DnsSafeHost);
            }
            if (!string.IsNullOrEmpty(model.StateCode))
            {
                query.AddClause(DplFields.StateCode, DplSearchMatchType.Exact, model.StateCode);
            }

            var dplResult = CSDenialService.SearchDpl(query);
            var result    = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id));

            return(result);
        }
Beispiel #2
0
        public BlacklistQueryResult Search(SearchPersonBlacklistRequest model)
        {
            Establish.For(model, nameof(model)).IsNotNull()
            .Property(x => x.Name, nameof(model.Name), e => e.IsNotNullOrEmpty())
            .Property(x => x.CountryCode, nameof(model.CountryCode), e => e.IsNotNullOrEmpty().HasExactLength(2));

            // name and country are manditory
            var query = new DplSearch();

            query.AddClause(DplFields.Name, DplSearchMatchType.Similar, model.Name);
            query.AddClause(DplFields.CountryCode, DplSearchMatchType.Exact, model.CountryCode);

            if (!string.IsNullOrEmpty(model.City))
            {
                query.AddClause(DplFields.City, DplSearchMatchType.Exact, model.City);
            }
            if (!string.IsNullOrEmpty(model.Email))
            {
                query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, model.Email);
            }
            if (!string.IsNullOrEmpty(model.StateCode))
            {
                query.AddClause(DplFields.StateCode, DplSearchMatchType.Exact, model.StateCode);
            }

            var dplResult = CSDenialService.SearchDpl(query);
            var result    = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id));

            return(result);
        }
Beispiel #3
0
        public BlacklistQueryResult Search(SearchEmailBlacklistRequest model)
        {
            Establish.For(model, nameof(model)).IsNotNull()
            .Property(x => x.Email, nameof(model.Email), e => e.IsNotNullOrEmpty().MatchesPattern(EmailRegex));

            var query = new DplSearch();

            query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, model.Email);

            var dplResult = CSDenialService.SearchDpl(query);
            var result    = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id));

            return(result);
        }
Beispiel #4
0
        public BlacklistQueryResult Search(SearchDomainBlacklistRequest model)
        {
            Establish.For(model, nameof(model)).IsNotNull()
            .Property(x => x.Uri, nameof(model.Uri), e => e.IsNotNull().Satisfies(x => Uri.IsWellFormedUriString(x, UriKind.Absolute)));

            var uri = new Uri(model.Uri);

            var query = new DplSearch();

            query.AddClause(DplFields.Notes, DplSearchMatchType.Contains, uri.DnsSafeHost);

            var dplResult = CSDenialService.SearchDpl(query);
            var result    = new BlacklistQueryResult(dplResult.Hits.Select(x => x.Id));

            return(result);
        }
Beispiel #5
0
        public DplSearchResult SearchDpl(DplSearch searchQuery)
        {
            if (searchQuery == null)
            {
                throw new ArgumentNullException(nameof(searchQuery));
            }

            var clauses = searchQuery.GetClauses();

            if (!clauses.Any())
            {
                throw new ArgumentException("DPL Search does not contain any clauses.", nameof(searchQuery));
            }

            IEnumerable <DplEntry> entries = Repository.DplEntries;

            foreach (var clause in clauses)
            {
                switch (clause.MatchType)
                {
                case DplSearchMatchType.Exact:
                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => string.Equals(x.City, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => string.Equals(x.CountryCode, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => string.Equals(x.Name, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => string.Equals(x.Notes, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => string.Equals(x.StateCode, clause.Value, StringComparison.OrdinalIgnoreCase));
                        break;
                    }

                    break;

                case DplSearchMatchType.Similar:
                    float threshold = 0.3125f;

                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.City, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.CountryCode, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Name, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.Notes, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => (Levenshtein.CalculateDistance(x.StateCode, clause.Value, 1) / (float)clause.Value.Length) < threshold);
                        break;
                    }

                    break;

                case DplSearchMatchType.Contains:
                    switch (clause.DplField)
                    {
                    case DplFields.City:
                        entries = entries.Where(x => x.City.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.CountryCode:
                        entries = entries.Where(x => x.CountryCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.Name:
                        entries = entries.Where(x => x.Name.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.Notes:
                        entries = entries.Where(x => x.Notes.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;

                    case DplFields.StateCode:
                        entries = entries.Where(x => x.StateCode.IndexOf(clause.Value, StringComparison.OrdinalIgnoreCase) != -1);
                        break;
                    }
                    break;

                default:
                    throw new ArgumentException($"{nameof(DplSearchMatchType)} value not defined.", nameof(searchQuery));
                }
            }

            var hits   = entries.ToList();
            var result = new DplSearchResult()
            {
                Hits           = hits,
                TotalHits      = hits.Count,
                ReportDateTime = DateTime.Now
            };

            return(result);
        }