@@ -92,7 +92,7 @@ FILE: src/Directory.Build.props
9292 <EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
9393 <AnalysisLevel>latest</AnalysisLevel>
9494 </PropertyGroup>
95-
95+
9696 <PropertyGroup Condition="$(MSBuildProjectName.Contains('.Tests'))">
9797 <IsPackable>false</IsPackable>
9898 <OutputType>Exe</OutputType>
@@ -653,7 +653,7 @@ namespace MyBlog.Core.Services;
653653
654654/// <summary>
655655/// Custom Markdown to HTML renderer.
656- /// Supports: headings, bold, italic, links, images, code blocks, blockquotes,
656+ /// Supports: headings, bold, italic, links, images, code blocks, blockquotes,
657657/// unordered lists, ordered lists, horizontal rules.
658658/// </summary>
659659public sealed partial class MarkdownService : IMarkdownService
@@ -1082,13 +1082,13 @@ FILE: src/MyBlog.Infrastructure/MyBlog.Infrastructure.csproj
10821082 <PropertyGroup>
10831083 <RootNamespace>MyBlog.Infrastructure</RootNamespace>
10841084 </PropertyGroup>
1085-
1085+
10861086 <ItemGroup>
10871087 <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" />
10881088 <PackageReference Include="Microsoft.AspNetCore.Identity" />
10891089 <PackageReference Include="OpenTelemetry" />
10901090 </ItemGroup>
1091-
1091+
10921092 <ItemGroup>
10931093 <ProjectReference Include="..\MyBlog.Core\MyBlog.Core.csproj" />
10941094 </ItemGroup>
@@ -2989,14 +2989,14 @@ FILE: src/MyBlog.Tests/MyBlog.Tests.csproj
29892989 <RootNamespace>MyBlog.Tests</RootNamespace>
29902990 <IsTestProject>true</IsTestProject>
29912991 </PropertyGroup>
2992-
2992+
29932993 <ItemGroup>
29942994 <PackageReference Include="Microsoft.NET.Test.Sdk" />
29952995 <PackageReference Include="xunit.v3" />
29962996 <PackageReference Include="Microsoft.Testing.Extensions.TrxReport" />
29972997 <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" />
29982998 </ItemGroup>
2999-
2999+
30003000 <ItemGroup>
30013001 <ProjectReference Include="..\MyBlog.Core\MyBlog.Core.csproj" />
30023002 <ProjectReference Include="..\MyBlog.Web\MyBlog.Web.csproj" />
@@ -3425,62 +3425,62 @@ public class SlugServiceTests
34253425 [Fact]
34263426 public void GenerateSlug_WithSimpleTitle_ReturnsLowercaseWithHyphens()
34273427 {
3428- var result = _sut.GenerateSlug ("Hello World");
3428+ var result = _sut.GenerateSlugOrUuid ("Hello World");
34293429 Assert.Equal("hello-world", result);
34303430 }
34313431
34323432 [Fact]
34333433 public void GenerateSlug_WithSpecialCharacters_RemovesThem()
34343434 {
3435- var result = _sut.GenerateSlug ("Hello, World! How's it going?");
3435+ var result = _sut.GenerateSlugOrUuid ("Hello, World! How's it going?");
34363436 Assert.Equal("hello-world-hows-it-going", result);
34373437 }
34383438
34393439 [Fact]
34403440 public void GenerateSlug_WithMultipleSpaces_CollapsesToSingleHyphen()
34413441 {
3442- var result = _sut.GenerateSlug ("Hello World");
3442+ var result = _sut.GenerateSlugOrUuid ("Hello World");
34433443 Assert.Equal("hello-world", result);
34443444 }
34453445
34463446 [Fact]
34473447 public void GenerateSlug_WithUnicode_RemovesDiacritics()
34483448 {
3449- var result = _sut.GenerateSlug ("Café résumé");
3449+ var result = _sut.GenerateSlugOrUuid ("Café résumé");
34503450 Assert.Equal("cafe-resume", result);
34513451 }
34523452
34533453 [Fact]
34543454 public void GenerateSlug_WithLeadingTrailingSpaces_TrimsHyphens()
34553455 {
3456- var result = _sut.GenerateSlug (" Hello World ");
3456+ var result = _sut.GenerateSlugOrUuid (" Hello World ");
34573457 Assert.Equal("hello-world", result);
34583458 }
34593459
34603460 [Fact]
34613461 public void GenerateSlug_WithNumbers_PreservesNumbers()
34623462 {
3463- var result = _sut.GenerateSlug ("Top 10 Tips for 2024");
3463+ var result = _sut.GenerateSlugOrUuid ("Top 10 Tips for 2024");
34643464 Assert.Equal("top-10-tips-for-2024", result);
34653465 }
34663466
34673467 [Fact]
34683468 public void GenerateSlug_WithUnderscores_ConvertsToHyphens()
34693469 {
3470- var result = _sut.GenerateSlug ("hello_world_test");
3470+ var result = _sut.GenerateSlugOrUuid ("hello_world_test");
34713471 Assert.Equal("hello-world-test", result);
34723472 }
34733473
34743474 [Fact]
34753475 public void GenerateSlug_WithEmptyString_ThrowsArgumentException()
34763476 {
3477- Assert.Throws<ArgumentException>(() => _sut.GenerateSlug (""));
3477+ Assert.Throws<ArgumentException>(() => _sut.GenerateSlugOrUuid (""));
34783478 }
34793479
34803480 [Fact]
34813481 public void GenerateSlug_WithWhitespaceOnly_ThrowsArgumentException()
34823482 {
3483- Assert.Throws<ArgumentException>(() => _sut.GenerateSlug (" "));
3483+ Assert.Throws<ArgumentException>(() => _sut.GenerateSlugOrUuid (" "));
34843484 }
34853485}
34863486
@@ -4464,7 +4464,7 @@ FILE: src/MyBlog.Web/Components/Pages/Admin/ChangePassword.razor
44644464 // Get current user ID
44654465 var context = HttpContextAccessor.HttpContext;
44664466 var userIdClaim = context?.User?.FindFirst(ClaimTypes.NameIdentifier)?.Value;
4467-
4467+
44684468 if (string.IsNullOrEmpty(userIdClaim) || !Guid.TryParse(userIdClaim, out var userId))
44694469 {
44704470 _errorMessage = "Unable to identify current user. Please log in again.";
@@ -4659,7 +4659,7 @@ else
46594659
46604660 var authState = await AuthStateProvider.GetAuthenticationStateAsync();
46614661 var userIdClaim = authState.User.FindFirst(ClaimTypes.NameIdentifier);
4662-
4662+
46634663 if (userIdClaim is null || !Guid.TryParse(userIdClaim.Value, out var userId))
46644664 {
46654665 _uploadStatus = "Unable to identify current user. Please log in again.";
@@ -4841,7 +4841,7 @@ else
48414841 }
48424842
48434843 // Generate unique slug
4844- var baseSlug = SlugService.GenerateSlug (_title);
4844+ var baseSlug = SlugService.GenerateSlugOrUuid (_title);
48454845 var finalSlug = baseSlug;
48464846 var counter = 1;
48474847
@@ -5021,7 +5021,7 @@ FILE: src/MyBlog.Web/Components/Pages/Admin/UserEditor.razor
50215021 <div class="form-group">
50225022 <label for="password">Password @(IsEdit ? "(Leave blank to keep current)" : "")</label>
50235023 <input type="password" id="password" @bind="_password" required="@(!IsEdit)" />
5024- @if (!IsEdit)
5024+ @if (!IsEdit)
50255025 {
50265026 <small>Required for new users.</small>
50275027 }
@@ -5239,7 +5239,7 @@ FILE: src/MyBlog.Web/Components/Pages/Admin/UserList.razor
52395239 if (id == _currentUserId) return;
52405240
52415241 var confirm = await JsRuntime.InvokeAsync<bool>("confirm", "Are you sure you want to delete this user?");
5242-
5242+
52435243 if (confirm)
52445244 {
52455245 await UserRepository.DeleteAsync(id);
@@ -5296,7 +5296,7 @@ else
52965296
52975297 var pageSize = Configuration.GetValue("Application:PostsPerPage", 10);
52985298 var (posts, totalCount) = await PostRepository.GetPublishedPostsAsync(_currentPage, pageSize);
5299-
5299+
53005300 _posts = posts;
53015301 _totalPages = (int)Math.Ceiling(totalCount / (double)pageSize);
53025302 }
@@ -5327,7 +5327,7 @@ FILE: src/MyBlog.Web/Components/Pages/Login.razor
53275327
53285328 <form method="post" @onsubmit="HandleLogin" @formname="login">
53295329 <AntiforgeryToken />
5330-
5330+
53315331 <div class="form-group">
53325332 <label for="username">Username</label>
53335333 <input type="text" id="username" name="username" @bind="_username" required />
@@ -5380,15 +5380,15 @@ FILE: src/MyBlog.Web/Components/Pages/Login.razor
53805380 new(ClaimTypes.NameIdentifier, user.Id.ToString()),
53815381 new(ClaimTypes.Name, user.Username),
53825382 new("DisplayName", user.DisplayName),
5383- new(ClaimTypes.Role, AppConstants.AdminRole)
5383+ new(ClaimTypes.Role, AppConstants.AdminRole)
53845384 };
53855385
53865386 var identity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
53875387 var principal = new ClaimsPrincipal(identity);
53885388
53895389 var context = HttpContextAccessor.HttpContext!;
53905390 await context.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, principal);
5391-
5391+
53925392 Navigation.NavigateTo(ReturnUrl ?? "/admin", forceLoad: true);
53935393 }
53945394}
@@ -5547,9 +5547,9 @@ FILE: src/MyBlog.Web/Components/Shared/Pagination.razor
55475547 {
55485548 <a href="@GetPageUrl(CurrentPage - 1)" class="page-link">← Previous</a>
55495549 }
5550-
5550+
55515551 <span class="page-info">Page @CurrentPage of @TotalPages</span>
5552-
5552+
55535553 @if (CurrentPage < TotalPages)
55545554 {
55555555 <a href="@GetPageUrl(CurrentPage + 1)" class="page-link">Next →</a>
@@ -5874,14 +5874,14 @@ FILE: src/MyBlog.Web/MyBlog.Web.csproj
58745874 <PropertyGroup>
58755875 <RootNamespace>MyBlog.Web</RootNamespace>
58765876 </PropertyGroup>
5877-
5877+
58785878 <ItemGroup>
58795879 <PackageReference Include="OpenTelemetry.Extensions.Hosting" />
58805880 <PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" />
58815881 <PackageReference Include="OpenTelemetry.Exporter.Console" />
58825882 <PackageReference Include="OpenTelemetry.Instrumentation.Http" />
58835883 </ItemGroup>
5884-
5884+
58855885 <ItemGroup>
58865886 <ProjectReference Include="..\MyBlog.Infrastructure\MyBlog.Infrastructure.csproj" />
58875887 </ItemGroup>
0 commit comments