using Microsoft.EntityFrameworkCore; using Modules.User.Database.Database; using System.Linq.Expressions; namespace Modules.User.Database.Repositories; public class UserRepository1(UserDbContext context) { private readonly UserDbContext _context = context; internal async Task AddAsync(Database.Entities.User user) { _context.Users.Add(user); await _context.SaveChangesAsync(); return user.Id; } internal async Task DeleteAsync(Guid userId) { var user = await _context.Users .Include(user => user.Account) .FirstOrDefaultAsync(q => q.Id == userId); if (user != null) { user.Deleted = true; user.Account.Deleted = true; await _context.SaveChangesAsync(); return true; } else return false; } private IQueryable FilteredUserQuery(bool? hasAvatar, string? nickName, DateTimeOffset? lastOnlineFrom = null, DateTimeOffset? lastOnlineTo = null, bool? isBanned = null) { var query = UserQuery(); if (hasAvatar.HasValue) { query = query.Where(q => !string.IsNullOrWhiteSpace(q.AvatarId)); } if (!string.IsNullOrWhiteSpace(nickName)) { query = query.Where(q => q.NickName.ToLower().StartsWith(nickName.ToLower())); } if (lastOnlineFrom.HasValue) { query = query.Where(q => q.Account.Sessions.Any(x => x.LastUpdate >= lastOnlineFrom)); } if (lastOnlineTo.HasValue) { query = query.Where(q => q.Account.Sessions.Any(x => x.LastUpdate <= lastOnlineTo)); } // if (isBanned.HasValue) // { // // query = query.Where(q => q.Deleted.) // } //check banlist return query; } internal async Task GetFilteredCountAsync(bool? hasAvatar, string? nickName, DateTimeOffset? lastOnlineFrom = null, DateTimeOffset? lastOnlineTo = null, bool? isBanned = null) { return await FilteredUserQuery(hasAvatar, nickName, lastOnlineFrom, lastOnlineTo,isBanned).CountAsync(); } internal async Task> GetWhereAsync(bool? hasAvatar, string? nickName, DateTimeOffset? lastOnlineFrom = null, DateTimeOffset? lastOnlineTo = null, bool? isBanned = null, int skip = 0, int take = 10) { return await FilteredUserQuery(hasAvatar, nickName, lastOnlineFrom, lastOnlineTo,isBanned) .OrderBy(q => q.NickName).Skip(skip).Take(take).ToListAsync(); } internal async Task GetFirstOrDefaultWhereAsync(Expression> predicate) => await UserQuery().FirstOrDefaultAsync(predicate); internal async Task GetFirstWhereAsync(Expression> predicate) => await UserQuery().FirstAsync(predicate); internal async Task UpdateUserAsync() => await _context.SaveChangesAsync(); private IQueryable UserQuery() => _context.Users .Include(q => q.Account).ThenInclude(q => q.Sessions) .Include(q => q.RegionalSettings).AsQueryable(); }