using Dpz.Core.MessageQueue.Abstractions;
using Dpz.Core.Public.ViewModel.Messages;

namespace Dpz.Core.Service.Mediator.Features.Markdown.Commands;

/// <summary>
/// 处理 Markdown 编辑:提取图片地址并发布已删除图片的清理消息。
/// </summary>
public class EditMarkdownEvent(IMessagePublisher<RemoveImagesMessage> removeImageMessagePublisher)
    : IRequestHandler<EditMarkdownRequest, List<string>>
{
    private readonly HtmlParser _htmlParse = new();

    /// <summary>
    /// 对比新旧 Markdown,返回当前图片集合并清理失效图片。
    /// </summary>
    public async ValueTask<List<string>> Handle(
        EditMarkdownRequest request,
        CancellationToken cancellationToken
    )
    {
        if (string.IsNullOrWhiteSpace(request.OriginalMarkdown))
        {
            return await GetImagesByMarkdownAsync(request.Markdown ?? string.Empty);
        }

        var originalImages = await GetImagesByMarkdownAsync(request.OriginalMarkdown);
        var images = await GetImagesByMarkdownAsync(request.Markdown ?? string.Empty);

        var missingImages = originalImages.Except(images).ToList();

        await removeImageMessagePublisher.PublishBatchAsync(
            missingImages.Select(x => new RemoveImagesMessage { ImageUrl = x }),
            cancellationToken: cancellationToken
        );

        return images;
    }

    private async Task<List<string>> GetImagesByMarkdownAsync(string markdown)
    {
        var htmlContent = markdown.MarkdownToHtml();
        var document = await _htmlParse.ParseDocumentAsync(htmlContent);
        var imageElements = document.GetElementsByTagName("img");
        return imageElements.GetElementsImageUrls();
    }
}
评论加载中...