Просмотр исходного кода

SERVER - bug fixes to RestService single and multisave

Nick-PRSDigital@bitbucket.org 2 лет назад
Родитель
Сommit
7860504156
1 измененных файлов с 45 добавлено и 41 удалено
  1. 45 41
      InABox.Server/RestService.cs

+ 45 - 41
InABox.Server/RestService.cs

@@ -1,11 +1,7 @@
 using System.Reflection;
-using GenHTTP.Api.Protocol;
-using GenHTTP.Modules.IO.Streaming;
 using InABox.Clients;
 using InABox.Core;
 using InABox.Database;
-using Microsoft.Exchange.WebServices.Data;
-using NPOI.SS.Formula.Functions;
 
 namespace InABox.API
 {
@@ -34,7 +30,7 @@ namespace InABox.API
         protected static Guid ValidateRequest(Request request, out string? userID)
         {
             var session = request.Credentials.Session;
-            if(session != Guid.Empty)
+            if (session != Guid.Empty)
             {
                 var valid = CredentialsCache.Validate(session, out userID);
                 if (valid != Guid.Empty)
@@ -43,7 +39,7 @@ namespace InABox.API
                 }
                 return valid;
             }
-            else if(request.Credentials.UserID is not null
+            else if (request.Credentials.UserID is not null
                 && request.Credentials.Password is not null
                 && CredentialsCache.IsBypassed(request.Credentials.UserID, request.Credentials.Password))
             {
@@ -77,7 +73,7 @@ namespace InABox.API
                 foreach (var item in request.TableTypes)
                 {
                     var type = CoreUtils.GetEntity(item.Value);
-                    if(type.IsAssignableTo(typeof(ISecure)) && !isSecure)
+                    if (type.IsAssignableTo(typeof(ISecure)) && !isSecure)
                     {
                         Logger.Send(LogType.Error, userid, $"{type} is a secure entity. Request failed");
                     }
@@ -129,7 +125,7 @@ namespace InABox.API
                     reLogin = true;
                 }
             }
-            if(user == null)
+            if (user == null)
             {
                 if (request.UsePIN)
                 {
@@ -182,7 +178,7 @@ namespace InABox.API
                 response.UserGuid = user.ID;
                 response.UserID = user.UserID;
                 response.SecurityID = user.SecurityGroup.ID;
-                response.Session = user.ID == CoreUtils.FullGuid ? 
+                response.Session = user.ID == CoreUtils.FullGuid ?
                     CredentialsCache.NewSession(user, true, DateTime.MaxValue) :
                     CredentialsCache.NewSession(user, true);
                 response.PasswordExpiration = CheckPasswordExpiration ? user.PasswordExpiration : DateTime.MinValue;
@@ -222,7 +218,7 @@ namespace InABox.API
             response.Status = StatusCode.OK;
             return response;
         }
-        
+
         public static InfoResponse Info(InfoRequest request)
         {
             var response = new InfoResponse()
@@ -237,7 +233,7 @@ namespace InABox.API
             response.Status = StatusCode.OK;
             return response;
         }
-        
+
     }
 
     public class RestService<TEntity> : RestService where TEntity : Entity, new()
@@ -340,32 +336,37 @@ namespace InABox.API
             try
             {
                 var e = request.Item;
-                var oldValues = new Dictionary<string, object?>();
-                foreach (var key in e.OriginalValues.Keys)
-                {
-                    oldValues.Add(key, CoreUtils.GetPropertyValue(e, key));
-                }
-                    
+
+                var preSaveChanges = BaseObjectExtensions.GetOriginaValues(e, false);
+
                 var store = DbFactory.FindStore<TEntity>(userguid, userid, request.Credentials.Platform, request.Credentials.Version);
+
                 store.Save(e, request.AuditNote);
 
                 if (request.ReturnOnlyChanged)
                 {
-                    foreach(var (key, value) in e.OriginalValues)
+                    var currentChanges = BaseObjectExtensions.GetOriginaValues(e, false);
+
+                    foreach (var (key, value) in currentChanges)
                     {
-                        if(oldValues.TryGetValue(key, out var oldValue))
+                        if (preSaveChanges.TryGetValue(key, out var oldValue))
                         {
-                            var curValue = CoreUtils.GetPropertyValue(e, key);
-                            if(!Equals(curValue, oldValue))
+                            if (!Equals(value, oldValue))
                             {
                                 response.ChangedValues.Add(key, CoreUtils.GetPropertyValue(e, key));
-                            }
+                            }                          
                         }
                         else
                         {
                             response.ChangedValues.Add(key, CoreUtils.GetPropertyValue(e, key));
                         }
                     }
+                    //this is additional logging that should be removed when finished debugging this code
+                    //Logger.Send(LogType.Information, userid, "(SINGLE SAVE) START logging changed values for " + e.ToString());
+                    //foreach (var v in response.ChangedValues)
+                    //    Logger.Send(LogType.Information, userid, "changed value: Key: " + v.Key + ", Value: " + v.Value);
+                    //Logger.Send(LogType.Information, userid, "(SINGLE SAVE) END logging changed values for " + e.ToString());
+                    //remove until here
                 }
                 else
                 {
@@ -408,47 +409,50 @@ namespace InABox.API
                     request.Items != null ? string.Join(", ", request.Items.Select(x => x.ToString())) : request + " (null)"));
             try
             {
+                var originals = new Dictionary<TEntity, Dictionary<string, object>>();
 
                 var es = request.Items;
 
-                var oldValuesList = new List<Dictionary<string, object?>>();
-                foreach(var e in es)
-                {
-                    var oldValues = new Dictionary<string, object?>();
-                    foreach (var key in e.OriginalValues.Keys)
-                    {
-                        oldValues.Add(key, CoreUtils.GetPropertyValue(e, key));
-                    }
-                    oldValuesList.Add(oldValues);
-                }
+                foreach (var e in es)
+                    originals[e] = BaseObjectExtensions.GetOriginaValues(e, false);
 
                 var store = DbFactory.FindStore<TEntity>(userguid, userid, request.Credentials.Platform, request.Credentials.Version);
 
                 store.Save(es, request.AuditNote);
 
                 if (request.ReturnOnlyChanged)
-                {
-                    for(int i = 0; i < es.Length; ++i)
+                {                  
+                    for (int i = 0; i < es.Length; ++i)
                     {
+                        var result = new Dictionary<string, object>();
+
                         var e = es[i];
 
-                        var changedValues = new Dictionary<string, object?>();
-                        var oldValues = oldValuesList[i];
-                        foreach (var (key, value) in e.OriginalValues)
+                        var currentChanges = BaseObjectExtensions.GetOriginaValues(e, false);
+
+                        var preSaveChanges = originals[e];
+
+                        foreach (var (key, value) in currentChanges)
                         {
-                            if (oldValues.TryGetValue(key, out var oldValue))
+                            if (preSaveChanges.TryGetValue(key, out var oldValue))
                             {
                                 if (!Equals(value, oldValue))
                                 {
-                                    changedValues.Add(key, value);
+                                    result[key] = CoreUtils.GetPropertyValue(e, key);
                                 }
                             }
                             else
                             {
-                                changedValues.Add(key, value);
+                                result[key] = CoreUtils.GetPropertyValue(e, key);
                             }
                         }
-                        response.ChangedValues.Add(changedValues);
+                        response.ChangedValues.Add(result);
+                        //this is additional logging that should be removed when finished debugging this code
+                        //Logger.Send(LogType.Information, userid, "(MULTISAVE) START logging changed values for " + e.ToString());
+                        //foreach (var v in result)
+                        //    Logger.Send(LogType.Information, userid, "changed value: Key: " + v.Key + ", Value: " + v.Value);
+                        //Logger.Send(LogType.Information, userid, "(MULTISAVE) END logging changed values for " + e.ToString());
+                        //remove until here
                     }
                 }
                 else