Ejemplo n.º 1
0
        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)));
        }
Ejemplo n.º 2
0
        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));
        }