|
@@ -1,11 +1,7 @@
|
|
using System.Reflection;
|
|
using System.Reflection;
|
|
-using GenHTTP.Api.Protocol;
|
|
|
|
-using GenHTTP.Modules.IO.Streaming;
|
|
|
|
using InABox.Clients;
|
|
using InABox.Clients;
|
|
using InABox.Core;
|
|
using InABox.Core;
|
|
using InABox.Database;
|
|
using InABox.Database;
|
|
-using Microsoft.Exchange.WebServices.Data;
|
|
|
|
-using NPOI.SS.Formula.Functions;
|
|
|
|
|
|
|
|
namespace InABox.API
|
|
namespace InABox.API
|
|
{
|
|
{
|
|
@@ -34,7 +30,7 @@ namespace InABox.API
|
|
protected static Guid ValidateRequest(Request request, out string? userID)
|
|
protected static Guid ValidateRequest(Request request, out string? userID)
|
|
{
|
|
{
|
|
var session = request.Credentials.Session;
|
|
var session = request.Credentials.Session;
|
|
- if(session != Guid.Empty)
|
|
|
|
|
|
+ if (session != Guid.Empty)
|
|
{
|
|
{
|
|
var valid = CredentialsCache.Validate(session, out userID);
|
|
var valid = CredentialsCache.Validate(session, out userID);
|
|
if (valid != Guid.Empty)
|
|
if (valid != Guid.Empty)
|
|
@@ -43,7 +39,7 @@ namespace InABox.API
|
|
}
|
|
}
|
|
return valid;
|
|
return valid;
|
|
}
|
|
}
|
|
- else if(request.Credentials.UserID is not null
|
|
|
|
|
|
+ else if (request.Credentials.UserID is not null
|
|
&& request.Credentials.Password is not null
|
|
&& request.Credentials.Password is not null
|
|
&& CredentialsCache.IsBypassed(request.Credentials.UserID, request.Credentials.Password))
|
|
&& CredentialsCache.IsBypassed(request.Credentials.UserID, request.Credentials.Password))
|
|
{
|
|
{
|
|
@@ -77,7 +73,7 @@ namespace InABox.API
|
|
foreach (var item in request.TableTypes)
|
|
foreach (var item in request.TableTypes)
|
|
{
|
|
{
|
|
var type = CoreUtils.GetEntity(item.Value);
|
|
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");
|
|
Logger.Send(LogType.Error, userid, $"{type} is a secure entity. Request failed");
|
|
}
|
|
}
|
|
@@ -129,7 +125,7 @@ namespace InABox.API
|
|
reLogin = true;
|
|
reLogin = true;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- if(user == null)
|
|
|
|
|
|
+ if (user == null)
|
|
{
|
|
{
|
|
if (request.UsePIN)
|
|
if (request.UsePIN)
|
|
{
|
|
{
|
|
@@ -182,7 +178,7 @@ namespace InABox.API
|
|
response.UserGuid = user.ID;
|
|
response.UserGuid = user.ID;
|
|
response.UserID = user.UserID;
|
|
response.UserID = user.UserID;
|
|
response.SecurityID = user.SecurityGroup.ID;
|
|
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, DateTime.MaxValue) :
|
|
CredentialsCache.NewSession(user, true);
|
|
CredentialsCache.NewSession(user, true);
|
|
response.PasswordExpiration = CheckPasswordExpiration ? user.PasswordExpiration : DateTime.MinValue;
|
|
response.PasswordExpiration = CheckPasswordExpiration ? user.PasswordExpiration : DateTime.MinValue;
|
|
@@ -222,7 +218,7 @@ namespace InABox.API
|
|
response.Status = StatusCode.OK;
|
|
response.Status = StatusCode.OK;
|
|
return response;
|
|
return response;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
public static InfoResponse Info(InfoRequest request)
|
|
public static InfoResponse Info(InfoRequest request)
|
|
{
|
|
{
|
|
var response = new InfoResponse()
|
|
var response = new InfoResponse()
|
|
@@ -237,7 +233,7 @@ namespace InABox.API
|
|
response.Status = StatusCode.OK;
|
|
response.Status = StatusCode.OK;
|
|
return response;
|
|
return response;
|
|
}
|
|
}
|
|
-
|
|
|
|
|
|
+
|
|
}
|
|
}
|
|
|
|
|
|
public class RestService<TEntity> : RestService where TEntity : Entity, new()
|
|
public class RestService<TEntity> : RestService where TEntity : Entity, new()
|
|
@@ -340,32 +336,37 @@ namespace InABox.API
|
|
try
|
|
try
|
|
{
|
|
{
|
|
var e = request.Item;
|
|
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);
|
|
var store = DbFactory.FindStore<TEntity>(userguid, userid, request.Credentials.Platform, request.Credentials.Version);
|
|
|
|
+
|
|
store.Save(e, request.AuditNote);
|
|
store.Save(e, request.AuditNote);
|
|
|
|
|
|
if (request.ReturnOnlyChanged)
|
|
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));
|
|
response.ChangedValues.Add(key, CoreUtils.GetPropertyValue(e, key));
|
|
- }
|
|
|
|
|
|
+ }
|
|
}
|
|
}
|
|
else
|
|
else
|
|
{
|
|
{
|
|
response.ChangedValues.Add(key, CoreUtils.GetPropertyValue(e, key));
|
|
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
|
|
else
|
|
{
|
|
{
|
|
@@ -408,47 +409,50 @@ namespace InABox.API
|
|
request.Items != null ? string.Join(", ", request.Items.Select(x => x.ToString())) : request + " (null)"));
|
|
request.Items != null ? string.Join(", ", request.Items.Select(x => x.ToString())) : request + " (null)"));
|
|
try
|
|
try
|
|
{
|
|
{
|
|
|
|
+ var originals = new Dictionary<TEntity, Dictionary<string, object>>();
|
|
|
|
|
|
var es = request.Items;
|
|
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);
|
|
var store = DbFactory.FindStore<TEntity>(userguid, userid, request.Credentials.Platform, request.Credentials.Version);
|
|
|
|
|
|
store.Save(es, request.AuditNote);
|
|
store.Save(es, request.AuditNote);
|
|
|
|
|
|
if (request.ReturnOnlyChanged)
|
|
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 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))
|
|
if (!Equals(value, oldValue))
|
|
{
|
|
{
|
|
- changedValues.Add(key, value);
|
|
|
|
|
|
+ result[key] = CoreUtils.GetPropertyValue(e, key);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
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
|
|
else
|