public async Task <BlogGrpcResponse> DeleteTagAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { await _blogFileService.DeleteBlogTagAsync(request.TagId); var posts = await _blogFileService.GetBlogPostsAsync(); foreach (var blogPost in posts) { if (blogPost.Tag.Contains(request.TagId)) { blogPost.Tag.Remove(request.TagId); await _blogFileService.UpdateBlogPostAsync(blogPost, blogPost.Link); } } await _blogSiteHttpClient.ReloadBlogDataAsync(); } catch (Exception ex) { _logger.LogError(ex, $"{nameof(DeleteTagAsync)} failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
public async Task <BlogGrpcResponse> GetTagAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { var tag = await _blogFileService.GetBlogTagAsync(request.TagId); if (tag == null) { response.IsOk = false; response.Message = $"Tag id = {request.TagId} not found."; } else { response.Tag = tag; } } catch (Exception ex) { _logger.LogError(ex, $"{nameof(GetTagAsync)} failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
public async Task <BlogGrpcResponse> GetPostsAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { var posts = await _blogFileService.GetBlogPostsAsync(); var result = new List <BlogPostRuntime>(); foreach (var blogPost in posts) { var blogPostRuntime = await GetBlogPostRuntimeAsync(blogPost, request.ExtractRuntime); result.Add(blogPostRuntime); } response.Posts = result; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(GetPostsAsync)} failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
public async Task <BlogGrpcResponse> GetPostAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { var post = await _blogFileService.GetBlogPostAsync(request.Link); if (post == null) { response.IsOk = false; response.Message = $"Post with link not found: {request.Link}"; } else { var blogPostRuntime = await GetBlogPostRuntimeAsync(post, request.ExtractRuntime); response.PostRuntime = blogPostRuntime; } } catch (Exception ex) { _logger.LogError(ex, $"{nameof(GetPostAsync)}({request.Link}) failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
public BlogController( IOptions <AdminOptions> options, ILogger <BlogController> logger) { _logger = logger; _options = options.Value; _blogGrpcRequest = new BlogGrpcRequest(); _blogGrpcService = GrpcClientHelper.CreateClient <IBlogGrpcService>(options.Value.ApiLocalEndpoint); }
public async Task ReloadAsync() { _reloadLock.Reset(); try { var blogRequest = new BlogGrpcRequest { ExtractRuntime = true }; var postsResponse = await _blogGrpcService.GetPostsAsync(blogRequest); if (!postsResponse.IsOk) { _logger.LogError($"Getting all posts failed: {postsResponse.Message}"); return; } var tagsResponse = await _blogGrpcService.GetTagsAsync(); if (!tagsResponse.IsOk) { _logger.LogError($"Getting all tags failed: {tagsResponse.Message}"); return; } var readRequest = new ReadGrpcRequest { ExtractRuntime = true }; var readResponse = await _readGrpcService.GetReadItemsAsync(readRequest); if (!readResponse.IsOk) { _logger.LogError($"Getting all read items failed: {tagsResponse.Message}"); return; } var posts = postsResponse.Posts ?? new List <BlogPostRuntime>(); var tags = tagsResponse.Tags ?? new List <BlogTag>(); var readItems = readResponse.ReadItems ?? new List <ReadItemRuntime>(); _allPosts.Clear(); _allPosts.AddRange(posts.OrderByDescending(x => x.Raw.PublishTime)); _allTags.Clear(); _allTags.AddRange(tags.OrderByDescending(x => x.LastUpdatedAt)); _allReadItems.Clear(); _allReadItems.AddRange(readItems.OrderByDescending(x => x.Raw.StartTime)); _lastReloadTime = DateTime.Now; } catch (Exception ex) { _logger.LogError(ex, "Reload blog data failed."); } finally { _reloadLock.Set(); } }
public async Task <BlogGrpcResponse> AddPostAccessAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { await _blogFileService.AddBlogPostAccessAsync(request.Link, DateTime.Now, 1); } catch (Exception ex) { _logger.LogError(ex, $"{nameof(AddPostAccessAsync)}({request.Link}) failed."); response.IsOk = false; response.Message = ex.Message; } 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); }
public async Task <BlogGrpcResponse> AddTagAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { await _blogFileService.AddBlogTagAsync(request.Tag); await _blogSiteHttpClient.ReloadBlogDataAsync(); response.Tag = request.Tag; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(AddTagAsync)} failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
public async Task <BlogGrpcResponse> UpdatePostAsync(BlogGrpcRequest request, CallContext context = default) { var response = new BlogGrpcResponse(); try { await _blogFileService.UpdateBlogPostAsync(request.Post, request.OriginalPostLink); await _blogSiteHttpClient.ReloadBlogDataAsync(); response.Post = request.Post; } catch (Exception ex) { _logger.LogError(ex, $"{nameof(UpdatePostAsync)}({JsonUtil.Serialize(request.Post)}) failed."); response.IsOk = false; response.Message = ex.Message; } return(response); }
private async Task ProcessAsync() { while (_blogService.TryDequeuePostAccess(out var link)) { try { var request = new BlogGrpcRequest { Link = link }; var response = await _blogGrpcService.AddPostAccessAsync(request); if (!response.IsOk) { _logger.LogError($"Add post access for {link} failed: {response.Message}"); } } catch (Exception ex) { _logger.LogError(ex, $"Failed to add new access for post: {link}"); } } }