using Microsoft.EntityFrameworkCore; using SPMS.Domain.Entities; using SPMS.Domain.Enums; using SPMS.Domain.Interfaces; namespace SPMS.Infrastructure.Persistence.Repositories; public class DeviceRepository : Repository, IDeviceRepository { public DeviceRepository(AppDbContext context) : base(context) { } public async Task GetByServiceAndTokenAsync(long serviceId, string deviceToken) { return await _dbSet.FirstOrDefaultAsync(d => d.ServiceId == serviceId && d.DeviceToken == deviceToken); } public async Task GetByIdAndServiceAsync(long id, long serviceId) { return await _dbSet.FirstOrDefaultAsync(d => d.Id == id && d.ServiceId == serviceId); } public async Task GetActiveCountByServiceAsync(long serviceId) { return await _dbSet.CountAsync(d => d.ServiceId == serviceId && d.IsActive); } public async Task> GetByPlatformAsync(long serviceId, Platform platform) { return await _dbSet .Where(d => d.ServiceId == serviceId && d.Platform == platform && d.IsActive) .ToListAsync(); } public async Task<(IReadOnlyList Items, int TotalCount)> GetPagedAsync( long? serviceId, int page, int size, Platform? platform = null, bool? pushAgreed = null, bool? isActive = null, List? tags = null) { IQueryable query = _dbSet; if (serviceId.HasValue) query = query.Where(d => d.ServiceId == serviceId.Value); if (platform.HasValue) query = query.Where(d => d.Platform == platform.Value); if (pushAgreed.HasValue) query = query.Where(d => d.PushAgreed == pushAgreed.Value); if (isActive.HasValue) query = query.Where(d => d.IsActive == isActive.Value); if (tags != null && tags.Count > 0) { foreach (var tag in tags) { var tagStr = tag.ToString(); query = query.Where(d => d.Tags != null && EF.Functions.Like(d.Tags, $"%{tagStr}%")); } } var totalCount = await query.CountAsync(); var items = await query .OrderByDescending(d => d.CreatedAt) .Skip((page - 1) * size) .Take(size) .ToListAsync(); return (items, totalCount); } }