Save.cs 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. using InABox.API;
  2. using InABox.Core;
  3. using InABox.Database;
  4. using Microsoft.Exchange.WebServices.Data;
  5. namespace InABox.Rpc
  6. {
  7. public class RpcSaveHandler : RpcCommandHandler<IRpcServer, RpcSaveParameters, RpcSaveResult>
  8. {
  9. protected override RpcSaveResult Execute(IRpcSession session, RpcSaveParameters parameters)
  10. {
  11. var user = CredentialsCache.ValidateAndRefresh(session.ID)
  12. ?? throw new RpcException("User not found in Credentials Cache!", RpcError.UNAUTHENTICATED);
  13. var response = new RpcSaveResult();
  14. var entities = parameters.Items;
  15. var originals = new Dictionary<string, object>[entities.Length];
  16. for(int i = 0; i < entities.Length; ++i)
  17. {
  18. originals[i] = BaseObjectExtensions.GetOriginaValues(entities[i], false);
  19. }
  20. var store = DbFactory.FindStore(parameters.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
  21. store.Save(entities, parameters.AuditNote);
  22. var deltas = new Dictionary<string, object?>[entities.Length];
  23. for (int i = 0; i < entities.Length; ++i)
  24. {
  25. var preSaveChanges = originals[i];
  26. var item = entities[i];
  27. var currentChanges = item.GetOriginaValues(false);
  28. var delta = new Dictionary<string, object?>();
  29. foreach (var (key, value) in currentChanges)
  30. {
  31. if (preSaveChanges.TryGetValue(key, out var oldValue))
  32. {
  33. if (!Equals(value, oldValue))
  34. delta[key] = CoreUtils.GetPropertyValue(item, key);
  35. }
  36. else
  37. delta[key] = CoreUtils.GetPropertyValue(item, key);
  38. }
  39. deltas[i] = delta;
  40. }
  41. response.Deltas = deltas;
  42. return response;
  43. }
  44. public RpcSaveHandler(IRpcServer sender) : base(sender)
  45. {
  46. }
  47. }
  48. }