using Data.SeaHavenIndustries; using Microsoft.EntityFrameworkCore; using SeaHaven.DataServices.Helpers; using SeaHaven.DataServices.Interfaces; namespace SeaHaven.DataServices.Implementation { public class WorkOrderMediaDataService : IWorkOrderMediaDataService { private readonly ApplicationDbContext _context; public WorkOrderMediaDataService(ApplicationDbContext context) { _context = context; } public Task GetWorkOrderForMediaAuthAsync( int workOrderId, int? accountId, CancellationToken cancellationToken) => WorkOrderBoardQueryFilters.ApplyAccountScope( WorkOrderBoardQueryFilters.ApplyBaseScope(_context.workOrders.AsNoTracking()), accountId) .FirstOrDefaultAsync(w => w.Id == workOrderId, cancellationToken); public Task GetTrackedWorkOrderAsync( int workOrderId, int? accountId, CancellationToken cancellationToken) => WorkOrderBoardQueryFilters.ApplyAccountScope( WorkOrderBoardQueryFilters.ApplyBaseScope(_context.workOrders), accountId) .FirstOrDefaultAsync(w => w.Id == workOrderId, cancellationToken); public Task GetTrackedAttachmentAsync(int mediaId, int workOrderId, CancellationToken cancellationToken) => _context.workOrderAttachments.FirstOrDefaultAsync( a => a.Id == mediaId && a.WorkorderId == workOrderId && a.IsDeleted != true, cancellationToken); public void TrackAttachment(WorkOrderAttachments attachment) => _context.workOrderAttachments.Add(attachment); public void SetExpectedWorkOrderVersion(WorkOrder workOrder, byte[] version) => _context.Entry(workOrder).Property(w => w.RowVersion).OriginalValue = version; public void MarkWorkOrderModified(WorkOrder workOrder) { // Force a WO update so the RowVersion concurrency token is enforced when only // attachment rows change (category-only Extra mutations). var entry = _context.Entry(workOrder); if (entry.State == EntityState.Unchanged) entry.Property(w => w.Attachments).IsModified = true; } public Task SaveAsync(CancellationToken cancellationToken) => _context.SaveChangesAsync(cancellationToken); } }