public async Task <MiscGrpcResponse> GetSiteStatAsync(MiscGrpcRequest request, CallContext context = default)
    {
        var response = new MiscGrpcResponse();

        try
        {
            if (request.Site == LaobianSite.Jarvis)
            {
                response.SiteStat = await _jarvisHttpClient.GetSiteStatAsync();
            }
            else if (request.Site == LaobianSite.Blog)
            {
                response.SiteStat = await _blogHttpClient.GetSiteStatAsync();
            }
            else if (request.Site == LaobianSite.Api)
            {
                response.SiteStat = SiteStatHelper.Get();
            }
            else
            {
                response.IsOk    = false;
                response.Message = $"Getting site {request.Site} stat not supported.";
            }
        }
        catch (Exception ex)
        {
            response.IsOk    = false;
            response.Message = ex.Message;
            _logger.LogError(ex, $"{nameof(GetSiteStatAsync)} failed.");
        }

        return(response);
    }
    public async Task <MiscGrpcResponse> ShutdownSiteAsync(MiscGrpcRequest request, CallContext context = default)
    {
        var response = new MiscGrpcResponse();

        try
        {
            if (request.Site == LaobianSite.Api)
            {
                _appLifetime.StopApplication();
            }
            else if (request.Site == LaobianSite.Blog)
            {
                await _blogHttpClient.ShutdownAsync();
            }
            else if (request.Site == LaobianSite.Jarvis)
            {
                await _jarvisHttpClient.ShutdownAsync();
            }
            else
            {
                response.IsOk    = false;
                response.Message = $"Shutdown site {request.Site} not supported.";
            }
        }
        catch (Exception ex)
        {
            response.IsOk    = false;
            response.Message = ex.Message;
            _logger.LogError(ex, $"{nameof(ShutdownSiteAsync)} failed.");
        }

        return(response);
    }
    public async Task <MiscGrpcResponse> GetDbStatAsync(MiscGrpcRequest request, CallContext context = default)
    {
        var response = new MiscGrpcResponse();

        try
        {
            response.DbStats = await _gitFileService.GetGitFileStatsAsync();
        }
        catch (Exception ex)
        {
            response.IsOk    = false;
            response.Message = ex.Message;
            _logger.LogError(ex, $"{nameof(GetDbStatAsync)} failed.");
        }

        return(response);
    }
    public async Task <MiscGrpcResponse> PersistentGitFileAsync(MiscGrpcRequest request, CallContext context = default)
    {
        var response = new MiscGrpcResponse();

        try
        {
            await _gitFileService.PushAsync(request.Message);
        }
        catch (Exception ex)
        {
            response.IsOk    = false;
            response.Message = ex.Message;
            _logger.LogError(ex, $"{nameof(PersistentGitFileAsync)} failed.");
        }

        return(response);
    }
    public async Task <MiscGrpcResponse> ReloadBlogCacheAsync(BlogGrpcRequest request, CallContext context = default)
    {
        var response = new MiscGrpcResponse();

        try
        {
            await _blogSiteHttpClient.ReloadBlogDataAsync();
        }
        catch (Exception ex)
        {
            response.IsOk    = false;
            response.Message = ex.Message;
            _logger.LogError(ex, $"{nameof(ReloadBlogCacheAsync)} failed.");
        }

        return(response);
    }