namespace Dpz.Core.Service.Mediator.Features.Auth.Contracts;

using Dpz.Core.Public.Entity.Auth;
using Entity.Base.MapperConfig;
using Mapster;

/// <summary>
/// 认证应用分页项
/// </summary>
public class AuthApplicationPageItem : IHaveCustomMapping
{
    /// <summary>
    /// 应用标识
    /// </summary>
    public string Id { get; set; } = string.Empty;

    /// <summary>
    /// 客户端标识
    /// </summary>
    public string ClientId { get; set; } = string.Empty;

    /// <summary>
    /// 显示名称
    /// </summary>
    public string? DisplayName { get; set; }

    /// <summary>
    /// 应用类型
    /// </summary>
    public string? ApplicationType { get; set; }

    /// <summary>
    /// 客户端类型
    /// </summary>
    public string? ClientType { get; set; }

    /// <summary>
    /// 回调地址
    /// </summary>
    public List<string> RedirectUris { get; set; } = [];

    /// <summary>
    /// 登出回调地址
    /// </summary>
    public string? PostLogoutRedirectUri { get; set; }

    /// <summary>
    /// 应用图标
    /// </summary>
    public string? Logo { get; set; }

    /// <summary>
    /// 权限
    /// </summary>
    public List<string> Permissions { get; set; } = [];

    public static void CreateMappings(TypeAdapterConfig cfg)
    {
        cfg.NewConfig<DpzApplication, AuthApplicationPageItem>()
            .Map(dest => dest.Id, src => src.Id.ToString())
            .Map(dest => dest.RedirectUris, src => SplitRedirectUris(src.RedirectUris))
            .Map(dest => dest.Permissions, src => src.Permissions)
            .Map(dest => dest.Logo, src => GetLogo(src));
    }

    private static List<string> SplitRedirectUris(string? redirectUris)
    {
        return string.IsNullOrWhiteSpace(redirectUris)
            ? []
            : redirectUris
                .Split(';', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries)
                .ToList();
    }

    private static string? GetLogo(DpzApplication application)
    {
        return application.Properties.TryGetValue("Logo", out var logo)
            ? logo.IsString
                ? logo.AsString
                : logo.ToString()
            : null;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个用于认证应用分页查询结果项的数据传输对象(DTO)类,使用了 Mapster 进行对象映射配置。

主要组成部分:

1. 类定义

public class AuthApplicationPageItem : IHaveCustomMapping
  • 实现了 IHaveCustomMapping 接口,表明该类需要自定义对象映射规则
  • 用于在分页查询时返回认证应用的基本信息

2. 属性定义

包含了认证应用的核心信息字段:

  • Id: 应用唯一标识(字符串类型)
  • ClientId: OAuth/OIDC 客户端标识
  • DisplayName: 应用显示名称
  • ApplicationType: 应用类型(如 Web、Native 等)
  • ClientType: 客户端类型(如 Confidential、Public)
  • RedirectUris: OAuth 回调地址列表
  • PostLogoutRedirectUri: 登出后的重定向地址
  • Logo: 应用图标 URL
  • Permissions: 应用拥有的权限列表

3. 自定义映射配置 (CreateMappings 方法)

public static void CreateMappings(TypeAdapterConfig cfg)

定义了从 DpzApplication 实体到 AuthApplicationPageItem DTO 的映射规则:

  • ID 转换: 将实体的 Id 转换为字符串
  • RedirectUris 处理: 调用 SplitRedirectUris 方法将分号分隔的字符串拆分为列表
  • Permissions 直接映射: 权限列表直接复制
  • Logo 提取: 调用 GetLogo 方法从应用属性中提取 Logo

4. 辅助方法

SplitRedirectUris:

  • 将分号分隔的回调地址字符串拆分为字符串列表
  • 自动移除空条目和首尾空格
  • 空字符串返回空列表

GetLogo:

  • DpzApplicationProperties 字典中尝试获取 "Logo" 键的值
  • 如果值是字符串类型,返回 AsString
  • 否则调用 ToString() 方法
  • 找不到则返回 null

设计特点:

  • 使用 C# 11+ 的简化语法(如 = [] 初始化集合)
  • 采用 Mapster 进行灵活的对象映射
  • 将存储格式(分号分隔字符串)转换为友好的列表格式
  • 支持动态属性提取(Logo 从 Properties 字典获取)
评论加载中...