Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System.Threading.Tasks;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace LinkDotNet.Blog.Infrastructure.Persistence;

public interface IPersistenceHealthCheck
{
ValueTask<HealthCheckResult> PerformHealthCheckAsync();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using MongoDB.Bson;
using MongoDB.Driver;

namespace LinkDotNet.Blog.Infrastructure.Persistence.MongoDB;

public sealed class MongoDbPersistenceHealthCheck(IMongoDatabase database) : IPersistenceHealthCheck
{
public async ValueTask<HealthCheckResult> PerformHealthCheckAsync()
{
try
{
var command = new BsonDocument("ping", 1);
await database.RunCommandAsync<BsonDocument>(command);

return HealthCheckResult.Healthy("A healthy result.");
}
catch (Exception ex)
{
return HealthCheckResult.Unhealthy(exception: ex);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Threading.Tasks;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Raven.Client.Documents;

namespace LinkDotNet.Blog.Infrastructure.Persistence.RavenDb;

public sealed class RavenDbPersistenceHealthCheck(IDocumentStore documentStore) : IPersistenceHealthCheck
{
public async ValueTask<HealthCheckResult> PerformHealthCheckAsync()
{
try
{
using var session = documentStore.OpenAsyncSession();
await session.Query<object>().FirstOrDefaultAsync();
return HealthCheckResult.Healthy();
}
catch (Exception e)
{
return HealthCheckResult.Unhealthy(exception: e);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
using System;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace LinkDotNet.Blog.Infrastructure.Persistence.Sql;

public sealed class SqlPersistenceHealthCheck(IDbContextFactory<BlogDbContext> dbContextFactory) : IPersistenceHealthCheck
{
public async ValueTask<HealthCheckResult> PerformHealthCheckAsync()
{
try
{
await using var db = await dbContextFactory.CreateDbContextAsync();
await db.Database.ExecuteSqlRawAsync("SELECT 1");
return HealthCheckResult.Healthy();
}
catch (Exception exc)
{
return HealthCheckResult.Unhealthy(exception: exc);
}
}
}
6 changes: 3 additions & 3 deletions src/LinkDotNet.Blog.Web/Controller/RssFeedController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
using System.Xml;
using System.Xml.Linq;
using LinkDotNet.Blog.Domain;
using LinkDotNet.Blog.Infrastructure.Persistence;
using LinkDotNet.Blog.Web.Features;
using LinkDotNet.Blog.Web.Features.Repositories;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.RateLimiting;
using Microsoft.Extensions.Options;
Expand All @@ -26,12 +26,12 @@ public sealed class RssFeedController : ControllerBase
private readonly string description;
private readonly string blogName;
private readonly int blogPostsPerPage;
private readonly IRepository<BlogPost> blogPostRepository;
private readonly IBlogPostRepository blogPostRepository;

public RssFeedController(
IOptions<Introduction> introductionConfiguration,
IOptions<ApplicationConfiguration> applicationConfiguration,
IRepository<BlogPost> blogPostRepository)
IBlogPostRepository blogPostRepository)
{
ArgumentNullException.ThrowIfNull(introductionConfiguration);
ArgumentNullException.ThrowIfNull(applicationConfiguration);
Expand Down
5 changes: 2 additions & 3 deletions src/LinkDotNet.Blog.Web/DatabaseHealthCheck.cs
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
using System.Threading;
using System.Threading.Tasks;
using LinkDotNet.Blog.Domain;
using LinkDotNet.Blog.Infrastructure.Persistence;
using Microsoft.Extensions.Diagnostics.HealthChecks;

namespace LinkDotNet.Blog.Web;

public class DatabaseHealthCheck : IHealthCheck
{
private readonly IRepository<BlogPost> repository;
private readonly IPersistenceHealthCheck repository;

public DatabaseHealthCheck(IRepository<BlogPost> repository)
public DatabaseHealthCheck(IPersistenceHealthCheck repository)
{
this.repository = repository;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@using LinkDotNet.Blog.Web.Features.Repositories
@using LinkDotNet.Blog.Web.Features.Services

@inject IRepository<ProfileInformationEntry> Repository
@inject IAboutMeRepository Repository
@inject ISortOrderCalculator SortOrderCalculator
<div class="profile-card">
<div class="profile-name">
Expand Down Expand Up @@ -60,7 +60,7 @@

protected override async Task OnInitializedAsync()
{
profileInformationEntries = (await Repository.GetAllAsync(orderBy: d => d.SortOrder, descending: false)).ToList();
profileInformationEntries = (await Repository.GetProfileInformationEntriesAsync()).ToList();
}

private void ShowDeleteDialog(string key)
Expand All @@ -73,7 +73,7 @@
{
var entryToDelete = profileInformationEntries.Single(p => p.Content == currentDeleteKey);
profileInformationEntries.Remove(entryToDelete);
await Repository.DeleteAsync(entryToDelete.Id);
await Repository.DeleteProfileInformationEntryAsync(entryToDelete.Id);
}

private async Task AddValue(string toAdd)
Expand All @@ -82,7 +82,7 @@
var newEntry = ProfileInformationEntry.Create(toAdd, sortOrder);

profileInformationEntries.Add(newEntry);
await Repository.StoreAsync(newEntry);
await Repository.StoreProfileInformationEntryAsync(newEntry);
}

private int GetSortOrder()
Expand All @@ -104,7 +104,7 @@

var newSortOrder = SortOrderCalculator.GetSortOrder(dropTarget, profileInformationEntries);
currentDragItem.SortOrder = newSortOrder;
await Repository.StoreAsync(currentDragItem);
await Repository.StoreProfileInformationEntryAsync(currentDragItem);
currentDragItem = null;
profileInformationEntries.Sort((a, b) => a.SortOrder.CompareTo(b.SortOrder));
StateHasChanged();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@inject IRepository<Skill> Repository
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IAboutMeRepository Repository
<div>
@if (ShowAdminActions)
{
Expand Down Expand Up @@ -66,19 +66,19 @@

protected override async Task OnInitializedAsync()
{
skills = (await Repository.GetAllAsync()).ToList();
skills = (await Repository.GetSkillsAsync()).ToList();
}

private async Task AddSkill(Skill skillToAdd)
{
skills.Add(skillToAdd);
await Repository.StoreAsync(skillToAdd);
await Repository.StoreSkillAsync(skillToAdd);
}

private async Task DeleteSkill(Skill skill)
{
skills.Remove(skill);
await Repository.DeleteAsync(skill.Id);
await Repository.DeleteSkillAsync(skill.Id);
}

private async Task HandleDrop(ProficiencyLevel proficiencyLevel)
Expand All @@ -89,7 +89,7 @@
}

currentDragItem.SetProficiencyLevel(proficiencyLevel);
await Repository.StoreAsync(currentDragItem);
await Repository.StoreSkillAsync(currentDragItem);
currentDragItem = null;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@inject IRepository<Talk> Repository
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IAboutMeRepository Repository

@if (talks.Any() || ShowAdminActions)
{
Expand All @@ -27,18 +27,18 @@

protected override async Task OnInitializedAsync()
{
talks = (await Repository.GetAllAsync(orderBy: t => t.PublishedDate, descending: true)).ToList();
talks = (await Repository.GetTalksAsync()).ToList();
}

private async Task DeleteTalk(Talk talk)
{
talks.Remove(talk);
await Repository.DeleteAsync(talk.Id);
await Repository.DeleteTalkAsync(talk.Id);
}

private async Task StoreTalk(Talk talk)
{
talks.Add(talk);
await Repository.StoreAsync(talk);
await Repository.StoreTalkAsync(talk);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure
@using LinkDotNet.Blog.Infrastructure.Persistence
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IToastService ToastService
@inject IRepository<BlogPostTemplate> TemplateRepository
@inject IBlogPostTemplateRepository TemplateRepository
@inject IJSRuntime JSRuntime

<ModalDialog @ref="ModalDialog" Title="Save as Template">
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure
@using LinkDotNet.Blog.Infrastructure.Persistence
@using LinkDotNet.Blog.Web.Features.Repositories
@using LinkDotNet.Blog.Web.Features.Admin.BlogPostEditor.Services
@using LinkDotNet.Blog.Web.Features.Services
@using NCronJob
@inject IJSRuntime JSRuntime
@inject ICacheInvalidator CacheInvalidator
@inject IInstantJobRegistry InstantJobRegistry
@inject IRepository<ShortCode> ShortCodeRepository
@inject IRepository<BlogPostTemplate> TemplateRepository
@inject IShortCodeRepository ShortCodeRepository
@inject IBlogPostTemplateRepository TemplateRepository
@inject IToastService ToastService
@inject IOptions<ApplicationConfiguration> AppConfiguration
@inject ICurrentUserService CurrentUserService
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
@page "/create"
@attribute [Authorize]
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@using LinkDotNet.Blog.Web.Features.Admin.BlogPostEditor.Components
@inject IRepository<BlogPost> BlogPostRepository
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IBlogPostRepository BlogPostRepository
@inject IToastService ToastService

<CreateNewBlogPost Title="Create New Blog Post" OnBlogPostCreated="@(StoreBlogPostAsync)"></CreateNewBlogPost>
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
using System;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using LinkDotNet.Blog.Domain;
using LinkDotNet.Blog.Infrastructure.Persistence;
using LinkDotNet.Blog.Web.Features.Repositories;
using LinkDotNet.Blog.Infrastructure.Persistence.Sql;
using Microsoft.EntityFrameworkCore;

Expand All @@ -12,11 +12,11 @@ namespace LinkDotNet.Blog.Web.Features.Admin.BlogPostEditor.Services;
public sealed class BlogPostVersionService : IBlogPostVersionService
{
private readonly IDbContextFactory<BlogDbContext> dbContextFactory;
private readonly IRepository<BlogPost> blogPostRepository;
private readonly IBlogPostRepository blogPostRepository;

public BlogPostVersionService(
IDbContextFactory<BlogDbContext> dbContextFactory,
IRepository<BlogPost> blogPostRepository)
IBlogPostRepository blogPostRepository)
{
this.dbContextFactory = dbContextFactory;
this.blogPostRepository = blogPostRepository;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
@page "/update/{blogPostId}"
@page "/update/{blogPostId}"
@attribute [Authorize]
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@using LinkDotNet.Blog.Web.Features.Admin.BlogPostEditor.Components
@using LinkDotNet.Blog.Web.Features.Admin.BlogPostEditor.Services
@inject IRepository<BlogPost> BlogPostRepository
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IBlogPostRepository BlogPostRepository
@inject IBlogPostVersionService BlogPostVersionService
@inject IToastService ToastService

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
@page "/broken-links"
@page "/broken-links"
@using LinkDotNet.Blog.Domain
@using LinkDotNet.Blog.Infrastructure.Persistence
@inject IRepository<BrokenLink> BrokenLinkRepository
@using LinkDotNet.Blog.Web.Features.Repositories
@inject IBrokenLinkRepository BrokenLinkRepository
@inject IOptions<ApplicationConfiguration> ApplicationConfiguration
@attribute [Authorize]

Expand Down Expand Up @@ -57,7 +57,7 @@
{
if (ApplicationConfiguration.Value.EnableBrokenLinkChecker)
{
brokenLinks = (await BrokenLinkRepository.GetAllAsync(orderBy: b => b.BlogPostTitle, descending: false)).ToArray();
brokenLinks = (await BrokenLinkRepository.GetAllAsync()).ToArray();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
using System;
using System;
using System.Collections.Concurrent;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using LinkDotNet.Blog.Domain;
using LinkDotNet.Blog.Infrastructure.Persistence;
using LinkDotNet.Blog.Web.Features.Repositories;
using LinkDotNet.Blog.Infrastructure;
using NCronJob;

namespace LinkDotNet.Blog.Web.Features.Admin.BrokenLinks.Services;
Expand All @@ -13,14 +14,14 @@ public sealed class BrokenLinkCheckerJob : IJob
{
private const int MaxParallelRequests = 5;

private readonly IRepository<BlogPost> blogPostRepository;
private readonly IRepository<BrokenLink> brokenLinkRepository;
private readonly IBlogPostRepository blogPostRepository;
private readonly IBrokenLinkRepository brokenLinkRepository;
private readonly ILinkChecker linkChecker;
private readonly TimeProvider timeProvider;

public BrokenLinkCheckerJob(
IRepository<BlogPost> blogPostRepository,
IRepository<BrokenLink> brokenLinkRepository,
IBlogPostRepository blogPostRepository,
IBrokenLinkRepository brokenLinkRepository,
ILinkChecker linkChecker,
TimeProvider timeProvider)
{
Expand Down Expand Up @@ -58,9 +59,8 @@ await Parallel.ForEachAsync(blogPostsByUrl, parallelOptions, async (postsWithUrl
}
});

var previousIds = await brokenLinkRepository.GetAllByProjectionAsync(b => b.Id);
await brokenLinkRepository.DeleteBulkAsync(previousIds);
await brokenLinkRepository.StoreBulkAsync(brokenLinks.ToArray());
var previousIds = await brokenLinkRepository.GetAllAsync();
await brokenLinkRepository.ReplaceAllAsync(previousIds.Select(link => link.Id).ToArray(), brokenLinks.ToArray());
}

private sealed record BlogPostLinks(string Id, string Title, string Content);
Expand Down
Loading