using Microsoft.EntityFrameworkCore; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; using System.Linq; using UnivateProperties_API.Containers.Property; using UnivateProperties_API.Containers.Timeshare; using UnivateProperties_API.Context; using UnivateProperties_API.Model.Logging; using UnivateProperties_API.Model.Properties; namespace UnivateProperties_API.Repository.Properties { public class PropertyRepository : IPropertyRepository { private readonly DataContext dBContext; public PropertyRepository(DataContext _dBContext) { dBContext = _dBContext; } public List Get(Func where) { return dBContext.Properties .Include("PropertyType") .Include("Province") .Include("City") .Include("Suburb") .Where(where).ToList(); } public List GetAll() { var properties = dBContext.Properties.ToList(); return properties; } public Property GetDetailed(Func first) { throw new NotImplementedException(); } public PropertyContainer GetDetailed(int id, bool detailed) { var property = dBContext.Properties.Include("Status").Where(p => p.Id == id).FirstOrDefault(); if (property != null) { return GetDetail(property, detailed); } return null; } public List GetDetailedAll() { var properties = dBContext.Properties.ToList(); return properties; } private PropertyContainer GetDetail(Property property, bool detailed) { int propID = property.Id; var propertyType = dBContext.PropertyTypes.Find(property.PropertyTypeId); property.Province = dBContext.Provinces.Find(property.ProvinceId); property.City = dBContext.Cities.Find(property.CityId); property.Suburb = dBContext.Suburbs.Find(property.SuburbId); property.DisplayData = new List(); if (detailed) { var groups = (from g in dBContext.UserDefinedGroups where g.UsageType == propertyType.UsageType || g.UsageType == PropertyUsageType.Both orderby g.Rank select g).ToList(); foreach (UserDefinedGroup uGroup in groups) { var groupFields = (from f in dBContext.PropertyUserFields join uf in dBContext.UserDefinedFields on f.UserDefinedFieldId equals uf.Id join g in dBContext.UserDefinedGroups on uf.GroupId equals g.Id where f.PropertyId == propID && g.Id == uGroup.Id orderby g.Rank, uf.Rank select new { uf.FieldName, f.Value, f.Description }).ToList(); if (groupFields.Count > 0) { PropertyDetailGroup detailGroup = new PropertyDetailGroup() { GroupName = uGroup.Description, Values = new List() }; if (uGroup.Description == "Property Overview") { detailGroup.Values.Add(new PropertyDetail() { Name = "Property Type", Value = property.PropertyType.Description }); } foreach (var val in groupFields) { var irem = new PropertyDetail() { Name = val.FieldName, Description = val.Description }; detailGroup.Values.Add(irem); if ((val.FieldName == "Erf Size" || val.FieldName == "Floor Size") && val.Value.EndsWith("2")) { irem.Value = val.Value.Substring(0, val.Value.Length - 1) + "" + val.Value.Last() + ""; } else irem.Value = val.Value; } property.DisplayData.Add(detailGroup); } } } else { if (!string.IsNullOrEmpty(property.Video)) property.Video = string.Format("https://www.youtube.com/watch?v={0}", property.Video); } var propertyDetails = new PropertyContainer(); foreach (string prop in property.GetAllProperties()) { if (prop != "Item" && prop != "Display") propertyDetails[prop] = property[prop]; } propertyDetails.PropertyUsageType = propertyType.UsageType == PropertyUsageType.Commercial ? "Commercial" : "Residential"; if (property.OwnerId > 0) propertyDetails.UserId = (dBContext.Individuals.Where(p => p.Id == property.OwnerId).FirstOrDefault().UserId).Value; if (property.AgentId > 0) propertyDetails.UserId = (dBContext.Agents.Where(p => p.Id == property.AgentId).FirstOrDefault().UserId).Value; propertyDetails.NewImages = new List(); return propertyDetails; } public void Insert(Property item) { throw new NotImplementedException(); } public void Insert(IEnumerable items) { foreach (var item in items) { dBContext.Properties.Add(item); } Save(); } public void Remove(Property item) { item.IsDeleted = true; Save(); } public void Remove(IEnumerable items) { foreach (var item in items) { item.IsDeleted = true; } Save(); } public void RemoveAtId(int item) { var property = Get(x => x.Id == item).FirstOrDefault(); if (property != null) { dBContext.Properties.Remove(property); Save(); } } public void Save() { dBContext.SaveChanges(); } public void Update(Property item) { if (item.Video.StartsWith("http")) item.Video = item.Video.Replace("https://www.youtube.com/watch?v=", ""); dBContext.Entry(item).State = EntityState.Modified; Save(); } public void Update(PropertyContainer item) { if (item.Video.StartsWith("http")) item.Video = item.Video.Replace("https://www.youtube.com/watch?v=", ""); var property = new Property(); foreach (string prop in property.GetAllProperties()) { if (prop != "Item" && prop != "Display") property[prop] = item[prop]; } property.PropertyUserFields = null; property.PropertyImages = null; dBContext.Entry(property).State = EntityState.Modified; #region Insert New UDFs var lastFieldID = dBContext.GetMaxID("PropertyUserFields"); foreach (var propGroup in item.PropertyOverviewFields) { foreach (var field in propGroup.Fields) { if (field.ItemId == 0) { lastFieldID++; var propertyField = new PropertyUserField() { Id = lastFieldID, PropertyId = property.Id, UserDefinedFieldId = field.Id, Value = field.Value }; dBContext.Add(propertyField); } else { var propertyField = dBContext.PropertyUserFields.Where(p => p.Id == field.ItemId).FirstOrDefault(); if (propertyField != null) { if (string.IsNullOrEmpty(field.Value)) propertyField.IsDeleted = true; else propertyField.Value = field.Value; dBContext.Entry(propertyField).State = EntityState.Modified; } } } } foreach (var propGroup in item.PropertyFields) { foreach (var field in propGroup.Fields) { if (field.ItemId == 0) { lastFieldID++; var propertyField = new PropertyUserField() { Id = lastFieldID, PropertyId = property.Id, UserDefinedFieldId = field.Id, Value = field.Value }; dBContext.Add(propertyField); } else { var propertyField = dBContext.PropertyUserFields.Where(p => p.Id == field.ItemId).FirstOrDefault(); if (propertyField != null) { if (string.IsNullOrEmpty(field.Value)) propertyField.IsDeleted = true; else propertyField.Value = field.Value; dBContext.Entry(propertyField).State = EntityState.Modified; } } } } #endregion #region Update Images if (item.PropertyImages != null) { foreach (var image in item.PropertyImages) { var propImage = dBContext.PropertyImages.Where(pi => pi.Id == image.Id).FirstOrDefault(); if (propImage != null) { propImage.IsDefault = image.IsDefault; propImage.IsDeleted = image.IsDeleted; dBContext.Entry(propImage).State = EntityState.Modified; } } } #endregion Save(); } public List GetDisplay() { List props = GetAll(); return GetDisplayDetails(props); } public List GetDisplay(Func where) { List props; if (where != null) props = Get(where); else props = GetAll(); return GetDisplayDetails(props); } public List GetDisplay(PropertySearch search) { SearchObject obj = new SearchObject() { UserName = search.UserName, Type = "Property" }; if (!string.IsNullOrEmpty(search.Keyword) && search.Keyword.ToUpper() != "ALL" && search.Keyword.ToUpper() != "UNDEFINED") { string keyword = search.Keyword.ToLower(); List props = (from p in dBContext.Properties join pr in dBContext.Provinces on p.ProvinceId equals pr.Id join c in dBContext.Cities on p.CityId equals c.Id join s in dBContext.Suburbs on p.SuburbId equals s.Id join pt in dBContext.PropertyTypes on p.PropertyTypeId equals pt.Id where EF.Functions.Like(p.PropertyName.ToLower(), $"%{keyword}%") || EF.Functions.Like(pr.Description.ToLower(), $"%{keyword}%") || EF.Functions.Like(c.Description.ToLower(), $"%{keyword}%") || EF.Functions.Like(s.Description.ToLower(), $"%{keyword}%") || EF.Functions.Like(pt.Description.ToLower(), $"%{keyword}%") select p).ToList(); obj.Property = "Keyword"; obj.Value = search.Keyword; SaveLog(obj); return GetDisplayDetails(props); } else { List props; PropertyUsageType uType = PropertyUsageType.Both; if (!string.IsNullOrEmpty(search.PropertyUsageType) && search.PropertyUsageType != "undefined" && search.PropertyUsageType.ToUpper() != "ALL") { if (search.PropertyUsageType.ToUpper() == "COMMERCIAL") uType = PropertyUsageType.Commercial; else uType = PropertyUsageType.Residential; } props = (from p in dBContext.Properties join pt in dBContext.PropertyTypes on p.PropertyTypeId equals pt.Id where pt.UsageType == uType select p).ToList(); obj.Property = "PropertyUsageType"; obj.Value = search.PropertyUsageType; SaveLog(obj); if (!string.IsNullOrEmpty(search.SalesType) && search.SalesType != "undefined" && search.SalesType.ToUpper() != "ALL") { if (search.SalesType.ToUpper() == "SALE") props = props.Where(p => p.IsSale).ToList(); else props = props.Where(p => !p.IsSale).ToList(); obj.Property = "SalesType"; obj.Value = search.SalesType; SaveLog(obj); } if (!string.IsNullOrEmpty(search.Province) && search.Province != "undefined" && search.Province.ToUpper() != "ALL") { props = (from p in props join pp in dBContext.Provinces on p.ProvinceId equals pp.Id where pp.Description.ToUpper() == search.Province.ToUpper() select p).ToList(); obj.Property = "Province"; obj.Value = search.Province; SaveLog(obj); } if (!string.IsNullOrEmpty(search.City) && search.City != "undefined" && search.City.ToUpper() != "ALL") { props = (from p in props join c in dBContext.Cities on p.CityId equals c.Id where c.Description.ToUpper() == search.City.ToUpper() select p).ToList(); obj.Property = "City"; obj.Value = search.City; SaveLog(obj); } if (!string.IsNullOrEmpty(search.Suburb) && search.Suburb != "undefined" && search.Suburb.ToUpper() != "ALL") { props = (from p in props join s in dBContext.Suburbs on p.SuburbId equals s.Id where s.Description.ToUpper() == search.Suburb.ToUpper() select p).ToList(); obj.Property = "Suburb"; obj.Value = search.Suburb; SaveLog(obj); } if (!string.IsNullOrEmpty(search.PropertyType) && search.PropertyType != "Undefined" && search.PropertyType.ToUpper() != "ALL") { var pType = dBContext.PropertyTypes.Where(t => t.Description == search.PropertyType).FirstOrDefault(); if (pType != null) { props = props.Where(p => p.PropertyTypeId == pType.Id).ToList(); } obj.Property = "PropertyType"; obj.Value = search.PropertyType; SaveLog(obj); } if (search.MinPrice > 0) { props = props.Where(p => p.Price >= search.MinPrice).ToList(); obj.Property = "MinPrice"; obj.Value = search.MinPrice.ToString(); SaveLog(obj); } if (search.MaxPrice > 0) { props = props.Where(p => p.Price <= search.MaxPrice).ToList(); obj.Property = "MaxPrice"; obj.Value = search.MaxPrice.ToString(); SaveLog(obj); } return GetDisplayDetails(props); } } private void SaveLog(SearchObject item) { var searchLog = new SearchLog { Type = item.Type, Search = JsonConvert.SerializeObject(item) }; dBContext.SearchLogs.Add(searchLog); Save(); } private List GetDisplayDetails(List props) { var properties = new List(); foreach (var item in props) { PropertyDisplay display = new PropertyDisplay { Id = item.Id, ShortDescription = item.ShortDescription, IsSale = item.IsSale, DisplayPrice = string.Format("R {0}", item.Price.ToString("N0")), DisplayImage = (from i in dBContext.PropertyImages where i.PropertyId == item.Id && i.IsDefault select i.Image).FirstOrDefault(), Area = (from u in dBContext.PropertyUserFields join f in dBContext.UserDefinedFields on u.UserDefinedFieldId equals f.Id where u.PropertyId == item.Id && f.FieldName == "Floor Size" select u.Value).FirstOrDefault(), Beds = (from u in dBContext.PropertyUserFields join f in dBContext.UserDefinedFields on u.UserDefinedFieldId equals f.Id where u.PropertyId == item.Id && f.FieldName == "Bedrooms" select u.Value).FirstOrDefault(), Baths = (from u in dBContext.PropertyUserFields join f in dBContext.UserDefinedFields on u.UserDefinedFieldId equals f.Id where u.PropertyId == item.Id && f.FieldName == "Bathrooms" select u.Value).FirstOrDefault(), Garages = (from u in dBContext.PropertyUserFields join f in dBContext.UserDefinedFields on u.UserDefinedFieldId equals f.Id where u.PropertyId == item.Id && f.FieldName == "Garages" select u.Value).FirstOrDefault(), Province = (from p in dBContext.Provinces where p.Id == item.ProvinceId select p.Description).FirstOrDefault(), City = (from c in dBContext.Cities where c.Id == item.CityId select c.Description).FirstOrDefault(), Suburb = (from s in dBContext.Suburbs where s.Id == item.SuburbId select s.Description).FirstOrDefault(), Price = item.Price, DateCreated = item.Created, PropertyUsageType = (from p in dBContext.PropertyTypes where p.Id == item.PropertyTypeId select p.UsageType.ToString()).FirstOrDefault() }; if (display.DisplayImage != null && !display.DisplayImage.StartsWith("data:image")) { display.DisplayImage = ImageFormatter.ImageToBase64(display.DisplayImage); } if (!string.IsNullOrEmpty(display.Area) && display.Area.EndsWith("2")) { display.Area = display.Area.Substring(0, display.Area.Length - 1) + "" + display.Area.Last() + ""; } properties.Add(display); } return properties; } public List GetPropertyTypes(Func where) { List list; if (where != null) list = dBContext.PropertyTypes.Where(where).ToList(); else list = dBContext.PropertyTypes.ToList(); return list; } public List GetLatestDisplay() { List props = GetAll().OrderByDescending(x => x.Created).Take(3).ToList(); return GetDisplayDetails(props); } public List GetPropertyList(string Type, int By) { var individual = dBContext.Individuals.Where(x => x.UserId == By).FirstOrDefault(); var agent = dBContext.Agents.Where(x => x.UserId == By).FirstOrDefault(); List properties = new List(); if (Type.ToUpper() == "MY") { if (individual != null) properties = dBContext.Properties.Include("City").Include("Suburb").Where(x => x.OwnerId == individual.Id).ToList(); if (agent != null) properties = dBContext.Properties.Include("City").Include("Suburb").Where(x => x.AgentId == agent.Id).ToList(); } else if (Type.ToUpper() == "ADMIN") { if (individual != null) properties = dBContext.Properties.Include("City").Include("Suburb").Where(x => x.OwnerId == individual.Id).ToList(); if (agent != null) properties = dBContext.Properties.Include("City").Include("Suburb").Where(x => x.AgencyId == agent.AgencyId).ToList(); } else if (Type.ToUpper() == "SUPERADMIN") { properties = dBContext.Properties.Include("City").Include("Suburb").ToList(); } List list = new List(); foreach (Property p in properties) { var prop = new PropertyList() { Id = p.Id, Name = string.IsNullOrEmpty(p.PropertyName) ? p.ShortDescription : p.PropertyName, Price = string.Format("R {0:n}", p.Price), Publish = p.Published.ToString(), Type = dBContext.PropertyTypes.Find(p.PropertyTypeId)?.Description, CarouselDescription = string.Format("{0}, {1}
{2}", p.Suburb.Description, p.City.Description, p.AddressLine3) }; prop.Size = (from u in dBContext.PropertyUserFields join f in dBContext.UserDefinedFields on u.UserDefinedFieldId equals f.Id where u.PropertyId == p.Id && f.FieldName == "Floor Size" select u.Value).FirstOrDefault(); if (!string.IsNullOrEmpty(prop.Size) && prop.Size.EndsWith("2")) { prop.Size = prop.Size.Substring(0, prop.Size.Length - 1) + "" + prop.Size.Last() + ""; } prop.UsageType = (dBContext.PropertyTypes.Find(p.PropertyTypeId).UsageType == PropertyUsageType.Residential ? "Residential" : "Commercial"); prop.SaleType = p.IsSale ? "Sale" : "Rental"; list.Add(prop); } return list; } public int NewId() { // Not sure if properties need it return 0; } public void Insert(PropertyContainer items) { Property property = new Property(); PropertyType pt = dBContext.PropertyTypes.Find(items.PropertyTypeId); if (pt != null) { if (pt.UsageType == PropertyUsageType.Residential) { string type = dBContext.PropertyTypes.Find(items.PropertyTypeId).Description; if (items.PropertyUserFields.Count > 0) { string shortDesc = "{0} {1} {2}"; UserDefinedField bedrooms = dBContext.UserDefinedFields.Where(u => u.FieldName == "Bedrooms").FirstOrDefault(); var udValue = items.PropertyUserFields.Where(u => u.UserDefinedFieldId == bedrooms.Id).FirstOrDefault(); if (udValue != null) items.ShortDescription = string.Format(shortDesc, udValue.Value, "Bedroom", pt.Description).Trim(); else items.ShortDescription = string.Format(shortDesc, "", "", pt.Description).Trim(); } else { items.ShortDescription = type; } } else { items.ShortDescription = pt.Description; } } var images = items.PropertyImages; var fields = items.PropertyUserFields; items.PropertyImages = null; items.PropertyUserFields = null; var individual = dBContext.Individuals.Where(i => i.UserId == items.UserId).FirstOrDefault(); var agent = dBContext.Agents.Where(a => a.UserId == items.UserId).FirstOrDefault(); foreach( string prop in property.GetAllProperties()) { if (prop != "Item" && prop != "Display") property[prop] = items[prop]; } if (individual != null) property.OwnerId = individual.Id; if (agent != null) { property.AgencyId = agent.AgencyId; property.AgentId = agent.Id; } property.Video = property.Video.Replace("https://www.youtube.com/watch?v=", ""); if (images != null) { var lastID = dBContext.GetMaxID("PropertyImages"); bool saveFiles = false; var loc = dBContext.Location.FirstOrDefault().PropertyImageLocation; if (!string.IsNullOrEmpty(loc)) { saveFiles = true; loc += string.Format("\\{0}", property.Id); if (Directory.Exists(loc)) { Directory.CreateDirectory(loc); } } property.PropertyImages = new List(); foreach (PropertyImage image in images) { lastID++; image.Id = lastID; image.PropertyId = property.Id; if (saveFiles) { string path = ImageFormatter.Base64ToImage(image.Image, loc, lastID.ToString()); image.Image = path; } property.PropertyImages.Add(image); } } if (fields != null) { var lastID = dBContext.GetMaxID("PropertyUserFields"); property.PropertyUserFields = new List(); foreach (PropertyUserField field in fields) { lastID++; field.Id = lastID; field.PropertyId = property.Id; property.PropertyUserFields.Add(field); } } dBContext.Properties.Add(property); Save(); items.Id = property.Id; } public bool MayEdit(int id) { var hasBidItems = (from b in dBContext.BidItems where b.PropertyId == id && b.StatusId == 2 select b).FirstOrDefault(); return (hasBidItems == null) ? true : false; } public void InsertImages(int propertyID, List Images) { if (Images != null) { var lastID = dBContext.GetMaxID("PropertyImages"); bool saveFiles = false; var loc = dBContext.Location.FirstOrDefault().PropertyImageLocation; if (!string.IsNullOrEmpty(loc)) { saveFiles = true; loc += string.Format("\\{0}", propertyID); if (Directory.Exists(loc)) { Directory.CreateDirectory(loc); } } foreach (PropertyImage image in Images) { lastID++; image.Id = lastID; image.PropertyId = propertyID; if (saveFiles) { string path = ImageFormatter.Base64ToImage(image.Image, loc, lastID.ToString()); image.Image = path; } dBContext.PropertyImages.Add(image); Save(); } } } public void InsertFields(int propertyID, List Fields) { throw new NotImplementedException(); } } }