using System.ComponentModel.DataAnnotations;
using Dpz.Core.Entity.Base.MapperConfig;
using Dpz.Core.EnumLibrary;
using Dpz.Core.Public.Entity;
using Mapster;

namespace Dpz.Core.Public.ViewModel;

public class MembleComment : IHaveCustomMapping
{
    /// <summary>
    /// 评论类型
    /// </summary>
    [Required(ErrorMessage = "comment node is empty.")]
    public required CommentNode Node { get; set; }

    /// <summary>
    /// 关联
    /// </summary>
    [
        Required(ErrorMessage = "relation is empty."),
        MaxLength(500, ErrorMessage = "relation max length 20.")
    ]
    public required string Relation { get; set; }

    /// <summary>
    /// 回复内容
    /// </summary>
    [
        Required(ErrorMessage = "请输入回复内容"),
        MaxLength(2000, ErrorMessage = "回复内容最大长度为2000")
    ]
    public required string CommentText { get; set; }

    /// <summary>
    /// 回复ID
    /// </summary>
    [MaxLength(50, ErrorMessage = "reply id max length 15")]
    public string? ReplyId { get; set; }

    public VmUserInfo? User { get; set; }

    public static void CreateMappings(TypeAdapterConfig cfg)
    {
        cfg.NewConfig<MembleComment, Comment>().MapWith(x => CreateCommentEntity(x));
    }

    private static Comment CreateCommentEntity(MembleComment viewModel)
    {
        var entity = new Comment
        {
            Node = viewModel.Node,
            Relation = viewModel.Relation,
            CommentText = viewModel.CommentText,
            Commenter = new MembleCommenter()
            {
                Avatar =
                    viewModel.User?.Avatar
                    ?? throw new ArgumentNullException(nameof(viewModel.User)),
                Identity =
                    viewModel.User?.Permissions?.HasFlag(Permissions.System) == true
                        ? "管理员"
                        : "成员",
                NickName =
                    viewModel.User?.Name ?? throw new ArgumentNullException(nameof(viewModel.User)),
            },
        };
        return entity;
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

这是一个C#代码文件,定义了一个名为MembleComment的视图模型类,主要用于处理评论相关的数据传输和映射。让我详细解释一下:

类的基本结构

public class MembleComment : IHaveCustomMapping
  • 继承了IHaveCustomMapping接口,表示这个类有自定义的映射配置
  • 这是一个视图模型(ViewModel)类,通常用于在前端和后端之间传输数据

属性定义

1. Node (评论类型)

[Required(ErrorMessage = "comment node is empty.")]
public required CommentNode Node { get; set; }
  • 必填字段,使用了CommentNode枚举类型
  • 用于标识评论的节点类型

2. Relation (关联)

[Required(ErrorMessage = "relation is empty."),
 MaxLength(500, ErrorMessage = "relation max length 20.")]
public required string Relation { get; set; }
  • 必填字符串字段,最大长度500字符(注意:错误消息写的是20,但实际验证是500)
  • 用于存储评论的关联信息

3. CommentText (回复内容)

[Required(ErrorMessage = "请输入回复内容"),
 MaxLength(2000, ErrorMessage = "回复内容最大长度为2000")]
public required string CommentText { get; set; }
  • 必填字段,评论的具体内容
  • 最大长度2000字符

4. ReplyId (回复ID)

[MaxLength(50, ErrorMessage = "reply id max length 15")]
public string? ReplyId { get; set; }
  • 可选字段,用于标识这是对某个评论的回复
  • 最大长度50字符(错误消息显示15,但验证是50)

5. User (用户信息)

public VmUserInfo? User { get; set; }
  • 可选的用户信息对象

映射配置

CreateMappings方法

public static void CreateMappings(TypeAdapterConfig cfg)
{
    cfg.NewConfig<MembleComment, Comment>().MapWith(x => CreateCommentEntity(x));
}
  • 使用Mapster库配置从MembleCommentComment实体的映射
  • 指定使用自定义的CreateCommentEntity方法进行映射

CreateCommentEntity方法

private static Comment CreateCommentEntity(MembleComment viewModel)
{
    var entity = new Comment
    {
        Node = viewModel.Node,
        Relation = viewModel.Relation,
        CommentText = viewModel.CommentText,
        Commenter = new MembleCommenter()
        {
            Avatar = viewModel.User?.Avatar ?? throw new ArgumentNullException(nameof(viewModel.User)),
            Identity = viewModel.User?.Permissions?.HasFlag(Permissions.System) == true ? "管理员" : "成员",
            NickName = viewModel.User?.Name ?? throw new ArgumentNullException(nameof(viewModel.User)),
        },
    };
    return entity;
}

这个方法的主要功能:

  1. 创建新的Comment实体对象
  2. 直接映射基本属性(Node、Relation、CommentText)
  3. 创建MembleCommenter对象,包含:
    • Avatar: 用户头像,如果为空则抛出异常
    • Identity: 根据用户权限判断身份(系统权限=管理员,否则=成员)
    • NickName: 用户昵称,如果为空则抛出异常

总结

这个类的主要作用是:

  1. 作为评论数据的传输对象,包含数据验证规则
  2. 提供从视图模型到实体模型的自定义映射逻辑
  3. 处理用户身份识别和评论者信息的构建
  4. 确保关键用户信息不为空,否则抛出异常

这是一个典型的DDD(领域驱动设计)模式中的应用服务层对象,用于处理业务逻辑和数据转换。

评论加载中...