Fix W3-T1 review: forward CancellationToken in GetPaged, scrub ex.Message from snackbar, drop unused Navigation inject, annotate ITrackService wiring in CmsStartup

This commit is contained in:
Daniel Harvey
2026-05-18 14:58:36 -04:00
parent 77e6637a9e
commit 88c94b24cf
6 changed files with 16 additions and 9 deletions
+5
View File
@@ -7,6 +7,11 @@ public static class CmsStartup
public static IServiceCollection AddCmsServices(this IServiceCollection services) public static IServiceCollection AddCmsServices(this IServiceCollection services)
{ {
// CMS-specific services registered here as implementation waves land. // CMS-specific services registered here as implementation waves land.
//
// Note: ITrackService (and its dependencies: TrackRepository, DeepDrftContext) is registered
// by DeepDrftWeb.Startup.ConfigureDomainServices, not here. The CMS RCL runs inside the
// DeepDrftWeb host, which wires those up before this method is called. A standalone CMS
// host would need to register ITrackService separately.
return services; return services;
} }
} }
+4 -3
View File
@@ -8,7 +8,7 @@
@inject IHttpClientFactory HttpClientFactory @inject IHttpClientFactory HttpClientFactory
@inject IDialogService DialogService @inject IDialogService DialogService
@inject ISnackbar Snackbar @inject ISnackbar Snackbar
@inject NavigationManager Navigation @inject ILogger<TrackList> Logger
<PageTitle>Tracks — DeepDrft CMS</PageTitle> <PageTitle>Tracks — DeepDrft CMS</PageTitle>
@@ -85,7 +85,7 @@
var sortColumn = string.IsNullOrEmpty(state.SortLabel) ? "TrackName" : state.SortLabel; var sortColumn = string.IsNullOrEmpty(state.SortLabel) ? "TrackName" : state.SortLabel;
var sortDescending = state.SortDirection == SortDirection.Descending; var sortDescending = state.SortDirection == SortDirection.Descending;
var result = await TrackService.GetPaged(pageNumber, state.PageSize, sortColumn, sortDescending); var result = await TrackService.GetPaged(pageNumber, state.PageSize, sortColumn, sortDescending, cancellationToken);
if (!result.Success || result.Value is null) if (!result.Success || result.Value is null)
{ {
@@ -129,7 +129,8 @@
} }
catch (Exception ex) catch (Exception ex)
{ {
Snackbar.Add($"Delete failed: {ex.Message}", Severity.Error); Logger.LogError(ex, "Delete failed for track {TrackId}", track.Id);
Snackbar.Add("Delete failed — please try again.", Severity.Error);
} }
} }
} }
+1
View File
@@ -5,6 +5,7 @@
@using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization @using Microsoft.AspNetCore.Components.Web.Virtualization
@using static Microsoft.AspNetCore.Components.Web.RenderMode @using static Microsoft.AspNetCore.Components.Web.RenderMode
@using Microsoft.Extensions.Logging
@using Microsoft.JSInterop @using Microsoft.JSInterop
@using DeepDrftCms @using DeepDrftCms
@using DeepDrftModels.Entities @using DeepDrftModels.Entities
+1 -1
View File
@@ -8,7 +8,7 @@ public interface ITrackService
{ {
Task<ResultContainer<TrackEntity?>> GetById(long id); Task<ResultContainer<TrackEntity?>> GetById(long id);
Task<ResultContainer<List<TrackEntity>>> GetAll(); Task<ResultContainer<List<TrackEntity>>> GetAll();
Task<ResultContainer<PagedResult<TrackEntity>>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending); Task<ResultContainer<PagedResult<TrackEntity>>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending, CancellationToken cancellationToken = default);
Task<ResultContainer<TrackEntity>> Create(TrackEntity newTrack); Task<ResultContainer<TrackEntity>> Create(TrackEntity newTrack);
Task<ResultContainer<TrackEntity>> Update(TrackEntity track); Task<ResultContainer<TrackEntity>> Update(TrackEntity track);
Task<Result> Delete(long id); Task<Result> Delete(long id);
@@ -24,12 +24,12 @@ public class TrackRepository
return await _db.Tracks.ToListAsync(); return await _db.Tracks.ToListAsync();
} }
public async Task<PagedResult<TrackEntity>> GetPage(PagingParameters<TrackEntity> pageParameters) public async Task<PagedResult<TrackEntity>> GetPage(PagingParameters<TrackEntity> pageParameters, CancellationToken cancellationToken = default)
{ {
// Two separate queries with no transaction: count and page can be momentarily inconsistent // Two separate queries with no transaction: count and page can be momentarily inconsistent
// under concurrent writes. Acceptable — write volume is low and the UI is read-only. // under concurrent writes. Acceptable — write volume is low and the UI is read-only.
// If filtering is added, the count query must be updated to apply the same filter. // If filtering is added, the count query must be updated to apply the same filter.
var count = await _db.Tracks.CountAsync(); var count = await _db.Tracks.CountAsync(cancellationToken);
var orderBy = pageParameters.OrderBy ?? (t => t.Id); var orderBy = pageParameters.OrderBy ?? (t => t.Id);
var ordered = pageParameters.IsDescending var ordered = pageParameters.IsDescending
@@ -39,7 +39,7 @@ public class TrackRepository
var page = await ordered var page = await ordered
.Skip(pageParameters.Skip) .Skip(pageParameters.Skip)
.Take(pageParameters.PageSize) .Take(pageParameters.PageSize)
.ToListAsync(); .ToListAsync(cancellationToken);
return new PagedResult<TrackEntity>(page, count, pageParameters.Page, pageParameters.PageSize); return new PagedResult<TrackEntity>(page, count, pageParameters.Page, pageParameters.PageSize);
} }
+2 -2
View File
@@ -41,7 +41,7 @@ public class TrackService : ITrackService
} }
} }
public async Task<ResultContainer<PagedResult<TrackEntity>>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending) public async Task<ResultContainer<PagedResult<TrackEntity>>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending, CancellationToken cancellationToken = default)
{ {
try try
{ {
@@ -75,7 +75,7 @@ public class TrackService : ITrackService
} }
} }
var page = await _repository.GetPage(parameters); var page = await _repository.GetPage(parameters, cancellationToken);
return ResultContainer<PagedResult<TrackEntity>>.CreatePassResult(page); return ResultContainer<PagedResult<TrackEntity>>.CreatePassResult(page);
} }
catch (Exception e) catch (Exception e)