using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; using Microsoft.EntityFrameworkCore; using System.Linq; using Sockeye.Models; using Sockeye.Biz; using Sockeye.Api.ControllerHelpers; using System.ComponentModel.DataAnnotations; namespace Sockeye.Api.Controllers { [ApiController] [ApiVersion("8.0")] //[ApiExplorerSettings(IgnoreApi = true)] [Route("subscription-server-trial-request")]//SUBSCRIPTION SERVER TRIAL REQUEST HANDLER ROUTE [Produces("application/json")] public class SubscriptionServerTrialRequestController : ControllerBase { private readonly AyContext ct; private readonly ILogger log; private readonly ApiServerState serverState; /// /// ctor /// /// /// /// public SubscriptionServerTrialRequestController(AyContext dbcontext, ILogger logger, ApiServerState apiServerState) { ct = dbcontext; log = logger; serverState = apiServerState; } public class dtoSubscriptionServerTrialRequest { [Required] public string DataCenter { get; set; } [Required, EmailAddress] public string Email { get; set; } [Required] public string Company { get; set; } [Required] public string Name { get; set; } [Required] public string RValue { get; set; } } //######################################################### //REQUEST ROUTE CALLED FROM CONTACT FORMS APP //######################################################### [HttpPost] public async Task Post([FromBody] dtoSubscriptionServerTrialRequest r) { if (!serverState.IsOpen) return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason)); if (!ModelState.IsValid) { return BadRequest(ModelState); } if (r.RValue != "totallylegit") { return BadRequest(); } //Already a pending request? if (await ct.SubscriptionServer.Where(z => z.ServerState == ServerState.Requested && z.TrialEmail == r.Email).AnyAsync()) { return Ok("Request awaiting approval"); } //can't do this if there is an active server already in action if (await ct.SubscriptionServer.Where(z => (z.ServerState != ServerState.Destroyed) && z.TrialEmail == r.Email).AnyAsync()) { return BadRequest("E1000 - Can't trial; there is already an active server for this email address"); } /* new SelectListItem { Value = "SF", Text = "San Francisco" }, new SelectListItem { Value = "NY", Text = "New York" }, new SelectListItem { Value = "TOR", Text = "Toronto" }, new SelectListItem { Value = "AMS", Text = "Amsterdam" }, new SelectListItem { Value = "LON", Text = "London" }, new SelectListItem { Value = "FFT", Text = "Frankfurt" }, new SelectListItem { Value = "SNG", Text = "Singapore" }, new SelectListItem { Value = "BNG", Text = "Bangalore" }, new SelectListItem { Value = "SYD", Text = "Sydney Australia" } */ //Everything seems to be in order, save the request and return ok var newObject = new SubscriptionServer(); switch (r.DataCenter) { case "SF": newObject.TimeZone = "America/Los_Angeles"; break; case "NY": newObject.TimeZone = "America/New_York"; break; case "TOR": newObject.TimeZone = "America/Toronto"; break; case "AMS": newObject.TimeZone = "Europe/Amsterdam"; break; case "LON": newObject.TimeZone = "Europe/London"; break; case "FFT": newObject.TimeZone = "Europe/Berlin"; break; case "SNG": newObject.TimeZone = "Asia/Singapore"; break; case "BNG": newObject.TimeZone = "Asia/Kolkata"; break; case "SYD": newObject.TimeZone = "Australia/Sydney"; break; } newObject.Name = "XXX.onayanova.com"; newObject.ServerState = ServerState.Requested; newObject.SubscriptionExpire = System.DateTime.UtcNow.AddDays(8); newObject.Trial = true; newObject.DataCenter = r.DataCenter; newObject.TrialCompany = r.Company; newObject.TrialContact = r.Name; newObject.TrialEmail = r.Email; SubscriptionServerBiz biz = SubscriptionServerBiz.GetBiz(ct); SubscriptionServer o = await biz.CreateAsync(newObject); if (o == null) { var msg = ($"Unexpected error (code SE-555 was returned to customer) processing a new trial license request:{biz.GetErrorsAsString}"); log.LogError(msg); await NotifyEventHelper.AddOpsProblemEvent(msg); return BadRequest($"E1000 - Error processing request code SE-555 contact support");//don't want to leak any info so need to check sockeye log if get this error } else return Accepted(); } //------------ }//eoc }//eons