diff --git a/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs b/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs new file mode 100644 index 0000000..f615bf8 --- /dev/null +++ b/src/HelloShop.IdentityService/DataSeeding/User2DataSeedingProvider.cs @@ -0,0 +1,27 @@ +using HelloShop.IdentityService.Entities; +using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Infrastructure; + +namespace HelloShop.IdentityService.DataSeeding +{ + public class User2DataSeedingProvider : IDataSeedingProvider + { + public async Task SeedingAsync(IServiceProvider serviceProvider) + { + var dbContext = serviceProvider.GetRequiredService(); + + var guestUser = dbContext.Set().SingleOrDefault(x => x.UserName == "guest2"); + + if (guestUser is null) + { + await dbContext.Set().AddAsync(new User + { + UserName = "guest2", + PasswordHash = "AQAAAAEAACcQAAAAEJ" + }); + + await dbContext.SaveChangesAsync(); + } + } + } +} diff --git a/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs b/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs new file mode 100644 index 0000000..0bc0e4c --- /dev/null +++ b/src/HelloShop.IdentityService/DataSeeding/UserDataSeedingProvider.cs @@ -0,0 +1,25 @@ +using HelloShop.IdentityService.Entities; +using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Infrastructure; + +namespace HelloShop.IdentityService.DataSeeding +{ + public class UserDataSeedingProvider(IdentityServiceDbContext dbContext) : IDataSeedingProvider + { + public async Task SeedingAsync(IServiceProvider serviceProvider) + { + var guestUser = dbContext.Set().SingleOrDefault(x => x.UserName == "guest"); + + if (guestUser is null) + { + await dbContext.Set().AddAsync(new User + { + UserName = "guest", + PasswordHash = "AQAAAAEAACcQAAAAEJ" + }); + + await dbContext.SaveChangesAsync(); + } + } + } +} diff --git a/src/HelloShop.IdentityService/Program.cs b/src/HelloShop.IdentityService/Program.cs index 8d62b4d..54e8ab7 100644 --- a/src/HelloShop.IdentityService/Program.cs +++ b/src/HelloShop.IdentityService/Program.cs @@ -1,5 +1,7 @@ using HelloShop.IdentityService.Constants; +using HelloShop.IdentityService.DataSeeding; using HelloShop.IdentityService.EntityFrameworks; +using HelloShop.ServiceDefaults.Extensions; using Microsoft.EntityFrameworkCore; var builder = WebApplication.CreateBuilder(args); @@ -18,6 +20,8 @@ builder.Services.AddDbContext(options => options.UseNpgsql(builder.Configuration.GetConnectionString(DbConstants.ConnectionStringName)); }); +builder.Services.AddDataSeedingProviders(); + var app = builder.Build(); app.MapDefaultEndpoints(); @@ -35,4 +39,6 @@ app.UseAuthorization(); app.MapControllers(); +app.UseDataSeedingProviders(); + app.Run(); diff --git a/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs b/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs new file mode 100644 index 0000000..f927104 --- /dev/null +++ b/src/HelloShop.ServiceDefaults/Extensions/DataSeedingExtensions.cs @@ -0,0 +1,40 @@ +using HelloShop.ServiceDefaults.Infrastructure; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Text; +using System.Threading.Tasks; + +namespace HelloShop.ServiceDefaults.Extensions +{ + public static class DataSeedingExtensions + { + public static IServiceCollection AddDataSeedingProviders(this IServiceCollection services, Assembly? assembly = null) + { + assembly ??= Assembly.GetCallingAssembly(); + + var dataSeedProviders = assembly.ExportedTypes.Where(t => t.IsAssignableTo(typeof(IDataSeedingProvider)) && t.IsClass); + + dataSeedProviders.ToList().ForEach(t => services.AddTransient(typeof(IDataSeedingProvider), t)); + + return services; + } + + public static IApplicationBuilder UseDataSeedingProviders(this IApplicationBuilder app) + { + using var serviceScope = app.ApplicationServices.CreateScope(); + + var dataSeedingProviders = serviceScope.ServiceProvider.GetServices().OrderBy(x=>x.Order); + + foreach (var dataSeedingProvider in dataSeedingProviders) + { + dataSeedingProvider.SeedingAsync(serviceScope.ServiceProvider).Wait(); + } + + return app; + } + } +} diff --git a/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs b/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs new file mode 100644 index 0000000..302be74 --- /dev/null +++ b/src/HelloShop.ServiceDefaults/Infrastructure/IDataSeedingProvider.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace HelloShop.ServiceDefaults.Infrastructure +{ + public interface IDataSeedingProvider + { + int Order => default; + + Task SeedingAsync(IServiceProvider serviceProvider); + } +}