using InABox.API; using InABox.Core; using InABox.Database; using InABox.Server; namespace InABox.Rpc; public class RpcQueryHandler : RpcCommandHandler { protected override RpcQueryResult Execute(IRpcSession session, RpcQueryParameters parameters) { var user = CredentialsCache.ValidateAndRefresh(session.ID) ?? throw new RpcException("User not found in Credentials Cache!", RpcError.UNAUTHENTICATED); var response = new RpcQueryResult(); var tasks = new List>(); foreach (var query in parameters.Queries) { var task = Task.Run(() => { var table = new RpcQueryTable() { Key = query.Key }; try { var store = DbFactory.FindStore(query.Type, user.ID, user.UserID, session.Platform, session.Version ?? ""); table.Table = store.Query(query.Filter, query.Columns, query.Sort); } catch (Exception e) { Logger.Send( LogType.Error, user.UserID, string.Format( "[{0} {1}] Error: {2}\n{3}", PlatformUtils.PlatformToString(session.Platform), session.Version, e.Message, e.StackTrace ) ); } return table; }); tasks.Add(task); } Task.WaitAll(tasks.ToArray()); response.Tables = tasks.Select(x => x.Result).ToArray(); return response; } public RpcQueryHandler(IRpcServer sender) : base(sender) { } }