This commit is contained in:
@@ -58,7 +58,7 @@ namespace AyaNova.Biz
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
//IMPORT
|
||||
//
|
||||
@@ -82,7 +82,7 @@ namespace AyaNova.Biz
|
||||
} while (NotUnique);
|
||||
|
||||
newObject.Name = newUniqueName;
|
||||
|
||||
|
||||
await ValidateAsync(newObject, null);
|
||||
if (HasErrors) return false;
|
||||
await ct.Report.AddAsync(newObject);
|
||||
@@ -332,7 +332,7 @@ namespace AyaNova.Biz
|
||||
bool RequestIsCustomerWorkOrderReport = false;
|
||||
if (reportRequest.ReportId == -100)
|
||||
{
|
||||
log.LogTrace("customer user report requested");
|
||||
log.LogDebug("customer user report requested");
|
||||
//get the user and workorder data and set the actual report id or return null if not found
|
||||
var woTags = await ct.WorkOrder.AsNoTracking().Where(x => x.Id == reportRequest.SelectedRowIds[0]).Select(x => x.Tags).FirstOrDefaultAsync();
|
||||
if (woTags == null) return null;
|
||||
@@ -346,7 +346,7 @@ namespace AyaNova.Biz
|
||||
throw new ReportRenderTimeOutException();
|
||||
|
||||
//get report, vet security, see what we need before init in case of issue
|
||||
log.LogTrace($"get report from db");
|
||||
log.LogDebug($"get report from db");
|
||||
var report = await ct.Report.FirstOrDefaultAsync(z => z.Id == reportRequest.ReportId);
|
||||
if (report == null)
|
||||
{
|
||||
@@ -366,7 +366,7 @@ namespace AyaNova.Biz
|
||||
|
||||
if (!RequestIsCustomerWorkOrderReport && !AyaNova.Api.ControllerHelpers.Authorized.HasReadFullRole(effectiveRoles, report.AType))
|
||||
{
|
||||
log.LogTrace($"bail: user unauthorized");
|
||||
log.LogDebug($"bail: user unauthorized");
|
||||
AddError(ApiErrorCode.NOT_AUTHORIZED, null, $"User not authorized for {report.AType} type object");
|
||||
return null;
|
||||
}
|
||||
@@ -374,7 +374,7 @@ namespace AyaNova.Biz
|
||||
//Client meta data is required
|
||||
if (reportRequest.ClientMeta == null)
|
||||
{
|
||||
log.LogTrace($"bail: ClientMeta parameter is missing");
|
||||
log.LogDebug($"bail: ClientMeta parameter is missing");
|
||||
AddError(ApiErrorCode.VALIDATION_MISSING_PROPERTY, null, "ClientMeta parameter is missing and required to render report");
|
||||
return null;
|
||||
}
|
||||
@@ -393,7 +393,7 @@ namespace AyaNova.Biz
|
||||
//if GetReportData errored then will return null so need to return that as well here
|
||||
if (ReportData == null)
|
||||
{
|
||||
log.LogTrace($"bail: ReportData == null");
|
||||
log.LogDebug($"bail: ReportData == null");
|
||||
return null;
|
||||
}
|
||||
// #if (DEBUG)
|
||||
@@ -406,11 +406,11 @@ namespace AyaNova.Biz
|
||||
bool AutoDownloadChromium = true;
|
||||
if (string.IsNullOrWhiteSpace(ServerBootConfig.AYANOVA_REPORT_RENDER_BROWSER_PATH))
|
||||
{
|
||||
log.LogTrace($"Using default Chromium browser (downloaded)");
|
||||
log.LogDebug($"Using default Chromium browser (downloaded)");
|
||||
}
|
||||
else
|
||||
{
|
||||
log.LogTrace($"Using user specified Chromium browser at {ServerBootConfig.AYANOVA_REPORT_RENDER_BROWSER_PATH}");
|
||||
log.LogDebug($"Using user specified Chromium browser at {ServerBootConfig.AYANOVA_REPORT_RENDER_BROWSER_PATH}");
|
||||
AutoDownloadChromium = false;
|
||||
}
|
||||
|
||||
@@ -441,7 +441,7 @@ namespace AyaNova.Biz
|
||||
// #if (DEBUG)
|
||||
// log.LogInformation($"DBG: ReportBiz::calling browserfetcher");
|
||||
// #endif
|
||||
log.LogTrace($"Windows: Calling browserFetcher download async now:");
|
||||
log.LogDebug($"Windows: Calling browserFetcher download async now:");
|
||||
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultChromiumRevision);
|
||||
}
|
||||
|
||||
@@ -463,9 +463,10 @@ namespace AyaNova.Biz
|
||||
throw new ReportRenderTimeOutException();
|
||||
|
||||
//API DOCS http://www.puppeteersharp.com/api/index.html
|
||||
log.LogTrace($"Launching headless Browser now:");
|
||||
log.LogDebug($"Launching headless Browser and new page now:");
|
||||
using (var browser = await Puppeteer.LaunchAsync(lo))
|
||||
using (var page = (await browser.PagesAsync())[0])
|
||||
// using (var page = await browser.NewPageAsync())
|
||||
{
|
||||
//track this process for timeout purposes
|
||||
ReportRenderManager.AddProcess(browser.Process.Id, renderTimeOutExpiry, log);
|
||||
@@ -496,7 +497,7 @@ namespace AyaNova.Biz
|
||||
}
|
||||
};
|
||||
|
||||
log.LogTrace($"Preparing page: adding base reporting scripts to page");
|
||||
log.LogDebug($"Preparing page: adding base reporting scripts to page");
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
throw new ReportRenderTimeOutException();
|
||||
|
||||
@@ -524,7 +525,7 @@ namespace AyaNova.Biz
|
||||
await page.EvaluateExpressionAsync("ayRegisterHelpers();");
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
throw new ReportRenderTimeOutException();
|
||||
log.LogTrace($"Preparing page: adding this report's scripts, style and templates to page");
|
||||
log.LogDebug($"Preparing page: adding this report's scripts, style and templates to page");
|
||||
|
||||
//add report pre-render, helpers and style
|
||||
if (string.IsNullOrWhiteSpace(report.JsPrerender))
|
||||
@@ -539,12 +540,12 @@ namespace AyaNova.Biz
|
||||
if (!string.IsNullOrWhiteSpace(report.Style))
|
||||
await page.AddStyleTagAsync(new AddTagOptions() { Content = report.Style });
|
||||
|
||||
log.LogTrace($"Preparing page: adding Client meta data");
|
||||
log.LogDebug($"Preparing page: adding Client meta data");
|
||||
|
||||
//Client meta data to JSON string
|
||||
var clientMeta = reportRequest.ClientMeta.ToString();
|
||||
|
||||
log.LogTrace($"Preparing page: adding Server meta data");
|
||||
log.LogDebug($"Preparing page: adding Server meta data");
|
||||
//Server meta data
|
||||
var logo = await ct.Logo.AsNoTracking().SingleOrDefaultAsync();
|
||||
|
||||
@@ -561,7 +562,7 @@ namespace AyaNova.Biz
|
||||
var HasStreetAddress = !string.IsNullOrWhiteSpace(ServerGlobalBizSettings.Cache.Address) ? "true" : "false";
|
||||
var serverMeta = $"{{ayApiUrl:`{apiUrl}`, HasSmallLogo:{HasSmallLogo}, HasMediumLogo:{HasMediumLogo}, HasLargeLogo:{HasLargeLogo},CompanyName: `{AyaNova.Core.License.ActiveKey.RegisteredTo}`,CompanyWebAddress:`{ServerGlobalBizSettings.Cache.WebAddress}`,CompanyEmailAddress:`{ServerGlobalBizSettings.Cache.EmailAddress}`,CompanyPhone1:`{ServerGlobalBizSettings.Cache.Phone1}`,CompanyPhone2:`{ServerGlobalBizSettings.Cache.Phone2}`,HasPostalAddress:{HasPostalAddress},CompanyPostAddress:`{ServerGlobalBizSettings.Cache.PostAddress}`,CompanyPostCity:`{ServerGlobalBizSettings.Cache.PostCity}`,CompanyPostRegion:`{ServerGlobalBizSettings.Cache.PostRegion}`,CompanyPostCountry:`{ServerGlobalBizSettings.Cache.PostCountry}`,CompanyPostCode:`{ServerGlobalBizSettings.Cache.PostCode}`,HasStreetAddress:{HasStreetAddress},CompanyAddress:`{ServerGlobalBizSettings.Cache.Address}`,CompanyCity:`{ServerGlobalBizSettings.Cache.City}`,CompanyRegion:`{ServerGlobalBizSettings.Cache.Region}`,CompanyCountry:`{ServerGlobalBizSettings.Cache.Country}`,CompanyLatitude:{ServerGlobalBizSettings.Cache.Latitude},CompanyLongitude:{ServerGlobalBizSettings.Cache.Longitude}}}";
|
||||
|
||||
log.LogTrace($"Preparing page: adding Report meta data");
|
||||
log.LogDebug($"Preparing page: adding Report meta data");
|
||||
|
||||
//Custom fields definition for report usage
|
||||
string CustomFieldsTemplate = "null";
|
||||
@@ -587,13 +588,16 @@ namespace AyaNova.Biz
|
||||
|
||||
//prePareData / preRender
|
||||
var ReportDataObject = $"{{ ayReportData:{ReportData}, ayReportMetaData:{reportMeta}, ayClientMetaData:{clientMeta}, ayServerMetaData:{serverMeta} }}";
|
||||
log.LogTrace($"Calling ayPreRender...");
|
||||
|
||||
|
||||
log.LogDebug($"PageLog before render:{PageLog.ToString()}");
|
||||
log.LogDebug($"Calling ayPreRender...");
|
||||
await page.WaitForExpressionAsync($"ayPreRender({ReportDataObject})");
|
||||
log.LogDebug($"ayPreRender completed");
|
||||
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
throw new ReportRenderTimeOutException();
|
||||
//compile the template
|
||||
log.LogTrace($"Calling Handlebars.compile...");
|
||||
log.LogDebug($"Calling Handlebars.compile...");
|
||||
|
||||
var compileScript = $"Handlebars.compile(`{report.Template}`)(PreParedReportDataObject);";
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
@@ -602,14 +606,14 @@ namespace AyaNova.Biz
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
throw new ReportRenderTimeOutException();
|
||||
//render report as HTML
|
||||
log.LogTrace($"Setting page content to compiled HTML");
|
||||
log.LogDebug($"Setting page content to compiled HTML");
|
||||
|
||||
await page.SetContentAsync(compiledHTML);
|
||||
|
||||
//add style (after page or it won't work)
|
||||
if (!string.IsNullOrWhiteSpace(report.Style))
|
||||
{
|
||||
log.LogTrace($"Adding report template Style CSS");
|
||||
log.LogDebug($"Adding report template Style CSS");
|
||||
await page.AddStyleTagAsync(new AddTagOptions { Content = report.Style });
|
||||
}
|
||||
|
||||
@@ -619,7 +623,7 @@ namespace AyaNova.Biz
|
||||
|
||||
//Set PDF options
|
||||
//https://pptr.dev/#?product=Puppeteer&version=v5.3.0&show=api-pagepdfoptions
|
||||
log.LogTrace($"Resolving PDF Options from report settings");
|
||||
log.LogDebug($"Resolving PDF Options from report settings");
|
||||
|
||||
var PdfOptions = new PdfOptions() { };
|
||||
|
||||
@@ -697,22 +701,25 @@ namespace AyaNova.Biz
|
||||
if (DateTime.UtcNow > renderTimeOutExpiry)
|
||||
throw new ReportRenderTimeOutException();
|
||||
//render to pdf and return
|
||||
log.LogTrace($"Calling render page contents to PDF");
|
||||
log.LogDebug($"Calling render page contents to PDF");
|
||||
await page.PdfAsync(outputFullPath, PdfOptions);//###### TODO: SLOW NEEDS TIMEOUT HERE ONCE SUPPORTED, open bug: https://github.com/hardkoded/puppeteer-sharp/issues/1710
|
||||
|
||||
log.LogTrace($"Closing Page and Browser");
|
||||
log.LogDebug($"Closing Page");
|
||||
await page.CloseAsync();
|
||||
log.LogDebug($"Closing Browser");
|
||||
await browser.CloseAsync();
|
||||
|
||||
log.LogTrace($"Completed, returning results");
|
||||
log.LogDebug($"Render completed, returning results");
|
||||
return outputFileName;
|
||||
}
|
||||
catch (ReportRenderTimeOutException)
|
||||
{
|
||||
log.LogDebug("Caught ReportRendertimeOutException, re-throwing");
|
||||
throw;
|
||||
}
|
||||
catch (PuppeteerSharp.TargetClosedException)
|
||||
{
|
||||
log.LogDebug("Caught PuppeteerSharp.TargetClosedException throwing as ReportRendertimeOutException (timed out and closed from process sweeper)");
|
||||
//we closed it because the timeout hit and the CoreJobReportRenderEngineProcessCleanup job cleaned it out
|
||||
//so return the error the client expects in this scenario
|
||||
throw new ReportRenderTimeOutException();
|
||||
@@ -734,15 +741,18 @@ namespace AyaNova.Biz
|
||||
}
|
||||
finally
|
||||
{
|
||||
// #if (DEBUG)
|
||||
// log.LogInformation($"DBG: ReportBiz::RenderReport - closing browser");
|
||||
// #endif
|
||||
log.LogTrace($"Closing Page and Browser");
|
||||
log.LogDebug($"reached finally block");
|
||||
if (!page.IsClosed)
|
||||
{
|
||||
log.LogDebug($"Page not closed in finally block, closing now");
|
||||
await page.CloseAsync();
|
||||
}
|
||||
if (!browser.IsClosed)
|
||||
{
|
||||
log.LogDebug($"Browser not closed in finally block, closing now");
|
||||
await browser.CloseAsync();
|
||||
log.LogTrace($"Calling ReportRenderManager.RemoveProcess to stop tracking this process");
|
||||
}
|
||||
log.LogDebug($"Calling ReportRenderManager.RemoveProcess to stop tracking this process");
|
||||
ReportRenderManager.RemoveProcess(browser.Process.Id, log);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user