using Microsoft.EntityFrameworkCore; using SharedLibraryCore.Database; using SharedLibraryCore.Database.Models; using SharedLibraryCore.Dtos; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace SharedLibraryCore.Services { public class MetaService { private static List>>> _metaActions = new List>>>(); /// /// adds or updates meta key and value to the database /// /// key of meta data /// value of the meta data /// client to save the meta for /// public async Task AddPersistentMeta(string metaKey, string metaValue, EFClient client) { using (var ctx = new DatabaseContext()) { var existingMeta = await ctx.EFMeta .Where(_meta => _meta.Key == metaKey) .Where(_meta => _meta.ClientId == client.ClientId) .FirstOrDefaultAsync(); if (existingMeta != null) { existingMeta.Value = metaValue; existingMeta.Updated = DateTime.UtcNow; } else { ctx.EFMeta.Add(new EFMeta() { ClientId = client.ClientId, Created = DateTime.UtcNow, Key = metaKey, Value = metaValue }); } await ctx.SaveChangesAsync(); } } /// /// retrieves meta data for given client and key /// /// key to retrieve value for /// client to retrieve meta for /// public async Task GetPersistentMeta(string metaKey, EFClient client) { using (var ctx = new DatabaseContext(disableTracking:true)) { return await ctx.EFMeta .Where(_meta => _meta.Key == metaKey) .Where(_meta => _meta.ClientId == client.ClientId) .FirstOrDefaultAsync(); } } /// /// aads a meta task to the runtime meta list /// /// public static void AddRuntimeMeta(Func>> metaAction) { _metaActions.Add(metaAction); } /// /// retrieves all the runtime meta information for given client idea /// /// id of the client /// public static async Task> GetRuntimeMeta(int clientId) { var meta = new List(); foreach (var action in _metaActions) { meta.AddRange(await action(clientId)); } return meta; } } }