浏览代码

Added Server-Side Kanban Subscriber Checking

frogsoftware 1 年之前
父节点
当前提交
9ba6618bb2

+ 36 - 8
prs.classes/Entities/Kanban/KanbanSubscriberSet.cs → prs.classes/Entities/Kanban/ClientKanbanSubscriberSet.cs

@@ -7,37 +7,39 @@ using InABox.Core;
 
 namespace Comal.Classes
 {
-    public class KanbanSubscriberSet
+    public abstract class BaseKanbanSubscriberSet
     {
         private readonly List<KanbanSubscriber> _subscribers = new List<KanbanSubscriber>();
 
-        public KanbanSubscriberSet(IEnumerable<Guid> kanbanids)
+        protected BaseKanbanSubscriberSet(IEnumerable<Guid> kanbanids)
         {
             _subscribers.Clear();
-            var result = new Client<KanbanSubscriber>().Query(
+            var result = DoQuery(
                 new Filter<KanbanSubscriber>(x => x.Kanban.ID).InList(kanbanids.ToArray()),
                 new Columns<KanbanSubscriber>(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<KanbanSubscriber>()));
         }
-
+        
         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<KanbanSubscriber>().Save(updates, "");
+                var updates = _subscribers.Where(x => (x.Manager || x.Assignee || x.Observer) && (x.IsChanged() || Equals(x.ID, Guid.Empty))).ToArray();
+                if (updates.Any())
+                    DoSave(updates);
             });
             var delete = Task.Run(() =>
             {
                 var deletes = _subscribers.Where(x => !x.Manager && !x.Assignee && !x.Observer).ToArray();
-                new Client<KanbanSubscriber>().Delete(deletes, "");
+                if (deletes.Any())
+                    DoDelete(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));
@@ -89,5 +91,31 @@ namespace Comal.Classes
 
             observer.Observer = true;
         }
+        
+        protected abstract CoreTable DoQuery(Filter<KanbanSubscriber> filter, Columns<KanbanSubscriber> columns);
+        
+        protected abstract void DoSave(IEnumerable<KanbanSubscriber> updates);
+        
+        protected abstract void DoDelete(KanbanSubscriber[] deletes);
+
+    }
+    
+    public class ClientKanbanSubscriberSet : BaseKanbanSubscriberSet
+    {
+        
+        public ClientKanbanSubscriberSet(IEnumerable<Guid> kanbanids) : base(kanbanids)
+        {
+            
+        }
+        
+        protected override void DoSave(IEnumerable<KanbanSubscriber> updates)
+            => new Client<KanbanSubscriber>().Save(updates, "");
+
+        protected override void DoDelete(KanbanSubscriber[] deletes)
+            => new Client<KanbanSubscriber>().Delete(deletes, "");
+
+        protected override CoreTable DoQuery(Filter<KanbanSubscriber> filter, Columns<KanbanSubscriber> columns)
+         => new Client<KanbanSubscriber>().Query(filter, columns);
+        
     }
 }

+ 1 - 1
prs.desktop/Panels/Tasks/TasksByUserControl.xaml.cs

@@ -601,7 +601,7 @@ namespace PRSDesktop
                 if (!models.Any())
                     return;
                 var kanbans = Host.LoadKanbans(models, new Columns<Kanban>(x => x.ID, x => x.EmployeeLink.ID, x => x.Private, x => x.Number));
-                var subscribers = new KanbanSubscriberSet(kanbans.Select(x => x.ID));
+                var subscribers = new ClientKanbanSubscriberSet(kanbans.Select(x => x.ID));
                 var targetID = Guid.Parse(target);
 
                 var updated = new List<Kanban>();

+ 44 - 10
prs.stores/KanbanStore.cs

@@ -4,10 +4,30 @@ using System.Linq;
 using System.Text;
 using System.Text.RegularExpressions;
 using Comal.Classes;
+using InABox.Clients;
 using InABox.Core;
+using InABox.Database;
 
 namespace Comal.Stores
 {
+    public class ServerKanbanSubscriberSet : BaseKanbanSubscriberSet
+    {
+        public ServerKanbanSubscriberSet(IEnumerable<Guid> kanbanids) : base(kanbanids)
+        {
+            
+        }
+        
+        protected override void DoSave(IEnumerable<KanbanSubscriber> updates)
+            => DbFactory.Provider.Save(updates);
+
+        protected override void DoDelete(KanbanSubscriber[] deletes)
+            => DbFactory.Provider.Delete(deletes,"");
+
+        protected override CoreTable DoQuery(Filter<KanbanSubscriber> filter, Columns<KanbanSubscriber> columns)
+            => DbFactory.Provider.Query(filter, columns);
+        
+    }
+    
     internal class KanbanStore : ScheduleActionStore<Kanban>
     {
         private void CheckNotifications(Kanban entity)
@@ -19,7 +39,7 @@ namespace Comal.Stores
                     new Filter<Notification>(x => x.EntityType).IsEqualTo(typeof(Kanban).EntityName()).And(x => x.EntityID).IsEqualTo(entity.ID)
                         .And(x => x.Closed).IsEqualTo(DateTime.MinValue),
                     new Columns<Notification>(x => x.ID)
-                ).Rows.Select(x => x.ToObject<Notification>());
+                ).Rows.Select(x => x.ToObject<Notification>()).ToArray();
                 foreach (var notification in notifications)
                     notification.Closed = entity.Completed;
                 if (notifications.Any())
