using Microsoft.EntityFrameworkCore; using SPMS.Domain.Entities; using SPMS.Domain.Enums; using SPMS.Domain.Interfaces; namespace SPMS.Infrastructure.Persistence.Repositories; public class AdminRepository : Repository, IAdminRepository { public AdminRepository(AppDbContext context) : base(context) { } public async Task GetByEmailAsync(string email) { return await _dbSet .FirstOrDefaultAsync(a => a.Email == email && !a.IsDeleted); } public async Task GetByAdminCodeAsync(string adminCode) { return await _dbSet .FirstOrDefaultAsync(a => a.AdminCode == adminCode && !a.IsDeleted); } public async Task GetByRefreshTokenAsync(string refreshToken) { return await _dbSet .FirstOrDefaultAsync(a => a.RefreshToken == refreshToken && !a.IsDeleted); } public async Task EmailExistsAsync(string email, long? excludeId = null) { var query = _dbSet.Where(a => a.Email == email && !a.IsDeleted); if (excludeId.HasValue) query = query.Where(a => a.Id != excludeId.Value); return await query.AnyAsync(); } public async Task<(IReadOnlyList Items, int TotalCount)> GetOperatorPagedAsync( int page, int size, AdminRole? roleFilter, bool? isActive) { IQueryable query; if (isActive.HasValue) { // IgnoreQueryFilters로 삭제된 운영자도 조회 가능 query = _context.Set().IgnoreQueryFilters(); if (isActive.Value) query = query.Where(a => !a.IsDeleted); else query = query.Where(a => a.IsDeleted); } else { // 기본: 글로벌 필터 적용 (활성 운영자만) query = _dbSet.AsQueryable(); } // Super Admin 제외 query = query.Where(a => a.Role != AdminRole.Super); // Role 필터 if (roleFilter.HasValue) query = query.Where(a => a.Role == roleFilter.Value); var totalCount = await query.CountAsync(); var items = await query .OrderByDescending(a => a.CreatedAt) .Skip((page - 1) * size) .Take(size) .ToListAsync(); return (items, totalCount); } }