| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- using BulkPrintingAPI.Pagination;
- using MAX.Models;
- using Microsoft.AspNetCore.Mvc;
- using System;
- using System.Collections.Generic;
- using System.ComponentModel.DataAnnotations;
- using System.Linq;
- using System.Threading.Tasks;
- namespace BulkPrintingAPI.Controllers
- {
- [Produces("application/json")]
- [Route("api/[controller]")]
- public class VendorEventsController : Controller
- {
- private readonly MAXContext _context;
- public class RemoteVendorEvent
- {
- [Required]
- public int? Id { get; set; }
- [Required]
- public int? VendorId { get; set; }
- [Required]
- public int? UserId { get; set; }
- public int? VoucherId { get; set; }
- [Required]
- public DateTimeOffset? EventDate { get; set; }
- [Required]
- public VendorEvent.VendorEventType? EventType { get; set; }
- public bool Retry { get; set; }
- }
- public VendorEventsController(MAXContext context)
- {
- _context = context;
- }
- [HttpGet]
- public async Task<Page<VendorEvent>> GetVendorEventsAsync([FromQuery] int page = 1,
- [FromQuery] int pageSize = 100)
- {
- var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
- return await Page<VendorEvent>.GetPageAsync(
- VendorEventsForVendor(credentials.Vendor.Id).OrderByDescending(e => e.EventDate),
- page, pageSize);
- }
- [HttpPost]
- public async Task<IActionResult> PostRemoteVendorEventsAsync([FromBody] List<RemoteVendorEvent> remoteVendorEvents)
- {
- if (! ModelState.IsValid)
- {
- return BadRequest(ModelState);
- }
- var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
- var vendorId = credentials.Vendor.Id;
- var lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId;
- var maxRemoteId = lastVendorEventRemoteId;
- foreach (var remoteEvent in remoteVendorEvents)
- {
- if (vendorId != remoteEvent.VendorId)
- {
- return BadRequest(new { error = "Vendor ID mismatch" });
- }
- if (lastVendorEventRemoteId.HasValue && (lastVendorEventRemoteId.Value >= remoteEvent.Id.Value))
- {
- return BadRequest(new { error = "A supplied ID value is less than or equal to lastVendorRemoteId" });
- }
- if (! maxRemoteId.HasValue || (remoteEvent.Id.Value > maxRemoteId.Value))
- {
- maxRemoteId = remoteEvent.Id.Value;
- }
- _context.VendorEvents.Add(new VendorEvent()
- {
- RemoteId = remoteEvent.Id.Value,
- UserId = remoteEvent.UserId.Value,
- VendorId = remoteEvent.VendorId.Value,
- VoucherId = remoteEvent.VoucherId,
- EventType = remoteEvent.EventType.Value,
- EventDate = remoteEvent.EventDate.Value.ToUniversalTime(),
- Retry = remoteEvent.Retry
- });
- }
- // FIXME: race condition for simultaneous requests, although we should never have any from the same vendor
- credentials.Vendor.LastVendorEventRemoteId = maxRemoteId;
- await _context.SaveChangesAsync();
- return Ok(new
- {
- lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId
- });
- }
- [HttpGet("meta")]
- public async Task<IActionResult> GetVendorEventMetadata()
- {
- var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
- return Ok(new
- {
- date = DateTimeOffset.UtcNow,
- vendorId = credentials.Vendor.Id,
- lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId
- });
- }
- private IQueryable<VendorEvent> VendorEventsForVendor(int vendorId)
- {
- return _context.VendorEvents.Where(e => e.VendorId == vendorId);
- }
- }
- }
|