@@ -29,12 +49,12 @@ namespace Comal.Stores
 
         private void NotifyUsers(Kanban entity)
         {
-            var Subject = string.Format("Updated Task: {0} (Due: {1:dd MMM yy})", entity.Title, entity.DueDate);        
+            var Subject = $"Updated Task: {entity.Title} (Due: {entity.DueDate:dd MMM yy})";        
             var emps = Provider.Query(
                 new Filter<KanbanSubscriber>(x => x.Kanban.ID).IsEqualTo(entity.ID),
                 new Columns<KanbanSubscriber>(x => x.Employee.ID, x => x.Employee.UserLink.ID));          
             var senderrow = emps.Rows.FirstOrDefault(r => r.Get<KanbanSubscriber, Guid>(c => c.Employee.UserLink.ID).Equals(UserGuid));
-            var senderid = senderrow != null ? senderrow.Get<KanbanSubscriber, Guid>(c => c.Employee.ID) : Guid.Empty;
+            var senderid = senderrow?.Get<KanbanSubscriber, Guid>(c => c.Employee.ID) ?? Guid.Empty;
             var notifications = new List<Notification>();
             foreach (var row in emps.Rows)
             {
@@ -75,10 +95,8 @@ namespace Comal.Stores
 
         private string BuildDescription(Kanban entity)
         {
-            var notes = entity.Notes != null
-                ? string.Join("\r\n", entity.Notes)
-                    .Split(new[] { "===================================\r\n" }, StringSplitOptions.RemoveEmptyEntries)
-                : new string[] { };
+            var notes = string.Join("\r\n", entity.Notes)
+                .Split(new[] { "===================================\r\n" }, StringSplitOptions.RemoveEmptyEntries);
             var summary = notes.LastOrDefault();
             if (string.IsNullOrEmpty(summary))
                 summary = entity.Summary;
@@ -145,8 +163,8 @@ namespace Comal.Stores
                 return;
             }
             var kanbanForms = Provider.Query(
-                new Filter<KanbanForm>(x => x.Parent.ID).IsEqualTo(kanban.ID)).Rows.Select(x => x.ToObject<KanbanForm>());
-            var toDelete = kanbanForms.Where(x => string.IsNullOrWhiteSpace(x.FormData));
+                new Filter<KanbanForm>(x => x.Parent.ID).IsEqualTo(kanban.ID)).Rows.Select(x => x.ToObject<KanbanForm>()).ToArray();
+            var toDelete = kanbanForms.Where(x => string.IsNullOrWhiteSpace(x.FormData)).ToArray();
             Provider.Delete(toDelete, UserID);
 
             var kanbanTypeForms = Provider.Query(
@@ -157,7 +175,7 @@ namespace Comal.Stores
             foreach(var row in kanbanTypeForms.Rows)
             {
                 var formID = row.Get<KanbanTypeForm, Guid>(x => x.Form.ID);
-                if (!(kanbanForms.Any(x => x.Form.ID == formID) && !toDelete.Any(x => x.Form.ID == formID)))
+                if (!(kanbanForms.Any(x => x.Form.ID == formID) && toDelete.All(x => x.Form.ID != formID)))
                 {
                     var kanbanForm = new KanbanForm();
                     kanbanForm.Form.ID = formID;
@@ -174,6 +192,22 @@ namespace Comal.Stores
             CheckNotifications(entity);
             CheckNotificationRequired(entity);
             CheckKanbanTypeForms(entity);
+            CheckSubscribers(entity);
+        }
+
+        private void CheckSubscribers(Kanban entity)
+        {
+            if (entity.EmployeeLink.HasOriginalValue(x => x.ID) || (entity.ManagerLink.HasOriginalValue(x => x.ID)))
+            {
+                var set = new ServerKanbanSubscriberSet(new Guid[] { entity.ID });
+                if (entity.EmployeeLink.HasOriginalValue(x => x.ID))
+                    set.EnsureAssignee(entity.ID,entity.EmployeeLink.ID);
+                if (entity.ManagerLink.HasOriginalValue(x => x.ID))
+                    set.EnsureManager(entity.ID,entity.ManagerLink.ID);
+                set.Save();
+
+            }
         }
+        
     }
 }