Got a model to populate a grouping creator

This commit is contained in:
Vincent Allen
2025-09-02 15:00:23 -04:00
parent b2835f65c0
commit d0429ddaf4
42 changed files with 238 additions and 56 deletions

View File

@@ -50,6 +50,10 @@ public class ApplicationDbContext(DbContextOptions<ApplicationDbContext> options
.HasForeignKey(entry => entry.ArtifactGroupingId)
.OnDelete(DeleteBehavior.Cascade);
modelBuilder.Entity<ArtifactGrouping>()
.Navigation(g => g.IdentifierFields)
.UsePropertyAccessMode(PropertyAccessMode.Field);
var dictionaryComparer = new ValueComparer<Dictionary<string, string>>(
(dictionary1, dictionary2) => dictionary1.OrderBy(pair => pair.Key)
.SequenceEqual(dictionary2.OrderBy(pair => pair.Key)),

View File

@@ -15,7 +15,7 @@ public class ArtifactGrouping
{
get
{
return ModelHelpers.MakeIdentifier(_identifierFields.Values, Category.FieldSeparator, null);
return ModelHelpers.MakeIdentifier(IdentifierFields.Values, Category.FieldSeparator, null);
}
}

View File

@@ -6,11 +6,11 @@ namespace OpenArchival.DataAccess;
public class ArtifactGroupingProvider : IArtifactGroupingProvider
{
private readonly ApplicationDbContext _context;
private readonly IDbContextFactory<ApplicationDbContext> _context;
private readonly ILogger<ArtifactGroupingProvider> _logger;
[SetsRequiredMembers]
public ArtifactGroupingProvider(ApplicationDbContext context, ILogger<ArtifactGroupingProvider> logger)
public ArtifactGroupingProvider(IDbContextFactory<ApplicationDbContext> context, ILogger<ArtifactGroupingProvider> logger)
{
_context = context;
_logger = logger;
@@ -18,57 +18,75 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
public async Task<ArtifactGrouping?> GetGroupingAsync(int id)
{
return await _context.ArtifactGroupings
.Where(g => g.Id == id)
await using var context = await _context.CreateDbContextAsync();
return await context.ArtifactGroupings
.Include(g => g.Category)
.Include(g => g.IdentifierFields)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.StorageLocation)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Type)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(e => e.Files)
.Where(g => g.Id == id)
.FirstOrDefaultAsync();
}
public async Task<ArtifactGrouping?> GetGroupingAsync(string artifactGroupingIdentifier)
{
return await _context.ArtifactGroupings
await using var context = await _context.CreateDbContextAsync();
return await context.ArtifactGroupings
.Where(g => g.ArtifactGroupingIdentifier == artifactGroupingIdentifier)
.Include(g => g.Category)
.Include(g => g.ChildArtifactEntries)
.ThenInclude(g => g.StorageLocation)
.ThenInclude(g => g.Location)
.FirstOrDefaultAsync();
}
public async Task CreateGroupingAsync(ArtifactGrouping grouping)
{
_context.ArtifactGroupings.Add(grouping);
await _context.SaveChangesAsync();
await using var context = await _context.CreateDbContextAsync();
context.ArtifactGroupings.Add(grouping);
await context.SaveChangesAsync();
}
public async Task UpdateGroupingAsync(ArtifactGrouping grouping)
{
_context.ArtifactGroupings.Update(grouping);
await _context.SaveChangesAsync();
await using var context = await _context.CreateDbContextAsync();
context.ArtifactGroupings.Update(grouping);
await context.SaveChangesAsync();
}
public async Task DeleteGroupingAsync(int id)
{
await _context.ArtifactGroupings
await using var context = await _context.CreateDbContextAsync();
await context.ArtifactGroupings
.Where(p => p.Id == id)
.ExecuteDeleteAsync();
await _context.SaveChangesAsync();
await context.SaveChangesAsync();
}
public async Task DeleteGroupingAsync(ArtifactGrouping grouping)
{
_context.ArtifactGroupings.Remove(grouping);
await _context.SaveChangesAsync();
await using var context = await _context.CreateDbContextAsync();
context.ArtifactGroupings.Remove(grouping);
await context.SaveChangesAsync();
}
public async Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount)
{
await using var context = await _context.CreateDbContextAsync();
if (pageNumber < 1 || resultsCount < 1)
{
throw new ArgumentOutOfRangeException($"Either page number or number of results was less than or equal to 0. {nameof(pageNumber)}={pageNumber} {nameof(resultsCount)}={resultsCount}");
}
var totalCount = await _context.ArtifactGroupings.CountAsync();
var totalCount = await context.ArtifactGroupings.CountAsync();
var items = await _context.ArtifactGroupings
var items = await context.ArtifactGroupings
.Include(g => g.ChildArtifactEntries)
.Include(g => g.Category)
.OrderBy(g => g.Id)
.Skip((pageNumber - 1) * resultsCount)
@@ -77,4 +95,10 @@ public class ArtifactGroupingProvider : IArtifactGroupingProvider
return items;
}
public async Task<int> GetTotalCount()
{
await using var context = await _context.CreateDbContextAsync();
return context.ArtifactGroupings.Count();
}
}

