using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using InABox.Clients; using InABox.Core; namespace Comal.Classes { public class KanbanSubscriberSet { private readonly List _subscribers = new List(); public KanbanSubscriberSet(IEnumerable kanbanids) { _subscribers.Clear(); var result = new Client().Query( new Filter(x => x.Kanban.ID).InList(kanbanids.ToArray()), new Columns(x => x.ID).Add(x => x.Kanban.ID).Add(x => x.Employee.ID).Add(x => x.Assignee).Add(x => x.Manager) .Add(x => x.Observer)); if (result.Rows.Any()) _subscribers.AddRange(result.Rows.Select(x => x.ToObject())); } public void Save(bool wait = true) { var update = Task.Run(() => { var updates = _subscribers.Where(x => (x.Manager || x.Assignee || x.Observer) && (x.IsChanged() || Equals(x.ID, Guid.Empty))); new Client().Save(updates, ""); }); var delete = Task.Run(() => { var deletes = _subscribers.Where(x => !x.Manager && !x.Assignee && !x.Observer).ToArray(); new Client().Delete(deletes, ""); }); if (wait) Task.WaitAll(update, delete); } private KanbanSubscriber EnsureSubscriber(Guid kanbanid, Guid employeeid) { var subscriber = _subscribers.FirstOrDefault(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid)); if (subscriber == null) { subscriber = new KanbanSubscriber(); subscriber.Kanban.ID = kanbanid; subscriber.Employee.ID = employeeid; _subscribers.Add(subscriber); } return subscriber; } public void EnsureManager(Guid kanbanid, Guid employeeid) { var manager = EnsureSubscriber(kanbanid, employeeid); // No-one else can be a manager var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray(); foreach (var other in others) other.Manager = false; // only this one! manager.Manager = true; } public void EnsureAssignee(Guid kanbanid, Guid employeeid) { var assignee = EnsureSubscriber(kanbanid, employeeid); // No-one else can be a assignee var others = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid)).ToArray(); foreach (var other in others) other.Assignee = false; // only this one! assignee.Assignee = true; } public void EnsureObserver(Guid kanbanid, Guid employeeid) { var observer = EnsureSubscriber(kanbanid, employeeid); // Employee can only be an observer once var subscribers = _subscribers.Where(x => Equals(x.Kanban.ID, kanbanid) && Equals(x.Employee.ID, employeeid)).ToArray(); foreach (var subscriber in subscribers) subscriber.Observer = false; observer.Observer = true; } } }