diff --git a/server/AyaNova/Controllers/ReportController.cs b/server/AyaNova/Controllers/ReportController.cs
index 8d964869..9af29403 100644
--- a/server/AyaNova/Controllers/ReportController.cs
+++ b/server/AyaNova/Controllers/ReportController.cs
@@ -158,6 +158,39 @@ namespace AyaNova.Api.Controllers
+
+
+
+//======================================================================================================
+ ///
+ /// Render Report
+ ///
+ ///
+ /// From route path
+ ///
+ [HttpPost("render")]
+ public async Task RenderReport([FromBody] long reportId, long[] objectIdArray, ApiVersion apiVersion)
+ {
+ if (!serverState.IsOpen)
+ return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
+ ReportBiz biz = ReportBiz.GetBiz(ct, HttpContext);
+ if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType))
+ return StatusCode(403, new ApiNotAuthorizedResponse());
+ if (!ModelState.IsValid)
+ return BadRequest(new ApiErrorResponse(ModelState));
+
+ var httpConnectionFeature = HttpContext.Features.Get();
+ var API_URL = $"http://127.0.0.1:{httpConnectionFeature.LocalPort}/api/v8/";
+
+ var result = await biz.RenderReport(reportId,objectIdArray,API_URL);
+ if (result == null)
+ return BadRequest(new ApiErrorResponse(biz.Errors));
+ else
+ return new FileContentResult(result.RenderedOutput,result.MimeType);
+
+ }
+
+
[HttpGet("render-test")]
[AllowAnonymous]
public async Task GetTestReport([FromRoute] string test)
diff --git a/server/AyaNova/biz/ReportBiz.cs b/server/AyaNova/biz/ReportBiz.cs
index 1dc4e231..5d08b67f 100644
--- a/server/AyaNova/biz/ReportBiz.cs
+++ b/server/AyaNova/biz/ReportBiz.cs
@@ -233,14 +233,37 @@ 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)
or return to route to return to Client end
*/
- public async Task RenderReport(long reportId, long[] objectidarray, string apiUrl)
+ public async Task RenderReport(long id, long[] objectidarray, string apiUrl, long overrideUserId = 0)
{
+ var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::RenderReport");
//get report, vet security, see what we need before init in case of issue
+ var report = await ct.Report.FirstOrDefaultAsync(z => z.Id == id);
+ if (report == null)
+ {
+ AddError(ApiErrorCode.NOT_FOUND, "id");
+ return null;
+ }
+
+ AuthorizationRoles effectiveRoles = CurrentUserRoles;
+ if (overrideUserId != 0)
+ {
+ 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;
+ }
+
+
//initialization
- var log = AyaNova.Util.ApplicationLogging.CreateLogger("ReportBiz::RenderReport");
+
log.LogDebug("Initializing report system");
var ReportJSFolderPath = Path.Combine(ServerBootConfig.AYANOVA_CONTENT_ROOT_PATH, "resource", "rpt");
var lo = new LaunchOptions { Headless = true };
@@ -302,6 +325,16 @@ namespace AyaNova.Biz
return null;
}
+ public class RenderedReport
+ {
+ public string MimeType { get; set; }
+ public byte[] RenderedOutput { get; set; }
+ public RenderedReport()
+ {
+ MimeType = "application/pdf";
+ RenderedOutput = null;
+ }
+ }
////////////////////////////////////////////////////////////////////////////////////////////////