add support for Db Seeder, Fix GraphQL Generic Usage ...

This commit is contained in:
2026-05-11 23:24:10 +03:30
parent 07f4435f9a
commit 3bb6042b31
13 changed files with 1237 additions and 396 deletions
+129
View File
@@ -0,0 +1,129 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using xCommons.Extensions;
using xDataService.Configuration;
using xDataService.Constants;
using xDataService.Interfaces;
using xModels.Base;
namespace xDataService.Providers
{
public abstract class XBaseDbSeeder<TEntity, TKey> : IXBaseDbSeeder<TEntity, TKey>
where TEntity : XBaseEntity<TKey>
{
public string Database { get; }
public IXBaseRepository<TEntity, TKey> Repository { get; }
public XDataServiceConfiguration DataServiceConfiguration { get; }
public XBaseDbSeeder(
string database,
IXBaseRepository<TEntity, TKey> repository,
XDataServiceConfiguration dataServiceConfiguration
)
{
//
this.Database = database;
this.Repository = repository;
this.DataServiceConfiguration = dataServiceConfiguration;
}
public async Task Seed()
{
//
var entityName = nameof(TEntity);
//
// Validate Seed ...
var isValid =
DataServiceConfiguration.SeedingMode != XDbSeedingMode.None &&
DataServiceConfiguration
.Databases
.Any(db =>
db.Key == Database &&
db.Value.SeedItems
.Any(si =>
si.Key == entityName &&
si.Value.HasChild()));
if (!isValid)
{
return;
}
//
// Extract Seeding Items ...
var seedItems = DataServiceConfiguration
.Databases[Database]
.SeedItems[entityName]
.ToList();
foreach (var item in seedItems)
{
//
try
{
//
// Try to convert Item to Entity ...
var entity = ((object)item).FromDynamicObject<TEntity>();
//
// Check Item Exists or not ...
var isExist = false;
TEntity exists = null;
var asyncEnumerable = this.Repository.GetAllAsAsyncEnumerable();
await foreach (var e in asyncEnumerable)
{
//
isExist = e.IsSameContent(
dest: entity,
propertyBlackList: new List<string>
{
nameof(entity.Id),
nameof(entity.Deleted)
});
if (isExist)
{
exists = e;
break;
}
}
//
// Seed Based on Seed Mode ...
var seedMode = DataServiceConfiguration.SeedingMode;
switch (seedMode)
{
//
case XDbSeedingMode.AddIfNotExists:
//
if (!isExist)
{
//
exists = await Repository.AddAsync(entity);
}
break;
//
case XDbSeedingMode.AddOrUpdate:
//
exists = exists.UpdateData(
updateWith: entity,
propertyBlackList: new List<string>
{
nameof(entity.Id),
nameof(entity.Deleted)
}
);
//
await Repository.AddOrUpdateAsync(exists);
break;
}
}
catch
{ }
}
}
}
}