This commit is contained in:
2020-09-02 21:18:04 +00:00
parent 4a6a71649f
commit ad81e5caa2
6 changed files with 99 additions and 94 deletions

View File

@@ -68,12 +68,11 @@ namespace AyaNova.Api.Controllers
if (!ModelState.IsValid) if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState)); return BadRequest(new ApiErrorResponse(ModelState));
var UserId = UserIdFromContext.Id(HttpContext.Items);
var UserRoles = UserRolesFromContext.Roles(HttpContext.Items); var UserRoles = UserRolesFromContext.Roles(HttpContext.Items);
try try
{ {
ApiDataListResponse r = await DataListFetcher.GetResponseAsync(listOptions.DataListKey, ct, listOptions, UserId, UserRoles, log); ApiDataListResponse r = await DataListFetcher.GetResponseAsync(listOptions.DataListKey, ct, listOptions, UserRoles, log);
return Ok(r); return Ok(r);
} }
catch (System.UnauthorizedAccessException) catch (System.UnauthorizedAccessException)

View File

@@ -183,14 +183,7 @@ namespace AyaNova.Api.Controllers
//====================================================================================================== //======================================================================================================
public class ObjectReportDataParameter
{
public AyaType ObjectType { get; set; }
public long[] SelectedRowIds { get; set; }
public string DataListKey { get; set; }
public string ListView { get; set; }//optional, if null or empty will use default list view built into DataList
}
/// <summary> /// <summary>
/// Get data from id list in format used by report designer /// Get data from id list in format used by report designer
@@ -215,20 +208,22 @@ namespace AyaNova.Api.Controllers
if (!ModelState.IsValid) if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState)); return BadRequest(new ApiErrorResponse(ModelState));
Newtonsoft.Json.Linq.JArray reportData = null; // Newtonsoft.Json.Linq.JArray reportData = null;
if (reportDataParam.SelectedRowIds.Length > 0) // if (reportDataParam.SelectedRowIds.Length > 0)
{ // {
//pre-selected id values // //pre-selected id values
reportData = await biz.GetReportData(reportDataParam.ObjectType, reportDataParam.SelectedRowIds); // reportData = await biz.GetReportData(reportDataParam.ObjectType, reportDataParam.SelectedRowIds);
} // }
else // else
{ // {
//get from datalist values // //get from datalist values
//get the list of id's from the data list view // //get the list of id's from the data list view
var rowIds = await AyaNova.DataList.DataListFetcher.GetIdListResponseAsync(reportDataParam.DataListKey, reportDataParam.ListView, ct, UserIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items), log); // var rowIds = await AyaNova.DataList.DataListFetcher.GetIdListResponseAsync(reportDataParam.DataListKey, reportDataParam.ListView, ct, UserIdFromContext.Id(HttpContext.Items), UserRolesFromContext.Roles(HttpContext.Items), log);
//now get the report data // //now get the report data
reportData = await biz.GetReportData(reportDataParam.ObjectType, rowIds); // reportData = await biz.GetReportData(reportDataParam.ObjectType, rowIds);
} // }
var reportData=await biz.GetReportData(reportDataParam);
if (reportData == null) if (reportData == null)
return BadRequest(new ApiErrorResponse(biz.Errors)); return BadRequest(new ApiErrorResponse(biz.Errors));
@@ -257,7 +252,7 @@ namespace AyaNova.Api.Controllers
var httpConnectionFeature = HttpContext.Features.Get<IHttpConnectionFeature>(); var httpConnectionFeature = HttpContext.Features.Get<IHttpConnectionFeature>();
var API_URL = $"http://127.0.0.1:{httpConnectionFeature.LocalPort}/api/v8/"; var API_URL = $"http://127.0.0.1:{httpConnectionFeature.LocalPort}/api/v8/";
var result = await biz.RenderReport(reportParam.ReportId, reportParam.ObjectIdArray, API_URL); var result = await biz.RenderReport(reportParam, API_URL);
if (result == null) if (result == null)
return BadRequest(new ApiErrorResponse(biz.Errors)); return BadRequest(new ApiErrorResponse(biz.Errors));
else else
@@ -265,43 +260,39 @@ namespace AyaNova.Api.Controllers
} }
public class RenderReportParameter
{
public long ReportId { get; set; }
public long[] ObjectIdArray { get; set; }
}
[HttpGet("render-test")] // [HttpGet("render-test")]
[AllowAnonymous] // [AllowAnonymous]
public async Task<IActionResult> GetTestReport([FromRoute] string test) // public async Task<IActionResult> GetTestReport([FromRoute] string test)
{ // {
if (!serverState.IsOpen) // if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); // return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
string outputFile = FileUtil.NewRandomTempFilesFolderFileName; // string outputFile = FileUtil.NewRandomTempFilesFolderFileName;
switch (test) // switch (test)
{ // {
case "chrome-reddit-to-pdf": // case "chrome-reddit-to-pdf":
//first test, just render a web page to pdf and return it // //first test, just render a web page to pdf and return it
//return PhysicalFile(filePath, mimetype, dbObject.DisplayFileName); // //return PhysicalFile(filePath, mimetype, dbObject.DisplayFileName);
outputFile += ".pdf"; // outputFile += ".pdf";
//http://www.puppeteersharp.com/api/index.html // //http://www.puppeteersharp.com/api/index.html
//https://github.com/hardkoded/puppeteer-sharp // //https://github.com/hardkoded/puppeteer-sharp
await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); // await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision);
var browser = await Puppeteer.LaunchAsync(new LaunchOptions // var browser = await Puppeteer.LaunchAsync(new LaunchOptions
{ // {
Headless = true // Headless = true
}); // });
var page = await browser.NewPageAsync(); // var page = await browser.NewPageAsync();
await page.GoToAsync("https://github.com/hardkoded/puppeteer-sharp"); // await page.GoToAsync("https://github.com/hardkoded/puppeteer-sharp");
await page.PdfAsync(outputFile); // await page.PdfAsync(outputFile);
return PhysicalFile(outputFile, "application/pdf"); // return PhysicalFile(outputFile, "application/pdf");
} // }
return NotFound(test); // return NotFound(test);
} // }

