using System.Linq; using Microsoft.EntityFrameworkCore; using TakeoutSaaS.Domain.Tenants.Entities; using TakeoutSaaS.Domain.Tenants.Repositories; using TakeoutSaaS.Infrastructure.App.Persistence; namespace TakeoutSaaS.Infrastructure.App.Repositories; /// /// EF 公告已读仓储。 /// public sealed class EfTenantAnnouncementReadRepository(TakeoutAppDbContext context) : ITenantAnnouncementReadRepository { public Task> GetByAnnouncementAsync(long tenantId, long announcementId, CancellationToken cancellationToken = default) { return context.TenantAnnouncementReads.AsNoTracking() .Where(x => x.TenantId == tenantId && x.AnnouncementId == announcementId) .OrderBy(x => x.ReadAt) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } public Task> GetByAnnouncementAsync(long tenantId, IEnumerable announcementIds, long? userId, CancellationToken cancellationToken = default) { var ids = announcementIds.Distinct().ToArray(); if (ids.Length == 0) { return Task.FromResult>(Array.Empty()); } var query = context.TenantAnnouncementReads.AsNoTracking() .Where(x => x.TenantId == tenantId && ids.Contains(x.AnnouncementId)); if (userId.HasValue) { query = query.Where(x => x.UserId == userId.Value); } else { query = query.Where(x => x.UserId == null); } return query .OrderByDescending(x => x.ReadAt) .ToListAsync(cancellationToken) .ContinueWith(t => (IReadOnlyList)t.Result, cancellationToken); } public Task FindAsync(long tenantId, long announcementId, long? userId, CancellationToken cancellationToken = default) { return context.TenantAnnouncementReads .FirstOrDefaultAsync(x => x.TenantId == tenantId && x.AnnouncementId == announcementId && x.UserId == userId, cancellationToken); } public Task AddAsync(TenantAnnouncementRead record, CancellationToken cancellationToken = default) { return context.TenantAnnouncementReads.AddAsync(record, cancellationToken).AsTask(); } public Task SaveChangesAsync(CancellationToken cancellationToken = default) { return context.SaveChangesAsync(cancellationToken); } }