This commit is contained in:
2020-08-26 21:50:10 +00:00
parent 795c5893cf
commit 915076aea7
2 changed files with 68 additions and 2 deletions

View File

@@ -158,6 +158,39 @@ namespace AyaNova.Api.Controllers
//======================================================================================================
/// <summary>
/// Render Report
/// </summary>
/// <param name="reportId"></param>
/// <param name="apiVersion">From route path</param>
/// <returns></returns>
[HttpPost("render")]
public async Task<IActionResult> 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<IHttpConnectionFeature>();
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<IActionResult> GetTestReport([FromRoute] string test)

View File

@@ -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<byte[]> RenderReport(long reportId, long[] objectidarray, string apiUrl)
public async Task<RenderedReport> 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;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////