mirror of
https://github.com/wabbajack-tools/wabbajack.git
synced 2024-08-30 18:42:17 +00:00
Can enqueue indexing jobs
This commit is contained in:
@ -9,9 +9,23 @@ namespace Wabbajack.CacheServer.DTOs.JobQueue
|
|||||||
{
|
{
|
||||||
public abstract class AJobPayload
|
public abstract class AJobPayload
|
||||||
{
|
{
|
||||||
public static List<Type> KnowSubtypes = new List<Type>();
|
public static List<Type> KnownSubTypes = new List<Type> {typeof(IndexJob)};
|
||||||
|
public static Dictionary<Type, string> TypeToName { get; set; }
|
||||||
|
public static Dictionary<string, Type> NameToType { get; set; }
|
||||||
|
|
||||||
|
|
||||||
[BsonIgnore]
|
[BsonIgnore]
|
||||||
public abstract string Description { get; }
|
public abstract string Description { get; }
|
||||||
|
|
||||||
|
public virtual bool UsesNexus { get; } = false;
|
||||||
|
|
||||||
|
public abstract JobResult Execute();
|
||||||
|
|
||||||
|
static AJobPayload()
|
||||||
|
{
|
||||||
|
NameToType = KnownSubTypes.ToDictionary(t => t.FullName.Substring(t.Namespace.Length + 1), t => t);
|
||||||
|
TypeToName = NameToType.ToDictionary(k => k.Value, k => k.Key);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
20
Wabbajack.CacheServer/DTOs/JobQueue/IndexJob.cs
Normal file
20
Wabbajack.CacheServer/DTOs/JobQueue/IndexJob.cs
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using Wabbajack.Lib.Downloaders;
|
||||||
|
|
||||||
|
namespace Wabbajack.CacheServer.DTOs.JobQueue
|
||||||
|
{
|
||||||
|
public class IndexJob : AJobPayload
|
||||||
|
{
|
||||||
|
public AbstractDownloadState State { get; set; }
|
||||||
|
public override string Description { get; } = "Validate and index an archive";
|
||||||
|
public override bool UsesNexus { get => State is NexusDownloader.State; }
|
||||||
|
public override JobResult Execute()
|
||||||
|
{
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -19,8 +19,8 @@ namespace Wabbajack.CacheServer.DTOs.JobQueue
|
|||||||
|
|
||||||
[BsonId]
|
[BsonId]
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public DateTime Started { get; set; }
|
public DateTime? Started { get; set; }
|
||||||
public DateTime Ended { get; set; }
|
public DateTime? Ended { get; set; }
|
||||||
public DateTime Created { get; set; } = DateTime.Now;
|
public DateTime Created { get; set; } = DateTime.Now;
|
||||||
public JobPriority Priority { get; set; } = JobPriority.Normal;
|
public JobPriority Priority { get; set; } = JobPriority.Normal;
|
||||||
public bool RequiresNexus { get; set; } = true;
|
public bool RequiresNexus { get; set; } = true;
|
||||||
|
36
Wabbajack.CacheServer/DTOs/JobQueue/JobResult.cs
Normal file
36
Wabbajack.CacheServer/DTOs/JobQueue/JobResult.cs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using MongoDB.Bson.Serialization.Attributes;
|
||||||
|
|
||||||
|
namespace Wabbajack.CacheServer.DTOs.JobQueue
|
||||||
|
{
|
||||||
|
public class JobResult
|
||||||
|
{
|
||||||
|
public JobResultType ResultType { get; set; }
|
||||||
|
[BsonIgnoreIfNull]
|
||||||
|
public string Message { get; set; }
|
||||||
|
|
||||||
|
[BsonIgnoreIfNull]
|
||||||
|
public string Stacktrace { get; set; }
|
||||||
|
|
||||||
|
public static JobResult Success()
|
||||||
|
{
|
||||||
|
return new JobResult { ResultType = JobResultType.Success };
|
||||||
|
}
|
||||||
|
|
||||||
|
public static JobResult Error(Exception ex)
|
||||||
|
{
|
||||||
|
return new JobResult {ResultType = JobResultType.Error, Stacktrace = ex.ToString()};
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum JobResultType
|
||||||
|
{
|
||||||
|
Success,
|
||||||
|
Error
|
||||||
|
}
|
||||||
|
}
|
@ -12,10 +12,6 @@ namespace Wabbajack.CacheServer.DTOs
|
|||||||
{
|
{
|
||||||
public class ModListStatus
|
public class ModListStatus
|
||||||
{
|
{
|
||||||
static ModListStatus()
|
|
||||||
{
|
|
||||||
SerializerSettings.Init();
|
|
||||||
}
|
|
||||||
|
|
||||||
[BsonId]
|
[BsonId]
|
||||||
public string Id { get; set; }
|
public string Id { get; set; }
|
||||||
|
@ -7,6 +7,7 @@ using MongoDB.Bson;
|
|||||||
using MongoDB.Bson.IO;
|
using MongoDB.Bson.IO;
|
||||||
using MongoDB.Bson.Serialization;
|
using MongoDB.Bson.Serialization;
|
||||||
using MongoDB.Bson.Serialization.Conventions;
|
using MongoDB.Bson.Serialization.Conventions;
|
||||||
|
using Wabbajack.CacheServer.DTOs.JobQueue;
|
||||||
using Wabbajack.Lib.Downloaders;
|
using Wabbajack.Lib.Downloaders;
|
||||||
|
|
||||||
namespace Wabbajack.CacheServer.DTOs
|
namespace Wabbajack.CacheServer.DTOs
|
||||||
@ -18,6 +19,11 @@ namespace Wabbajack.CacheServer.DTOs
|
|||||||
var dis = new TypeDiscriminator(typeof(AbstractDownloadState), AbstractDownloadState.NameToType,
|
var dis = new TypeDiscriminator(typeof(AbstractDownloadState), AbstractDownloadState.NameToType,
|
||||||
AbstractDownloadState.TypeToName);
|
AbstractDownloadState.TypeToName);
|
||||||
BsonSerializer.RegisterDiscriminatorConvention(typeof(AbstractDownloadState), dis);
|
BsonSerializer.RegisterDiscriminatorConvention(typeof(AbstractDownloadState), dis);
|
||||||
|
BsonClassMap.RegisterClassMap<AbstractDownloadState>(cm => cm.SetIsRootClass(true));
|
||||||
|
|
||||||
|
dis = new TypeDiscriminator(typeof(AJobPayload), AJobPayload.NameToType, AJobPayload.TypeToName);
|
||||||
|
BsonSerializer.RegisterDiscriminatorConvention(typeof(AJobPayload), dis);
|
||||||
|
BsonClassMap.RegisterClassMap<AJobPayload>(cm => cm.SetIsRootClass(true));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,7 +50,7 @@ namespace Wabbajack.CacheServer.DTOs
|
|||||||
|
|
||||||
public Type GetActualType(IBsonReader bsonReader, Type nominalType)
|
public Type GetActualType(IBsonReader bsonReader, Type nominalType)
|
||||||
{
|
{
|
||||||
Type type = defaultType;
|
Type type = null;
|
||||||
var bookmark = bsonReader.GetBookmark();
|
var bookmark = bsonReader.GetBookmark();
|
||||||
bsonReader.ReadStartDocument();
|
bsonReader.ReadStartDocument();
|
||||||
if (bsonReader.FindElement(ElementName))
|
if (bsonReader.FindElement(ElementName))
|
||||||
@ -55,6 +61,8 @@ namespace Wabbajack.CacheServer.DTOs
|
|||||||
}
|
}
|
||||||
|
|
||||||
bsonReader.ReturnToBookmark(bookmark);
|
bsonReader.ReturnToBookmark(bookmark);
|
||||||
|
if (type == null)
|
||||||
|
throw new Exception($"Type mis-configuration can't find bson type for ${nominalType}");
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -15,6 +15,7 @@ namespace Wabbajack.CacheServer
|
|||||||
public JobQueueEndpoints() : base ("/jobs")
|
public JobQueueEndpoints() : base ("/jobs")
|
||||||
{
|
{
|
||||||
Get("/", HandleListJobs);
|
Get("/", HandleListJobs);
|
||||||
|
Get("/enqueue_curated_for_indexing", HandleEnqueueAllCurated);
|
||||||
}
|
}
|
||||||
|
|
||||||
private readonly Func<object, string> HandleListJobsTemplate = NettleEngine.GetCompiler().Compile(@"
|
private readonly Func<object, string> HandleListJobsTemplate = NettleEngine.GetCompiler().Compile(@"
|
||||||
@ -47,5 +48,24 @@ namespace Wabbajack.CacheServer
|
|||||||
response.ContentType = "text/html";
|
response.ContentType = "text/html";
|
||||||
return response;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private async Task<string> HandleEnqueueAllCurated(object arg)
|
||||||
|
{
|
||||||
|
var states = await Server.Config.ListValidation.Connect()
|
||||||
|
.AsQueryable()
|
||||||
|
.SelectMany(lst => lst.DetailedStatus.Archives)
|
||||||
|
.Select(a => a.Archive.State)
|
||||||
|
.ToListAsync();
|
||||||
|
|
||||||
|
var jobs = states.Select(state => new IndexJob {State = state})
|
||||||
|
.Select(j => new Job {Payload = j, RequiresNexus = j.UsesNexus})
|
||||||
|
.ToList();
|
||||||
|
|
||||||
|
if (jobs.Count > 0)
|
||||||
|
await Server.Config.JobQueue.Connect().InsertManyAsync(jobs);
|
||||||
|
|
||||||
|
return $"Enqueued {states.Count} jobs";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using Nancy.Bootstrapper;
|
|||||||
using Nancy.Configuration;
|
using Nancy.Configuration;
|
||||||
using Nancy.Hosting.Self;
|
using Nancy.Hosting.Self;
|
||||||
using Nancy.TinyIoc;
|
using Nancy.TinyIoc;
|
||||||
|
using Wabbajack.CacheServer.DTOs;
|
||||||
using Wabbajack.CacheServer.ServerConfig;
|
using Wabbajack.CacheServer.ServerConfig;
|
||||||
using Wabbajack.Common;
|
using Wabbajack.Common;
|
||||||
|
|
||||||
@ -18,6 +19,7 @@ namespace Wabbajack.CacheServer
|
|||||||
|
|
||||||
static Server()
|
static Server()
|
||||||
{
|
{
|
||||||
|
SerializerSettings.Init();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,7 +74,9 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Compile Include="DTOs\JobQueue\AJobPayload.cs" />
|
<Compile Include="DTOs\JobQueue\AJobPayload.cs" />
|
||||||
|
<Compile Include="DTOs\JobQueue\IndexJob.cs" />
|
||||||
<Compile Include="DTOs\JobQueue\Job.cs" />
|
<Compile Include="DTOs\JobQueue\Job.cs" />
|
||||||
|
<Compile Include="DTOs\JobQueue\JobResult.cs" />
|
||||||
<Compile Include="DTOs\Metric.cs" />
|
<Compile Include="DTOs\Metric.cs" />
|
||||||
<Compile Include="DTOs\ModListStatus.cs" />
|
<Compile Include="DTOs\ModListStatus.cs" />
|
||||||
<Compile Include="DTOs\MongoDoc.cs" />
|
<Compile Include="DTOs\MongoDoc.cs" />
|
||||||
|
Reference in New Issue
Block a user