refactoring, improvements, fixes, etc...

This commit is contained in:
jozsef.b@aycode.com 2024-04-29 19:28:28 +02:00
parent 242a4cddc0
commit 5cc7ff9529
11 changed files with 190 additions and 7 deletions

View File

@ -14,4 +14,8 @@
<Folder Include="Extensions\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,22 @@
using AyCode.Core.Interfaces;
using Newtonsoft.Json;
namespace AyCode.Core.Extensions;
public static class SerializeObjectToJsonExtensions
{
private static string SerializeObjectToJson<T>(T source)
{
JsonSerializerSettings options = new()
{
ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
NullValueHandling = NullValueHandling.Ignore
};
return JsonConvert.SerializeObject(source, options);
}
public static string ToJson<T>(this T source) where T : class, IAcSerializableToJson => SerializeObjectToJson(source);
public static string ToJson<T>(this IQueryable<T> source) where T : class, IAcSerializableToJson => SerializeObjectToJson(source);
public static string ToJson<T>(this IEnumerable<T> source) where T : class, IAcSerializableToJson => SerializeObjectToJson(source);
}

View File

@ -7,6 +7,8 @@ using AyCode.Core.Extensions;
using AyCode.Core.Helpers;
using AyCode.Database.DbContexts;
using AyCode.Database.Extensions;
using AyCode.Entities;
using AyCode.Interfaces;
using AyCode.Interfaces.Entities;
using AyCode.Utils.Extensions;
using Microsoft.EntityFrameworkCore;
@ -50,6 +52,18 @@ public abstract class AcDalBase<TDbContext> : IAcDalBase<TDbContext> where TDbCo
ctx = null;
}
public TModelDto? GetModelDtoById<TModelDto, TEntity>(Guid id) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> Session(ctx => ctx.GetModelDtoById<TModelDto, TEntity>(id));
public Task<TModelDto?> GetModelDtoByIdAsync<TModelDto, TEntity>(Guid id) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> SessionAsync(ctx => ctx.GetModelDtoById<TModelDto, TEntity>(id));
public List<TModelDto> GetAllModelDto<TModelDto, TEntity>() where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> Session(ctx => ctx.GetAllModelDto<TModelDto, TEntity>().ToList());
public Task<List<TModelDto>> GetAllModelDtoAsync<TModelDto, TEntity>() where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> SessionAsync(ctx => ctx.GetAllModelDto<TModelDto, TEntity>().ToList());
public Task<TResultType> SessionAsync<TResultType>(Func<TDbContext, TResultType> callback)
=> this.SessionAsync<TDbContext, TResultType>(callback);

View File

