网站首页 网站源码
website
站点相关全部源代码,隐藏了一些关于服务器的信息
namespace Dpz.Core.Service.RepositoryServiceImpl;

public class CodeNoteService(
    IRepository<CodeNote> repository,
    IMapper mapper,
    ILogger<CodeNoteService> logger,
    IConfiguration configuration,
    IFusionCache fusionCache
) : ICodeNoteService
{
    public async Task<string> SaveNoteAsync(string[]? path, string name, string note)
    {
        var pathStr = GetPathStr(path);
        var codeNote = await repository
            .SearchFor(x => x.Name == name && x.Path == pathStr)
            .FirstOrDefaultAsync();
        if (codeNote == null)
        {
            var entity = new CodeNote
            {
                CreateTime = DateTime.Now,
                LastUpdateTime = DateTime.Now,
                Name = name,
                Note = note,
                Path = pathStr,
            };
            await repository.InsertAsync(entity);
            return entity.Id.ToString();
        }

        codeNote.Note = note;
        codeNote.LastUpdateTime = DateTime.Now;
        await repository.UpdateAsync(codeNote);
        return codeNote.Id.ToString();
    }

    public async Task<VmCodeNote?> FindAsync(string[]? path, string name)
    {
        var pathStr = GetPathStr(path);
        var codeNote = await repository
            .SearchFor(x => x.Name == name && x.Path == pathStr)
            .FirstOrDefaultAsync();
        if (codeNote == null)
        {
            return null;
        }

        return mapper.Map<VmCodeNote>(codeNote);
    }

    private static string GetPathStr(string[]? path)
    {
        return path is not null && path.Length > 0 ? string.Join("/", path) : "";
    }

    public async Task SaveAiAnalyzeResultAsync(string[]? path, string name, string analyzeResult)
    {
        var pathStr = GetPathStr(path);
        var codeNote = await repository
            .SearchFor(x => x.Name == name && x.Path == pathStr)
            .FirstOrDefaultAsync();
        if (codeNote == null)
        {
            var entity = new CodeNote
            {
                CreateTime = DateTime.Now,
                LastUpdateTime = DateTime.Now,
                Name = name,
                AiAnalyzeResult = analyzeResult,
                Path = pathStr,
            };
            await repository.InsertAsync(entity);

            await ClearCacheAsync();
            return;
        }

        codeNote.AiAnalyzeResult = analyzeResult;
        codeNote.LastUpdateTime = DateTime.Now;
        await repository.UpdateAsync(codeNote);

        await ClearCacheAsync();
        return;

        async Task ClearCacheAsync()
        {
            var codeView =
                configuration.GetSection("CodeView").Get<CodeViewOption>()
                ?? throw new InvalidConfigurationException("CodeView");
            var cachePath = new List<string>();
            cachePath.AddRange(path ?? []);
            cachePath.Add(name);
            var removeCacheKey = CacheKey.CodeViewKey(cachePath.ToArray(), codeView.ToString());
            await fusionCache.RemoveAsync(removeCacheKey);
        }
    }

    public async Task<List<VmCodeNote>> GetNoteAsync(string[]? path)
    {
#if DEBUG
        var stopwatch = new Stopwatch();
        stopwatch.Start();
#endif
        var pathStr = GetPathStr(path);
        var list = await repository.SearchFor(x => x.Path == pathStr).ToListAsync();
#if DEBUG
        stopwatch.Stop();
        var queryTime = stopwatch.Elapsed;
        logger.LogInformation("查询耗时:{QueryTime} ms", queryTime.TotalMilliseconds);
#endif
        return mapper.Map<List<VmCodeNote>>(list);
    }

    public async Task<List<VmCodeNote>> GetAllNoteAsync()
    {
        var list = await repository.SearchFor(x => true).ToListAsync();
        return mapper.Map<List<VmCodeNote>>(list);
    }

    public async Task DeleteAsync(string[]? path, string name)
    {
        var pathStr = GetPathStr(path);
        await repository.DeleteAsync(x => x.Name == name && x.Path == pathStr);
    }
}
⚠⚠    以下内容为AI分析的结果,请根据实际情况进行判断。

上述代码定义了一个名为 CodeNoteService 的服务类,主要用于管理代码笔记(CodeNote)的 CRUD(创建、读取、更新、删除)操作。这个服务类实现了 ICodeNoteService 接口,并依赖于多个组件,如 IRepository<CodeNote>IMapperILogger<CodeNoteService>IConfigurationIHybridCachingProvider。以下是该类的主要功能和方法的详细解释:

主要功能

  1. 保存笔记 (SaveNoteAsync):

    • 接收路径、名称和笔记内容作为参数。
    • 检查是否已经存在具有相同名称和路径的笔记。
    • 如果不存在,则创建一个新的 CodeNote 实体并插入到数据库中。
    • 如果存在,则更新该笔记的内容和最后更新时间。
  2. 查找笔记 (FindAsync):

    • 根据路径和名称查找特定的笔记。
    • 如果找到,使用 IMapperCodeNote 实体映射到视图模型 VmCodeNote 并返回;如果未找到,则返回 null
  3. 保存 AI 分析结果 (SaveAiAnalyzeResultAsync):

    • 接收路径、名称和分析结果作为参数。
    • 检查是否已经存在具有相同名称和路径的笔记。
    • 如果不存在,则创建一个新的 CodeNote 实体并插入到数据库中。
    • 如果存在,则更新该笔记的 AI 分析结果和最后更新时间。
    • 在每次保存后,调用 ClearCacheAsync 方法清除相关缓存。
  4. 获取笔记 (GetNoteAsync):

    • 根据路径获取所有相关的笔记。
    • 使用 IMapperCodeNote 实体列表映射到 VmCodeNote 列表并返回。
  5. 获取所有笔记 (GetAllNoteAsync):

    • 获取数据库中所有的笔记,并将其映射到 VmCodeNote 列表返回。
  6. 删除笔记 (DeleteAsync):

    • 根据路径和名称删除特定的笔记。

辅助方法

  • GetPathStr:

    • 将路径数组转换为字符串,使用斜杠(/)连接各个部分。如果路径为空或为 null,则返回空字符串。
  • ClearCacheAsync:

    • 清除与特定路径和名称相关的缓存。它从配置中获取 CodeView 的设置,并生成缓存键以便于删除。

日志记录

GetNoteAsync 方法中,使用 ILogger 记录查询耗时,便于调试和性能监控。

总结

CodeNoteService 类提供了一系列方法来管理代码笔记的生命周期,包括创建、更新、查找、删除和缓存管理。它通过依赖注入的方式使用了多个服务,确保了代码的模块化和可测试性。

loading