public ActionResult <IEnumerable <NewPdfResponse> > AddNewPdf([Required][FromRoute] string groupId, [FromBody] NewPdfRequest request) { if (!request.RowData.Any()) { return(BadRequest("Expected to get atleast one 'rowData' element, but got none.")); } var responses = request.RowData.Select(row => { var entity = _context.PdfFiles.Add(new PdfEntity(groupId, PdfType.Pdf) { Options = request.Options }).Entity; var templatedRow = TemplateUtils.MergeBaseTemplatingWithRows(request.BaseData, row); PersistParsedHtmlTemplateOfPdfDocument(entity, request.Html, templatedRow); _context.SaveChanges(); entity.HangfireJobId = _backgroundJobs.Enqueue <IPdfQueue>(que => que.CreatePdf(entity.Id)); _context.SaveChanges(); var pdfUri = _uris.PdfUri(groupId, entity.FileId); var htmlUri = _uris.HtmlUri(groupId, entity.FileId); return(new NewPdfResponse(entity.FileId, entity.GroupId, pdfUri, htmlUri, row)); }); return(Accepted(responses.ToList())); }
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 void CreatePdf(Guid pdfEntityId) { var entity = _context.PdfFiles.Single(x => x.Id == pdfEntityId); var htmlFromStorage = _storage.Get(new StorageFileId(entity, "html")); var data = GeneratePdfDataFromHtml(pdfEntityId, Encoding.UTF8.GetString(htmlFromStorage.Data), entity.Options).GetAwaiter().GetResult(); _storage.AddOrReplace(new StorageData(new StorageFileId(entity), data)); entity.Processed = true; _mqMessages.PdfGenerated(entity.GroupId, entity.FileId); _context.SaveChanges(); }
public void MergePdf(StorageFileId storageIdForMergedPdf, string[] pdfIds) { Debug.Assert(storageIdForMergedPdf.Extension == "pdf"); var temp = ResolveTemporaryDirectory(); _logger.LogInformation($"Using temporary folder: {temp}"); try { var mergedFile = _context.PdfFiles.Single(x => x.GroupId == storageIdForMergedPdf.Group && x.FileId == storageIdForMergedPdf.Id); var pdfEntities = _context.PdfFiles .Where(x => x.GroupId == storageIdForMergedPdf.Group) .Where(x => pdfIds.Any(id => x.FileId == id)) .ToList(); if(pdfEntities.Any(x => !x.Processed)) throw new InvalidOperationException( $"Tried to merge files that are not ready, non ready pdf list is '{pdfEntities.Where(x => !x.Processed).Select(x => x.FileId).Aggregate("", (a, b) => $"{a}, {b}").Trim(',')}'"); var pdfs = pdfIds .Select(id => _pdfStorage.Get(new StorageFileId(storageIdForMergedPdf.Group, id, "pdf"))) .Select(pdf => (tempFile: Path.Combine($@"{temp}", $"{pdf.StorageFileId.Id}.pdf"), data: pdf.Data)).ToList(); pdfs.ForEach(x => File.WriteAllBytes(x.tempFile, x.data)); var mergedPdf = MergeFiles(temp, pdfs.Select(x => x.tempFile)); _pdfStorage.AddOrReplace(new StorageData(storageIdForMergedPdf, mergedPdf)); mergedFile.Processed = true; _context.SaveChanges(); } finally { _logger.LogInformation($"Removing temporary folder: {temp}"); Directory.Delete(temp, true); } }