@ -33,6 +33,22 @@ namespace AyCode.Database.DataLayers.Users
public TUser? GetUserByEmail(string? email, bool onlyConfirmed) => Session(x => x.GetUserByEmail(email, onlyConfirmed));
public Task<TUser?> GetUserByEmailAsync(string? email, bool onlyConfirmed) => SessionAsync(x => x.GetUserByEmail(email, onlyConfirmed));
public TUserModelDto? GetUserModelDtoById<TUserModelDto>(Guid userId, bool onlyConfirmed) where TUserModelDto : class, IAcUserModelDtoMinBase
=> Session(ctx => ctx.GetUserModelDtoById<TUserModelDto, TUser>(userId, onlyConfirmed));
public Task<TUserModelDto?> GetUserModelDtoByIdAsync<TUserModelDto>(Guid userId, bool onlyConfirmed) where TUserModelDto : class, IAcUserModelDtoMinBase
=> SessionAsync(ctx => ctx.GetUserModelDtoById<TUserModelDto, TUser>(userId, onlyConfirmed));
public TUserModelDto? GetUserModelDtoByEmail<TUserModelDto>(string email, bool onlyConfirmed) where TUserModelDto : class, IAcUserModelDtoMinBase
=> Session(ctx => ctx.GetUserModelDtoByEmail<TUserModelDto, TUser>(email, onlyConfirmed));
public Task<TUserModelDto?> GetUserModelDtoByEmailAsync<TUserModelDto>(string email, bool onlyConfirmed) where TUserModelDto : class, IAcUserModelDtoMinBase
=> SessionAsync(ctx => ctx.GetUserModelDtoByEmail<TUserModelDto, TUser>(email, onlyConfirmed));
public List<TUserModelDto> GetAllUserModelDto<TUserModelDto>() where TUserModelDto : class, IAcUserModelDtoMinBase
=> GetAllModelDto<TUserModelDto, TUser>();
public Task<List<TUserModelDto>> GetAllUserModelDtoAsync<TUserModelDto>() where TUserModelDto : class, IAcUserModelDtoMinBase
=> GetAllModelDtoAsync<TUserModelDto, TUser>();
public Task<bool> AddUserAsync(TUser user)
{
return TransactionAsync(ctx => ctx.AddUser(user));

View File

@ -0,0 +1,61 @@
using AyCode.Interfaces.Messages;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbSets.Messages;
public static class AcEmailMessageDbSetExtension
{
public static TEmailMessage? GetEmailMessageById<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid emailMessageId) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.FirstOrDefault(x => x.Id == emailMessageId);
public static IQueryable<TEmailMessage> GetEmailMessagesByContextId<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid contextId) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Where(x => x.ContextId == contextId);
public static IQueryable<TEmailMessage> GetEmailMessagesBySenderId<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid senderId) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Where(x => x.SenderId == senderId);
public static IQueryable<TEmailMessage> GetEmailMessagesBySenderEmailAddress<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, string senderEmailAddress) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Where(x => x.EmailAddress == senderEmailAddress);
private static IQueryable<TEmailMessage> GetEmailMessages<TEmailMessage, TEmailRecipient>(this IQueryable<TEmailMessage> queryableEmails, Guid userId, Guid userProductMappingId)
where TEmailMessage : class, IAcEmailMessageBase, IAcEmailRecipientsRelation<TEmailRecipient>
where TEmailRecipient : IAcEmailRecipientBase
{
return queryableEmails.Where(x => x.SenderId == userId || x.SenderId == userProductMappingId || x.Recipients.Any(recipient => recipient.RecipientId == userId || recipient.RecipientId == userProductMappingId));
}
public static IQueryable<TEmailMessage> GetEmailMessages<TEmailMessage, TEmailRecipient>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid userId, Guid userProductMappingId)
where TEmailMessage : class, IAcEmailMessageBase, IAcEmailRecipientsRelation<TEmailRecipient>
where TEmailRecipient : IAcEmailRecipientBase
{
return ctx.EmailMessages.GetEmailMessages<TEmailMessage, TEmailRecipient>(userId, userProductMappingId);
}
public static IQueryable<TEmailMessage> GetEmailMessages<TEmailMessage, TEmailRecipient>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid contextId, Guid userId, Guid userProductMappingId)
where TEmailMessage : class, IAcEmailMessageBase, IAcEmailRecipientsRelation<TEmailRecipient>
where TEmailRecipient : IAcEmailRecipientBase
{
return ctx.GetEmailMessagesByContextId(contextId).GetEmailMessages<TEmailMessage, TEmailRecipient>(userId, userProductMappingId);
}
#region Add, Update, Remove
public static bool AddEmailMessage<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, TEmailMessage emailMessage) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Add(emailMessage).State == EntityState.Added;
public static bool UpdateEmailMessage<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, TEmailMessage emailMessage) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Update(emailMessage).State == EntityState.Modified;
public static bool RemoveEmailMessage<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, Guid emailMessageId) where TEmailMessage : class, IAcEmailMessageBase
{
var emailMessage = ctx.GetEmailMessageById(emailMessageId);
return emailMessage == null || ctx.RemoveEmailMessage(emailMessage);
}
public static bool RemoveEmailMessage<TEmailMessage>(this IAcEmailMessageDbSet<TEmailMessage> ctx, TEmailMessage emailMessage) where TEmailMessage : class, IAcEmailMessageBase
=> ctx.EmailMessages.Remove(emailMessage).State == EntityState.Deleted;
#endregion Add, Update, Remove
}

View File

@ -0,0 +1,9 @@
using AyCode.Interfaces.Messages;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbSets.Messages;
public interface IAcEmailMessageDbSet<TEmailMessage> where TEmailMessage : class, IAcEmailMessageBase
{
public DbSet<TEmailMessage> EmailMessages { get; set; }
}

View File

