This commit is contained in:
2021-12-24 22:57:45 +00:00
parent e703b440b2
commit 71fa9e5ef5
47 changed files with 145 additions and 109 deletions

View File

@@ -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);
}
}