GPSTrackerStore.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System.Collections.Generic;
  2. using System.Linq;
  3. using Comal.Classes;
  4. using InABox.Core;
  5. using System;
  6. namespace Comal.Stores
  7. {
  8. internal class GPSTrackerStore : BaseStore<GPSTracker>
  9. {
  10. protected override void AfterSave(GPSTracker entity)
  11. {
  12. UpdateLinkedEquipment(entity);
  13. UpdateLinkedJob(entity);
  14. base.AfterSave(entity);
  15. }
  16. private void UpdateLinkedEquipment(GPSTracker entity)
  17. {
  18. if (entity.Equipment.HasOriginalValue(x => x.ID))
  19. {
  20. var oldID = entity.Equipment.GetOriginalValue(x => x.ID);
  21. var newID = entity.Equipment.ID;
  22. // If there are any other trackers linked to this new equipment item
  23. // blank them out - a tracker can only be attached to one equipment item
  24. var trackers = Provider.Query(
  25. new Filter<GPSTracker>(x => x.Equipment.ID).IsEqualTo(newID).And(x => x.ID)
  26. .IsNotEqualTo(entity.ID),
  27. Columns.None<GPSTracker>().Add(x => x.ID).Add(x => x.Equipment.ID)
  28. ).ToList<GPSTracker>();
  29. if (trackers.Any())
  30. {
  31. foreach (var tracker in trackers)
  32. tracker.Equipment.ID = Guid.Empty;
  33. Provider.Save(trackers);
  34. }
  35. var equips = Provider.Query(
  36. new Filter<Equipment>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID).Or(x=>x.TrackerLink.ID).IsEqualTo(entity.ID),
  37. Columns.None<Equipment>().Add(x => x.ID, x => x.TrackerLink.ID)
  38. ).ToList<Equipment>();
  39. // If there are any other trackers attached to this equipment item,
  40. // clear them out - an equipment item can only have one tracker
  41. foreach (var equip in equips)
  42. equip.TrackerLink.ID = Guid.Empty;
  43. // Update the equipment item with the new Tracker ID
  44. var curr = equips.FirstOrDefault(x => x.ID.Equals(newID));
  45. if (curr != null)
  46. curr.TrackerLink.ID = entity.ID;
  47. // Save any changes
  48. if (equips.Any(x=>x.IsChanged()))
  49. Provider.Save(equips);
  50. }
  51. }
  52. private void UpdateLinkedJob(GPSTracker entity)
  53. {
  54. if (entity.JobTracker.HasOriginalValue(x => x.ID))
  55. {
  56. var oldID = entity.JobTracker.GetOriginalValue(x => x.ID);
  57. var newID = entity.JobTracker.ID;
  58. var trackers = Provider.Query(
  59. new Filter<JobTracker>(x => x.ID).IsEqualTo(oldID).Or(x => x.ID).IsEqualTo(newID),
  60. Columns.None<JobTracker>().Add(x => x.ID, x => x.TrackerLink.ID)
  61. );
  62. var updates = new List<JobTracker>();
  63. var prev = trackers.Rows.FirstOrDefault(r => r.Get<JobTracker, Guid>(c => c.ID).Equals(oldID));
  64. if (prev != null)
  65. {
  66. var target = prev.ToObject<JobTracker>();
  67. target.TrackerLink.ID = Guid.Empty;
  68. updates.Add(target);
  69. }
  70. var curr = trackers.Rows.FirstOrDefault(r => r.Get<JobTracker, Guid>(c => c.ID).Equals(newID));
  71. if (curr != null)
  72. {
  73. var tracker = curr.ToObject<JobTracker>();
  74. tracker.TrackerLink.ID = entity.ID;
  75. updates.Add(tracker);
  76. }
  77. if (updates.Any())
  78. Provider.Save(updates);
  79. }
  80. }
  81. }
  82. }