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); }
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(); }
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); }
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)}"); }