XFE Git
XFE Studio Git
Git 首页 全局搜索
XFE 主站 文档 NuGet

XFEExtension.NetCore.ServerInteractive

[DLL] Server interaction extension, including user identity verification and querying in conjunction with AutoConfig

公开
关注 0 Fork 0 Star 0
UTF-8
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;

/// <summary>
/// 表格请求器
/// </summary>
public class TableRequester : IRequesterBase
{
    /// <summary>
    /// 请求地址
    /// </summary>
    public string RequestAddress { get; set; } = string.Empty;
    /// <summary>
    /// 电脑信息
    /// </summary>
    public string DeviceInfo { get; set; } = string.Empty;
    /// <summary>
    /// 用户登录Session
    /// </summary>
    public string Session { get; set; } = string.Empty;
    /// <summary>
    /// Json序列化选项
    /// </summary>
    public JsonSerializerOptions? JsonSerializerOptions { get; set; }
    /// <summary>
    /// 请求消息返回事件
    /// </summary>
    public event XFEEventHandler<object?, ServerInteractiveEventArgs>? MessageReceived;

    private static string GetRequestName<T>() => $"{typeof(T).Name[0]}".ToLower() + typeof(T).Name[1..];

    /// <summary>
    /// 获取Table列表(分页)
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="tableName">表名称</param>
    /// <param name="pageCount">每页个数</param>
    /// <param name="page">当前页面</param>
    /// <returns>表内容</returns>
    public async Task<TableRequestResult<T>> Get<T>(string tableName, int pageCount, int page) where T : IIdModel
    {
        try
        {
            var (response, code) = await InteractiveHelper.GetServerResponse($"{RequestAddress}/table/get/{tableName}", new
            {
                pageCount,
                page,
                session = Session,
                deviceInfo = DeviceInfo
            }.ToJson());
            if (code == HttpStatusCode.OK)
            {
                MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code));
                var result = JsonSerializer.Deserialize<TableRequestResult<T>>(response, JsonSerializerOptions);
                return result ?? new();
            }

            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code));
            return new();
        }
        catch (Exception ex)
        {
            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError));
            return new();
        }
    }

    /// <summary>
    /// 获取Table列表(分页)
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <returns>表内容</returns>
    public async Task<TableRequestResult<T>> Get<T>(int pageCount, int page) where T : IIdModel => await Get<T>(GetRequestName<T>(), pageCount, page);

    /// <summary>
    /// 获取Table列表
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <returns>表内容</returns>
    public async Task<TableRequestResult<T>> Get<T>() where T : IIdModel => await Get<T>(-1, -1);

    /// <summary>
    /// 向表中添加一个数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="tableName">表名称</param>
    /// <param name="data">数据</param>
    /// <returns>是否添加成功</returns>
    public async Task<bool> Add<T>(string tableName, T data) where T : IIdModel
    {
        try
        {
            var (response, code) = await InteractiveHelper.GetServerResponse($"{RequestAddress}/table/add/{tableName}", new
            {
                data = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data, JsonSerializerOptions))),
                session = Session,
                deviceInfo = DeviceInfo
            }.ToJson());
            if (code == HttpStatusCode.OK)
            {
                MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code));
                return true;
            }

            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code));
            return false;
        }
        catch (Exception ex)
        {
            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError));
            return false;
        }
    }

    /// <summary>
    /// 向表中添加一个数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="data">数据</param>
    /// <returns>是否添加成功</returns>
    public async Task<bool> Add<T>(T data) where T : IIdModel => await Add(GetRequestName<T>(), data);

    /// <summary>
    /// 从表中删除一个数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="tableName">表名称</param>
    /// <param name="id">元素的ID</param>
    /// <returns>是否删除成功</returns>
    public async Task<bool> Remove<T>(string tableName, string id) where T : IIdModel
    {
        try
        {
            var (response, code) = await InteractiveHelper.GetServerResponse($"{RequestAddress}/table/remove/{tableName}", new
            {
                id,
                session = Session,
                deviceInfo = DeviceInfo
            }.ToJson());
            if (code == HttpStatusCode.OK)
            {
                MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code));
                return true;
            }

            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code));
            return false;
        }
        catch (Exception ex)
        {
            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError));
            return false;
        }
    }

    /// <summary>
    /// 从表中删除一个数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="id">元素的ID</param>
    /// <returns>是否删除成功</returns>
    public async Task<bool> Remove<T>(string id) where T : IIdModel => await Remove<T>(GetRequestName<T>(), id);

    /// <summary>
    /// 更改表中的数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="tableName">表名称</param>
    /// <param name="data">数据</param>
    /// <returns></returns>
    public async Task<bool> Change<T>(string tableName, T data) where T : IIdModel
    {
        try
        {
            var (response, code) = await InteractiveHelper.GetServerResponse($"{RequestAddress}/table/change/{tableName}", new
            {
                data = Convert.ToBase64String(Encoding.UTF8.GetBytes(JsonSerializer.Serialize(data, JsonSerializerOptions))),
                session = Session,
                deviceInfo = DeviceInfo
            }.ToJson());
            if (code == HttpStatusCode.OK)
            {
                MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl("Success", code));
                return true;
            }

            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(response, code));
            return false;
        }
        catch (Exception ex)
        {
            MessageReceived?.Invoke(this, new ServerInteractiveEventArgsImpl(ex.Message, HttpStatusCode.InternalServerError));
            return false;
        }
    }

    /// <summary>
    /// 更改表中的数据
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    /// <param name="data">数据</param>
    /// <returns>是否修改成功</returns>
    public async Task<bool> Change<T>(T data) where T : IIdModel => await Change(GetRequestName<T>(), data);
}