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

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(MapperConfigurationExpression cfg)
    {
        cfg.CreateMap<MembleComment, Comment>()
            .ConstructUsing(
                (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分析的结果,请根据实际情况进行判断。

这段代码定义了一个名为 MembleComment 的类,它实现了 IHaveCustomMapping 接口,并使用了 AutoMapper 库来进行对象映射。以下是对代码的详细解释:

类的定义

  • 命名空间: Dpz.Core.Public.ViewModel,表示该类属于公共视图模型部分。
  • 类名: MembleComment,表示这是一个与评论相关的视图模型。

属性

  1. Node:

    • 类型: CommentNode
    • 特性: [Required],表示该属性是必需的,且如果为空会返回错误信息 "comment node is empty."。
    • 功能: 表示评论的类型。
  2. Relation:

    • 类型: string
    • 特性: [Required][MaxLength(500)],表示该属性是必需的,且最大长度为500个字符。
    • 功能: 表示与评论相关的内容或对象。
  3. CommentText:

    • 类型: string
    • 特性: [Required][MaxLength(2000)],表示该属性是必需的,且最大长度为2000个字符。
    • 功能: 表示评论的具体内容。
  4. ReplyId:

    • 类型: string?(可空类型)
    • 特性: [MaxLength(50)],表示最大长度为50个字符。
    • 功能: 表示回复的ID,如果该评论是对其他评论的回复。
  5. User:

    • 类型: VmUserInfo?(可空类型)
    • 功能: 表示评论者的用户信息。

方法

  • CreateMappings:
    • 参数: MapperConfigurationExpression cfg,用于配置映射。
    • 功能: 使用 AutoMapper 创建从 MembleCommentComment 的映射。
    • 映射逻辑:
      • 创建一个新的 Comment 实体,并将 MembleComment 的属性映射到 Comment 的相应属性。
      • Commenter 属性被初始化为 MembleCommenter 对象,其中包含评论者的头像、身份(管理员或成员)和昵称。

总结

整体来看,MembleComment 类用于表示一个评论的视图模型,包含了评论的基本信息和评论者的信息。通过实现 IHaveCustomMapping 接口,类能够与 AutoMapper 配合使用,将视图模型转换为数据实体(Comment)。这使得在处理评论时,可以方便地将用户输入的数据映射到后端的数据结构中。

评论加载中...