Query.cs 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. using InABox.API;
  2. using InABox.Core;
  3. using InABox.Database;
  4. using InABox.Server;
  5. namespace InABox.Rpc;
  6. public class RpcQueryHandler : RpcCommandHandler<IRpcServer, RpcQueryCommand, RpcQueryParameters, RpcQueryResult>
  7. {
  8. protected override RpcQueryResult Execute(IRpcSession session, RpcQueryParameters parameters)
  9. {
  10. var user = CredentialsCache.ValidateAndRefresh(session.ID)
  11. ?? throw new RpcException("User not found in Credentials Cache!", RpcError.UNAUTHENTICATED);
  12. var response = new RpcQueryResult();
  13. var tasks = new List<Task<RpcQueryTable>>();
  14. foreach (var query in parameters.Queries)
  15. {
  16. var task = Task.Run(() =>
  17. {
  18. var table = new RpcQueryTable() { Key = query.Key };
  19. try
  20. {
  21. var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? "");
  22. table.Table = store.Query(query.Filter, query.Columns, query.Sort);
  23. }
  24. catch (Exception e)
  25. {
  26. Logger.Send(
  27. LogType.Error,
  28. user.UserID,
  29. string.Format(
  30. "[{0} {1}] Error: {2}\n{3}",
  31. PlatformUtils.PlatformToString(session.Platform),
  32. session.Version,
  33. e.Message,
  34. e.StackTrace
  35. )
  36. );
  37. }
  38. return table;
  39. });
  40. tasks.Add(task);
  41. }
  42. Task.WaitAll(tasks.ToArray());
  43. response.Tables = tasks.Select(x => x.Result).ToArray();
  44. return response;
  45. }
  46. public RpcQueryHandler(IRpcServer sender) : base(sender)
  47. {
  48. }
  49. }