Save.cs 2.2 KB

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