using System.Net; using System.Text; using System.Text.Json; using XFEExtension.NetCore.DelegateExtension; using XFEExtension.NetCore.ServerInteractive.Interfaces.Requester; using XFEExtension.NetCore.ServerInteractive.Models; using XFEExtension.NetCore.ServerInteractive.Models.RequesterModels; using XFEExtension.NetCore.ServerInteractive.Utilities.Helpers; using XFEExtension.NetCore.StringExtension.Json; namespace XFEExtension.NetCore.ServerInteractive.Utilities.Requester; /// /// 表格请求器 /// public class TableRequester : IRequesterBase { /// /// 请求地址 /// public string RequestAddress { get; set; } = string.Empty; /// /// 电脑信息 /// public string DeviceInfo { get; set; } = string.Empty; /// /// 用户登录Session /// public string Session { get; set; } = string.Empty; /// /// Json序列化选项 /// public JsonSerializerOptions? JsonSerializerOptions { get; set; } /// /// 请求消息返回事件 /// public event XFEEventHandler? MessageReceived; private static string GetRequestName() => $"{typeof(T).Name[0]}".ToLower() + typeof(T).Name[1..]; /// /// 获取Table列表(分页) /// /// 数据类型 /// 表名称 /// 每页个数 /// 当前页面 /// 表内容 public Task> Get(string tableName, int pageSize, int page) where T : IIdModel => GetAsync(tableName, pageSize, page, CancellationToken.None); /// 获取 Table 列表(分页、支持取消)。 public async Task> GetAsync(string tableName, int pageSize, int page, CancellationToken cancellationToken) where T : IIdModel { try { if (pageSize != -1 && (pageSize is < 1 or > 1000 || page < 1)) throw new ArgumentOutOfRangeException(nameof(pageSize), "pageSize 必须介于 1 和 1000 之间,page 必须大于等于 1"); var requestUri = BuildTableUri("get", tableName); var (response, code) = await InteractiveHelper.GetServerResponse(requestUri, new { pageSize, page, session = Session, deviceInfo = DeviceInfo }, JsonSerializerOptions ?? new(), cancellationToken); if (code == HttpStatusCode.OK) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl("Success", code)); var result = JsonSerializer.Deserialize>(response, JsonSerializerOptions); return result ?? new(); } NotifyMessageReceived(new ServerInteractiveEventArgsImpl(response, code)); return new(); } catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { throw; } catch (Exception ex) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError)); return new(); } } /// /// 获取Table列表(分页) /// /// 数据类型 /// 表内容 public Task> Get(int pageSize, int page) where T : IIdModel => Get(GetRequestName(), pageSize, page); /// 获取默认名称的 Table 列表(分页、支持取消)。 public Task> GetAsync(int pageSize, int page, CancellationToken cancellationToken) where T : IIdModel => GetAsync(GetRequestName(), pageSize, page, cancellationToken); /// /// 获取Table列表 /// /// 数据类型 /// 表内容 public Task> Get() where T : IIdModel => Get(-1, -1); /// /// 向表中添加一个数据 /// /// 数据类型 /// 表名称 /// 数据 /// 是否添加成功 public Task Add(string tableName, T data) where T : IIdModel => AddAsync(tableName, data, CancellationToken.None); /// 向 Table 添加数据(支持取消)。 public async Task AddAsync(string tableName, T data, CancellationToken cancellationToken) where T : IIdModel { try { var (response, code) = await InteractiveHelper.GetServerResponse(BuildTableUri("add", tableName), new { data = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data, JsonSerializerOptions))), session = Session, deviceInfo = DeviceInfo }, JsonSerializerOptions ?? new(), cancellationToken); if ((int)code is >= 200 and < 300) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl("Success", code)); return true; } NotifyMessageReceived(new ServerInteractiveEventArgsImpl(response, code)); return false; } catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { throw; } catch (Exception ex) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError)); return false; } } /// /// 向表中添加一个数据 /// /// 数据类型 /// 数据 /// 是否添加成功 public Task Add(T data) where T : IIdModel => Add(GetRequestName(), data); /// 向默认名称的 Table 添加数据(支持取消)。 public Task AddAsync(T data, CancellationToken cancellationToken) where T : IIdModel => AddAsync(GetRequestName(), data, cancellationToken); /// /// 从表中删除一个数据 /// /// 数据类型 /// 表名称 /// 元素的ID /// 是否删除成功 public Task Remove(string tableName, string id) where T : IIdModel => RemoveAsync(tableName, id, CancellationToken.None); /// 从 Table 删除数据(支持取消)。 public async Task RemoveAsync(string tableName, string id, CancellationToken cancellationToken) where T : IIdModel { try { var (response, code) = await InteractiveHelper.GetServerResponse(BuildTableUri("remove", tableName), new { id, session = Session, deviceInfo = DeviceInfo }, JsonSerializerOptions ?? new(), cancellationToken); if ((int)code is >= 200 and < 300) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl("Success", code)); return true; } NotifyMessageReceived(new ServerInteractiveEventArgsImpl(response, code)); return false; } catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { throw; } catch (Exception ex) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError)); return false; } } /// /// 从表中删除一个数据 /// /// 数据类型 /// 元素的ID /// 是否删除成功 public Task Remove(string id) where T : IIdModel => Remove(GetRequestName(), id); /// 从默认名称的 Table 删除数据(支持取消)。 public Task RemoveAsync(string id, CancellationToken cancellationToken) where T : IIdModel => RemoveAsync(GetRequestName(), id, cancellationToken); /// /// 更改表中的数据 /// /// 数据类型 /// 表名称 /// 数据 /// public Task Change(string tableName, T data) where T : IIdModel => ChangeAsync(tableName, data, CancellationToken.None); /// 更改 Table 数据(支持取消)。 public async Task ChangeAsync(string tableName, T data, CancellationToken cancellationToken) where T : IIdModel { try { var (response, code) = await InteractiveHelper.GetServerResponse(BuildTableUri("change", tableName), new { data = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data, JsonSerializerOptions))), session = Session, deviceInfo = DeviceInfo }, JsonSerializerOptions ?? new(), cancellationToken); if ((int)code is >= 200 and < 300) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl("Success", code)); return true; } NotifyMessageReceived(new ServerInteractiveEventArgsImpl(response, code)); return false; } catch (OperationCanceledException) when (cancellationToken.IsCancellationRequested) { throw; } catch (Exception ex) { NotifyMessageReceived(new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError)); return false; } } /// /// 更改表中的数据 /// /// 数据类型 /// 数据 /// 是否修改成功 public Task Change(T data) where T : IIdModel => Change(GetRequestName(), data); /// 更改默认名称的 Table 数据(支持取消)。 public Task ChangeAsync(T data, CancellationToken cancellationToken) where T : IIdModel => ChangeAsync(GetRequestName(), data, cancellationToken); private Uri BuildTableUri(string operation, string tableName) => InteractiveHelper.BuildRequestUri(RequestAddress, $"table/{operation}/{Uri.EscapeDataString(tableName)}"); private void NotifyMessageReceived(ServerInteractiveEventArgs args) { try { MessageReceived?.Invoke(this, args); } catch (Exception) { } } }