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; + } + } ////////////////////////////////////////////////////////////////////////////////////////////////