Files
Disco/Disco.Services/Documents/DocumentBulkGenerateTask.cs
T
2025-07-31 16:18:32 +10:00

99 lines
3.9 KiB
C#

using Disco.Data.Repository;
using Disco.Models.Repository;
using Disco.Services.Tasks;
using Quartz;
using System;
using System.Collections.Generic;
using System.IO;
namespace Disco.Services.Documents
{
public class DocumentBulkGenerateTask : ScheduledTask
{
private const string JobDataMapContext = "Context";
public override string TaskName { get; } = "Document Template - Bulk Generate";
public override bool SingleInstanceTask { get; } = false;
public override bool CancelInitiallySupported { get; } = false;
public override void InitalizeScheduledTask(DiscoDataContext Database)
{
// clear cache
var cachePath = GetCachePath(Database);
if (Directory.Exists(cachePath))
Directory.Delete(cachePath, true);
}
public static Stream GetCached(DiscoDataContext database, Guid id)
{
var cachePath = GetCachePath(database);
var path = Path.Combine(cachePath, $"{id}.pdf");
if (File.Exists(path))
return File.OpenRead(path);
else
throw new FileNotFoundException();
}
public static ScheduledTaskStatus ScheduleNow(Func<DocumentTemplate, DiscoDataContext, User, DateTime, bool, List<string>, IScheduledTaskStatus, Stream> generateDelegate, DocumentTemplate documentTemplate, User creatorUser, DateTime timestamp, bool insertBlankPages, List<string> dataObjectsIds)
{
var context = new DocumentBulkGenerateContext()
{
GenerateDelegate = generateDelegate,
DocumentTemplate = documentTemplate,
CreatorUser = creatorUser,
Timestamp = timestamp,
InsertBlankPages = insertBlankPages,
DataObjectsIds = dataObjectsIds,
};
// Build Data Map
var task = new DocumentBulkGenerateTask();
JobDataMap taskData = new JobDataMap() { { JobDataMapContext, context } };
// Schedule Task
var status = task.ScheduleTask(taskData);
context.Id = status.SessionId;
return status;
}
protected override void ExecuteTask()
{
var context = (DocumentBulkGenerateContext)ExecutionContext.JobDetail.JobDataMap[JobDataMapContext];
using (var database = new DiscoDataContext())
{
var cachePath = GetCachePath(database);
if (!Directory.Exists(cachePath))
Directory.CreateDirectory(cachePath);
var filePath = Path.Combine(cachePath, $"{Status.SessionId}.pdf");
var stream = context.GenerateDelegate(context.DocumentTemplate, database, context.CreatorUser, context.Timestamp, context.InsertBlankPages, context.DataObjectsIds, Status);
database.SaveChanges();
using (var cacheStream = new FileStream(filePath, FileMode.Create, FileAccess.Write, FileShare.None))
stream.CopyTo(cacheStream);
}
Status.UpdateStatus(100);
Status.Finished("Generated Document");
}
private static string GetCachePath(DiscoDataContext database)
=> Path.Combine(database.DiscoConfiguration.DataStoreLocation, @"DocumentTemplates\BulkGenerateCache");
private class DocumentBulkGenerateContext
{
public Func<DocumentTemplate, DiscoDataContext, User, DateTime, bool, List<string>, IScheduledTaskStatus, Stream> GenerateDelegate { get; set; }
public string Id { get; set; }
public DocumentTemplate DocumentTemplate { get; set; }
public User CreatorUser { get; set; }
public DateTime Timestamp { get; set; }
public bool InsertBlankPages { get; set; }
public List<string> DataObjectsIds { get; set; }
}
}
}