41 lines
1.2 KiB
C#
41 lines
1.2 KiB
C#
using System.Text.Json;
|
|
using Femto.Common.Domain;
|
|
using Femto.Modules.Blog.Domain.Posts.Events;
|
|
using Femto.Modules.Blog.Emoji;
|
|
|
|
namespace Femto.Modules.Blog.Domain.Posts;
|
|
|
|
internal class Post : Entity
|
|
{
|
|
public Guid Id { get; private set; }
|
|
public Guid AuthorId { get; private set; }
|
|
public string Content { get; private set; } = null!;
|
|
public IList<PostMedia> Media { get; private set; }
|
|
|
|
public IList<PostReaction> Reactions { get; private set; } = [];
|
|
public bool IsPublic { get; set; }
|
|
|
|
public DateTimeOffset PostedOn { get; private set; }
|
|
|
|
private string PossibleReactionsJson { get; set; } = null!;
|
|
|
|
public IEnumerable<string> PossibleReactions
|
|
{
|
|
get => JsonSerializer.Deserialize<IEnumerable<string>>(this.PossibleReactionsJson)!;
|
|
init => PossibleReactionsJson = JsonSerializer.Serialize(value);
|
|
}
|
|
|
|
private Post() { }
|
|
|
|
public Post(Guid authorId, string content, IList<PostMedia> media)
|
|
{
|
|
this.Id = Guid.CreateVersion7();
|
|
this.AuthorId = authorId;
|
|
this.Content = content;
|
|
this.Media = media;
|
|
this.PossibleReactions = AllEmoji.GetRandomEmoji(5);
|
|
this.PostedOn = DateTimeOffset.UtcNow;
|
|
|
|
this.AddDomainEvent(new PostCreated(this));
|
|
}
|
|
}
|