From 88c94b24cf5090475d906155bd31a78fa4fa4102 Mon Sep 17 00:00:00 2001 From: Daniel Harvey Date: Mon, 18 May 2026 14:58:36 -0400 Subject: [PATCH] Fix W3-T1 review: forward CancellationToken in GetPaged, scrub ex.Message from snackbar, drop unused Navigation inject, annotate ITrackService wiring in CmsStartup --- DeepDrftCms/CmsStartup.cs | 5 +++++ DeepDrftCms/Pages/Tracks/TrackList.razor | 7 ++++--- DeepDrftCms/_Imports.razor | 1 + DeepDrftWeb.Services/ITrackService.cs | 2 +- DeepDrftWeb.Services/Repositories/TrackRepository.cs | 6 +++--- DeepDrftWeb.Services/TrackService.cs | 4 ++-- 6 files changed, 16 insertions(+), 9 deletions(-) diff --git a/DeepDrftCms/CmsStartup.cs b/DeepDrftCms/CmsStartup.cs index 44861e1..1b80271 100644 --- a/DeepDrftCms/CmsStartup.cs +++ b/DeepDrftCms/CmsStartup.cs @@ -7,6 +7,11 @@ public static class CmsStartup public static IServiceCollection AddCmsServices(this IServiceCollection services) { // 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; } } diff --git a/DeepDrftCms/Pages/Tracks/TrackList.razor b/DeepDrftCms/Pages/Tracks/TrackList.razor index e63ba33..f6892c6 100644 --- a/DeepDrftCms/Pages/Tracks/TrackList.razor +++ b/DeepDrftCms/Pages/Tracks/TrackList.razor @@ -8,7 +8,7 @@ @inject IHttpClientFactory HttpClientFactory @inject IDialogService DialogService @inject ISnackbar Snackbar -@inject NavigationManager Navigation +@inject ILogger Logger Tracks — DeepDrft CMS @@ -85,7 +85,7 @@ var sortColumn = string.IsNullOrEmpty(state.SortLabel) ? "TrackName" : state.SortLabel; 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) { @@ -129,7 +129,8 @@ } 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); } } } diff --git a/DeepDrftCms/_Imports.razor b/DeepDrftCms/_Imports.razor index d0b266a..edc98a0 100644 --- a/DeepDrftCms/_Imports.razor +++ b/DeepDrftCms/_Imports.razor @@ -5,6 +5,7 @@ @using Microsoft.AspNetCore.Components.Web @using Microsoft.AspNetCore.Components.Web.Virtualization @using static Microsoft.AspNetCore.Components.Web.RenderMode +@using Microsoft.Extensions.Logging @using Microsoft.JSInterop @using DeepDrftCms @using DeepDrftModels.Entities diff --git a/DeepDrftWeb.Services/ITrackService.cs b/DeepDrftWeb.Services/ITrackService.cs index 93184a5..6d387ef 100644 --- a/DeepDrftWeb.Services/ITrackService.cs +++ b/DeepDrftWeb.Services/ITrackService.cs @@ -8,7 +8,7 @@ public interface ITrackService { Task> GetById(long id); Task>> GetAll(); - Task>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending); + Task>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending, CancellationToken cancellationToken = default); Task> Create(TrackEntity newTrack); Task> Update(TrackEntity track); Task Delete(long id); diff --git a/DeepDrftWeb.Services/Repositories/TrackRepository.cs b/DeepDrftWeb.Services/Repositories/TrackRepository.cs index d4cb123..8399d4e 100644 --- a/DeepDrftWeb.Services/Repositories/TrackRepository.cs +++ b/DeepDrftWeb.Services/Repositories/TrackRepository.cs @@ -24,12 +24,12 @@ public class TrackRepository return await _db.Tracks.ToListAsync(); } - public async Task> GetPage(PagingParameters pageParameters) + public async Task> GetPage(PagingParameters pageParameters, CancellationToken cancellationToken = default) { // 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. // 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 ordered = pageParameters.IsDescending @@ -39,7 +39,7 @@ public class TrackRepository var page = await ordered .Skip(pageParameters.Skip) .Take(pageParameters.PageSize) - .ToListAsync(); + .ToListAsync(cancellationToken); return new PagedResult(page, count, pageParameters.Page, pageParameters.PageSize); } diff --git a/DeepDrftWeb.Services/TrackService.cs b/DeepDrftWeb.Services/TrackService.cs index fe6015d..e1cd6ad 100644 --- a/DeepDrftWeb.Services/TrackService.cs +++ b/DeepDrftWeb.Services/TrackService.cs @@ -41,7 +41,7 @@ public class TrackService : ITrackService } } - public async Task>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending) + public async Task>> GetPaged(int pageNumber, int pageSize, string? sortColumn, bool sortDescending, CancellationToken cancellationToken = default) { try { @@ -75,7 +75,7 @@ public class TrackService : ITrackService } } - var page = await _repository.GetPage(parameters); + var page = await _repository.GetPage(parameters, cancellationToken); return ResultContainer>.CreatePassResult(page); } catch (Exception e)