private string TrackHtmlContent(CommunicationBlast blast, string html, Guid communicationPieceUid, MultipleValueDictionary <string, CommunicationBlastTracker> trackersByUrl, string hostname) { var pieceSegment = Base32.Encode(communicationPieceUid.ToByteArray()); return(TrackHtmlContent( html, (pos, linkType, linkUrl) => { var tracker = trackersByUrl[linkUrl.ToString()] .FirstOrDefault(z => z.CommunicationType == Communications.CommunicationTypes.Email && z.Position == pos && z.LinkType == linkType); if (tracker == null) { tracker = new CommunicationBlastTracker { CommunicationType = Communications.CommunicationTypes.Email, Position = pos, LinkType = linkType, RedirectUrl = linkUrl.ToString(), TrackerUid = Guid.NewGuid(), CommunicationBlast = blast }; Rdb.CommunicationBlastTrackers.Add(tracker); trackersByUrl.Add(tracker.RedirectUrl, tracker); } return new Uri($"https://{hostname}/e/{TenantId}/{pieceSegment}/{Base32.Encode(tracker.TrackerUid.ToByteArray())}"); })); }
async Task <CommunicationBlast> ICommunicationBlastFinder.FindAsync(Creative creative) { var blast = await Rdb.CommunicationBlasts.FirstOrDefaultAsync(z => z.CreativeId == creative.CreativeId); if (blast != null) { return(blast); } var comm = await Rdb.Communications.OrderBy(z => z.CommunicationId).Take(1).SingleAsync(); var blastSpecificCreative = new Creative(creative); var filler = new CommunicationsFiller(CreativeSettingsFinder, null); filler.Flatten(blastSpecificCreative.CreativeSettings); Rdb.Creatives.Add(blastSpecificCreative); blast = new CommunicationBlast { Communication = comm, Creative = blastSpecificCreative, }; Rdb.CommunicationBlasts.Add(blast); await Rdb.SaveChangesAsync(); return(blast); }