using System.Threading.Tasks; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.AspNetCore.Authorization; using Microsoft.Extensions.Logging; using AyaNova.Models; using AyaNova.Api.ControllerHelpers; using AyaNova.Biz; using AyaNova.Util; using PuppeteerSharp; namespace AyaNova.Api.Controllers { [ApiController] [ApiVersion("8.0")] [Route("api/v{version:apiVersion}/report")] [Produces("application/json")] [Authorize] public class ReportController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; /// /// ctor /// /// /// /// public ReportController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; serverState = apiServerState; } [HttpGet("render/{test}")] [AllowAnonymous] public async Task GetTestReport([FromRoute] string test) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); string outputFile = FileUtil.NewRandomTempFilesFolderFileName; switch (test) { case "chrome-reddit-to-pdf": //first test, just render a web page to pdf and return it //return PhysicalFile(filePath, mimetype, dbObject.DisplayFileName); outputFile += ".pdf"; //http://www.puppeteersharp.com/api/index.html //https://github.com/hardkoded/puppeteer-sharp await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); var page = await browser.NewPageAsync(); await page.GoToAsync("https://github.com/hardkoded/puppeteer-sharp"); await page.PdfAsync(outputFile); return PhysicalFile(outputFile, "application/pdf"); } return NotFound(test); } [HttpGet("render/pdf/{url}")] [AllowAnonymous] public async Task GetUrlPdfReport([FromRoute] string url) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); string outputFile = FileUtil.NewRandomTempFilesFolderFileName; //first test, just render a web page to pdf and return it //return PhysicalFile(filePath, mimetype, dbObject.DisplayFileName); outputFile += ".pdf"; //http://www.puppeteersharp.com/api/index.html //https://github.com/hardkoded/puppeteer-sharp await new BrowserFetcher().DownloadAsync(BrowserFetcher.DefaultRevision); var browser = await Puppeteer.LaunchAsync(new LaunchOptions { Headless = true }); var page = await browser.NewPageAsync(); await page.GoToAsync(url); await page.PdfAsync(outputFile); return PhysicalFile(outputFile, "application/pdf"); } //------------ /* NOTES/TODO during testing Need job to automatically erase any temp files older than 5 minutes (or whatever) */ }//eoc }//eons