ClientKanbanSubscriberSet.cs 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Threading.Tasks;
  5. using InABox.Clients;
  6. using InABox.Core;
  7. namespace Comal.Classes
  8. {
  9. public abstract class BaseKanbanSubscriberSet
  10. {
  11. private readonly List<KanbanSubscriber> _subscribers = new List<KanbanSubscriber>();
  12. protected BaseKanbanSubscriberSet(IEnumerable<Guid> kanbanids)
  13. {
  14. _subscribers.Clear();
  15. var result = DoQuery(
  16. new Filter<KanbanSubscriber>(x => x.Kanban.ID).InList(kanbanids.ToArray()),
  17. new Columns<KanbanSubscriber>(x => x.ID).Add(x => x.Kanban.ID).Add(x => x.Employee.ID).Add(x => x.Assignee).Add(x => x.Manager)
  18. .Add(x => x.Observer));
  19. if (result.Rows.Any())
  20. _subscribers.AddRange(result.Rows.Select(x => x.ToObject<KanbanSubscriber>()));
  21. }
  22. public void Save(bool wait = true)
  23. {
  24. var update = Task.Run(() =>
  25. {
  26. var updates = _subscribers.Where(x => (x.Manager || x.Assignee || x.Observer) && (x.IsChanged() || Equals(x.ID, Guid.Empty))).ToArray();
  27. if (updates.Any())
  28. DoSave(updates);
  29. });
  30. var delete = Task.Run(() =>
  31. {
  32. var deletes = _subscribers.Where(x => !x.Manager && !x.Assignee && !x.Observer).ToArray();
  33. if (deletes.Any())
  34. DoDelete(deletes);
  35. });
  36. if (wait)
  37. Task.WaitAll(update, delete);
  38. }
  39. private KanbanSubscriber EnsureSubscriber(Guid kanbanid, Guid employeeid)
  40. {
  41. var subscriber = _subscribers.FirstOrDefault(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid));
  42. if (subscriber == null)
  43. {
  44. subscriber = new KanbanSubscriber();
  45. subscriber.Kanban.ID = kanbanid;
  46. subscriber.Employee.ID = employeeid;
  47. _subscribers.Add(subscriber);
  48. }
  49. return subscriber;
  50. }
  51. public void EnsureManager(Guid kanbanid, Guid employeeid)
  52. {
  53. if(employeeid == Guid.Empty)
  54. {
  55. return;
  56. }
  57. var manager = EnsureSubscriber(kanbanid, employeeid);
  58. // No-one else can be a manager
  59. var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray();
  60. foreach (var other in others)
  61. {
  62. if(other != manager)
  63. {
  64. other.Manager = false;
  65. }
  66. }
  67. // only this one!
  68. manager.Manager = true;
  69. }
  70. public void EnsureAssignee(Guid kanbanid, Guid employeeid)
  71. {
  72. if (employeeid == Guid.Empty)
  73. {
  74. return;
  75. }
  76. var assignee = EnsureSubscriber(kanbanid, employeeid);
  77. // No-one else can be a assignee
  78. var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray();
  79. foreach (var other in others)
  80. {
  81. if (other != assignee)
  82. {
  83. other.Assignee = false;
  84. }
  85. }
  86. // only this one!
  87. assignee.Assignee = true;
  88. }
  89. public void EnsureObserver(Guid kanbanid, Guid employeeid)
  90. {
  91. if (employeeid == Guid.Empty)
  92. {
  93. return;
  94. }
  95. var observer = EnsureSubscriber(kanbanid, employeeid);
  96. // Employee can only be an observer once
  97. var subscribers = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid)).ToArray();
  98. foreach (var subscriber in subscribers)
  99. {
  100. if (subscriber != observer)
  101. {
  102. subscriber.Observer = false;
  103. }
  104. }
  105. observer.Observer = true;
  106. }
  107. protected abstract CoreTable DoQuery(Filter<KanbanSubscriber> filter, Columns<KanbanSubscriber> columns);
  108. protected abstract void DoSave(IEnumerable<KanbanSubscriber> updates);
  109. protected abstract void DoDelete(KanbanSubscriber[] deletes);
  110. }
  111. public class ClientKanbanSubscriberSet : BaseKanbanSubscriberSet
  112. {
  113. public ClientKanbanSubscriberSet(IEnumerable<Guid> kanbanids) : base(kanbanids)
  114. {
  115. }
  116. protected override void DoSave(IEnumerable<KanbanSubscriber> updates)
  117. => new Client<KanbanSubscriber>().Save(updates, "");
  118. protected override void DoDelete(KanbanSubscriber[] deletes)
  119. => new Client<KanbanSubscriber>().Delete(deletes, "");
  120. protected override CoreTable DoQuery(Filter<KanbanSubscriber> filter, Columns<KanbanSubscriber> columns)
  121. => new Client<KanbanSubscriber>().Query(filter, columns);
  122. }
  123. }