// ============================================================================
// 【文件说明】IHwSearchIndexService.cs - 搜索索引服务接口
// ============================================================================
// 这个接口定义了搜索索引的增删改操作契约。
//
// 【CQRS 模式说明】
// 这个接口体现了 CQRS(命令查询职责分离)的"命令"部分:
// - 命令:增删改操作
// - 查询:搜索操作(在 HwSearchQueryService 中)
//
// 【Upsert 操作说明】
// Upsert = Update + Insert,是一种"合并"操作:
// - 如果记录存在,更新
// - 如果记录不存在,插入
//
// 这是索引同步的常用模式,避免先查询再决定 insert/update。
//
// 【与 Java Spring Boot 的对比】
// Java 通常用 Repository 模式:
// public interface SearchIndexRepository {
// void upsertMenu(HwWebMenu menu);
// void deleteMenu(Long menuId);
// }
//
// C# 这里用 Service 接口,语义更接近业务操作。
// ============================================================================
namespace Admin.NET.Plugin.HwPortal;
///
/// 搜索索引服务接口。
///
/// 【服务职责】
/// 负责搜索索引的增删改操作:
/// 1. Upsert:插入或更新索引
/// 2. Delete:删除索引
///
/// 注意:这个接口只负责"写"操作,"读"操作在 HwSearchQueryService 中。
///
///
/// 【接口方法命名约定】
/// - UpsertXxxAsync:插入或更新某个类型的索引
/// - DeleteXxxAsync:删除某个类型的索引
/// - Async 后缀:表示异步方法
///
/// 对比 Java:
/// Java 通常不用 Async 后缀,而是返回 CompletableFuture:
/// CompletableFuture upsertMenu(HwWebMenu menu);
///
///
public interface IHwSearchIndexService
{
///
/// 插入或更新菜单索引。
///
/// 菜单实体
/// 取消令牌
Task UpsertMenuAsync(HwWebMenu menu, CancellationToken cancellationToken = default);
///
/// 插入或更新页面索引。
///
/// 页面实体
/// 取消令牌
Task UpsertWebAsync(HwWeb web, CancellationToken cancellationToken = default);
///
/// 插入或更新页面1索引。
///
/// 页面1实体
/// 取消令牌
Task UpsertWeb1Async(HwWeb1 web1, CancellationToken cancellationToken = default);
///
/// 插入或更新文档索引。
///
/// 文档实体
/// 取消令牌
Task UpsertDocumentAsync(HwWebDocument document, CancellationToken cancellationToken = default);
///
/// 插入或更新配置类型索引。
///
/// 配置类型实体
/// 取消令牌
Task UpsertConfigTypeAsync(HwPortalConfigType configType, CancellationToken cancellationToken = default);
///
/// 删除菜单索引。
///
/// 菜单ID
/// 取消令牌
Task DeleteMenuAsync(long menuId, CancellationToken cancellationToken = default);
///
/// 删除页面索引。
///
/// 页面编码
/// 取消令牌
Task DeleteWebAsync(long webCode, CancellationToken cancellationToken = default);
///
/// 删除页面1索引。
///
/// 【复合主键删除】
/// Web1 的索引由多个字段组成复合键:
/// - webCode:页面编码
/// - typeId:类型ID
/// - deviceId:设备ID
///
/// 删除时需要提供所有键字段。
///
///
/// 页面编码
/// 类型ID
/// 设备ID
/// 取消令牌
Task DeleteWeb1Async(long webCode, long typeId, long deviceId, CancellationToken cancellationToken = default);
///
/// 删除文档索引。
///
/// 文档ID
/// 取消令牌
Task DeleteDocumentAsync(string documentId, CancellationToken cancellationToken = default);
///
/// 删除配置类型索引。
///
/// 配置类型ID
/// 取消令牌
Task DeleteConfigTypeAsync(long configTypeId, CancellationToken cancellationToken = default);
///
/// 根据文档ID删除索引。
///
/// 【通用删除方法】
/// DocId 是索引的全局唯一标识,格式:{SourceType}_{BizId}
///
/// 这个方法提供了更通用的删除方式:
/// - 不需要知道具体类型
/// - 只需要 DocId
///
/// 使用场景:
/// 1. 批量删除:遍历 DocId 列表逐个删除
/// 2. 清理无效索引:根据外部数据源清理
///
///
/// 文档唯一ID
/// 取消令牌
Task DeleteByDocIdAsync(string docId, CancellationToken cancellationToken = default);
}