diff --git a/Api.SeaHavenIndustries.Tests/WorkOrderDataServiceBatchingTests.cs b/Api.SeaHavenIndustries.Tests/WorkOrderDataServiceBatchingTests.cs index a32815f..c0f552c 100644 --- a/Api.SeaHavenIndustries.Tests/WorkOrderDataServiceBatchingTests.cs +++ b/Api.SeaHavenIndustries.Tests/WorkOrderDataServiceBatchingTests.cs @@ -87,6 +87,34 @@ public class WorkOrderDataServiceBatchingTests context.WorkOrderAuditLogs.Should().HaveCount(2); } + [Fact] + public async Task AddWorkOrderAttachmentsAsync_PersistsAllRowsInSingleSave() + { + await using var context = NewContext(); + await SeedAsync(context); + var service = new WorkOrderDataService(context); + + await service.AddWorkOrderAttachmentsAsync(new[] + { + new WorkOrderAttachments { WorkorderId = 1, Attachments = "https://files/a.pdf" }, + new WorkOrderAttachments { WorkorderId = 1, Attachments = "https://files/b.pdf" } + }); + + context.workOrderAttachments.Should().HaveCount(2); + } + + [Fact] + public async Task AddWorkOrderAttachmentsAsync_WithEmptyCollection_DoesNothing() + { + await using var context = NewContext(); + await SeedAsync(context); + var service = new WorkOrderDataService(context); + + await service.AddWorkOrderAttachmentsAsync(Array.Empty()); + + context.workOrderAttachments.Should().BeEmpty(); + } + [Fact] public async Task GetByIdsOrderedAsync_PreservesInputOrderDeduplicatesAndSkipsMissing() { diff --git a/SeaHaven.DataServices/Implementation/WorkOrderDataService.cs b/SeaHaven.DataServices/Implementation/WorkOrderDataService.cs index 9a305f5..7556b32 100644 --- a/SeaHaven.DataServices/Implementation/WorkOrderDataService.cs +++ b/SeaHaven.DataServices/Implementation/WorkOrderDataService.cs @@ -288,6 +288,15 @@ namespace SeaHaven.DataServices.Implementation await _context.SaveChangesAsync(); } + public async Task AddWorkOrderAttachmentsAsync(IReadOnlyCollection attachments) + { + if (attachments.Count == 0) + return; + + await _context.workOrderAttachments.AddRangeAsync(attachments); + await _context.SaveChangesAsync(); + } + public async Task AddAuditLogAsync(WorkOrderAuditLog auditLog) { await _context.WorkOrderAuditLogs.AddAsync(auditLog); diff --git a/SeaHaven.DataServices/Interfaces/IWorkOrderDataService.cs b/SeaHaven.DataServices/Interfaces/IWorkOrderDataService.cs index 1211c60..5e885a9 100644 --- a/SeaHaven.DataServices/Interfaces/IWorkOrderDataService.cs +++ b/SeaHaven.DataServices/Interfaces/IWorkOrderDataService.cs @@ -57,6 +57,8 @@ namespace SeaHaven.DataServices.Interfaces Task AddWorkOrderContactsAsync(int workOrderId, IEnumerable contactIds); Task AddWorkOrderCategoriesAsync(int workOrderId, IEnumerable categoryIds); Task AddWorkOrderAttachmentAsync(WorkOrderAttachments attachment); + /// Adds every attachment in one commit (no per-row round trip). + Task AddWorkOrderAttachmentsAsync(IReadOnlyCollection attachments); Task AddAuditLogAsync(WorkOrderAuditLog auditLog); Task AddAuditLogsAsync(IReadOnlyCollection auditLogs);