using System; 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 : IXBaseDbSeeder where TEntity : XBaseEntity { // #region Properties ... /// /// Holds Entity Name ... /// public string Entity { get; } /// /// Holds Database Name ... /// public string Database { get; } /// /// Repository Service for Data Manipulation ... /// public IXBaseRepository Repository { get; } /// /// DataServiceConfiguration ... /// public XDataServiceConfiguration DataServiceConfiguration { get; } #endregion // #region Constructor ... public XBaseDbSeeder( string entity, string database, IXBaseRepository repository, XDataServiceConfiguration dataServiceConfiguration ) { // this.Entity = entity; this.Database = database; this.Repository = repository; this.DataServiceConfiguration = dataServiceConfiguration; } #endregion public async Task Seed() { // // Validate Seed ... var isValid = DataServiceConfiguration.SeedingMode != XDbSeedingMode.None && DataServiceConfiguration .Databases .Any(db => db.Key == Database && db.Value.SeedItems .Any(si => si.Key == Entity && si.Value.HasChild())); if (!isValid) { return; } // // Extract Seeding Items ... var seedItems = DataServiceConfiguration .Databases[Database] .SeedItems[Entity] .ToList(); foreach (var item in seedItems) { // try { // var entity = item .ToJSON() .FromJSON(); // // 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 { 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( item: entity, saveChanges: true ); } break; // case XDbSeedingMode.AddOrUpdate: // exists = exists.UpdateData( updateWith: entity, propertyBlackList: new List { nameof(entity.Id), nameof(entity.Deleted) } ); // await Repository.AddOrUpdateAsync(exists); break; } } catch { } } } } }