using Distribution.Data; using Microsoft.EntityFrameworkCore; namespace Distribution.Features.Item; public class ItemRepository(AppDBContext context) : IItemRepository { public async Task GetByIdAsync(Guid id) => await context.Items .Include(i => i.Category) .Include(i => i.SubCategory) .Include(i => i.Brand) .Include(i => i.BaseUom) .Include(i => i.Conversions).ThenInclude(c => c.FromUom) .Include(i => i.Conversions).ThenInclude(c => c.ToUom) .FirstOrDefaultAsync(i => i.Id == id); public async Task GetBySkuAsync(string sku) => await context.Items.FirstOrDefaultAsync(i => i.Sku == sku && i.IsActive); public async Task> GetAllAsync(Guid? categoryId = null, Guid? subCategoryId = null, Guid? brandId = null) { // Deleted items stay IsActive=false but remain visible with an Inactive status — // Delete never removes the row, only marks it (same rule as Orders/Stores). var query = context.Items .Include(i => i.Category) .Include(i => i.SubCategory) .Include(i => i.Brand) .Include(i => i.BaseUom) .AsQueryable(); if (categoryId.HasValue) query = query.Where(i => i.FK_CategoryId == categoryId); if (subCategoryId.HasValue) query = query.Where(i => i.FK_SubCategoryId == subCategoryId); if (brandId.HasValue) query = query.Where(i => i.FK_BrandId == brandId); return await query.ToListAsync(); } public async Task SkuExistsAsync(string sku, Guid? excludeId = null) { var query = context.Items.Where(i => i.Sku == sku); if (excludeId.HasValue) query = query.Where(i => i.Id != excludeId); return await query.AnyAsync(); } public async Task GetByExternalErpItemIdAsync(int erpId) => await context.Items .Include(i => i.Conversions) .FirstOrDefaultAsync(i => i.ExternalErpItemId == erpId); public async Task AddAsync(Models.Item entity) => await context.Items.AddAsync(entity); public void Update(Models.Item entity) => context.Items.Update(entity); public void Remove(Models.Item entity) { entity.IsActive = false; context.Items.Update(entity); } public async Task ReplaceConversionsAsync(Guid itemId, List conversions) { var existing = await context.UomConversions.Where(c => c.FK_ItemId == itemId).ToListAsync(); context.UomConversions.RemoveRange(existing); await context.UomConversions.AddRangeAsync(conversions); } }