From d48dd07eebaa3699892018070be553fccff0d4e4 Mon Sep 17 00:00:00 2001 From: YouWeiDH Date: Mon, 20 Jan 2025 19:44:33 +0800 Subject: [PATCH] hdong: add search user logic. --- .../Repositories/IBotSharpRepository.cs | 1 + .../Users/IUserService.cs | 1 + .../FileRepository/FileRepository.User.cs | 57 +++++++++++++++ .../Users/Services/UserService.cs | 12 ++++ .../Repository/MongoRepository.User.cs | 69 +++++++++++++++++++ 5 files changed, 140 insertions(+) diff --git a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs index d01744675..a752e07c4 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Repositories/IBotSharpRepository.cs @@ -48,6 +48,7 @@ public interface IBotSharpRepository : IHaveServiceProvider void UpdateUserIsDisable(string userId, bool isDisable) => throw new NotImplementedException(); void UpdateUsersIsDisable(List userIds, bool isDisable) => throw new NotImplementedException(); PagedItems GetUsers(UserFilter filter) => throw new NotImplementedException(); + List SearchLoginUsers(User filter, string source = UserSource.Internal) =>throw new NotImplementedException(); User? GetUserDetails(string userId, bool includeAgent = false) => throw new NotImplementedException(); bool UpdateUser(User user, bool updateUserAgents = false) => throw new NotImplementedException(); diff --git a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs index f92d72251..a9dc03331 100644 --- a/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs +++ b/src/Infrastructure/BotSharp.Abstraction/Users/IUserService.cs @@ -8,6 +8,7 @@ public interface IUserService { Task GetUser(string id); Task> GetUsers(UserFilter filter); + Task> SearchLoginUsers(User filter); Task GetUserDetails(string userId, bool includeAgent = false); Task IsAdminUser(string userId); Task GetUserAuthorizations(IEnumerable? agentIds = null); diff --git a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs index 9d5b42bed..8dfd198db 100644 --- a/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs +++ b/src/Infrastructure/BotSharp.Core/Repository/FileRepository/FileRepository.User.cs @@ -128,6 +128,63 @@ public PagedItems GetUsers(UserFilter filter) }; } + public List SearchLoginUsers(User filter, string source = UserSource.Internal) + { + List searchResult = new List(); + + // search by filters + if (!string.IsNullOrWhiteSpace(filter.Id)) + { + var curUser = Users.FirstOrDefault(x => x.Source == source && x.Id == filter.Id.ToLower()); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Phone) && !string.IsNullOrWhiteSpace(filter.RegionCode)) + { + string[] regionCodeData = filter.RegionCode.Split('|'); + if (regionCodeData.Length == 2) + { + string phoneNoCallingCode = filter.Phone; + string phoneWithCallingCode = filter.Phone; + if (!filter.Phone.StartsWith('+')) + { + phoneNoCallingCode = filter.Phone; + phoneWithCallingCode = $"{regionCodeData[1]}{filter.Phone}"; + } + else + { + phoneNoCallingCode = filter.Phone.Replace(regionCodeData[1], ""); + } + searchResult = Users.AsQueryable() + .Where(x => x.Source == source && (x.Phone == phoneNoCallingCode || x.Phone == phoneWithCallingCode) && x.RegionCode == regionCodeData[0]) + .ToList(); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Email)) + { + var curUser = Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Email == filter.Email.ToString()); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.UserName)) + { + var curUser = Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.UserName == filter.UserName); + User user = curUser != null ? curUser : null; + if (user != null) + { + searchResult.Add(user); + } + } + + return searchResult; + } + public User? GetUserDetails(string userId, bool includeAgent = false) { if (string.IsNullOrWhiteSpace(userId)) return null; diff --git a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs index afb897e7d..0af66b30f 100644 --- a/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs +++ b/src/Infrastructure/BotSharp.Core/Users/Services/UserService.cs @@ -570,6 +570,18 @@ public async Task VerifyEmailExisting(string email) return false; } + public async Task> SearchLoginUsers(User filter) + { + if (filter == null) + { + return new List(); + } + + var db = _services.GetRequiredService(); + + return db.SearchLoginUsers(filter); + } + public async Task VerifyPhoneExisting(string phone, string regionCode) { if (string.IsNullOrWhiteSpace(phone)) diff --git a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs index 57ea76b96..9ca34c972 100644 --- a/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs +++ b/src/Plugins/BotSharp.Plugin.MongoStorage/Repository/MongoRepository.User.cs @@ -233,6 +233,75 @@ public PagedItems GetUsers(UserFilter filter) }; } + public List SearchLoginUsers(User filter, string source = UserSource.Internal) + { + List searchResult = new List(); + + // search by filters + if (!string.IsNullOrWhiteSpace(filter.Id)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Id == filter.Id.ToLower()); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.Phone) && !string.IsNullOrWhiteSpace(filter.RegionCode)) + { + string[] regionCodeData = filter.RegionCode.Split('|'); + if (regionCodeData.Length == 2) + { + string phoneNoCallingCode = filter.Phone; + string phoneWithCallingCode = filter.Phone; + if (!filter.Phone.StartsWith('+')) + { + phoneNoCallingCode = filter.Phone; + phoneWithCallingCode = $"{regionCodeData[1]}{filter.Phone}"; + } + else + { + phoneNoCallingCode = filter.Phone.Replace(regionCodeData[1], ""); + } + var phoneUsers = _dc.Users.AsQueryable() + .Where(x => x.Source == source && (x.Phone == phoneNoCallingCode || x.Phone == phoneWithCallingCode) && x.RegionCode == regionCodeData[0]) + .ToList(); + + if (phoneUsers != null && phoneUsers.Count > 0) + { + foreach (var user in phoneUsers) + { + if (user != null) + { + searchResult.Add(user.ToUser()); + } + } + } + + } + } + else if (!string.IsNullOrWhiteSpace(filter.Email)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.Email == filter.Email.ToString()); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + else if (!string.IsNullOrWhiteSpace(filter.UserName)) + { + var curUser = _dc.Users.AsQueryable().FirstOrDefault(x => x.Source == source && x.UserName == filter.UserName); + User user = curUser != null ? curUser.ToUser() : null; + if (user != null) + { + searchResult.Add(user); + } + } + + return searchResult; + } + public User? GetUserDetails(string userId, bool includeAgent = false) { if (string.IsNullOrWhiteSpace(userId)) return null;