using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using UnivateProperties_API.Containers.Campaigns; using UnivateProperties_API.Context; using UnivateProperties_API.Helpers; using UnivateProperties_API.Model.Campaigns; namespace UnivateProperties_API.Repository.Campaigns { public interface ICampaignRepository : IRepository { CampaignDTO GetDTO(Func where); int InsertFromDTO(CampaignDTO campaign); string GetCampaignHTML(int CampaignId); List GetCampaignItems(int CampaignId); List GetCampaignPlaceHolders(int CampaignId); } public class CampaignRepository : ICampaignRepository { private readonly DataContext _dbContext; public CampaignRepository(DataContext dbContext) { _dbContext = dbContext; } public List Get(Func where) { return _dbContext.Campaigns.Where(where).ToList(); } public List GetAll() { return _dbContext.Campaigns.OrderByDescending(c => c.Created).ToList(); } public string GetCampaignHTML(int CampaignId) { var campaign = _dbContext.Campaigns.Where(c => c.Id == CampaignId).Include("PlaceHolders").Include("Items").FirstOrDefault(); string html = ""; string tableItems = ""; int rows; if (campaign.Items.Count % campaign.ItemsPerRow == 0) { rows = campaign.Items.Count / campaign.ItemsPerRow; } else { int remainder = campaign.Items.Count % campaign.ItemsPerRow; int evenItems = campaign.Items.Count - remainder; rows = evenItems / campaign.ItemsPerRow; rows += remainder; } int itemCounter = 0; for (int r = 0; r < rows; r++) { tableItems += ""; for(int c = 0; c < campaign.ItemsPerRow; c++) { itemCounter++; if (itemCounter > campaign.Items.Count) tableItems += ""; else tableItems += string.Format("", itemCounter); } tableItems += ""; } tableItems += "
[ITEM{0}]
"; if(campaign != null) { var url = _dbContext.Defaults.Where(d => d.Id == "URL").FirstOrDefault(); html = campaign.Body; string temp = campaign.ItemBody; itemCounter = 0; foreach (var item in campaign.Items) { itemCounter++; var week = _dbContext.Weeks.Where(w => w.Id == item.WeekId).FirstOrDefault(); string curItem = temp; foreach(var place in campaign.PlaceHolders) { var value = week[place.BoundTo]; if (!string.IsNullOrEmpty(place.Format)) { string format = place.Format; if (format.Contains("|")) { string special = format.Substring(format.IndexOf('|'), format.Length - format.IndexOf('|')).Replace("|", ""); format = format.Substring(0, format.IndexOf('|')); if (special == "DaySuffix") { if (DateTime.TryParse(value.ToString(), out DateTime dateValue)) { string suffix = MyCommon.DateSuffixed(dateValue); string[] formatParts = format.Split(" "); string replaceValue = ""; foreach(var s in formatParts) { string tempFormat = "{0:" + s + "}"; replaceValue += string.Format(tempFormat, dateValue); if (s.ToLower().Contains("d")) replaceValue += "" + suffix + " "; else replaceValue += " "; } curItem = curItem.Replace(place.Name.ToString(), replaceValue.Trim()); } else { curItem = curItem.Replace(place.Name.ToString(), "ERROR-Date format on non date field"); } } } else curItem = curItem.Replace(place.Name.ToString(), string.Format("{0:" + format + "}", value)); } else curItem = curItem.Replace(place.Name.ToString(), value.ToString()); } var cutsomPlaceHolders = _dbContext.CampaignItemPlaceHolders.Where(c => c.CampaignItemId == item.Id).ToList(); foreach (var custom in cutsomPlaceHolders) { curItem = curItem.Replace(custom.PlaceHolder, custom.Value); } curItem = curItem.Replace("[image]", item.Image); curItem = curItem.Replace("[link]", string.Format("{0}resort/{1}/{2}", url?.Value ?? "http://localhost:8080/#/", item.Week.ResortCode, item.Week.UnitNumber)); tableItems = tableItems.Replace(string.Format("[ITEM{0}]", itemCounter), curItem); } html = html.Replace("[items]", tableItems); } return html; } public List GetCampaignItems(int CampaignId) { return _dbContext.CampaignItems.Where(c => c.CampaignId == CampaignId).ToList(); } public List GetCampaignPlaceHolders(int CampaignId) { return _dbContext.CampaignPlaceHolders.Where(c => c.CampaignId == CampaignId).ToList(); } public Campaign GetDetailed(Func first) { var item = _dbContext.Campaigns.FirstOrDefault(first); if (item == null) { item = new Campaign { Items = new List(), PlaceHolders = new List() }; } else { item.Items = (from i in _dbContext.CampaignItems where i.CampaignId == item.Id select new CampaignItem() { Id = i.Id, CampaignId = i.CampaignId, Image = i.Image, WeekId = i.WeekId, Week = i.Week, CampaignItemPlaceHolder = new List()}).ToList(); item.PlaceHolders = (from i in _dbContext.CampaignPlaceHolders where i.CampaignId == item.Id select new CampaignPlaceHolder(){Id = i.Id, CampaignId = i.CampaignId, Name = i.Name, BoundTo = i.BoundTo, BoundToClass = i.BoundToClass, BoundToClassDisplay = i.BoundToClassDisplay }).ToList(); foreach(var week in item.Items) { var placeholders = (from p in _dbContext.CampaignItemPlaceHolders where p.CampaignItemId == week.Id select new CampaignItemPlaceHolder() { Id = p.Id, PlaceHolder = p.PlaceHolder, Value = p.Value, CampaignItemId = p.CampaignItemId }).ToList(); week.CampaignItemPlaceHolder = placeholders; } } var sItem = JsonConvert.SerializeObject(item, Formatting.None); return item; } public List GetDetailedAll() { return GetAll(); } public CampaignDTO GetDTO(Func where) { var item = _dbContext.Campaigns.Include("Items").Include("PlaceHolders").Where(where).FirstOrDefault(); var dto = new CampaignDTO { PlaceHolders = new List(), Weeks = new List(), WeekPlaceHolders = new List() }; if (item != null) { dto.Name = item.Name; dto.StartDate = item.StartDate; dto.EndDate = item.EndDate; dto.Subject = item.Subject; dto.Body = item.Body; dto.ItemBody = item.ItemBody; foreach (var p in item.PlaceHolders) { dto.PlaceHolders.Add(new CampaignPlaceholderDTO() { Name = p.Name, BoundTo = p.BoundTo, BoundToClass = p.BoundToClass, BoundToClassDisplay = p.BoundToClassDisplay }); } foreach (var i in item.Items) { dto.Weeks.Add(new CampaignWeeksDTO() { Image = i.Image, WeekId = i.WeekId }); } } return dto; } public void Insert(Campaign item) { if (item.PlaceHolders.Count > 0) { foreach (var ph in item.PlaceHolders) { ph.CampaignId = item.Id; } } if (item.Items.Count > 0) { foreach (var i in item.Items) { i.CampaignId = item.Id; } } _dbContext.Add(item); Save(); } public void Insert(IEnumerable items) { foreach (var item in items) { _dbContext.Add(item); } Save(); } public int InsertFromDTO(CampaignDTO campaign) { var cam = new Campaign { Name = campaign.Name, StartDate = campaign.StartDate, EndDate = campaign.EndDate, Subject = campaign.Subject, Body = campaign.Body, ItemBody = campaign.ItemBody, ItemsPerRow = campaign.ItemsPerRow }; if (campaign.PlaceHolders.Count > 0) { cam.PlaceHolders = new List(); foreach (var place in campaign.PlaceHolders) { cam.PlaceHolders.Add(new CampaignPlaceHolder() { CampaignId = cam.Id, Name = place.Name, BoundTo = place.BoundTo, BoundToClass = place.BoundToClass, BoundToClassDisplay = place.BoundToClassDisplay }); } } if (campaign.Weeks.Count > 0) { cam.Items = new List(); foreach (var week in campaign.Weeks) { cam.Items.Add(new CampaignItem() { CampaignId = cam.Id, WeekId = week.WeekId, Image = week.Image }); } } if (campaign.WeekPlaceHolders.Count > 0) { foreach (var wph in campaign.WeekPlaceHolders) { var week = cam.Items.Where(w => w.WeekId == wph.WeekId).FirstOrDefault(); if (week.CampaignItemPlaceHolder == null) week.CampaignItemPlaceHolder = new List(); CampaignItemPlaceHolder campaignItemPlaceHolder = new CampaignItemPlaceHolder { CampaignItemId = week.Id, PlaceHolder = wph.Name, Value = wph.Value }; week.CampaignItemPlaceHolder.Add(campaignItemPlaceHolder); } } _dbContext.Add(cam); Save(); return cam.Id; } public int NewId() { throw new NotImplementedException(); } public void Remove(Campaign item) { var i = _dbContext.Campaigns.Find(item); _dbContext.Campaigns.Remove(i); Save(); } public void Remove(IEnumerable items) { foreach (var item in items) { var i = _dbContext.Campaigns.Find(item); _dbContext.Campaigns.Remove(i); } Save(); } public void RemoveAtId(int item) { var i = _dbContext.Campaigns.Where(c => c.Id == item).FirstOrDefault(); if (i != null) { _dbContext.Campaigns.Remove(i); } Save(); } public void Save() { _dbContext.SaveChanges(); } public void Update(Campaign item) { _dbContext.Entry(item).State = EntityState.Modified; Save(); } } }