View File

@@ -13,7 +13,7 @@ namespace AyaNova.DataList
{ {
internal static class DataListFetcher internal static class DataListFetcher
{ {
internal static async Task<ApiDataListResponse> GetResponseAsync(string DataListKey, AyContext ct, ListOptions listOptions, long UserId, AuthorizationRoles UserRoles, ILogger log) internal static async Task<ApiDataListResponse> GetResponseAsync(string DataListKey, AyContext ct, ListOptions listOptions, AuthorizationRoles UserRoles, ILogger log)
{ {
var DataList = DataListFactory.GetAyaDataList(DataListKey); var DataList = DataListFactory.GetAyaDataList(DataListKey);
@@ -53,7 +53,7 @@ namespace AyaNova.DataList
var qOrderBy = string.Empty; var qOrderBy = string.Empty;
//WHERE CLAUSE - FILTER //WHERE CLAUSE - FILTER
qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, ListViewArray, UserId); qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, ListViewArray);
//ORDER BY CLAUSE - SORT //ORDER BY CLAUSE - SORT
//BUILD ORDER BY //BUILD ORDER BY
@@ -202,7 +202,7 @@ namespace AyaNova.DataList
//Get a list of id's for reporting //Get a list of id's for reporting
internal static async Task<long[]> GetIdListResponseAsync(string dataListKey, string listView, AyContext ct, long userId, AuthorizationRoles userRoles, ILogger log) internal static async Task<long[]> GetIdListResponseAsync(string dataListKey, string listView, AyContext ct, AuthorizationRoles userRoles, ILogger log)
{ {
var DataList = DataListFactory.GetAyaDataList(dataListKey); var DataList = DataListFactory.GetAyaDataList(dataListKey);
@@ -242,7 +242,7 @@ namespace AyaNova.DataList
var qOrderBy = string.Empty; var qOrderBy = string.Empty;
//WHERE CLAUSE - FILTER //WHERE CLAUSE - FILTER
qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, ListViewArray, userId); qWhere = DataListSqlFilterCriteriaBuilder.DataFilterToSQLCriteria(DataList.FieldDefinitions, ListViewArray);
//ORDER BY CLAUSE - SORT //ORDER BY CLAUSE - SORT
//BUILD ORDER BY //BUILD ORDER BY
@@ -271,7 +271,7 @@ namespace AyaNova.DataList
while (dr.Read()) while (dr.Read())
{ {
// retList.Add(dr.GetInt64(0)); // retList.Add(dr.GetInt64(0));
// //INSERT REMAINING FIELDS FROM TEMPLATE INTO THE RETURN ROWS LIST // //INSERT REMAINING FIELDS FROM TEMPLATE INTO THE RETURN ROWS LIST
foreach (string TemplateField in ListViewFieldList) foreach (string TemplateField in ListViewFieldList)
{ {
@@ -296,10 +296,10 @@ namespace AyaNova.DataList
{ {
var ordinal = SelectBuild.map[f.SqlIdColumnName]; var ordinal = SelectBuild.map[f.SqlIdColumnName];
if (!await dr.IsDBNullAsync(ordinal)) if (!await dr.IsDBNullAsync(ordinal))
retList.Add(dr.GetInt64(ordinal)); retList.Add(dr.GetInt64(ordinal));
} }
} }
} }
} }
} }

View File

@@ -10,7 +10,7 @@ namespace AyaNova.DataList
{ {
public static class DataListSqlFilterCriteriaBuilder public static class DataListSqlFilterCriteriaBuilder
{ {
public static string DataFilterToSQLCriteria(List<AyaDataListFieldDefinition> objectFieldsList, JArray listViewArray, long userId) public static string DataFilterToSQLCriteria(List<AyaDataListFieldDefinition> objectFieldsList, JArray listViewArray)
{ {
if (listViewArray == null || listViewArray.Count == 0) if (listViewArray == null || listViewArray.Count == 0)
@@ -120,7 +120,7 @@ namespace AyaNova.DataList
} }
//Append this filter's criteria //Append this filter's criteria
sb.Append(DataFilterToColumnCriteria(columnNameToFilter, DataTypeToFilter, opType, val, tagList, userId)); sb.Append(DataFilterToColumnCriteria(columnNameToFilter, DataTypeToFilter, opType, val, tagList));
ThisIsTheFirstFilterItemForThisColumn = false; ThisIsTheFirstFilterItemForThisColumn = false;
@@ -158,7 +158,7 @@ namespace AyaNova.DataList
/// <summary> /// <summary>
/// Translate DataFilter to Postgres friendly SQL criteria /// Translate DataFilter to Postgres friendly SQL criteria
/// </summary> /// </summary>
private static string DataFilterToColumnCriteria(string SqlColumnNameToFilter, UiFieldDataType DataType, string sOperator, string sValue, List<string> sTags, long userId)//, bool IsCompound) private static string DataFilterToColumnCriteria(string SqlColumnNameToFilter, UiFieldDataType DataType, string sOperator, string sValue, List<string> sTags)//, bool IsCompound)
{ {
bool TagFilter = sTags.Count < 0; bool TagFilter = sTags.Count < 0;
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();

View File

@@ -253,20 +253,27 @@ namespace AyaNova.Biz
//REPORT DATA //REPORT DATA
//Data fetched to return to report designer for Client report design usage //Data fetched to return to report designer for Client report design usage
public async Task<Newtonsoft.Json.Linq.JArray> GetReportData(AyaType objectType, long[] objectidarray) public async Task<Newtonsoft.Json.Linq.JArray> GetReportData(ObjectReportDataParameter reportDataParam, AuthorizationRoles overrideRoles = AuthorizationRoles.NoRole)
{ {
var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::GetReportData"); var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::GetReportData");
AuthorizationRoles effectiveRoles = CurrentUserRoles; AuthorizationRoles effectiveRoles = CurrentUserRoles;
if (!AyaNova.Api.ControllerHelpers.Authorized.HasReadFullRole(effectiveRoles, objectType)) if (overrideRoles != AuthorizationRoles.NoRole)
effectiveRoles = overrideRoles;
if (!AyaNova.Api.ControllerHelpers.Authorized.HasReadFullRole(effectiveRoles, reportDataParam.ObjectType))
{ {
AddError(ApiErrorCode.NOT_AUTHORIZED, null, $"User not authorized for {objectType} type object"); AddError(ApiErrorCode.NOT_AUTHORIZED, null, $"User not authorized for {reportDataParam.ObjectType} type object");
return null; return null;
} }
//Get data
log.LogDebug($"Instantiating biz object handler for {objectType}"); //Do we need to rehydrate the ID List from a DataList?
var biz = BizObjectFactory.GetBizObject(objectType, ct); if (reportDataParam.SelectedRowIds.Length == 0)
log.LogDebug($"Fetching data for {objectidarray.Length} {objectType} items"); reportDataParam.SelectedRowIds = await AyaNova.DataList.DataListFetcher.GetIdListResponseAsync(reportDataParam.DataListKey, reportDataParam.ListView, ct, effectiveRoles, log);
return await ((IReportAbleObject)biz).GetReportData(objectidarray);
log.LogDebug($"Instantiating biz object handler for {reportDataParam.ObjectType}");
var biz = BizObjectFactory.GetBizObject(reportDataParam.ObjectType, ct);
log.LogDebug($"Fetching data for {reportDataParam.SelectedRowIds.Length} {reportDataParam.ObjectType} items");
return await ((IReportAbleObject)biz).GetReportData(reportDataParam.SelectedRowIds);
} }
@@ -279,12 +286,12 @@ namespace AyaNova.Biz
so the route just calls the biz object which handles processing, getting data, checking rights and then making the report and either attaching it to an email (maybe I do need that temp server folder after all) so the route just calls the biz object which handles processing, getting data, checking rights and then making the report and either attaching it to an email (maybe I do need that temp server folder after all)
or return to route to return to Client end or return to route to return to Client end
*/ */
public async Task<RenderedReport> RenderReport(long id, long[] objectidarray, string apiUrl, long overrideUserId = 0) public async Task<RenderedReport> RenderReport(RenderReportParameter reportParam, string apiUrl, AuthorizationRoles overrideRoles = AuthorizationRoles.NoRole)
{ {
var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::RenderReport"); var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::RenderReport");
//get report, vet security, see what we need before init in case of issue //get report, vet security, see what we need before init in case of issue
var report = await ct.Report.FirstOrDefaultAsync(z => z.Id == id); var report = await ct.Report.FirstOrDefaultAsync(z => z.Id == reportParam.ReportId);
if (report == null) if (report == null)
{ {
AddError(ApiErrorCode.NOT_FOUND, "id"); AddError(ApiErrorCode.NOT_FOUND, "id");
@@ -292,18 +299,9 @@ namespace AyaNova.Biz
} }
AuthorizationRoles effectiveRoles = CurrentUserRoles; AuthorizationRoles effectiveRoles = CurrentUserRoles;
if (overrideUserId != 0) if (overrideRoles != AuthorizationRoles.NoRole)
{ effectiveRoles = overrideRoles;
var effectiveUser = await ct.User.FirstOrDefaultAsync(z => z.Id == overrideUserId);
if (effectiveUser == null)
{
var msg = $"Override user id specifies user that doesn't exist({overrideUserId}) cannot generate report {report.Name}";
log.LogError(msg);
AddError(ApiErrorCode.NOT_FOUND, "UserId", msg);
return null;
}
effectiveRoles = effectiveUser.Roles;
}
if (!AyaNova.Api.ControllerHelpers.Authorized.HasReadFullRole(effectiveRoles, report.ObjectType)) if (!AyaNova.Api.ControllerHelpers.Authorized.HasReadFullRole(effectiveRoles, report.ObjectType))
{ {
@@ -313,10 +311,7 @@ namespace AyaNova.Biz
//Get data //Get data
log.LogDebug($"Instantiating biz object handler for {report.ObjectType}"); var ReportData = await GetReportData(new ObjectReportDataParameter() { ObjectType = report.ObjectType, SelectedRowIds = reportParam.SelectedRowIds, DataListKey = reportParam.DataListKey, ListView = reportParam.ListView });
var biz = BizObjectFactory.GetBizObject(report.ObjectType, ct);
log.LogDebug($"Fetching data for {objectidarray.Length} {report.ObjectType} items");
var data = (await ((IReportAbleObject)biz).GetReportData(objectidarray)).ToString();
//initialization //initialization
log.LogDebug("Initializing report system"); log.LogDebug("Initializing report system");
@@ -359,7 +354,7 @@ namespace AyaNova.Biz
//TODO: CUSTOM HELPERS //TODO: CUSTOM HELPERS
//compile and run handlebars template //compile and run handlebars template
var compileScript = $"let reportData=ayPreRender({data});Handlebars.compile({report.Template})(reportData);"; var compileScript = $"let reportData=ayPreRender({ReportData});Handlebars.compile({report.Template})(reportData);";
var resultHTML = await page.EvaluateExpressionAsync<string>(compileScript); var resultHTML = await page.EvaluateExpressionAsync<string>(compileScript);
//render report as HTML //render report as HTML

View File

@@ -0,0 +1,20 @@
using AyaNova.Biz;
namespace AyaNova.Models
{
public class ObjectReportDataParameter
{
public AyaType ObjectType { get; set; }
public long[] SelectedRowIds { get; set; }
public string DataListKey { get; set; }
public string ListView { get; set; }//optional, if null or empty will use default list view built into DataList
}
public class RenderReportParameter
{
public long ReportId { get; set; }
public long[] SelectedRowIds { get; set; }
public string DataListKey { get; set; }
public string ListView { get; set; }//optional, if null or empty will use default list view built into DataList
}
}