public ActionResult <MergeResponse> MergePdfs(string groupId, [Required][FromBody] PdfMergeRequest request) { if (request.PdfIds.Length < 1) { return(BadRequest("Atleast one pdf must be defined, current length 0")); } var underlayingPdfFiles = _context.PdfFiles .Where(x => x.GroupId == groupId && !x.Removed) .Where(x => request.PdfIds.Any(id => x.FileId == id)) .ToList(); var missingPdfFiles = request.PdfIds.Where(x => !underlayingPdfFiles.Any(file => x == file.FileId)); if (missingPdfFiles.Any()) { var message = $"Pdf files not found, missing files from group '{groupId}' are '{missingPdfFiles.Aggregate("", (a, b) => $"{a}, {b}").Trim(',')}'"; _logger.LogWarning($"Requested merge but it failed: {message}"); return(BadRequest(message)); } var mergeEntity = _context.PdfFiles.Add(new PdfEntity(groupId, PdfType.Merge)).Entity; var filePath = $"{_settings.BaseUrl}/v1/pdf/{groupId}/{mergeEntity.FileId}.pdf"; request.PdfIds.ToList().ForEach(id => { _mqMessages.PdfOpened(groupId, id); underlayingPdfFiles.Single(x => x.FileId == id).Usage.Add(new PdfOpenedEntity()); }); var entitiesToPriritize = underlayingPdfFiles .Where(x => !x.Processed) .Where(x => x.IsValidForHighPriority()) .ToList(); entitiesToPriritize.ForEach(pdfEntity => { pdfEntity.MarkAsHighPriority( _backgroundJob.EnqueueWithHighPriority <IPdfQueue>(que => que.CreatePdf(pdfEntity.Id), originalJobId: pdfEntity.HangfireJobId)); }); _context.SaveChanges(); var storageFile = new StorageFileId(mergeEntity, "pdf"); mergeEntity.HangfireJobId = _backgroundJob.EnqueueWithHighPriority <IPdfMerger>(merger => merger.MergePdf(storageFile, request.PdfIds)); _context.SaveChanges(); return(Accepted(new MergeResponse(mergeEntity.FileId, filePath))); }
public IActionResult Get([FromRoute] string groupId, [FromRoute] string pdfId, [FromRoute] string extension, [FromQuery] bool noCount) { if (extension != "html" && extension != "pdf") { return(BadRequest("Only extensions 'pdf' and 'html' are supported.")); } var pdfEntity = _context.PdfFiles.FirstOrDefault(x => x.GroupId == groupId && x.FileId == pdfId); if (pdfEntity == null) { return(_errorPages.PdfNotFoundResponse()); } if (pdfEntity.Removed) { return(_errorPages.PdfRemovedResponse()); } if (!pdfEntity.Processed) { if (pdfEntity.IsValidForHighPriority()) { pdfEntity.MarkAsHighPriority( _backgroundJobs.EnqueueWithHighPriority <IPdfQueue>(que => que.CreatePdf(pdfEntity.Id), originalJobId: pdfEntity.HangfireJobId)); _context.SaveChanges(); } return(_errorPages.PdfIsStillProcessingResponse()); } var pdfOrHtml = _pdfStorage.Get(new StorageFileId(groupId, pdfId, extension)); if (!noCount) { pdfEntity.Usage.Add(new PdfOpenedEntity()); _context.SaveChanges(); _mqMessages.PdfOpened(groupId, pdfId); } return(new FileStreamResult(new MemoryStream(pdfOrHtml.Data), pdfOrHtml.ContentType)); }