From 49050a899065d8bfb4286597e2ba20c9de2ce51f Mon Sep 17 00:00:00 2001 From: mahan Date: Wed, 17 Sep 2025 15:49:58 +0330 Subject: [PATCH] Add search functionality to law retrieval with filtering options --- Company.Domain/LawAgg/ILawRepository.cs | 1 + Company.Domain/LawAgg/Law.cs | 1 - .../Law/ILawApplication.cs | 12 +++- .../LawApplication.cs | 36 ++---------- .../Repository/LawRepository.cs | 55 +++++++++++++++++++ .../Areas/Admin/Controllers/LawController.cs | 4 +- 6 files changed, 72 insertions(+), 37 deletions(-) diff --git a/Company.Domain/LawAgg/ILawRepository.cs b/Company.Domain/LawAgg/ILawRepository.cs index 041e0f41..08708532 100644 --- a/Company.Domain/LawAgg/ILawRepository.cs +++ b/Company.Domain/LawAgg/ILawRepository.cs @@ -10,5 +10,6 @@ namespace Company.Domain.LawAgg Task GetWithItems(long id); Task> GetActive(); Task GetByType(LawType type); + Task> GetList(LawSearchModel searchModel); } } diff --git a/Company.Domain/LawAgg/Law.cs b/Company.Domain/LawAgg/Law.cs index 7abe7bc8..96609fb6 100644 --- a/Company.Domain/LawAgg/Law.cs +++ b/Company.Domain/LawAgg/Law.cs @@ -11,7 +11,6 @@ namespace Company.Domain.LawAgg public string Title { get; private set; } public bool IsActive { get; private set; } public List Items { get; private set; } - public LawType Type { get; private set; } public Law(string title, LawType lawType) diff --git a/CompanyManagment.App.Contracts/Law/ILawApplication.cs b/CompanyManagment.App.Contracts/Law/ILawApplication.cs index 147d4bd8..5b628f24 100644 --- a/CompanyManagment.App.Contracts/Law/ILawApplication.cs +++ b/CompanyManagment.App.Contracts/Law/ILawApplication.cs @@ -1,6 +1,8 @@ using _0_Framework.Application; using System.Collections.Generic; +using System.Security.AccessControl; using System.Threading.Tasks; +using CompanyManagment.App.Contracts.Workshop; namespace CompanyManagment.App.Contracts.Law { @@ -13,12 +15,18 @@ namespace CompanyManagment.App.Contracts.Law OperationResult ActivateByType(LawType type); OperationResult DeactivateByType(LawType type); EditLaw GetDetails(long id); - List GetList(); + Task> GetList(LawSearchModel searchModel); Task GetLawWithItems(long id); Task GetLawByType(LawType type); OperationResult UpsertLaw(EditLaw command); } - + + public class LawSearchModel + { + public string Title { get; set; } + public string Text { get; set; } + } + public enum LawType { /// diff --git a/CompanyManagment.Application/LawApplication.cs b/CompanyManagment.Application/LawApplication.cs index 0797cc2a..dd0d037e 100644 --- a/CompanyManagment.Application/LawApplication.cs +++ b/CompanyManagment.Application/LawApplication.cs @@ -195,40 +195,12 @@ public class LawApplication : ILawApplication }; } - public List GetList() + public async Task> GetList(LawSearchModel searchModel) { - // Get all laws from database - var dbLaws = _lawRepository.Get() - .Select(x => new LawViewModel - { - Id = x.id, - Title = x.Title, - IsActive = x.IsActive, - CreatedAt = x.CreationDate, - Type = x.Type - }).ToList(); + // Get filtered laws from database + return await _lawRepository.GetList(searchModel); - // Create a set of existing law types - var existingTypes = dbLaws.Select(x => x.Type).ToHashSet(); - - // Add placeholder laws for any missing enum values - foreach (LawType lawType in Enum.GetValues(typeof(LawType))) - { - if (!existingTypes.Contains(lawType)) - { - dbLaws.Add(new LawViewModel - { - Id = 0, // Indicates it doesn't exist in the database yet - Title = GetDefaultTitleForLawType(lawType), - IsActive = false, - CreatedAt = DateTime.Now, - Type = lawType, - Items = new List() - }); - } - } - - return dbLaws; + } private string GetDefaultTitleForLawType(LawType lawType) diff --git a/CompanyManagment.EFCore/Repository/LawRepository.cs b/CompanyManagment.EFCore/Repository/LawRepository.cs index d30f7eec..b542fa63 100644 --- a/CompanyManagment.EFCore/Repository/LawRepository.cs +++ b/CompanyManagment.EFCore/Repository/LawRepository.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; @@ -42,4 +43,58 @@ public class LawRepository:RepositoryBase,ILawRepository }).ToList() }).FirstOrDefaultAsync(); } + + public async Task> GetList(LawSearchModel searchModel) + { + var query = _context.Laws.Include(x => x.Items).AsQueryable(); + + if (!string.IsNullOrWhiteSpace(searchModel.Title)) + query = query.Where(x => x.Title.Contains(searchModel.Title)); + + if (!string.IsNullOrWhiteSpace(searchModel.Text)) + query = query.Where(x => x.Title.Contains(searchModel.Text) || x.Items.Any(i => i.Header.Contains(searchModel.Text) || i.Details.Contains(searchModel.Text))); + + var list = await query.Select(x => new LawViewModel + { + Id = x.id, + Title = x.Title, + IsActive = x.IsActive, + CreatedAt = x.CreationDate, + Type = x.Type + }).ToListAsync(); + + // Create a set of existing law types + var existingTypes = list.Select(x => x.Type).ToHashSet(); + if (string.IsNullOrWhiteSpace(searchModel.Text) && string.IsNullOrWhiteSpace(searchModel.Title)) + { + // Add placeholder laws for any missing enum values + foreach (LawType lawType in Enum.GetValues(typeof(LawType))) + { + if (!existingTypes.Contains(lawType)) + { + list.Add(new LawViewModel + { + Id = 0, // Indicates it doesn't exist in the database yet + Title = GetDefaultTitleForLawType(lawType), + IsActive = false, + CreatedAt = DateTime.Now, + Type = lawType, + Items = new List() + }); + } + } + } + + + + return list; + } + private string GetDefaultTitleForLawType(LawType lawType) + { + return lawType switch + { + LawType.Register => "قوانین ثبت نام", + _ => $"قوانین {lawType}" + }; + } } \ No newline at end of file diff --git a/ServiceHost/Areas/Admin/Controllers/LawController.cs b/ServiceHost/Areas/Admin/Controllers/LawController.cs index d2ade21a..166dea37 100644 --- a/ServiceHost/Areas/Admin/Controllers/LawController.cs +++ b/ServiceHost/Areas/Admin/Controllers/LawController.cs @@ -19,9 +19,9 @@ public class LawController : AdminBaseController /// /// [HttpGet] - public ActionResult> GetList() + public async Task>> GetList(LawSearchModel searchModel) { - return _lawApplication.GetList(); + return await _lawApplication.GetList(searchModel); } ///