From c10fca45e60010278106093e0ef9c49049482baa Mon Sep 17 00:00:00 2001 From: Pilzinsel64 Date: Fri, 23 May 2025 11:17:48 +0200 Subject: [PATCH] native amount/offset handling --- Pilz.Net/Api/Client/BaseChildItemClient.cs | 9 +++++++++ Pilz.Net/Api/Client/BaseClient.cs | 9 +++++++++ Pilz.Net/Api/Client/IBaseChildItemClient.cs | 1 + Pilz.Net/Api/Client/IBaseClient.cs | 1 + Pilz.Net/Api/Server/BaseChildItemHandler.cs | 17 ++++++++++++----- Pilz.Net/Api/Server/BaseItemHandler.cs | 9 +++++++-- 6 files changed, 39 insertions(+), 7 deletions(-) diff --git a/Pilz.Net/Api/Client/BaseChildItemClient.cs b/Pilz.Net/Api/Client/BaseChildItemClient.cs index d966a70..fcddd37 100644 --- a/Pilz.Net/Api/Client/BaseChildItemClient.cs +++ b/Pilz.Net/Api/Client/BaseChildItemClient.cs @@ -14,6 +14,15 @@ public abstract class BaseChildItemClient(IApiClient client) : BaseClient( return (await client.SendRequest.Items>($"{ApiEndpointParent}/{parentId}{ApiEndpointChild}", HttpMethod.Get)).EnsureOk().Items; } + public virtual async Task> GetAll(int parentId, int offset, int count) + { + return (await client.SendRequest.Items>(ApiEndpoint, HttpMethod.Get, new ApiParameterCollection + { + ["offset"] = offset, + ["count"] = count, + })).EnsureOk().Items; + } + public override async Task Save(T item) { if (item.Id == 0) diff --git a/Pilz.Net/Api/Client/BaseClient.cs b/Pilz.Net/Api/Client/BaseClient.cs index 584ccd9..41a177e 100644 --- a/Pilz.Net/Api/Client/BaseClient.cs +++ b/Pilz.Net/Api/Client/BaseClient.cs @@ -12,6 +12,15 @@ public abstract class BaseClient(IApiClient client) : IBaseClient where T return (await client.SendRequest.Items>(ApiEndpoint, HttpMethod.Get)).EnsureOk().Items; } + public virtual async Task> GetAll(int offset, int amount) + { + return (await client.SendRequest.Items>(ApiEndpoint, HttpMethod.Get, new ApiParameterCollection + { + ["offset"] = offset, + ["amount"] = amount, + })).EnsureOk().Items; + } + public virtual async Task Get(int id) { return (await client.SendRequest.Item>($"{ApiEndpoint}/{id}", HttpMethod.Get)).EnsureOk().Item; diff --git a/Pilz.Net/Api/Client/IBaseChildItemClient.cs b/Pilz.Net/Api/Client/IBaseChildItemClient.cs index 57ec171..c5f299b 100644 --- a/Pilz.Net/Api/Client/IBaseChildItemClient.cs +++ b/Pilz.Net/Api/Client/IBaseChildItemClient.cs @@ -5,5 +5,6 @@ namespace Pilz.Net.Api.Client; public interface IBaseChildItemClient : IBaseClient where T : IDataObject { Task> GetAll(int parentId); + Task> GetAll(int parentId, int offset, int count); Task Save(T item, int parentId); } diff --git a/Pilz.Net/Api/Client/IBaseClient.cs b/Pilz.Net/Api/Client/IBaseClient.cs index 325e573..401b761 100644 --- a/Pilz.Net/Api/Client/IBaseClient.cs +++ b/Pilz.Net/Api/Client/IBaseClient.cs @@ -7,5 +7,6 @@ public interface IBaseClient where T : IDataObject Task Delete(int id); Task Get(int id); Task> GetAll(); + Task> GetAll(int offset, int amount); Task Save(T item); } diff --git a/Pilz.Net/Api/Server/BaseChildItemHandler.cs b/Pilz.Net/Api/Server/BaseChildItemHandler.cs index e92ac6b..4d3e0c1 100644 --- a/Pilz.Net/Api/Server/BaseChildItemHandler.cs +++ b/Pilz.Net/Api/Server/BaseChildItemHandler.cs @@ -45,20 +45,27 @@ public abstract class BaseChildItemHandler(IApiSer server.RegisterHandler(t.GetMethod(nameof(Post))!.CreateDelegate(this), new(RouteParent + "/{pid}" + RouteChild, "POST"), Debugger.IsAttached); } - public virtual ApiResult GetAll(int pid) + public virtual ApiResult GetAll(int pid, int offset, int amount) { - IQueryable list; + IQueryable entities; if (pid != 0) { if (!server.Manager.Find(pid, out TParent? parentEntity)) return ApiResult.NotFound(); - list = GetChilds(parentEntity).AsQueryable(); + entities = GetChilds(parentEntity).AsQueryable(); } else - list = server.Manager.Get(); + entities = server.Manager.Get(); - return SortEntities(list).ToList().Select(ToClient).ToItemsResult(); + entities = SortEntities(entities); + + if (offset > 0) + entities = entities.Skip(offset); + if (amount > 0) + entities = entities.Take(amount); + + return SortEntities(entities).ToList().Select(ToClient).ToItemsResult(); } public virtual ApiResult Post(int pid, TUpdateMsg msg, ApiRequestInfo req) diff --git a/Pilz.Net/Api/Server/BaseItemHandler.cs b/Pilz.Net/Api/Server/BaseItemHandler.cs index 7bd23b5..08ef5d3 100644 --- a/Pilz.Net/Api/Server/BaseItemHandler.cs +++ b/Pilz.Net/Api/Server/BaseItemHandler.cs @@ -24,9 +24,14 @@ public abstract class BaseItemHandler(IApiServer server) server.RegisterHandler(t.GetMethod(nameof(Post))!.CreateDelegate(this), new(Route, "POST"), Debugger.IsAttached); } - public virtual ApiResult GetAll() + public virtual ApiResult GetAll(int offset, int amount) { - return SortEntities(server.Manager.Get()).ToList().Select(ToClient).ToItemsResult(); + var entities = SortEntities(server.Manager.Get()); + if (offset > 0) + entities = entities.Skip(offset); + if (amount > 0) + entities = entities.Take(amount); + return entities.ToList().Select(ToClient).ToItemsResult(); } public virtual ApiResult Post(TUpdateMsg msg, ApiRequestInfo req)