namespace Yes.Domain.Articles
{
[Table("Article")]
public class ArticleEntity
{
[Key]
public int Id { get; private set; }
///
/// 作者ID
///
[ForeignKey(nameof(Author))]
public int UserId { get; private set; }
public UserEntity? Author { get; private set; }
///
/// 分类ID
///
[ForeignKey(nameof(Category))]
public int CategoryId { get; private set; }
public CategoryEntity? Category { get; private set; }
///
/// 标题
///
public string Title { get; private set; } = string.Empty;
public string Slug { get; private set; } = string.Empty;
///
/// 内容
///
public string Content { get; private set; } = string.Empty;
///
/// 封面图
///
public string CoverUrl { get; private set; } = string.Empty;
///
/// 摘要
///
public string Summary { get; private set; } = string.Empty;
///
/// 标签
///
public string Tag { get; private set; } = string.Empty;
///
/// 创建时间
///
public DateTime CreateDate { get; private set; }
///
/// 删除时间
///
public DateTime DeleteDate { get; private set; }
///
/// 发布时间
///
public DateTime PublishDate { get; private set; }
///
/// 修改时间
///
public DateTime ModifyDate { get; private set; }
///
/// 是否允许评论
///
public bool CanComment { get; private set; }
///
/// 评论数
///
public int CommentCount { get; private set; }
///
/// 密码,不为空时需要输入密码才可查看
///
public string Password { get; private set; } = string.Empty;
///
/// 排序值
///
public int Sort { get; private set; }
///
/// 文章类型
///
public ArticleTypeEnum Type { get; private set; }
///
/// 文章状态
///
public ArticleStatusEnum Status { get; private set; }
///
/// 阅读数
///
public int ReadCount { get; private set; }
public static ArticleEntity CreatePage(string title, string content, string summary, string slug, string coverUrl,int sort, ValueObject authorObject)
{
var author = authorObject.Value;
var authorId = authorObject.Id;
var page = new ArticleEntity()
{
Author = author ?? throw new UserNotExistsException(authorId),
UserId = authorId,
Content = content ?? "",
Status = ArticleStatusEnum.Normal,
Summary = summary ?? "",
Title = title ?? "",
CategoryId = 0,
Tag = "",
CoverUrl = coverUrl ?? "",
Slug = slug ?? "",
Type = ArticleTypeEnum.Page,
CanComment = true,
CommentCount = 0,
ReadCount = 0,
Sort = sort,
Password = "",
CreateDate = DateTime.Now,
PublishDate = DateTime.Now,
ModifyDate= DateTime.Now
};
page.CheckSummary();
return page;
}
public static ArticleEntity CreateDraft(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject)
{
var category = categoryObject.Value;
var categoryId = categoryObject.Id;
var author = authorObject.Value;
var authorId = authorObject.Id;
return new ArticleEntity()
{
Author = author ?? throw new UserNotExistsException(authorId),
UserId = authorId,
Content = content ?? "",
Status = ArticleStatusEnum.Draft,
Summary = summary ?? "",
Title = title ?? "",
Category = category,
CategoryId = categoryId,
Tag = string.Join(",", tags.Distinct()),
CoverUrl = coverUrl ?? "",
Slug = slug ?? "",
Type = ArticleTypeEnum.Article,
CanComment = true,
CommentCount = 0,
ReadCount = 0,
Sort = 0,
Password = "",
CreateDate = DateTime.Now,
ModifyDate = DateTime.Now
};
}
public static ArticleEntity CreateArticle(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject)
{
var article = CreateDraft(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject);
article.CheckCategory();
article.Publish();
article.CheckSummary();
return article;
}
public void UpdateDraft(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject)
{
Update(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject);
Draft();
}
public void UpdateArticle(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject)
{
Update(title, content, summary, tags, slug, coverUrl, authorObject, categoryObject);
CheckCategory();
Publish();
CheckSummary();
}
public void UpdatePage(string title, string content, string summary, string slug, string coverUrl,int sort, ValueObject authorObject)
{
var author = authorObject.Value;
var authorId = authorObject.Id;
Title = title ?? "";
Content = content ?? "";
Summary = summary ?? "";
Tag = "";
Slug = slug ?? "";
CoverUrl = coverUrl ?? "";
Author = author ?? throw new UserNotExistsException(authorId);
UserId = authorId;
CategoryId = 0;
Sort = sort;
CheckSummary();
}
public bool IsPage()
{
return Type == ArticleTypeEnum.Page;
}
public bool IsArticle()
{
return Type == ArticleTypeEnum.Article;
}
public bool IsSlugEmpty()
{
return string.IsNullOrEmpty(Slug);
}
public bool IsSlugDifferent(string slug)
{
return !string.Equals(Slug, slug);
}
public void UpdateSlug(string slug)
{
if (string.IsNullOrEmpty(Slug))
{
Slug = slug;
}
}
public void Delete()
{
Status = ArticleStatusEnum.Deleted;
DeleteDate = DateTime.Now;
}
private void Update(string title, string content, string summary, List tags, string slug, string coverUrl, ValueObject authorObject, ValueObject categoryObject)
{
var category = categoryObject.Value;
var categoryId = categoryObject.Id;
var author = authorObject.Value;
var authorId = authorObject.Id;
Title = title ?? "";
Content = content ?? "";
Summary = summary ?? "";
Tag = string.Join(",", tags.Distinct());
Slug = slug ?? "";
CoverUrl = coverUrl ?? "";
Author = author ?? throw new UserNotExistsException(authorId);
UserId = authorId;
Category = category;
CategoryId = categoryId;
}
private void CheckCategory()
{
if (Category == null)
{
throw new CategoryNotExistsException();
}
}
private void Publish()
{
Status = ArticleStatusEnum.Normal;
PublishDate = DateTime.Now;
}
private void Draft()
{
Status = ArticleStatusEnum.Draft;
PublishDate = DateTime.Now;
}
private void CheckSummary()
{
if (Status == ArticleStatusEnum.Normal && string.IsNullOrEmpty(Summary))
{
Summary = Content.ToSummary();
}
}
}
}