using System; using System.Collections.Concurrent; using System.IO; using System.Linq; using System.Linq.Expressions; using System.Threading.Tasks; using Alphaleonis.Win32.Filesystem; using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Builder; using MongoDB.Driver; using MongoDB.Driver.Linq; using Wabbajack.Common; using Directory =Alphaleonis.Win32.Filesystem.Directory; using File = Alphaleonis.Win32.Filesystem.File; using Path = Alphaleonis.Win32.Filesystem.Path; namespace Wabbajack.BuildServer { public static class Extensions { public static async Task FindOneAsync(this IMongoCollection coll, Expression> expr) { return (await coll.AsQueryable().Where(expr).Take(1).ToListAsync()).FirstOrDefault(); } public static void UseJobManager(this IApplicationBuilder b) { var manager = (JobManager)b.ApplicationServices.GetService(typeof(JobManager)); var tsk = manager.JobScheduler(); manager.StartJobRunners(); } public static async Task CopyFileAsync(string sourcePath, string destinationPath) { using (Stream source = File.OpenRead(sourcePath)) { using(Stream destination = File.Create(destinationPath)) { await source.CopyToAsync(destination); } } } public static AuthenticationBuilder AddApiKeySupport(this AuthenticationBuilder authenticationBuilder, Action options) { return authenticationBuilder.AddScheme(ApiKeyAuthenticationOptions.DefaultScheme, options); } private static readonly ConcurrentDictionary PathForArchiveHash = new ConcurrentDictionary(); public static AbsolutePath PathForArchive(this AppSettings settings, Hash hash) { if (PathForArchiveHash.TryGetValue(hash, out AbsolutePath result)) return result; var hexHash = hash.ToHex(); var ends = "_" + hexHash + "_"; var file = settings.ArchiveDir.EnumerateFiles() .FirstOrDefault(f => ((string)f.FileNameWithoutExtension).EndsWith(ends)); if (file != default) PathForArchiveHash.TryAdd(hash, file); return file; } } }