using Dpz.Core.Public.ViewModel.Request;
using Dpz.Core.Public.ViewModel.Response;

namespace Dpz.Core.Service.RepositoryService;

public interface IArticleService
{
    /// <summary>
    /// 获取一定时间内,阅读量靠前的文章
    /// </summary>
    /// <param name="days"></param>
    /// <param name="count"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<ArticleMiniResponse>> GetTopArticlesAsync(
        int days = -7,
        uint count = 8,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 随机获取文章
    /// </summary>
    /// <returns></returns>
    Task<List<ArticleMiniResponse>> GetRandomArticlesAsync(
        int sample = 8,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取用户发表的文章
    /// </summary>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<ArticleMiniResponse>> GetPublishArticlesAsync(
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取文章
    /// </summary>
    /// <param name="pageIndex">页码</param>
    /// <param name="pageSize">大小</param>
    /// <param name="title">标题</param>
    /// <param name="account">账号</param>
    /// <param name="cancellationToken"></param>
    /// <param name="tags">标签</param>
    /// <returns></returns>
    Task<IPagedList<ArticleMiniResponse>> GetPagesAsync(
        int pageIndex = 1,
        int pageSize = 20,
        string? title = "",
        string? account = "",
        CancellationToken cancellationToken = default,
        params string?[]? tags
    );

    /// <summary>
    /// 获取所有标签
    /// </summary>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<string>> GetAllTagsAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取文章详情
    /// </summary>
    /// <param name="id"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<ArticleResponse?> GetArticleAsync(
        string? id,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 查看文章
    /// </summary>
    /// <param name="id"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task ViewAsync(string id, CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取最新文章
    /// </summary>
    /// <param name="range"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<List<ArticleMiniResponse>> GetLatestAsync(
        int range = 5,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 标题是否存在
    /// </summary>
    /// <param name="title"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<bool> IsExistsAsync(string title, CancellationToken cancellationToken = default);

    /// <summary>
    /// 由From 比对 不存在的
    /// </summary>
    /// <returns></returns>
    Task<IReadOnlyCollection<string>> NoExistsByFromAsync(
        IReadOnlyCollection<string> feeds,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 删除文章
    /// </summary>
    /// <param name="id"></param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeleteAsync(string id, CancellationToken cancellationToken = default);

    /// <summary>
    /// 删除旧的CnBeta数据
    /// </summary>
    /// <param name="month">最多删除几个月前的</param>
    /// <param name="limit">按时间倒序,删除的条数</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task DeleteOldCnBetaAsync(int month, int limit, CancellationToken cancellationToken = default);

    /// <summary>
    /// 创建文章
    /// </summary>
    /// <param name="article">文章</param>
    /// <param name="creator">创建人</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<ArticleResponse> CreateArticleAsync(
        CreateArticleRequest article,
        VmUserInfo creator,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 修改文章
    /// </summary>
    /// <param name="article">文章</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task EditArticleAsync(
        EditArticleRequest article,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取文章总数
    /// </summary>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<int> GetTotalCountAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取今日文章总数
    /// </summary>
    /// <returns></returns>
    Task<int> GetTodayCountAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 清除缓存
    /// </summary>
    ValueTask ClearCacheAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 获取所有作者
    /// </summary>
    Task<List<string>> GetAllAuthorsAsync(CancellationToken cancellationToken = default);

    /// <summary>
    /// 更新文章评论数
    /// </summary>
    /// <param name="articleId">文章ID</param>
    /// <param name="count">评论数</param>
    /// <param name="cancellationToken"></param>
    Task UpdateCommentCountAsync(
        string articleId,
        int count,
        CancellationToken cancellationToken = default
    );

    /// <summary>
    /// 获取文章归档(按年月分组,分页)
    /// </summary>
    /// <param name="pageIndex">页码</param>
    /// <param name="pageSize">每页大小</param>
    /// <param name="cancellationToken"></param>
    /// <returns></returns>
    Task<ArticleArchiveResponse> GetArchivePagedAsync(
        int pageIndex = 1,
        int pageSize = 50,
        CancellationToken cancellationToken = default
    );
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

代码解释

这是一个 C# 接口定义文件,定义了文章服务(Article Service)的业务逻辑接口。

整体结构

  • 命名空间: Dpz.Core.Service.RepositoryService
  • 接口名: IArticleService
  • 用途: 定义文章管理系统的所有业务操作契约

主要功能分类

1️⃣ 文章查询功能

方法功能关键参数
GetTopArticlesAsync获取热门文章(按阅读量)days(时间范围)、count(数量)
GetRandomArticlesAsync随机获取文章sample(采样数量)
GetPublishArticlesAsync获取用户发表的文章-
GetPagesAsync分页查询文章支持标题、账号、标签过滤
GetArticleAsync获取文章详情id(文章ID)
GetLatestAsync获取最新文章range(数量范围)

2️⃣ 文章操作功能

方法功能
CreateArticleAsync创建新文章(需要创建人信息)
EditArticleAsync编辑文章
DeleteAsync删除指定文章
ViewAsync记录文章浏览(通常会增加阅读计数)

3️⃣ 标签与作者管理

GetAllTagsAsync()      // 获取所有文章标签
GetAllAuthorsAsync()   // 获取所有作者列表

4️⃣ 统计与归档

GetTotalCountAsync()        // 获取文章总数
GetTodayCountAsync()        // 获取今日新增文章数
GetArchivePagedAsync()      // 按年月分组归档(分页)
UpdateCommentCountAsync()   // 更新文章评论数

5️⃣ 工具方法

方法用途
IsExistsAsync检查标题是否已存在(防重复)
NoExistsByFromAsync批量检查源链接是否存在(用于数据同步)
DeleteOldCnBetaAsync清理旧的CnBeta爬虫数据
ClearCacheAsync清除缓存

技术特点

  1. 异步设计: 所有方法都返回 Task,支持异步调用
  2. 取消令牌: 每个方法都支持 CancellationToken,可中断长时间操作
  3. 分页支持: 返回类型使用 IPagedList<T> 实现分页
  4. 可空参数: 使用 ? 标记可空类型(如 string?
  5. 默认参数: 大部分参数提供默认值,简化调用

典型使用场景

// 示例1: 获取热门文章(最近7天,前8篇)
var topArticles = await articleService.GetTopArticlesAsync();

// 示例2: 分页查询带标签过滤
var pagedResult = await articleService.GetPagesAsync(
    pageIndex: 1, 
    pageSize: 20, 
    tags: new[] { "C#", ".NET" }
);

// 示例3: 创建文章
var newArticle = await articleService.CreateArticleAsync(
    createRequest, 
    currentUser
);

这个接口设计遵循了 SOLID 原则 中的接口隔离原则,清晰地定义了文章管理的所有业务能力。

评论加载中...