using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text.RegularExpressions; using System.Threading.Tasks; using AutoMapper; using MapsDb.Interfaces; using MapsDb.Models; using MapsModels.DsModels; using Microsoft.EntityFrameworkCore; namespace MapsDb.DataService { public class BusStopDs : IBusStopDs { private PostgresDbContext _context; public BusStopDs(){ _context = new PostgresDbContext(); } public Task> GetIndexListAsync(PaginationDsM pagination){ return Task.Factory.StartNew(()=> { return GetAllBusStop(pagination); }); } private IList GetAllBusStop(PaginationDsM pagination) { var filter = pagination.filter; IQueryable data = _context.BusStop .Include(d=>d.Road) .Include(d=>d.Region) .Include(d=>d.SurfaceType) .Include(d=>d.StateCommon); data = Filtering(pagination.filter, data); //.Where(d => d.Region.Name == filter); IQueryable result = data .Select(BusStop => Mapper.Map(BusStop)) .Skip(pagination.from) .Take(pagination.perPage); switch (pagination.orderType()) { case "ASC": return result.OrderBy(i => i.GetType().GetProperty(pagination.sort).GetValue(i, null)).ToList(); case "DESC": return result.OrderByDescending(i => i.GetType().GetProperty(pagination.sort).GetValue(i, null)).ToList(); default: return result.OrderByDescending(i => i.Id).ToList(); } } public Task CreateAsync(BusStopEditDsM data){ return Task.Factory.StartNew(()=> { return Create(data); }); } private BusStop Create(BusStopEditDsM data) { BusStop Model = InsertModel(data); _context.BusStop.Add(Model); _context.SaveChanges(); return Model; } public Task UpdateAsync(BusStopEditDsM data, int id){ return Task.Factory.StartNew(()=> { return Update(data, id); }); } private BusStop Update(BusStopEditDsM data, int id) { BusStop Model = InsertModel(data); Model.Id = id; _context.BusStop.Update(Model); _context.SaveChanges(); return Model; } public BusStop InsertModel(BusStopEditDsM data){ BusStop Model = Mapper.Map(data); return Model; } public IQueryable Filtering(string filters, IQueryable data){ if(filters != null){ string[] FilterWords = filters.Split(';').Where(x => !string.IsNullOrEmpty(x)).ToArray(); foreach(string word in FilterWords){ string[] filter = Regex.Split(word.Substring(1), "(.*)_(.*)"); if(filter.Length < 3 ){ continue; } string field = char.ToUpper(filter[1][0]) + filter[1].Substring(1); if(word.StartsWith("$")){ data = FilterByEndWith(field, filter[2], data); } else if(word.StartsWith("^")){ data = FilterByStartWith(field, filter[2], data); } else if(word.StartsWith("*")){ data = FilterByComtains(field, filter[2], data); } else if(word.StartsWith("!")){ data = FilterByNotEquals(field, filter[2], data); } else if(word.StartsWith("=")){ data = FilterByEquals(field, filter[2], data); } } } return data; } public IQueryable FilterByComtains(string field, string param, IQueryable data){ switch(field){ case "RoadId": return data.Where(i => i.Road.Name.Contains(param) ); case "RegionId": return data.Where(i => i.Region.Name.Contains(param) ); case "SurfaceTypeId": return data.Where(i => i.SurfaceType.Name.Contains(param) ); case "StateCommonId": return data.Where(i => i.StateCommon.Value.Contains(param) ); default: return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).Contains(param) ); } } public IQueryable FilterByEquals(string field, string param, IQueryable data){ switch(field){ case "RoadId": return data.Where(i => i.Road.Name == param ); case "RegionId": return data.Where(i => i.Region.Name == param ); case "SurfaceTypeId": return data.Where(i => i.SurfaceType.Name == param ); case "StateCommonId": return data.Where(i => i.StateCommon.Value == param ); default: return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)) == param ); } } public IQueryable FilterByNotEquals(string field, string param, IQueryable data){ switch(field){ case "RoadId": return data.Where(i => i.Road.Name != param ); case "RegionId": return data.Where(i => i.Region.Name != param ); case "SurfaceTypeId": return data.Where(i => i.SurfaceType.Name != param ); case "StateCommonId": return data.Where(i => i.StateCommon.Value != param ); default: return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)) != param ); } } public IQueryable FilterByStartWith(string field, string param, IQueryable data){ switch(field){ case "RoadId": return data.Where(i => i.Road.Name.StartsWith(param) ); case "RegionId": return data.Where(i => i.Region.Name.StartsWith(param) ); case "SurfaceTypeId": return data.Where(i => i.SurfaceType.Name.StartsWith(param) ); case "StateCommonId": return data.Where(i => i.StateCommon.Value.StartsWith(param) ); default: return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).StartsWith(param) ); } } public IQueryable FilterByEndWith(string field, string param, IQueryable data){ switch(field){ case "RoadId": return data.Where(i => i.Road.Name.EndsWith(param) ); case "RegionId": return data.Where(i => i.Region.Name.EndsWith(param) ); case "SurfaceTypeId": return data.Where(i => i.SurfaceType.Name.EndsWith(param) ); case "StateCommonId": return data.Where(i => i.StateCommon.Value.EndsWith(param) ); default: return data.Where(i => Convert.ToString(i.GetType().GetProperty(field).GetValue(i, null)).EndsWith(param) ); } } public async Task DeleteAsync(int Id) { var busStop = await _context.BusStop.SingleOrDefaultAsync(x => x.Id == Id); _context.BusStop.Remove(busStop); return await _context.SaveChangesAsync(); } } }