Web API for the bulk printing desktop application.

VendorEventsController.cs 4.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. using BulkPrintingAPI.Pagination;
  2. using MAX.Models;
  3. using Microsoft.AspNetCore.Mvc;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.ComponentModel.DataAnnotations;
  7. using System.Linq;
  8. using System.Threading.Tasks;
  9. namespace BulkPrintingAPI.Controllers
  10. {
  11. [Produces("application/json")]
  12. [Route("api/[controller]")]
  13. public class VendorEventsController : Controller
  14. {
  15. private readonly MAXContext _context;
  16. public class RemoteVendorEvent
  17. {
  18. [Required]
  19. public int? Id { get; set; }
  20. [Required]
  21. public int? VendorId { get; set; }
  22. [Required]
  23. public int? UserId { get; set; }
  24. public int? VoucherId { get; set; }
  25. [Required]
  26. public DateTimeOffset? EventDate { get; set; }
  27. [Required]
  28. public VendorEvent.VendorEventType? EventType { get; set; }
  29. public bool Retry { get; set; }
  30. }
  31. public VendorEventsController(MAXContext context)
  32. {
  33. _context = context;
  34. }
  35. [HttpGet]
  36. public async Task<Page<VendorEvent>> GetVendorEventsAsync([FromQuery] int page = 1,
  37. [FromQuery] int pageSize = 100)
  38. {
  39. var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
  40. return await Page<VendorEvent>.GetPageAsync(
  41. VendorEventsForVendor(credentials.Vendor.Id).OrderByDescending(e => e.EventDate),
  42. page, pageSize);
  43. }
  44. [HttpPost]
  45. public async Task<IActionResult> PostRemoteVendorEventsAsync([FromBody] List<RemoteVendorEvent> remoteVendorEvents)
  46. {
  47. if (! ModelState.IsValid)
  48. {
  49. return BadRequest(ModelState);
  50. }
  51. var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
  52. var vendorId = credentials.Vendor.Id;
  53. var lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId;
  54. var maxRemoteId = lastVendorEventRemoteId;
  55. foreach (var remoteEvent in remoteVendorEvents)
  56. {
  57. if (vendorId != remoteEvent.VendorId)
  58. {
  59. return BadRequest(new { error = "Vendor ID mismatch" });
  60. }
  61. if (lastVendorEventRemoteId.HasValue && (lastVendorEventRemoteId.Value >= remoteEvent.Id.Value))
  62. {
  63. return BadRequest(new { error = "A supplied ID value is less than or equal to lastVendorRemoteId" });
  64. }
  65. if (! maxRemoteId.HasValue || (remoteEvent.Id.Value > maxRemoteId.Value))
  66. {
  67. maxRemoteId = remoteEvent.Id.Value;
  68. }
  69. _context.VendorEvents.Add(new VendorEvent()
  70. {
  71. RemoteId = remoteEvent.Id.Value,
  72. UserId = remoteEvent.UserId.Value,
  73. VendorId = remoteEvent.VendorId.Value,
  74. VoucherId = remoteEvent.VoucherId,
  75. EventType = remoteEvent.EventType.Value,
  76. EventDate = remoteEvent.EventDate.Value.ToUniversalTime(),
  77. Retry = remoteEvent.Retry
  78. });
  79. }
  80. // FIXME: race condition for simultaneous requests, although we should never have any from the same vendor
  81. credentials.Vendor.LastVendorEventRemoteId = maxRemoteId;
  82. await _context.SaveChangesAsync();
  83. return Ok(new
  84. {
  85. lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId
  86. });
  87. }
  88. [HttpGet("meta")]
  89. public async Task<IActionResult> GetVendorEventMetadata()
  90. {
  91. var credentials = await Utils.GetLoginCredentialsFromRequestAsync(HttpContext, _context);
  92. return Ok(new
  93. {
  94. date = DateTimeOffset.UtcNow,
  95. vendorId = credentials.Vendor.Id,
  96. lastVendorEventRemoteId = credentials.Vendor.LastVendorEventRemoteId
  97. });
  98. }
  99. private IQueryable<VendorEvent> VendorEventsForVendor(int vendorId)
  100. {
  101. return _context.VendorEvents.Where(e => e.VendorId == vendorId);
  102. }
  103. }
  104. }