Save.cs 2.1 KB

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