yavsc/Yavsc/ApiControllers/PdfEstimateController.cs

179 lines
7.1 KiB
C#
Raw Normal View History

2016-11-07 19:34:56 +01:00
using System.IO;
using Microsoft.AspNet.Authorization;
using Microsoft.AspNet.Mvc;
2016-11-09 14:03:57 +01:00
using System.Web.Routing;
2016-11-07 19:34:56 +01:00
namespace Yavsc.ApiControllers
{
2016-11-09 14:03:57 +01:00
using Models;
using Helpers;
using System.Linq;
using Microsoft.Data.Entity;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using System;
using System.Security.Claims;
using Microsoft.Extensions.Localization;
using Yavsc.Services;
using Yavsc.Models.Messaging;
2017-01-19 12:59:49 +01:00
using Yavsc.ViewModels;
2017-03-05 20:29:02 +01:00
using Microsoft.Extensions.OptionsModel;
2016-11-09 14:03:57 +01:00
2016-11-07 19:34:56 +01:00
[Route("api/pdfestimate"), Authorize]
public class PdfEstimateController : Controller
{
2016-11-09 14:03:57 +01:00
ApplicationDbContext dbContext;
private IStringLocalizer _localizer;
private GoogleAuthSettings _googleSettings;
private IGoogleCloudMessageSender _GCMSender;
private IAuthorizationService authorizationService;
2016-11-09 14:03:57 +01:00
private ILogger logger;
2016-11-09 14:03:57 +01:00
public PdfEstimateController(
IAuthorizationService authorizationService,
ILoggerFactory loggerFactory,
2017-02-22 22:56:03 +01:00
IStringLocalizer<Yavsc.Resources.YavscLocalisation> SR,
2017-03-05 20:29:02 +01:00
ApplicationDbContext context,
IOptions<GoogleAuthSettings> googleSettings,
IGoogleCloudMessageSender GCMSender
)
2016-11-09 14:03:57 +01:00
{
2017-03-05 20:29:02 +01:00
_googleSettings=googleSettings.Value;
this.authorizationService = authorizationService;
2016-11-09 14:03:57 +01:00
dbContext = context;
logger = loggerFactory.CreateLogger<PdfEstimateController>();
2017-02-22 22:56:03 +01:00
this._localizer = SR;
2017-03-05 20:29:02 +01:00
_GCMSender=GCMSender;
2016-11-09 14:03:57 +01:00
}
[HttpGet("get/{id}", Name = "Get"), Authorize]
public async Task<IActionResult> Get(long id)
2016-11-07 19:34:56 +01:00
{
var estimate = dbContext.Estimates.Include(
e=>e.Query
).FirstOrDefault(e=>e.Id == id);
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
2016-11-07 19:34:56 +01:00
{
return new ChallengeResult();
}
var filename = $"estimate-{id}.pdf";
2016-11-09 14:03:57 +01:00
FileInfo fi = new FileInfo(Path.Combine(Startup.UserBillsDirName, filename));
if (!fi.Exists) return Ok(new { Error = "Not generated" });
return File(fi.OpenRead(), "application/x-pdf", filename); ;
}
[HttpGet("estimate-{id}.tex", Name = "GetTex"), Authorize]
public async Task<IActionResult> GetTex(long id)
2016-11-09 14:03:57 +01:00
{
var estimate = dbContext.Estimates.Include(
e=>e.Query
).FirstOrDefault(e=>e.Id == id);
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
2016-11-09 14:03:57 +01:00
Response.ContentType = "text/x-tex";
2016-11-30 11:01:22 +01:00
return ViewComponent("Estimate",new object[] { id, "LaTeX" });
2016-11-09 14:03:57 +01:00
}
[HttpPost("gen/{id}")]
public async Task<IActionResult> GeneratePdf(long id)
2016-11-09 14:03:57 +01:00
{
var estimate = dbContext.Estimates.Include(
e=>e.Query
).FirstOrDefault(e=>e.Id == id);
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
2016-11-30 11:01:22 +01:00
return ViewComponent("Estimate",new object[] { id, "Pdf" } );
2016-11-07 19:34:56 +01:00
}
[HttpPost("prosign/{id}")]
public async Task<IActionResult> ProSign(long id)
{
2017-02-22 22:56:03 +01:00
var estimate = dbContext.Estimates.
Include(e=>e.Client).Include(e=>e.Client.Devices)
.Include(e=>e.Bill).Include(e=>e.Owner).Include(e=>e.Owner.Performer)
.FirstOrDefault(e=>e.Id == id);
if (estimate == null)
return new BadRequestResult();
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
if (Request.Form.Files.Count!=1)
return new BadRequestResult();
User.ReceiveProSignature(id,Request.Form.Files[0],"pro");
estimate.ProviderValidationDate = DateTime.Now;
2017-02-23 03:10:30 +01:00
dbContext.SaveChanges(User.GetUserId());
// Notify the client
2017-02-22 22:56:03 +01:00
var locstr = _localizer["EstimationMessageToClient"];
var yaev = new EstimationEvent(dbContext,estimate,_localizer);
2017-02-22 22:56:03 +01:00
var regids = estimate.Client.Devices.Select(d => d.GCMRegistrationId).ToArray();
bool gcmSent = false;
if (regids.Length>0) {
var grep = await _GCMSender.NotifyEstimateAsync(_googleSettings,regids,yaev);
gcmSent = grep.success>0;
}
return Ok (new { ProviderValidationDate = estimate.ProviderValidationDate, GCMSent = gcmSent });
}
[HttpGet("prosign/{id}")]
public async Task<IActionResult> GetProSign(long id)
{
// For authorization purpose
var estimate = dbContext.Estimates.FirstOrDefault(e=>e.Id == id);
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
var filename = FileSystemHelpers.SignFileNameFormat("pro",id);
FileInfo fi = new FileInfo(Path.Combine(Startup.UserBillsDirName, filename));
if (!fi.Exists) return HttpNotFound(new { Error = "Professional signature not found" });
return File(fi.OpenRead(), "application/x-pdf", filename); ;
}
[HttpPost("clisign/{id}")]
public async Task<IActionResult> CliSign(long id)
{
var uid = User.GetUserId();
var estimate = dbContext.Estimates.Include( e=>e.Query
2017-02-22 22:56:03 +01:00
).Include(e=>e.Owner).Include(e=>e.Owner.Performer).Include(e=>e.Client)
.FirstOrDefault( e=> e.Id == id && e.Query.ClientId == uid );
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
if (Request.Form.Files.Count!=1)
return new BadRequestResult();
User.ReceiveProSignature(id,Request.Form.Files[0],"cli");
estimate.ClientValidationDate = DateTime.Now;
2017-02-23 03:10:30 +01:00
dbContext.SaveChanges(User.GetUserId());
return Ok (new { ClientValidationDate = estimate.ClientValidationDate });
}
[HttpGet("clisign/{id}")]
public async Task<IActionResult> GetCliSign(long id)
{
// For authorization purpose
var estimate = dbContext.Estimates.FirstOrDefault(e=>e.Id == id);
if (!await authorizationService.AuthorizeAsync(User, estimate, new ViewRequirement()))
{
return new ChallengeResult();
}
var filename = FileSystemHelpers.SignFileNameFormat("pro",id);
FileInfo fi = new FileInfo(Path.Combine(Startup.UserBillsDirName, filename));
if (!fi.Exists) return HttpNotFound(new { Error = "Professional signature not found" });
return File(fi.OpenRead(), "application/x-pdf", filename); ;
}
2016-11-07 19:34:56 +01:00
}
}