ApiResponse.cs 4.53 KB
namespace Rcs.Application.Common
{
    /// <summary>
    /// API响应统一包装类
    /// </summary>
    /// <typeparam name="T">数据类型</typeparam>
    public class ApiResponse<T>
    {
        /// <summary>
        /// 是否成功
        /// </summary>
        public bool Success { get; set; }

        /// <summary>
        /// 业务状态码
        /// </summary>
        public int Code { get; set; }

        /// <summary>
        /// 响应消息
        /// </summary>
        public string Message { get; set; }

        /// <summary>
        /// 响应数据
        /// </summary>
        public T Data { get; set; }

        /// <summary>
        /// 时间戳
        /// </summary>
        public long Timestamp { get; set; }

        /// <summary>
        /// 错误详情(用于验证错误等)
        /// </summary>
        public Dictionary<string, string[]>? Errors { get; set; }

        /// <summary>
        /// 元数据(用于分页信息等)
        /// </summary>
        public object? Metadata { get; set; }

        public ApiResponse()
        {
            Timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
        }

        /// <summary>
        /// 创建成功响应
        /// </summary>
        /// <param name="data">响应数据</param>
        /// <param name="message">消息</param>
        /// <param name="code">业务状态码</param>
        /// <returns></returns>
        public static ApiResponse<T> Successful(T data, string message = "操作成功", int code = 200)
        {
            return new ApiResponse<T>
            {
                Success = true,
                Code = code,
                Message = message,
                Data = data
            };
        }

        /// <summary>
        /// 创建成功响应(无数据)
        /// </summary>
        /// <param name="message">消息</param>
        /// <param name="code">业务状态码</param>
        /// <returns></returns>
        public static ApiResponse<T> Successful(string message = "操作成功", int code = 200)
        {
            return new ApiResponse<T>
            {
                Success = true,
                Code = code,
                Message = message,
                Data = default
            };
        }

        /// <summary>
        /// 创建失败响应
        /// </summary>
        /// <param name="message">错误消息</param>
        /// <param name="code">业务状态码</param>
        /// <param name="data">响应数据</param>
        /// <returns></returns>
        public static ApiResponse<T> Failed(string message, int code = 400, T data = default)
        {
            return new ApiResponse<T>
            {
                Success = false,
                Code = code,
                Message = message,
                Data = data
            };
        }

        /// <summary>
        /// 创建验证失败响应
        /// </summary>
        /// <param name="errors">验证错误详情</param>
        /// <param name="message">错误消息</param>
        /// <returns></returns>
        public static ApiResponse<T> ValidationFailed(Dictionary<string, string[]> errors, string message = "验证失败")
        {
            return new ApiResponse<T>
            {
                Success = false,
                Code = 400,
                Message = message,
                Data = default,
                Errors = errors
            };
        }

        /// <summary>
        /// 设置元数据
        /// </summary>
        /// <param name="metadata">元数据对象</param>
        /// <returns></returns>
        public ApiResponse<T> WithMetadata(object metadata)
        {
            Metadata = metadata;
            return this;
        }
    }

    /// <summary>
    /// 非泛型API响应类(用于无数据返回的场景)
    /// </summary>
    public class ApiResponse : ApiResponse<object>
    {
        /// <summary>
        /// 创建成功响应
        /// </summary>
        public static new ApiResponse Successful(string message = "操作成功", int code = 200)
        {
            return new ApiResponse
            {
                Success = true,
                Code = code,
                Message = message
            };
        }

        /// <summary>
        /// 创建失败响应
        /// </summary>
        public static new ApiResponse Failed(string message, int code = 400)
        {
            return new ApiResponse
            {
                Success = false,
                Code = code,
                Message = message
            };
        }
    }
}