View File

@@ -9,4 +9,5 @@ public interface IArtifactGroupingProvider
Task DeleteGroupingAsync(int id);
Task DeleteGroupingAsync(ArtifactGrouping grouping);
Task<List<ArtifactGrouping>> GetGroupingsPaged(int pageNumber, int resultsCount);
public Task<int> GetTotalCount();
}

View File

@@ -15,7 +15,7 @@ using System.Reflection;
[assembly: System.Reflection.AssemblyCompanyAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+dd3968f6effa8f45f27a3ec91c34762c88380f06")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+ff34eb87b9d0eec9553fb4767daadfcc0d97fb44")]
[assembly: System.Reflection.AssemblyProductAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyTitleAttribute("OpenArchival.DataAccess")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
3f1dc26310f431c1735242d3a315e070d6215de828a0f93ee5bf50c1e5b9de38
9c710d1eda832a1b6dfacbdd6d88e8d851c4fd9722e33c20de29410792da1d82

View File

@@ -1 +1 @@
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/dd3968f6effa8f45f27a3ec91c34762c88380f06/*"}}
{"documents":{"D:\\Nextcloud\\Documents\\Open-Archival\\*":"https://raw.githubusercontent.com/vtallen/Open-Archival/ff34eb87b9d0eec9553fb4767daadfcc0d97fb44/*"}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"J3r5h7pKF0kY0DRJx0Xqba86ngtHs3jduVq7GPX+nwI=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","E6ltkajZSrcZfEd5mYBcKe4AnJ/ZOJ8hZBTp71ugK08="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"J3r5h7pKF0kY0DRJx0Xqba86ngtHs3jduVq7GPX+nwI=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","fDpShEUul2xTzLSmjcwncSU4OZgXILMHjt2fTsSSXoo="],"CachedAssets":{},"CachedCopyCandidates":{}}

View File

@@ -1 +1 @@
{"GlobalPropertiesHash":"EHbx5ejyqDv8gH5NpOoZxRAV9glFiYxTGFnRTcGg8no=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","E6ltkajZSrcZfEd5mYBcKe4AnJ/ZOJ8hZBTp71ugK08="],"CachedAssets":{},"CachedCopyCandidates":{}}
{"GlobalPropertiesHash":"EHbx5ejyqDv8gH5NpOoZxRAV9glFiYxTGFnRTcGg8no=","FingerprintPatternsHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","PropertyOverridesHash":"8ZRc1sGeVrPBx4lD717BgRaQekyh78QKV9SKsdt638U=","InputHashes":["51WRq7nT/WTvnhamRxLn7Ony/A1bnAxDelsXO4Ehpwc=","aDrxgmPzfmAYNrzynmphKXORQNARBvx3ZJm3IcIlVIA=","dFQa1Ee6LWN6QaEoa8lulEtbH6imVMCsVrPTv7uB7rA=","KAWcEu8sopHLr7dsoLsr\u002Bz7vrHN0YxMtmdfBYeH1kwI=","\u002Bjyo4JejKGZVNH7yAY1POV7dsMBGmszgVLUsVwm0S6Y=","fDpShEUul2xTzLSmjcwncSU4OZgXILMHjt2fTsSSXoo="],"CachedAssets":{},"CachedCopyCandidates":{}}