using System.Threading.Tasks;
using System.Collections.Generic;
using System.Text.Json.Serialization;
public async static Task Main()
JsonSerializerOptions _jsonOptions = new()
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull
{"id": "19420125-41b8-4aa8-886d-9caad26eab82", "name": "Change_my_name", "type": "topdown", "shmId": 0, "_metas": {"modificationDate": "2023-06-30T09:03:24.1418265Z"}, "homeId": 1, "samiId": 4801, "siteId": 1, "endDate": "2023-06-30T09:03:23.992Z", "targets": {"web": {"sizeId": "0", "imageUrl": "", "position": "0", "isVisible": "false", "isFloating": "true", "redirectionType": "none"}, "mobile": {"sizeId": "0", "imageUrl": "", "position": "0", "isVisible": "false", "isFloating": "true", "redirectionType": "none", "interfaceExcludedValue": "0"}, "tablet": {"sizeId": "0", "imageUrl": "", "position": "0", "isVisible": "false", "isFloating": "true", "redirectionType": "none", "interfaceExcludedValue": "0"}}, "beginDate": "2023-06-30T09:03:23.992Z", "contextId": "", "createdBy": "Alida SOSA ALVAREZ", "targeting": {"memberIds": [], "endZipCode": 0, "startZipCode": 0, "excludedValue": 0}, "hiddenDays": [], "isArchived": false, "universeId": 0, "isPublished": false, "businessUnit": 0, "isSynchronized": false, "uniqueIdentifier": "false-19420125-41b8-4aa8-886d-9caad26eab82"}
var json = await JsonSerializer.DeserializeAsync<Campaign>(GenerateStreamFromString(str), _jsonOptions);
Console.WriteLine(json.Id);
public static Stream GenerateStreamFromString(string s)
var stream = new MemoryStream();
var writer = new StreamWriter(stream);
public const string WEB_TARGET = "web";
public const string MOBILE_TARGET = "mobile";
public const string TABLET_TARGET = "tablet";
public string Id { get; set; }
public int SamiId { get; set; }
public int SiteId { get; set; }
public int HomeId { get; set; }
public string Name { get; set; }
public DateTime? EndDate { get; set; } = null;
public DateTime? BeginDate { get; set; } = null;
public Dictionary<string, Target> Targets { get; set; } = new Dictionary<string, Target>();
public string Type { get; set; } = "";
public int BusinessUnit { get; set; }
public bool IsArchived { get; set; }
public bool IsPublished { get; set; }
public string UniqueIdentifier => "toto";
public bool IsSynchronized { get; set; }
public string CreatedBy { get; set; }
public int UniverseId { get; set; }
public CampaignTargeting Targeting { get; set; } = new CampaignTargeting();
public int ShmId { get; set; }
public List<HiddenDay> HiddenDays { get; set; } = new List<HiddenDay>();
public string ContextId { get; set; }
public DateTime? CsvMembersDate { get; set; }
public bool IsMarketPlaceCampaign()
var result = this.Target(WEB_TARGET)?.IsMarketingCampaign()
?? this.Target(MOBILE_TARGET)?.IsMarketingCampaign()
?? this.Target(TABLET_TARGET)?.IsMarketingCampaign();
return result.GetValueOrDefault();
public bool IsValid() => this.EndDate >= DateTime.UtcNow;
public string GetRepresentativeUrl() => this.Target(WEB_TARGET)?.RegularImageUrl() ??
this.Target(MOBILE_TARGET)?.RegularImageUrl() ??
this.Target(TABLET_TARGET)?.RegularImageUrl();
private string BuildWidgetCampaignId(string device)
return $"c-{device}-{this.SamiId}";
public string BuildWidgetCampaignDesktopId() => this.BuildWidgetCampaignId(WEB_TARGET);
public string BuildWidgetCampaignTabletId() => this.BuildWidgetCampaignId(TABLET_TARGET);
public string BuildWidgetCampaignMobileId() => this.BuildWidgetCampaignId(MOBILE_TARGET);
private Target Target(string key) => this.Targets.TryGetValue(key, out var target) ? target : null;
public DateTime Date { get; set; }
public bool AM { get; set; }
public bool PM { get; set; }
public class CampaignTargeting
public int StartZipCode{ get; set; }
public int EndZipCode { get; set; }
public List<int> MemberIds { get; set; } = new List<int>();
public int ExcludedValue { get; set; }
public class Target : Dictionary<string, string>
private static readonly Dictionary<int, BannerFormat> _sizesToBannerFormat = new()
{(int)BannerFormat.XLWebMobile, BannerFormat.XLWebMobile}
public const string EXTRA_IMAGE_KEY = "extraImageUrl";
public const string EXTRA_SIZE_KEY = "extraSizeId";
public const string REGULAR_IMAGE_KEY = "imageUrl";
public const string REGULAR_SIZE_KEY = "sizeId";
public int ExtraSize() => this.GetSize(EXTRA_SIZE_KEY);
public string ExtraImageUrl() => this.GetImageUrl(EXTRA_IMAGE_KEY);
public int RegularSize(int defaultValue = 1) => this.GetSize(REGULAR_SIZE_KEY, defaultValue);
public string RegularImageUrl() => this.GetImageUrl(REGULAR_IMAGE_KEY);
private int GetSize(string key, int defaultValue = 1)
if (!this.TryGetValue(key, out var size)) return defaultValue;
return int.TryParse(size, out var sz) ? sz : defaultValue;
private string GetImageUrl(string key)
return this.TryGetValue(key, out var imageUrl) ? imageUrl : string.Empty;
public BannerImage UpdateExtraImage(string url, BannerFormat defaultFormat = BannerFormat.L)
return this.UpdateImage(EXTRA_IMAGE_KEY, EXTRA_SIZE_KEY, url, defaultFormat);
public BannerImage UpdateRegularImage(string url, BannerFormat defaultFormat = BannerFormat.L)
return this.UpdateImage(REGULAR_IMAGE_KEY, REGULAR_SIZE_KEY, url, defaultFormat);
private BannerImage UpdateImage(string imageKey, string sizeKey, string url, BannerFormat defaultFormat)
return string.IsNullOrWhiteSpace(url) || !this.ContainsKey(imageKey)
: this.SetBannerImage(imageKey, sizeKey, url, defaultFormat);
private BannerImage SetBannerImage(string imageKey, string sizeKey, string url, BannerFormat defaultFormat)
return BannerImage.Create(this.GetFormatBySize(sizeKey, defaultFormat), url);
private BannerFormat GetFormatBySize(string sizeKey, BannerFormat defaultFormat)
return _sizesToBannerFormat.TryGetValue(this.GetSize(sizeKey), out var format) ? format : defaultFormat;
private BannerFormat GetFormatBySize(int size, BannerFormat defaultFormat)
return _sizesToBannerFormat.TryGetValue(size, out var format) ? format : defaultFormat;
public BannerImage CreateBannerImage(int size)
return this.CreateBanner(size, BannerFormat.M);
public BannerImage CreateMobileBannerImage(int size)
return this.CreateBanner(size);
public bool? IsMarketingCampaign()
return this.TryGetValue("isMkt", out var boolString) ? boolString == "true" : null;
public BannerImage CreateExtraSizeBannerImage(int currentSize)
if (!this.ContainsKey(EXTRA_SIZE_KEY))
var extraSize = this.ExtraSize();
if (extraSize == currentSize)
var url = this.ExtraImageUrl();
return string.IsNullOrEmpty(url) ? null : BannerImage.Create(this.GetFormatBySize(extraSize, BannerFormat.XL), url);
private BannerImage CreateBanner(int size, BannerFormat defaultFormat = BannerFormat.L)
var url = this.RegularImageUrl();
return string.IsNullOrEmpty(url)
: BannerImage.Create(this.GetFormatBySize(size, defaultFormat), url);
public record BannerImage(BannerFormat BannerFormat, string Url, string WebPreOpeningUrl, string MobilePreopeningUrl, DateTime? StartDate = null, DateTime? EndDate = null)
public bool ContainsInstant(DateTime dateTime) =>
this.StartDate.HasValue &&
dateTime >= this.StartDate.Value &&
dateTime < this.EndDate.Value;
public bool IsDefault => !this.EndDate.HasValue && !this.StartDate.HasValue;
public static BannerImage Create(BannerFormat bannerFormat, string url) =>
new BannerImage(bannerFormat, url, url, url);