Query.cs 1.8 KB

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