@ -1,9 +1,12 @@
using AyCode.Core.Extensions;
using AyCode.Core.Logger;
using AyCode.Database.Extensions;
using AyCode.Entities;
using AyCode.Entities.Users;
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
using AyCode.Models.Users;
namespace AyCode.Database.DbSets.Users;
@ -14,24 +17,38 @@ public static class AcUserDbSetExtensions
if (string.IsNullOrWhiteSpace(email) || string.IsNullOrWhiteSpace(passwordHash))
return null;
return ctx.GetUsersByEmail(email, onlyConfirmed).SingleOrDefault(u => u.Password == passwordHash);
return ctx.GetQueryableUserByEmail(email, onlyConfirmed)?.SingleOrDefault(u => u.Password == passwordHash);
}
public static TUser? GetUserById<TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId, bool onlyConfirmed) where TUser : class, IAcUserBase
=> ctx.GetUsersById(userId, onlyConfirmed).FirstOrDefault();
=> ctx.Users.FirstOrDefault(u => u.Id == userId && (!onlyConfirmed || u.EmailConfirmed));
public static TUser? GetUserByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string? email, bool onlyConfirmed) where TUser : class, IAcUserBase
public static TUserModelDto? GetUserModelDtoById<TUserModelDto, TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId, bool onlyConfirmed)
where TUserModelDto : class, IAcUserModelDtoMinBase
where TUser : class, IAcUserBase
{
return string.IsNullOrWhiteSpace(email) ? null : ctx.GetUsersByEmail(email, onlyConfirmed).FirstOrDefault();
return ctx.GetUserById(userId, onlyConfirmed)?.ToModelDto<TUserModelDto, TUser>();
}
public static IQueryable<TUser> GetUsersById<TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId, bool onlyConfirmed) where TUser : class, IAcUserBase
public static TUser? GetUserByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string? email, bool onlyConfirmed) where TUser : class, IAcUserBase
=> ctx.GetQueryableUserByEmail(email, onlyConfirmed)?.FirstOrDefault();
public static TUserModelDto? GetUserModelDtoByEmail<TUserModelDto, TUser>(this IAcUserDbSetBase<TUser> ctx, string? email, bool onlyConfirmed)
where TUserModelDto : class, IAcUserModelDtoMinBase
where TUser : class, IAcUserBase
{
return ctx.GetUserByEmail(email, onlyConfirmed)?.ToModelDto<TUserModelDto, TUser>();
}
public static IQueryable<TUser> GetQueryableUsersById<TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId, bool onlyConfirmed) where TUser : class, IAcUserBase
=> ctx.Users.Where(u => u.Id == userId && (!onlyConfirmed || u.EmailConfirmed));
public static IQueryable<TUser> GetUsersByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string email, bool onlyConfirmed) where TUser : class, IAcUserBase
public static IQueryable<TUser>? GetQueryableUserByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string? email, bool onlyConfirmed) where TUser : class, IAcUserBase
{
Logger.Info($"GetUserByEmail: {email}");
if (string.IsNullOrWhiteSpace(email)) return null;
var emailLower = email.ToLower();
return ctx.Users.Where(u => u.EmailAddress == emailLower && (!onlyConfirmed || u.EmailConfirmed));
}

View File

@ -0,0 +1,18 @@
using AyCode.Core.Interfaces;
using AyCode.Database.DbContexts;
using AyCode.Database.DbSets.Users;
using AyCode.Entities;
using AyCode.Interfaces;
using AyCode.Interfaces.Entities;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.Extensions;
public static class AcDbModelDtoExtension
{
public static TModelDto? GetModelDtoById<TModelDto, TEntity>(this AcDbContextBase ctx, Guid id) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> ctx.Set<TEntity>().Find(id)?.ToModelDto<TModelDto, TEntity>();
public static IEnumerable<TModelDto> GetAllModelDto<TModelDto, TEntity>(this AcDbContextBase ctx) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> ctx.Set<TEntity>().ToModelDto<TModelDto, TEntity>();
}

View File

@ -0,0 +1,13 @@
using AyCode.Interfaces;
using AyCode.Interfaces.Entities;
namespace AyCode.Entities;
public static class AcModelDtoExtension
{
public static TModelDto? ToModelDto<TModelDto, TEntity>(this TEntity entity) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> Activator.CreateInstance(typeof(TModelDto), entity) as TModelDto;
public static IEnumerable<TModelDto> ToModelDto<TModelDto, TEntity>(this IEnumerable<TEntity> entities) where TModelDto : class, IAcModelDtoBase where TEntity : class, IEntity
=> entities.Select(entity => entity.ToModelDto<TModelDto, TEntity>())!;
}

View File

@ -0,0 +1,9 @@
namespace AyCode.Interfaces.Messages;
public interface IAcEmailMessageForeignKey<T>
{
public T EmailMessageId { get; set; }
}
public interface IAcEmailMessageForeignKey : IAcEmailMessageForeignKey<Guid>
{ }

View File

@ -1,6 +1,6 @@
namespace AyCode.Interfaces.Messages;
public interface IAcEmailRecipientsRelation<TEmailRecipient>
public interface IAcEmailRecipientsRelation<TEmailRecipient> where TEmailRecipient : IAcEmailRecipientBase
{
public List<TEmailRecipient> Recipients { get; set; }
}