2024-10-31 19:36:26 +00:00
|
|
|
|
using BotSharp.Abstraction.Agents.Models;
|
|
|
|
|
|
using BotSharp.Abstraction.Repositories.Filters;
|
2024-09-21 07:12:08 +00:00
|
|
|
|
using BotSharp.Abstraction.Users.Enums;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
using BotSharp.Abstraction.Users.Models;
|
2024-11-13 23:16:49 +00:00
|
|
|
|
using MongoDB.Driver;
|
|
|
|
|
|
using System.Globalization;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
|
|
|
|
|
|
namespace BotSharp.Plugin.MongoStorage.Repository;
|
|
|
|
|
|
|
|
|
|
|
|
public partial class MongoRepository
|
|
|
|
|
|
{
|
|
|
|
|
|
public User? GetUserByEmail(string email)
|
|
|
|
|
|
{
|
2024-01-31 19:57:54 +00:00
|
|
|
|
var user = _dc.Users.AsQueryable().FirstOrDefault(x => x.Email == email.ToLower());
|
|
|
|
|
|
return user != null ? user.ToUser() : null;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-06 10:15:58 +00:00
|
|
|
|
public User? GetUserByPhone(string phone)
|
|
|
|
|
|
{
|
2024-10-28 10:12:53 +00:00
|
|
|
|
string phoneSecond = string.Empty;
|
2024-10-30 12:50:23 +00:00
|
|
|
|
// 如果电话号码长度小于 4,直接返回 null
|
|
|
|
|
|
if (phone?.Length < 4)
|
|
|
|
|
|
{
|
|
|
|
|
|
return null;
|
|
|
|
|
|
}
|
|
|
|
|
|
if (phone.Substring(0, 3) != "+86")
|
2024-10-28 10:12:53 +00:00
|
|
|
|
{
|
|
|
|
|
|
phoneSecond = $"+86{phone}";
|
|
|
|
|
|
}
|
2024-10-30 12:36:32 +00:00
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
phoneSecond = phone.Replace("+86", "");
|
|
|
|
|
|
}
|
2024-10-28 10:12:53 +00:00
|
|
|
|
var user = _dc.Users.AsQueryable().FirstOrDefault(x => (x.Phone == phone || x.Phone == phoneSecond) && x.Type != UserType.Affiliate);
|
2024-09-06 10:15:58 +00:00
|
|
|
|
return user != null ? user.ToUser() : null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-21 07:12:08 +00:00
|
|
|
|
public User? GetAffiliateUserByPhone(string phone)
|
|
|
|
|
|
{
|
|
|
|
|
|
var user = _dc.Users.AsQueryable().FirstOrDefault(x => x.Phone == phone && x.Type == UserType.Affiliate);
|
|
|
|
|
|
return user != null ? user.ToUser() : null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-13 02:13:38 +00:00
|
|
|
|
public User? GetUserById(string id)
|
|
|
|
|
|
{
|
2024-01-31 19:57:54 +00:00
|
|
|
|
var user = _dc.Users.AsQueryable()
|
|
|
|
|
|
.FirstOrDefault(x => x.Id == id || (x.ExternalId != null && x.ExternalId == id));
|
|
|
|
|
|
return user != null ? user.ToUser() : null;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-21 07:12:08 +00:00
|
|
|
|
public List<User> GetUserByIds(List<string> ids)
|
|
|
|
|
|
{
|
|
|
|
|
|
var users = _dc.Users.AsQueryable()
|
|
|
|
|
|
.Where(x => ids.Contains(x.Id) || (x.ExternalId != null && ids.Contains(x.ExternalId))).ToList();
|
|
|
|
|
|
return users?.Any() == true ? users.Select(x => x.ToUser()).ToList() : new List<User>();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-19 09:16:55 +00:00
|
|
|
|
public List<User> GetUsersByAffiliateId(string affiliateId)
|
2024-09-21 07:12:08 +00:00
|
|
|
|
{
|
2024-10-19 09:16:55 +00:00
|
|
|
|
var users = _dc.Users.AsQueryable()
|
|
|
|
|
|
.Where(x => x.AffiliateId == affiliateId).ToList();
|
|
|
|
|
|
return users?.Any() == true ? users.Select(x => x.ToUser()).ToList() : new List<User>();
|
2024-09-21 07:12:08 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-31 19:57:54 +00:00
|
|
|
|
public User? GetUserByUserName(string userName)
|
|
|
|
|
|
{
|
|
|
|
|
|
var user = _dc.Users.AsQueryable().FirstOrDefault(x => x.UserName == userName.ToLower());
|
|
|
|
|
|
return user != null ? user.ToUser() : null;
|
2024-01-13 02:13:38 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void CreateUser(User user)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (user == null) return;
|
|
|
|
|
|
|
|
|
|
|
|
var userCollection = new UserDocument
|
|
|
|
|
|
{
|
2024-01-31 19:57:54 +00:00
|
|
|
|
Id = user.Id ?? Guid.NewGuid().ToString(),
|
2024-01-13 02:13:38 +00:00
|
|
|
|
UserName = user.UserName,
|
|
|
|
|
|
FirstName = user.FirstName,
|
|
|
|
|
|
LastName = user.LastName,
|
|
|
|
|
|
Salt = user.Salt,
|
|
|
|
|
|
Password = user.Password,
|
|
|
|
|
|
Email = user.Email,
|
2024-05-31 03:24:34 +00:00
|
|
|
|
Phone = user.Phone,
|
2024-01-31 15:15:41 +00:00
|
|
|
|
Source = user.Source,
|
2024-01-13 02:13:38 +00:00
|
|
|
|
ExternalId = user.ExternalId,
|
|
|
|
|
|
Role = user.Role,
|
2024-09-19 00:49:32 +00:00
|
|
|
|
Type = user.Type,
|
2024-05-26 01:34:29 +00:00
|
|
|
|
VerificationCode = user.VerificationCode,
|
|
|
|
|
|
Verified = user.Verified,
|
2024-10-21 11:59:05 +00:00
|
|
|
|
RegionCode = user.RegionCode,
|
2024-09-21 07:12:08 +00:00
|
|
|
|
AffiliateId = user.AffiliateId,
|
2024-10-19 10:49:18 +00:00
|
|
|
|
EmployeeId = user.EmployeeId,
|
2024-09-21 15:00:20 +00:00
|
|
|
|
IsDisabled = user.IsDisabled,
|
2024-01-13 02:13:38 +00:00
|
|
|
|
CreatedTime = DateTime.UtcNow,
|
|
|
|
|
|
UpdatedTime = DateTime.UtcNow
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
_dc.Users.InsertOne(userCollection);
|
|
|
|
|
|
}
|
2024-05-26 01:34:29 +00:00
|
|
|
|
|
2024-10-11 11:58:54 +00:00
|
|
|
|
public void UpdateExistUser(string userId, User user)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update
|
|
|
|
|
|
.Set(x => x.Email, user.Email)
|
|
|
|
|
|
.Set(x => x.Phone, user.Phone)
|
|
|
|
|
|
.Set(x => x.Salt, user.Salt)
|
|
|
|
|
|
.Set(x => x.Password, user.Password)
|
2024-10-21 11:59:05 +00:00
|
|
|
|
.Set(x => x.VerificationCode, user.VerificationCode)
|
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow)
|
|
|
|
|
|
.Set(x => x.RegionCode, user.RegionCode);
|
2024-10-11 11:58:54 +00:00
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-05-26 01:34:29 +00:00
|
|
|
|
public void UpdateUserVerified(string userId)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.Verified, true)
|
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
2024-06-28 09:59:49 +00:00
|
|
|
|
|
|
|
|
|
|
public void UpdateUserVerificationCode(string userId, string verficationCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.VerificationCode, verficationCode)
|
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public void UpdateUserPassword(string userId, string password)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.Password, password)
|
2024-10-16 09:52:18 +00:00
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow)
|
|
|
|
|
|
.Set(x => x.Verified, true);
|
2024-06-28 09:59:49 +00:00
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
2024-07-24 10:49:54 +00:00
|
|
|
|
|
|
|
|
|
|
public void UpdateUserEmail(string userId, string email)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.Email, email)
|
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-22 10:43:34 +00:00
|
|
|
|
public void UpdateUserPhone(string userId, string phone, string regionCode)
|
2024-07-24 10:49:54 +00:00
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
|
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.Phone, phone)
|
2024-10-22 10:43:34 +00:00
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow)
|
2024-10-22 10:56:00 +00:00
|
|
|
|
.Set(x => x.RegionCode, regionCode)
|
|
|
|
|
|
.Set(x => x.UserName, phone)
|
|
|
|
|
|
.Set(x => x.FirstName, phone);
|
2024-07-24 10:49:54 +00:00
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
2024-09-21 07:12:08 +00:00
|
|
|
|
|
|
|
|
|
|
public void UpdateUserIsDisable(string userId, bool isDisable)
|
|
|
|
|
|
{
|
|
|
|
|
|
var filter = Builders<UserDocument>.Filter.Eq(x => x.Id, userId);
|
2024-09-21 15:00:20 +00:00
|
|
|
|
var update = Builders<UserDocument>.Update.Set(x => x.IsDisabled, isDisable)
|
2024-09-21 07:12:08 +00:00
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
_dc.Users.UpdateOne(filter, update);
|
|
|
|
|
|
}
|
2024-09-29 11:26:17 +00:00
|
|
|
|
|
|
|
|
|
|
public void UpdateUsersIsDisable(List<string> userIds, bool isDisable)
|
|
|
|
|
|
{
|
|
|
|
|
|
foreach (var userId in userIds)
|
|
|
|
|
|
{
|
|
|
|
|
|
UpdateUserIsDisable(userId, isDisable);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2024-10-31 19:36:26 +00:00
|
|
|
|
|
|
|
|
|
|
public PagedItems<User> GetUsers(UserFilter filter)
|
|
|
|
|
|
{
|
2024-11-13 23:16:49 +00:00
|
|
|
|
if (filter == null)
|
|
|
|
|
|
{
|
|
|
|
|
|
filter = UserFilter.Empty();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-31 19:36:26 +00:00
|
|
|
|
var userBuilder = Builders<UserDocument>.Filter;
|
|
|
|
|
|
var userFilters = new List<FilterDefinition<UserDocument>>() { userBuilder.Empty };
|
|
|
|
|
|
|
|
|
|
|
|
// Apply filters
|
|
|
|
|
|
if (!filter.UserIds.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.Id, filter.UserIds));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!filter.UserNames.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.UserName, filter.UserNames));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!filter.ExternalIds.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.ExternalId, filter.ExternalIds));
|
|
|
|
|
|
}
|
|
|
|
|
|
if (!filter.Roles.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.Role, filter.Roles));
|
|
|
|
|
|
}
|
2024-11-14 23:33:26 +00:00
|
|
|
|
if (!filter.Types.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.Type, filter.Types));
|
|
|
|
|
|
}
|
2024-10-31 19:36:26 +00:00
|
|
|
|
if (!filter.Sources.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
userFilters.Add(userBuilder.In(x => x.Source, filter.Sources));
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Filter def and sort
|
|
|
|
|
|
var filterDef = userBuilder.And(userFilters);
|
|
|
|
|
|
var sortDef = Builders<UserDocument>.Sort.Descending(x => x.CreatedTime);
|
|
|
|
|
|
|
|
|
|
|
|
// Search
|
|
|
|
|
|
var userDocs = _dc.Users.Find(filterDef).Sort(sortDef).Skip(filter.Offset).Limit(filter.Size).ToList();
|
|
|
|
|
|
var count = _dc.Users.CountDocuments(filterDef);
|
|
|
|
|
|
|
|
|
|
|
|
var users = userDocs.Select(x => x.ToUser()).ToList();
|
2024-11-13 23:16:49 +00:00
|
|
|
|
return new PagedItems<User>
|
|
|
|
|
|
{
|
|
|
|
|
|
Items = users,
|
|
|
|
|
|
Count = (int)count
|
|
|
|
|
|
};
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
public User? GetUserDetails(string userId, bool includeAgent = false)
|
2024-11-13 23:16:49 +00:00
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrWhiteSpace(userId)) return null;
|
|
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
var userDoc = _dc.Users.AsQueryable().FirstOrDefault(x => x.Id == userId || x.ExternalId == userId);
|
2024-11-13 23:16:49 +00:00
|
|
|
|
if (userDoc == null) return null;
|
|
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
var agentActions = new List<UserAgentAction>();
|
2024-11-13 23:16:49 +00:00
|
|
|
|
var user = userDoc.ToUser();
|
|
|
|
|
|
var userAgents = _dc.UserAgents.AsQueryable().Where(x => x.UserId == userId).Select(x => new UserAgent
|
2024-10-31 19:36:26 +00:00
|
|
|
|
{
|
|
|
|
|
|
Id = x.Id,
|
|
|
|
|
|
UserId = x.UserId,
|
|
|
|
|
|
AgentId = x.AgentId,
|
2024-11-13 23:16:49 +00:00
|
|
|
|
Actions = x.Actions ?? Enumerable.Empty<string>()
|
2024-10-31 19:36:26 +00:00
|
|
|
|
}).ToList();
|
2024-11-13 23:16:49 +00:00
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
if (!includeAgent)
|
|
|
|
|
|
{
|
|
|
|
|
|
agentActions = userAgents.Select(x => new UserAgentAction
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = x.Id,
|
|
|
|
|
|
AgentId = x.AgentId,
|
|
|
|
|
|
Actions = x.Actions
|
|
|
|
|
|
}).ToList();
|
|
|
|
|
|
user.AgentActions = agentActions;
|
|
|
|
|
|
return user;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-13 23:16:49 +00:00
|
|
|
|
var agentIds = userAgents.Select(x => x.AgentId)?.Distinct().ToList();
|
2024-10-31 19:36:26 +00:00
|
|
|
|
if (!agentIds.IsNullOrEmpty())
|
|
|
|
|
|
{
|
|
|
|
|
|
var agents = GetAgents(new AgentFilter { AgentIds = agentIds });
|
|
|
|
|
|
|
2024-11-13 23:16:49 +00:00
|
|
|
|
foreach (var item in userAgents)
|
2024-10-31 19:36:26 +00:00
|
|
|
|
{
|
2024-11-13 23:16:49 +00:00
|
|
|
|
var found = agents.FirstOrDefault(x => x.Id == item.AgentId);
|
|
|
|
|
|
if (found == null) continue;
|
2024-10-31 19:36:26 +00:00
|
|
|
|
|
2024-11-13 23:16:49 +00:00
|
|
|
|
agentActions.Add(new UserAgentAction
|
2024-10-31 19:36:26 +00:00
|
|
|
|
{
|
2024-11-13 23:16:49 +00:00
|
|
|
|
Id = item.Id,
|
|
|
|
|
|
AgentId = found.Id,
|
|
|
|
|
|
Agent = found,
|
|
|
|
|
|
Actions = item.Actions
|
2024-10-31 19:36:26 +00:00
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-13 23:16:49 +00:00
|
|
|
|
user.AgentActions = agentActions;
|
|
|
|
|
|
return user;
|
2024-10-31 19:36:26 +00:00
|
|
|
|
}
|
2024-10-31 22:32:39 +00:00
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
public bool UpdateUser(User user, bool updateUserAgents = false)
|
2024-10-31 22:32:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
if (string.IsNullOrEmpty(user?.Id)) return false;
|
|
|
|
|
|
|
|
|
|
|
|
var userFilter = Builders<UserDocument>.Filter.Eq(x => x.Id, user.Id);
|
|
|
|
|
|
var userUpdate = Builders<UserDocument>.Update
|
2024-11-01 18:17:25 +00:00
|
|
|
|
.Set(x => x.Type, user.Type)
|
2024-10-31 22:32:39 +00:00
|
|
|
|
.Set(x => x.Role, user.Role)
|
2024-11-01 18:17:25 +00:00
|
|
|
|
.Set(x => x.Permissions, user.Permissions)
|
2024-10-31 22:32:39 +00:00
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
|
|
_dc.Users.UpdateOne(userFilter, userUpdate);
|
|
|
|
|
|
|
2024-11-14 23:33:26 +00:00
|
|
|
|
if (updateUserAgents)
|
2024-10-31 22:32:39 +00:00
|
|
|
|
{
|
|
|
|
|
|
var userAgentDocs = user.AgentActions?.Select(x => new UserAgentDocument
|
|
|
|
|
|
{
|
|
|
|
|
|
Id = !string.IsNullOrEmpty(x.Id) ? x.Id : Guid.NewGuid().ToString(),
|
|
|
|
|
|
UserId = user.Id,
|
|
|
|
|
|
AgentId = x.AgentId,
|
|
|
|
|
|
Actions = x.Actions,
|
|
|
|
|
|
CreatedTime = DateTime.UtcNow,
|
|
|
|
|
|
UpdatedTime = DateTime.UtcNow
|
|
|
|
|
|
})?.ToList() ?? [];
|
|
|
|
|
|
|
2024-11-01 18:17:25 +00:00
|
|
|
|
var toDelete = _dc.UserAgents.Find(Builders<UserAgentDocument>.Filter.And(
|
|
|
|
|
|
Builders<UserAgentDocument>.Filter.Eq(x => x.UserId, user.Id),
|
|
|
|
|
|
Builders<UserAgentDocument>.Filter.Nin(x => x.Id, userAgentDocs.Select(x => x.Id))
|
|
|
|
|
|
)).ToList();
|
|
|
|
|
|
|
|
|
|
|
|
_dc.UserAgents.DeleteMany(Builders<UserAgentDocument>.Filter.In(x => x.Id, toDelete.Select(x => x.Id)));
|
2024-10-31 22:32:39 +00:00
|
|
|
|
foreach (var doc in userAgentDocs)
|
|
|
|
|
|
{
|
|
|
|
|
|
var userAgentFilter = Builders<UserAgentDocument>.Filter.Eq(x => x.Id, doc.Id);
|
|
|
|
|
|
var userAgentUpdate = Builders<UserAgentDocument>.Update
|
|
|
|
|
|
.Set(x => x.Id, doc.Id)
|
|
|
|
|
|
.Set(x => x.UserId, user.Id)
|
|
|
|
|
|
.Set(x => x.AgentId, doc.AgentId)
|
|
|
|
|
|
.Set(x => x.Actions, doc.Actions)
|
|
|
|
|
|
.Set(x => x.UpdatedTime, DateTime.UtcNow);
|
|
|
|
|
|
|
|
|
|
|
|
_dc.UserAgents.UpdateOne(userAgentFilter, userAgentUpdate, _options);
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
|
}
|
2024-01-13 02:13:38 +00:00
|
|
|
|
}
|