Save.cs 2.2 KB

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