Files
raven/server/AyaNova/Controllers/CustomerController.cs
2022-03-09 19:04:17 +00:00

222 lines
12 KiB
C#

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 Microsoft.EntityFrameworkCore;
using System.Linq;
using AyaNova.Models;
using AyaNova.Api.ControllerHelpers;
using AyaNova.Biz;
namespace AyaNova.Api.Controllers
{
[ApiController]
[ApiVersion("8.0")]
[Route("api/v{version:apiVersion}/customer")]
[Produces("application/json")]
[Authorize]
public class CustomerController : ControllerBase
{
private readonly AyContext ct;
private readonly ILogger<CustomerController> log;
private readonly ApiServerState serverState;
/// <summary>
/// ctor
/// </summary>
/// <param name="dbcontext"></param>
/// <param name="logger"></param>
/// <param name="apiServerState"></param>
public CustomerController(AyContext dbcontext, ILogger<CustomerController> logger, ApiServerState apiServerState)
{
ct = dbcontext;
log = logger;
serverState = apiServerState;
}
/// <summary>
/// Create Customer
/// </summary>
/// <param name="newObject"></param>
/// <param name="apiVersion">From route path</param>
/// <returns></returns>
[HttpPost]
public async Task<IActionResult> PostCustomer([FromBody] Customer newObject, ApiVersion apiVersion)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
CustomerBiz biz = CustomerBiz.GetBiz(ct, HttpContext);
if (!Authorized.HasCreateRole(HttpContext.Items, biz.BizType))
return StatusCode(403, new ApiNotAuthorizedResponse());
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
Customer o = await biz.CreateAsync(newObject);
if (o == null)
return BadRequest(new ApiErrorResponse(biz.Errors));
else
return CreatedAtAction(nameof(CustomerController.GetCustomer), new { id = o.Id, version = apiVersion.ToString() }, new ApiCreatedResponse(o));
}
/// <summary>
/// Get Customer
/// </summary>
/// <param name="id"></param>
/// <returns>Customer</returns>
[HttpGet("{id}")]
public async Task<IActionResult> GetCustomer([FromRoute] long id)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
CustomerBiz biz = CustomerBiz.GetBiz(ct, HttpContext);
if (!Authorized.HasReadFullRole(HttpContext.Items, biz.BizType))
return StatusCode(403, new ApiNotAuthorizedResponse());
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
var o = await biz.GetAsync(id);
if (o == null) return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
await NotifyEventHelper.AddGeneralNotifyEvent(NotifyEventType.GeneralNotification, @" Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ullamcorper lectus nibh, vitae commodo enim vulputate tincidunt. In euismod posuere ante a consectetur. Ut at odio mauris. Nullam auctor nisi nibh, nec eleifend elit ultricies non. Proin pharetra, mi vel lobortis egestas, lectus leo commodo lorem, placerat dictum est ligula in augue. In in eros consectetur, scelerisque massa non, commodo ex. Integer varius libero eu ex blandit sollicitudin. Integer a tincidunt erat, ac maximus ligula. Nulla ac cursus ex. In hendrerit tortor at sem dictum euismod. Nam eu lacus vel massa sodales auctor. Morbi ullamcorper viverra molestie. Phasellus a turpis ac tellus scelerisque bibendum.
Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Nunc eget pharetra erat. Proin et consequat mi, quis eleifend leo. Duis vehicula nisl ipsum, ac viverra elit sodales sed. Suspendisse eu velit lobortis, iaculis nibh quis, pretium leo. Morbi accumsan sit amet magna quis dictum. Vestibulum fringilla felis vitae metus condimentum, ac aliquet massa consequat. Cras cursus non tellus at tincidunt.
Etiam id ornare nunc. Praesent porttitor aliquet velit a fringilla. Aenean malesuada ex ac elit semper imperdiet. Praesent pharetra vehicula nisl, aliquet aliquet neque rhoncus ac. Nunc convallis eget nibh ut laoreet. Cras finibus fermentum aliquet. Donec vel ipsum et augue volutpat malesuada vulputate et orci. Fusce nec leo mauris. Integer fringilla dolor eu enim sodales, id ornare lectus congue. Vestibulum nisi ligula, maximus et sapien vel, ultricies sagittis massa. Quisque felis eros, pulvinar non massa eu, lacinia accumsan erat. In facilisis neque et ultricies imperdiet. Cras eleifend quis nunc sit amet tristique. Mauris dignissim gravida lacus, vel euismod arcu imperdiet a. Quisque egestas id erat ut ornare. ", "Error", null, 1);
return Ok(ApiOkResponse.Response(o));
}
/// <summary>
/// Update Customer
/// </summary>
/// <param name="updatedObject"></param>
/// <returns></returns>
[HttpPut]
public async Task<IActionResult> PutCustomer([FromBody] Customer updatedObject)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
CustomerBiz biz = CustomerBiz.GetBiz(ct, HttpContext);
if (!Authorized.HasModifyRole(HttpContext.Items, biz.BizType))
return StatusCode(403, new ApiNotAuthorizedResponse());
var o = await biz.PutAsync(updatedObject);
if (o == null)
{
if (biz.Errors.Exists(z => z.Code == ApiErrorCode.CONCURRENCY_CONFLICT))
return StatusCode(409, new ApiErrorResponse(biz.Errors));
else
return BadRequest(new ApiErrorResponse(biz.Errors));
}
return Ok(ApiOkResponse.Response(new { Concurrency = o.Concurrency })); ;
}
/// <summary>
/// Delete Customer
/// </summary>
/// <param name="id"></param>
/// <returns>NoContent</returns>
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteCustomer([FromRoute] long id)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
CustomerBiz biz = CustomerBiz.GetBiz(ct, HttpContext);
if (!Authorized.HasDeleteRole(HttpContext.Items, biz.BizType))
return StatusCode(403, new ApiNotAuthorizedResponse());
if (!await biz.DeleteAsync(id))
return BadRequest(new ApiErrorResponse(biz.Errors));
return NoContent();
}
/// <summary>
/// Get Alert notes for this customer
/// </summary>
/// <param name="id"></param>
/// <returns>Alert notes or null</returns>
[HttpGet("alert/{id}")]
public async Task<IActionResult> GetCustomerAlert([FromRoute] long id)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Customer))
return StatusCode(403, new ApiNotAuthorizedResponse());
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
return Ok(ApiOkResponse.Response(await ct.Customer.AsNoTracking().Where(x => x.Id == id).Select(x => x.AlertNotes).FirstOrDefaultAsync()));
}
/// <summary>
/// Get addresses of interest for Customer id provided
/// (postal, physical, headoffice postal if billheadoffice=true)
/// </summary>
/// <param name="id"></param>
/// <returns>Multiple addresses</returns>
[HttpGet("address/{id}")]
public async Task<IActionResult> GetCustomerBillToAddress([FromRoute] long id)
{
if (!serverState.IsOpen)
return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Customer))
return StatusCode(403, new ApiNotAuthorizedResponse());
if (!ModelState.IsValid)
return BadRequest(new ApiErrorResponse(ModelState));
var cust = await ct.Customer.AsNoTracking().Where(x => x.Id == id).FirstOrDefaultAsync();
if (cust == null)
return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
HeadOffice head = null;
if (cust.BillHeadOffice == true && cust.HeadOfficeId != null)
head = await ct.HeadOffice.AsNoTracking().Where(x => x.Id == cust.HeadOfficeId).FirstOrDefaultAsync();
return Ok(ApiOkResponse.Response(new
{
customerpost = new PostalAddressRecord(cust.Name, cust.PostAddress, cust.PostCity, cust.PostRegion, cust.PostCountry, cust.PostCode),
customerphys = new AddressRecord(cust.Name, cust.Address, cust.City, cust.Region, cust.Country, cust.Latitude, cust.Longitude),
headofficepost = (head != null ? new PostalAddressRecord(head.Name, head.PostAddress, head.PostCity, head.PostRegion, head.PostCountry, head.PostCode) : new PostalAddressRecord("", "", "", "", "", ""))
}));
}
// /// <summary>
// /// Get service (physical) address for this customer
// /// </summary>
// /// <param name="id"></param>
// /// <returns>Service address</returns>
// [HttpGet("service-address/{id}")]
// public async Task<IActionResult> GetCustomerServiceAddress([FromRoute] long id)
// {
// if (!serverState.IsOpen)
// return StatusCode(503, new ApiErrorResponse(serverState.ApiErrorCode, null, serverState.Reason));
// if (!Authorized.HasReadFullRole(HttpContext.Items, AyaType.Customer))
// return StatusCode(403, new ApiNotAuthorizedResponse());
// if (!ModelState.IsValid)
// return BadRequest(new ApiErrorResponse(ModelState));
// var cust = await ct.Customer.AsNoTracking().Where(x => x.Id == id).FirstOrDefaultAsync();
// if (cust == null)
// return NotFound(new ApiErrorResponse(ApiErrorCode.NOT_FOUND));
// return Ok(ApiOkResponse.Response(new
// {
// customer = new AddressRecord(cust.Address, cust.City, cust.Region, cust.Country, cust.Latitude, cust.Longitude)
// }));
// }
//------------
}//eoc
// internal record PostalAddressRecord(string PostAddress, string PostCity, string PostRegion, string PostCountry, string PostCode);
// internal record AddressRecord(string Address, string City, string Region, string Country, decimal? Latitude, decimal? Longitude);
}//eons