Initial commit - ECommerce project

This commit is contained in:
2026-08-05 23:58:33 +03:00
commit bcebac18e7
63 changed files with 4543 additions and 0 deletions
+126
View File
@@ -0,0 +1,126 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Linq.Expressions;
// using System.Reflection;
// using System.Threading.Tasks;
// namespace Commerce.Core.Utility;
// public static class FilterExtension
// {
// public static IQueryable<T> ApplyFilter<T, TFilter>(this IQueryable<T> query, TFilter filter)
// where TFilter : class
// {
// if (filter == null)
// return query;
// var parameter = Expression.Parameter(typeof(T), "x");
// Expression finalExpression = null;
// var filterProperties = typeof(TFilter)
// .GetProperties()
// .Where(p => p.GetValue(filter) != null);
// foreach (var filterProperty in filterProperties)
// {
// var filterValue = filterProperty.GetValue(filter);
// if (filterValue == null)
// continue;
// var propertyName = filterProperty.Name;
// PropertyInfo entityProperty;
// Expression propertyExpression = null;
// Expression comparison = null;
// // Handle special suffix cases
// if (propertyName.EndsWith("_Start") || propertyName.EndsWith("_Min"))
// {
// entityProperty = typeof(T).GetProperty(
// propertyName.Substring(0, propertyName.LastIndexOf('_'))
// );
// if (entityProperty != null)
// {
// propertyExpression = Expression.Property(parameter, entityProperty);
// comparison = Expression.GreaterThanOrEqual(
// propertyExpression,
// Expression.Constant(filterValue, entityProperty.PropertyType)
// );
// }
// }
// else if (propertyName.EndsWith("_End") || propertyName.EndsWith("_Max"))
// {
// entityProperty = typeof(T).GetProperty(
// propertyName.Substring(0, propertyName.LastIndexOf('_'))
// );
// if (entityProperty != null)
// {
// propertyExpression = Expression.Property(parameter, entityProperty);
// comparison = Expression.LessThanOrEqual(
// propertyExpression,
// Expression.Constant(filterValue, entityProperty.PropertyType)
// );
// }
// }
// else if (propertyName.EndsWith("Name", StringComparison.OrdinalIgnoreCase))
// {
// entityProperty = typeof(T).GetProperty(propertyName);
// if (entityProperty != null && entityProperty.PropertyType == typeof(string))
// {
// propertyExpression = Expression.Property(parameter, entityProperty);
// // For string Contains operation
// var containsMethod = typeof(string).GetMethod(
// "Contains",
// new[] { typeof(string) }
// );
// var filterValueString = filterValue.ToString();
// comparison = Expression.Call(
// propertyExpression,
// containsMethod,
// Expression.Constant(filterValueString, typeof(string))
// );
// }
// else if (entityProperty != null)
// {
// // Fall back to equality comparison if it's not a string
// propertyExpression = Expression.Property(parameter, entityProperty);
// comparison = Expression.Equal(
// propertyExpression,
// Expression.Constant(filterValue, entityProperty.PropertyType)
// );
// }
// }
// else
// {
// entityProperty = typeof(T).GetProperty(propertyName);
// if (entityProperty != null)
// {
// propertyExpression = Expression.Property(parameter, entityProperty);
// comparison = Expression.Equal(
// propertyExpression,
// Expression.Constant(filterValue, entityProperty.PropertyType)
// );
// }
// }
// if (comparison != null)
// {
// finalExpression =
// finalExpression == null
// ? comparison
// : Expression.AndAlso(finalExpression, comparison);
// }
// }
// if (finalExpression != null)
// {
// var lambda = Expression.Lambda<Func<T, bool>>(finalExpression, parameter);
// query = query.Where(lambda);
// }
// return query;
// }
// }
@@ -0,0 +1,27 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Threading.Tasks;
// namespace Commerce.Core.Utility;
// public static class IEnumerableExtensions
// {
// public static IEnumerable<List<T>> Batch<T>(this IEnumerable<T> source, int batchSize)
// {
// var batch = new List<T>(batchSize);
// foreach (var item in source)
// {
// batch.Add(item);
// if (batch.Count == batchSize)
// {
// yield return batch;
// batch = new List<T>(batchSize);
// }
// }
// if (batch.Count > 0)
// {
// yield return batch;
// }
// }
// }
+19
View File
@@ -0,0 +1,19 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Threading.Tasks;
// using Contracts.DTOs;
// using Contracts.DTOs.Generic;
// namespace Commerce.Core.Utility;
// public static class Pagination<T>
// where T : class
// {
// public static IQueryable<T> Paginate(IQueryable<T> query, Pagination pagination)
// {
// return query
// .Skip((pagination.CurrentPage.Value - 1) * pagination.PageSize.Value)
// .Take(pagination.PageSize.Value);
// }
// }
@@ -0,0 +1,21 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Threading.Tasks;
// using Contracts.DTOs;
// using Contracts.DTOs.Generic;
// namespace Commerce.Core.Utility;
// public static class PaginationExtension
// {
// public static IQueryable<T> Paginate<T>(this IQueryable<T> query, Pagination pagination)
// {
// if (pagination.CurrentPage.HasValue && pagination.PageSize.HasValue)
// return query
// .Skip((pagination.CurrentPage.Value - 1) * pagination.PageSize.Value)
// .Take(pagination.PageSize.Value);
// else
// return query;
// }
// }
@@ -0,0 +1,31 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Linq.Expressions;
// using System.Threading.Tasks;
// using Contracts.DTOs.Generic;
// namespace Commerce.Core.Utility;
// public static class QueryableExtensions
// {
// public static IQueryable<T> ApplySorting<T>(this IQueryable<T> source, SortModel sortBy)
// {
// // Parameter for lambda expression, e.g., "p" in "p => p.Property"
// var parameter = Expression.Parameter(typeof(T), "p");
// // Access the property on the parameter, e.g., "p.Property"
// var property = Expression.Property(parameter, sortBy.SortBy);
// // Cast property access to an object (boxing value types)
// var converted = Expression.Convert(property, typeof(object));
// // Create the lambda expression, e.g., "p => (object)p.Property"
// var keySelector = Expression.Lambda<Func<T, object>>(converted, parameter);
// // Apply OrderBy or OrderByDescending based on the ascending flag
// return sortBy.SortDirection == SortDir.Ascending
// ? source.OrderBy(keySelector)
// : source.OrderByDescending(keySelector);
// }
// }
+45
View File
@@ -0,0 +1,45 @@
// using System;
// using System.Collections.Generic;
// using System.Linq;
// using System.Linq.Expressions;
// using System.Reflection;
// using System.Threading.Tasks;
// using Contracts.DTOs.Generic;
// using Microsoft.EntityFrameworkCore;
// namespace Commerce.Core.Utility;
// public static class SortExt
// {
// public static IQueryable<T> ApplySort<T>(this IQueryable<T> query, SortModel sortModel)
// {
// if (string.IsNullOrWhiteSpace(sortModel?.SortBy))
// return query;
// // Get the property info
// var propertyInfo = typeof(T).GetProperty(
// sortModel.SortBy,
// BindingFlags.IgnoreCase | BindingFlags.Public | BindingFlags.Instance
// );
// if (propertyInfo == null)
// throw new ArgumentException(
// $"No property '{sortModel.SortBy}' on type '{typeof(T).Name}'"
// );
// // Create x => x.PropertyName
// var parameter = Expression.Parameter(typeof(T), "x");
// var property = Expression.Property(parameter, propertyInfo);
// var lambda = Expression.Lambda(property, parameter);
// // Call OrderBy or OrderByDescending dynamically
// string methodName = sortModel.SortBy?.ToLower() == "desc" ? "OrderByDescending" : "OrderBy";
// var result = typeof(Queryable)
// .GetMethods()
// .First(m => m.Name == methodName && m.GetParameters().Length == 2)
// .MakeGenericMethod(typeof(T), propertyInfo.PropertyType)
// .Invoke(null, new object[] { query, lambda });
// return (IQueryable<T>)result;
// }
// }