Пример #1
0
        private void SanitizeFields(DealerRecord dealerRecord)
        {
            dealerRecord.TwitterHandle =
                dealerRecord.TwitterHandle
                .Replace("@", "")
                .Replace("http://twitter.com/", "")
                .Replace("https://twitter.com/", "");

            dealerRecord.TelegramHandle =
                dealerRecord.TelegramHandle
                .Replace("@", "")
                .Replace("https://t.me/", "")
                .Replace("https://telegram.me/", "");
        }
        private void SanitizeFields(DealerRecord dealerRecord)
        {
            dealerRecord.TwitterHandle =
                dealerRecord.TwitterHandle
                .Replace("@", "")
                .Replace("http://twitter.com/", "")
                .Replace("https://twitter.com/", "");

            dealerRecord.TelegramHandle =
                dealerRecord.TelegramHandle
                .Replace("@", "")
                .Replace("https://t.me/", "")
                .Replace("https://telegram.me/", "");

            dealerRecord.ShortDescription   = ConvertKnownUnicodeCharacters(dealerRecord.ShortDescription);
            dealerRecord.AboutTheArtistText = ConvertKnownUnicodeCharacters(dealerRecord.AboutTheArtistText);
            dealerRecord.AboutTheArtText    = ConvertKnownUnicodeCharacters(dealerRecord.AboutTheArtText);
            dealerRecord.ArtPreviewCaption  = ConvertKnownUnicodeCharacters(dealerRecord.ArtPreviewCaption);
        }
Пример #3
0
        private void ImportLinks(DealerRecord dealerRecord, string websiteUrls)
        {
            if (string.IsNullOrWhiteSpace(websiteUrls))
            {
                return;
            }

            var linkFragments = new List <LinkFragment>();

            if (dealerRecord.Links != null)
            {
                linkFragments.AddRange(dealerRecord.Links);
            }

            var sanitizedParts = websiteUrls
                                 .Replace(" / ", ";")
                                 .Split(new[] { ' ', ',', ';' }, StringSplitOptions.RemoveEmptyEntries);

            foreach (var part in sanitizedParts)
            {
                var assumedUri = part;
                if (part.Length < 10)
                {
                    continue;
                }

                if (!assumedUri.StartsWith("http://", StringComparison.CurrentCultureIgnoreCase) &&
                    !assumedUri.StartsWith("https://", StringComparison.CurrentCultureIgnoreCase))
                {
                    assumedUri = $"http://{part}";
                }

                if (Uri.IsWellFormedUriString(assumedUri, UriKind.Absolute))
                {
                    linkFragments.Add(new LinkFragment(LinkFragment.FragmentTypeEnum.WebExternal, string.Empty,
                                                       assumedUri));
                }
            }

            dealerRecord.Links = linkFragments.ToArray();
        }
Пример #4
0
        public async Task ImportZipPackageAsync(string fileName)
        {
            var importRecords = new List <DealerRecord>();

            using (var fileStream = File.OpenRead(fileName))
                using (var archive = new ZipArchive(fileStream))
                {
                    var csvEntry =
                        archive.Entries.Single(a => a.Name.EndsWith(".csv", StringComparison.CurrentCultureIgnoreCase));

                    TextReader reader = new StreamReader(csvEntry.Open(), Encoding.GetEncoding(1252));

                    var csvReader = new CsvReader(reader);
                    csvReader.Configuration.RegisterClassMap <DealerImportRowClassMap>();
                    var csvRecords = csvReader.GetRecords <DealerImportRow>().ToList();

                    foreach (var record in csvRecords)
                    {
                        var dealerRecord = new DealerRecord
                        {
                            RegistrationNumber = record.RegNo,
                            AttendeeNickname   = record.Nickname,
                            AboutTheArtistText = record.AboutTheArtist,
                            AboutTheArtText    = record.AboutTheArt,
                            ArtPreviewCaption  = record.ArtPreviewCaption,
                            DisplayName        = record.DisplayName,
                            ShortDescription   = record.ShortDescription
                        };

                        dealerRecord.ArtistImageId = await GetImageIdAsync(archive, $"artist_{record.RegNo}.",
                                                                           $"dealer:artist:{record.RegNo}");

                        dealerRecord.ArtistThumbnailImageId = await GetImageIdAsync(archive, $"thumbnail_{record.RegNo}.",
                                                                                    $"dealer:thumbnail:{record.RegNo}");

                        dealerRecord.ArtPreviewImageId =
                            await GetImageIdAsync(archive, $"art_{record.RegNo}.", $"dealer:art:{record.RegNo}");

                        ImportLinks(dealerRecord, record.WebsiteUrl);
                        SanitizeFields(dealerRecord);

                        importRecords.Add(dealerRecord);
                    }
                }

            var existingRecords = await _dealerService.FindAllAsync();

            var patch = new PatchDefinition <DealerRecord, DealerRecord>((source, list) =>
                                                                         list.SingleOrDefault(a => a.RegistrationNumber == source.RegistrationNumber));

            patch
            .Map(s => s.RegistrationNumber, t => t.RegistrationNumber)
            .Map(s => s.AttendeeNickname, t => t.AttendeeNickname)
            .Map(s => s.AboutTheArtistText, t => t.AboutTheArtistText)
            .Map(s => s.AboutTheArtText, t => t.AboutTheArtText)
            .Map(s => s.ArtPreviewCaption, t => t.ArtPreviewCaption)
            .Map(s => s.DisplayName, t => t.DisplayName)
            .Map(s => s.ShortDescription, t => t.ShortDescription)
            .Map(s => s.ArtistImageId, t => t.ArtistImageId)
            .Map(s => s.ArtistThumbnailImageId, t => t.ArtistThumbnailImageId)
            .Map(s => s.ArtPreviewImageId, t => t.ArtPreviewImageId)
            .Map(s => s.Links, t => t.Links);

            var diff = patch.Patch(importRecords, existingRecords);
            await _dealerService.ApplyPatchOperationAsync(diff);
        }
