From 5402923e9f922fe64c41d5b3b8b1ce1ed7cd29f6 Mon Sep 17 00:00:00 2001 From: littlefoot Date: Thu, 14 Jul 2022 19:31:53 -0400 Subject: [PATCH] Changed db stuff --- DBConnection/AppDbContext.cs | 5 ++--- DBConnection/Extensions/BuilderExtensions.cs | 2 +- DBConnection/ModelBuilders/IModelBuilder.cs | 2 +- DBConnection/ModelBuilders/UserNovelBuilder.cs | 1 - DBConnection/Models/Author.cs | 1 + DBConnection/Repositories/BaseRepository.cs | 18 +++++++++++------- .../Repositories/Interfaces/IRepository.cs | 9 ++++++--- DBConnection/Repositories/NovelRepository.cs | 15 +++++++++++++++ WebNovelPortalAPI/appsettings.json | 3 +++ 9 files changed, 40 insertions(+), 16 deletions(-) diff --git a/DBConnection/AppDbContext.cs b/DBConnection/AppDbContext.cs index 6dfdad8..35baae0 100644 --- a/DBConnection/AppDbContext.cs +++ b/DBConnection/AppDbContext.cs @@ -1,5 +1,4 @@ using System.Reflection; -using DBConnection.Interfaces; using DBConnection.ModelBuilders; using DBConnection.Models; using DBConnection.Seeders; @@ -18,12 +17,12 @@ public class AppDbContext : DbContext private readonly IEnumerable _seeders = from t in Assembly.GetExecutingAssembly().GetTypes() - where t.IsClass && t.Namespace.Contains(nameof(DBConnection.Seeders)) && typeof(ISeeder).IsAssignableFrom(t) + where t.IsClass && (t.Namespace?.Contains(nameof(DBConnection.Seeders)) ?? false) && typeof(ISeeder).IsAssignableFrom(t) select (ISeeder) Activator.CreateInstance(t); private static readonly IEnumerable ModelBuilders = from t in Assembly.GetExecutingAssembly().GetTypes() - where t.IsClass && t.Namespace.Contains(nameof(DBConnection.ModelBuilders)) && typeof(IModelBuilder).IsAssignableFrom(t) + where t.IsClass && (t.Namespace?.Contains(nameof(DBConnection.ModelBuilders)) ?? false) && typeof(IModelBuilder).IsAssignableFrom(t) select (IModelBuilder) Activator.CreateInstance(t); public AppDbContext(DbContextOptions options) : base(options) diff --git a/DBConnection/Extensions/BuilderExtensions.cs b/DBConnection/Extensions/BuilderExtensions.cs index 5e6cb7e..4601081 100644 --- a/DBConnection/Extensions/BuilderExtensions.cs +++ b/DBConnection/Extensions/BuilderExtensions.cs @@ -21,7 +21,7 @@ public static class BuilderExtensions opt.UseNpgsql(dbConnectionString); }); Type[] repositories = Assembly.GetExecutingAssembly().GetTypes() - .Where(t => t.IsClass && !t.IsAbstract && t.Namespace.Contains(nameof(DBConnection.Repositories)) && typeof(IRepository).IsAssignableFrom(t)).ToArray(); + .Where(t => t.IsClass && !t.IsAbstract && (t.Namespace?.Contains(nameof(DBConnection.Repositories)) ?? false) && typeof(IRepository).IsAssignableFrom(t)).ToArray(); foreach (var repo in repositories) { var repoInterface = repo.GetInterfaces() diff --git a/DBConnection/ModelBuilders/IModelBuilder.cs b/DBConnection/ModelBuilders/IModelBuilder.cs index 6d3e5f6..71c2d91 100644 --- a/DBConnection/ModelBuilders/IModelBuilder.cs +++ b/DBConnection/ModelBuilders/IModelBuilder.cs @@ -1,6 +1,6 @@ using Microsoft.EntityFrameworkCore; -namespace DBConnection.Interfaces; +namespace DBConnection.ModelBuilders; /// /// ModelBuilders are used for customizing DB models with properties not settable via annotations diff --git a/DBConnection/ModelBuilders/UserNovelBuilder.cs b/DBConnection/ModelBuilders/UserNovelBuilder.cs index 9a44513..cafa5ed 100644 --- a/DBConnection/ModelBuilders/UserNovelBuilder.cs +++ b/DBConnection/ModelBuilders/UserNovelBuilder.cs @@ -1,4 +1,3 @@ -using DBConnection.Interfaces; using DBConnection.Models; using Microsoft.EntityFrameworkCore; diff --git a/DBConnection/Models/Author.cs b/DBConnection/Models/Author.cs index 1fef4ab..fb07f1b 100644 --- a/DBConnection/Models/Author.cs +++ b/DBConnection/Models/Author.cs @@ -7,4 +7,5 @@ public class Author : BaseEntity [Key] public string Url { get; set; } public string Name { get; set; } + public List Novels { get; set; } } \ No newline at end of file diff --git a/DBConnection/Repositories/BaseRepository.cs b/DBConnection/Repositories/BaseRepository.cs index 993b2ad..582b004 100644 --- a/DBConnection/Repositories/BaseRepository.cs +++ b/DBConnection/Repositories/BaseRepository.cs @@ -38,7 +38,7 @@ public abstract class BaseRepository : IRepository whe } else { - var dbEntry = await Get(entity); + var dbEntry = await GetIncluded(entity); DbContext.Entry(dbEntry).CurrentValues.SetValues(entity); } @@ -46,14 +46,18 @@ public abstract class BaseRepository : IRepository whe return entity; } - public virtual async Task Get(TEntityType entity) + public virtual async Task GetIncluded(TEntityType entity) { - var keyValues = GetPrimaryKey(entity); - return await Get(keyValues); + return await GetIncluded(dbEntity => GetPrimaryKey(dbEntity) == GetPrimaryKey(entity)); } - - public virtual async Task Get(params object?[]? keyValues) + + public virtual async Task GetIncluded(Func predicate) { - return await DbContext.Set().Include(j => j.DateCreated).FindAsync(keyValues); + return GetAllIncludedQueryable().FirstOrDefault(predicate); + } + + public virtual async Task> GetWhereIncluded(Func predicate) + { + return GetAllIncludedQueryable().AsEnumerable().Where(predicate); } } \ No newline at end of file diff --git a/DBConnection/Repositories/Interfaces/IRepository.cs b/DBConnection/Repositories/Interfaces/IRepository.cs index 79bc979..2d220f2 100644 --- a/DBConnection/Repositories/Interfaces/IRepository.cs +++ b/DBConnection/Repositories/Interfaces/IRepository.cs @@ -1,3 +1,5 @@ +using DBConnection.Models; + namespace DBConnection.Repositories.Interfaces; public interface IRepository @@ -5,10 +7,11 @@ public interface IRepository } -public interface IRepository : IRepository where TEntityType : class +public interface IRepository : IRepository where TEntityType : BaseEntity { TEntityType Delete(TEntityType entity); Task Upsert(TEntityType entity); - Task Get(TEntityType entity); - Task Get(params object?[]? keyValues); + Task GetIncluded(TEntityType entity); + Task GetIncluded(Func predicate); + Task> GetWhereIncluded(Func predicate); } \ No newline at end of file diff --git a/DBConnection/Repositories/NovelRepository.cs b/DBConnection/Repositories/NovelRepository.cs index 53d61b6..270d41d 100644 --- a/DBConnection/Repositories/NovelRepository.cs +++ b/DBConnection/Repositories/NovelRepository.cs @@ -19,4 +19,19 @@ public class NovelRepository : BaseRepository, INovelRepository .Include(i => i.Tags); } + public async Task GetNovel(string url) + { + return await GetIncluded(i => i.Url == url); + } + + public async Task> LookupNovelsByName(string name) + { + return await GetWhereIncluded(n => n.Title.Contains(name)); + } + + public async Task> LookupNovelsByTag(string tag) + { + return await GetWhereIncluded(n => n.Tags.Any(nt => nt.TagValue.Contains(tag))); + } + } \ No newline at end of file diff --git a/WebNovelPortalAPI/appsettings.json b/WebNovelPortalAPI/appsettings.json index 10f68b8..29591d2 100644 --- a/WebNovelPortalAPI/appsettings.json +++ b/WebNovelPortalAPI/appsettings.json @@ -5,5 +5,8 @@ "Microsoft.AspNetCore": "Warning" } }, + "ConnectionStrings": { + "DefaultConnection": "null" + }, "AllowedHosts": "*" }