KanbanSubscriberSet.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  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 class KanbanSubscriberSet
  10. {
  11. private readonly List<KanbanSubscriber> _subscribers = new List<KanbanSubscriber>();
  12. public KanbanSubscriberSet(IEnumerable<Guid> kanbanids)
  13. {
  14. _subscribers.Clear();
  15. var result = new Client<KanbanSubscriber>().Query(
  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)));
  27. new Client<KanbanSubscriber>().Save(updates, "");
  28. });
  29. var delete = Task.Run(() =>
  30. {
  31. var deletes = _subscribers.Where(x => !x.Manager && !x.Assignee && !x.Observer).ToArray();
  32. new Client<KanbanSubscriber>().Delete(deletes, "");
  33. });
  34. if (wait)
  35. Task.WaitAll(update, delete);
  36. }
  37. private KanbanSubscriber EnsureSubscriber(Guid kanbanid, Guid employeeid)
  38. {
  39. var subscriber = _subscribers.FirstOrDefault(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid));
  40. if (subscriber == null)
  41. {
  42. subscriber = new KanbanSubscriber();
  43. subscriber.Kanban.ID = kanbanid;
  44. subscriber.Employee.ID = employeeid;
  45. _subscribers.Add(subscriber);
  46. }
  47. return subscriber;
  48. }
  49. public void EnsureManager(Guid kanbanid, Guid employeeid)
  50. {
  51. var manager = EnsureSubscriber(kanbanid, employeeid);
  52. // No-one else can be a manager
  53. var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray();
  54. foreach (var other in others)
  55. other.Manager = false;
  56. // only this one!
  57. manager.Manager = true;
  58. }
  59. public void EnsureAssignee(Guid kanbanid, Guid employeeid)
  60. {
  61. var assignee = EnsureSubscriber(kanbanid, employeeid);
  62. // No-one else can be a assignee
  63. var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray();
  64. foreach (var other in others)
  65. other.Assignee = false;
  66. // only this one!
  67. assignee.Assignee = true;
  68. }
  69. public void EnsureObserver(Guid kanbanid, Guid employeeid)
  70. {
  71. var observer = EnsureSubscriber(kanbanid, employeeid);
  72. // Employee can only be an observer once
  73. var subscribers = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid)).ToArray();
  74. foreach (var subscriber in subscribers)
  75. subscriber.Observer = false;
  76. observer.Observer = true;
  77. }
  78. }
  79. }