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