using Microsoft.AspNetCore.Http; using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; 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; using UnivateProperties_API.Model.Properties; using UnivateProperties_API.Model.Timeshare; 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); void addUploadCampaign(UploadCampaign campaignName); List GetUploadedCampaigns(); void RemoveUploadedAtId(int id); } 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.ItemsPerRow == 0) campaign.ItemsPerRow = 1; 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; TimeshareWeek week = new TimeshareWeek(); Property property = new Property(); itemCounter = 0; foreach (var item in campaign.Items) { itemCounter++; if (item.WeekId != 0) { week = _dbContext.Weeks.Where(w => w.Id == item.WeekId).FirstOrDefault(); } else { property = _dbContext.Properties.Where(p => p.Id == item.PropertyId).FirstOrDefault(); } string curItem = temp; foreach(var place in campaign.PlaceHolders) { //var value = property[place.BoundTo]; var value = week.Id == 0 ? property[place.BoundTo] : 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 != null ? value.ToString() : place.Name.ToString() + " (NO DATA)"); } 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); if (item.Week != null) { curItem = curItem.Replace("[link]", string.Format("{0}resort/{1}/{2}", url?.Value ?? "http://localhost:8080/#/", item.Week.ResortCode, item.Week.UnitNumber)); } else { if (_dbContext.PropertyTypes.Where(x => x.Id == item.Property.PropertyTypeId).FirstOrDefault().UsageType == PropertyUsageType.Commercial) { curItem = curItem.Replace("[link]", string.Format("{0}property/commercial/property/{1}", url?.Value ?? "http://localhost:8080/#/", item.Property.Id)); } else { curItem = curItem.Replace("[link]", string.Format("{0}property/residential/property/{1}", url?.Value ?? "http://localhost:8080/#/", item.Property.Id)); } } 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 && i.WeekId != 0 select new CampaignItem() { Id = i.Id, CampaignId = i.CampaignId, Image = i.Image, WeekId = i.WeekId, Week = i.Week, CampaignItemPlaceHolder = new List()}).ToList(); item.Items = (from i in _dbContext.CampaignItems where i.CampaignId == item.Id && i.WeekId == 0 select new CampaignItem() { Id = i.Id, CampaignId = i.CampaignId, Image = i.Image, PropertyId = i.PropertyId, Property = i.Property, 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 List GetUploadedCampaigns() { return _dbContext.CampaignUploads.Where(x => x.IsDeleted == false).ToList(); } public void addUploadCampaign(UploadCampaign campaign) { var camp = _dbContext.CampaignUploads.Where(x => x.FileName == campaign.FileName).FirstOrDefault(); if (camp == null) { _dbContext.CampaignUploads.Add(campaign); Save(); } } public void RemoveUploadedAtId(int id) { var camp = _dbContext.CampaignUploads.Where(x => x.Id == id).FirstOrDefault(); _dbContext.CampaignUploads.Remove(camp); Save(); } public void Update(Campaign item) { //var savedItem = _dbContext.Campaigns.Where(x => x.Id == item.Id).FirstOrDefault(); //if (savedItem != null) //{ // if (savedItem.Name != item.Name) // { // savedItem.Name = item.Name; // } // if (savedItem.StartDate != item.StartDate) // { // savedItem.StartDate = item.StartDate; // } // if (savedItem.EndDate != item.EndDate) // { // savedItem.EndDate = item.EndDate; // } // if (savedItem.Subject != item.Subject) // { // savedItem.Subject = item.Subject; // } // if (savedItem.ItemsPerRow != item.ItemsPerRow) // { // savedItem.ItemsPerRow = item.ItemsPerRow; // } // if (savedItem.Body != item.Body) // { // savedItem.Body = item.Body; // } // if (savedItem.ItemBody != item.ItemBody) // { // savedItem.ItemBody = item.ItemBody; // } // if (_dbContext.CampaignPlaceHolders.Where(x => x.CampaignId == savedItem.Id).ToList().Count > 0) // { // if (_dbContext.CampaignPlaceHolders.Where(x => x.CampaignId == savedItem.Id).ToList().Count < item.PlaceHolders.Count) // { // var holders = _dbContext.CampaignPlaceHolders.Where(x => x.CampaignId == item.Id).ToList(); // foreach (var savedPhItem in holders) // { // _dbContext.Remove(savedPhItem); // } // Save(); // foreach (CampaignPlaceHolder ph in item.PlaceHolders) // { // ph.CampaignId = item.Id; // _dbContext.Add(ph); // } // Save(); // } // } // else // { // foreach (CampaignPlaceHolder ph in item.PlaceHolders) // { // ph.CampaignId = item.Id; // _dbContext.Add(ph); // } // Save(); // } // if (savedItem.Items != null) // { // if (savedItem.Items.Count < item.Items.Count) // { // var savedItems = _dbContext.CampaignItems.Where(x => x.CampaignId == item.Id).ToList(); // foreach (var savedCamItem in savedItems) // { // _dbContext.Remove(savedCamItem); // } // Save(); // foreach (CampaignItem ci in item.Items) // { // ci.CampaignId = item.Id; // _dbContext.Add(ci); // } // Save(); // } // } // else // { // foreach (CampaignItem ci in item.Items) // { // ci.CampaignId = item.Id; // _dbContext.Add(ci); // } // Save(); // } //} //_dbContext.Update(savedItem); _dbContext.Entry(item).State = EntityState.Modified; Save(); } } }