Пример #5
0
        public async Task ImportZipPackageAsync(string fileName)
        {
            var importRecords = new List <DealerRecord>();

            using (var fileStream = File.OpenRead(fileName))
                using (var archive = new ZipArchive(fileStream))
                {
                    var csvEntry =
                        archive.Entries.Single(a => a.Name.EndsWith(".csv", StringComparison.CurrentCultureIgnoreCase));

                    TextReader reader = new StreamReader(csvEntry.Open(), true);

                    var csvReader = new CsvReader(reader);
                    csvReader.Configuration.RegisterClassMap <DealerImportRowClassMap>();
                    csvReader.Configuration.Delimiter = ";";
                    var csvRecords = csvReader.GetRecords <DealerImportRow>().ToList();

                    _output?.WriteLine($"Parsed {csvRecords.Count} records from CSV");

                    foreach (var record in csvRecords)
                    {
                        var dealerRecord = new DealerRecord
                        {
                            RegistrationNumber = record.RegNo,
                            AttendeeNickname   = record.Nickname,
                            AboutTheArtistText = record.AboutTheArtist,
                            AboutTheArtText    = record.AboutTheArt,
                            ArtPreviewCaption  = record.ArtPreviewCaption,
                            DisplayName        = record.DisplayName,
                            ShortDescription   = record.ShortDescription,
                            Merchandise        = record.Merchandise,
                            AttendsOnThursday  = !string.IsNullOrWhiteSpace(record.AttendsThu),
                            AttendsOnFriday    = !string.IsNullOrWhiteSpace(record.AttendsFri),
                            AttendsOnSaturday  = !string.IsNullOrWhiteSpace(record.AttendsSat),
                            TelegramHandle     = record.Telegram,
                            TwitterHandle      = record.Twitter
                        };

                        dealerRecord.ArtistImageId = await GetImageIdAsync(archive, $"artist_{record.RegNo}.",
                                                                           $"dealer:artist:{record.RegNo}");

                        dealerRecord.ArtistThumbnailImageId = await GetImageIdAsync(archive, $"thumbnail_{record.RegNo}.",
                                                                                    $"dealer:thumbnail:{record.RegNo}");

                        dealerRecord.ArtPreviewImageId =
                            await GetImageIdAsync(archive, $"art_{record.RegNo}.", $"dealer:art:{record.RegNo}");

                        ImportLinks(dealerRecord, record.Website);
                        SanitizeFields(dealerRecord);

                        importRecords.Add(dealerRecord);
                    }
                }

            var existingRecords = await _dealerService.FindAllAsync();

            var patch = new PatchDefinition <DealerRecord, DealerRecord>((source, list) =>
                                                                         list.SingleOrDefault(a => a.RegistrationNumber == source.RegistrationNumber));

            patch
            .Map(s => s.RegistrationNumber, t => t.RegistrationNumber)
            .Map(s => s.AttendeeNickname, t => t.AttendeeNickname)
            .Map(s => s.AboutTheArtistText, t => t.AboutTheArtistText)
            .Map(s => s.AboutTheArtText, t => t.AboutTheArtText)
            .Map(s => s.ArtPreviewCaption, t => t.ArtPreviewCaption)
            .Map(s => s.DisplayName, t => t.DisplayName)
            .Map(s => s.ShortDescription, t => t.ShortDescription)
            .Map(s => s.Merchandise, t => t.Merchandise)
            .Map(s => s.ArtistImageId, t => t.ArtistImageId)
            .Map(s => s.ArtistThumbnailImageId, t => t.ArtistThumbnailImageId)
            .Map(s => s.ArtPreviewImageId, t => t.ArtPreviewImageId)
            .Map(s => s.TelegramHandle, t => t.TelegramHandle)
            .Map(s => s.TwitterHandle, t => t.TwitterHandle)
            .Map(s => s.AttendsOnThursday, t => t.AttendsOnThursday)
            .Map(s => s.AttendsOnFriday, t => t.AttendsOnFriday)
            .Map(s => s.AttendsOnSaturday, t => t.AttendsOnSaturday)
            .Map(s => s.Links, t => t.Links);

            var diff = patch.Patch(importRecords, existingRecords);
            await _dealerService.ApplyPatchOperationAsync(diff);

            _output?.WriteLine($"Added: {diff.Count(a => a.Action == ActionEnum.Add)}");
            _output?.WriteLine($"Deleted: {diff.Count(a => a.Action == ActionEnum.Delete)}");
            _output?.WriteLine($"Updated: {diff.Count(a => a.Action == ActionEnum.Update)}");
            _output?.WriteLine($"Not Modified: {diff.Count(a => a.Action == ActionEnum.NotModified)}");
        }