Skip to content

Add V3-to-V4 database upgrade with recovery and SettingsModal redesign#511

Merged
jschick04 merged 31 commits intomainfrom
jschick/db-upgrade
May 4, 2026
Merged

Add V3-to-V4 database upgrade with recovery and SettingsModal redesign#511
jschick04 merged 31 commits intomainfrom
jschick/db-upgrade

Conversation

@jschick04
Copy link
Copy Markdown
Collaborator

Adds the V4 provider database schema along with the surrounding upgrade flow, recovery handling for interrupted upgrades, and a redesigned SettingsModal database list.

Schema and storage

  • New V4 provider DB format with ResolvedFromOwningPublisher and a merge helper.
  • EventResolver distinguishes obsolete vs unrecognized provider DB formats; EventDbTool rejects both for write commands.
  • DatabaseService restructured to a single-owner model with per-entry import, per-entry status, and BackupExists surfacing.
  • Empty / unrecognized provider DBs are quarantined at classification time; missing ProviderDetails is treated as Unknown schema.
  • Channel-based UpgradeBatchAsync with progress events; freshly-imported DBs default to disabled and V3 entries auto-upgrade.

Recovery for interrupted upgrades

  • .upgrade.bak marker detected during classification.
  • DatabaseRecoveryDialog (built on ModalChrome with new FooterDisabled support).
  • DatabaseRecoveryHost surfaces a banner and opens the dialog.
  • Safe recovery file operations on DatabaseService; Remove no longer wildcards user-created .bak files.

Banner system

  • New Attention slice with reset-on-growth dismiss semantics.
  • New UpgradeProgress slice driven by upgrade-batch events.
  • BannerHost paginates attention/upgrade-progress slices in a flat cycle.
  • Optional action button on the error banner; renamed Critical/Error to align with severity taxonomy.

SettingsModal UX

  • Per-status primary action per database row (toggle / upgrade / retry / spinner / none).
  • Classification-pending UX with WCAG AA contrast on status fills.
  • HandleOpenLog guarded by classification await and resolver try/catch.
  • Per-entry import failures surfaced; toggles buffered.
  • Inline upgrade banner; settings-scope upgrades triggered from toggle confirmation.
  • Database row redesigned: click name to reveal a recessed left-side trash strip; mouse leave collapses; keyboard reveal via :focus-visible. Dialog confirm wording adapts to whether logs are open.

Testing

  • EventLogExpert.Components.Tests: 113/113 passing.
  • EventLogExpert.UI.Tests: 1005/1005 passing.

Notes

  • Multi-model code review (Claude Opus 4.7 + GPT-5.5) ran on the final iteration; only finding was a missing @key on the database row foreach (now fixed).
  • No conflicts with open PR Make canonical DisplayedEvents primary and drop per-table materialization #510 (jschick/refactor_combinedview); the three overlapping files (EventLogEffects.cs, EventLogEffectsTests.cs, EventTable.razor.cs) auto-merge cleanly in either direction.

@jschick04 jschick04 requested a review from a team as a code owner May 3, 2026 15:45
Copilot AI review requested due to automatic review settings May 3, 2026 15:45
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a V4 provider-database schema and end-to-end upgrade/recovery UX, including new banner slices (attention + upgrade progress) and a redesigned Settings modal database list with per-entry actions.

Changes:

  • Introduces provider DB schema v4 detection/upgrade (including duplicate-merge and schema validation) and updates tooling to reject unknown/obsolete schemas.
  • Refactors database management to per-entry state/status with upgrade batching + recovery workflow surfaced via banners and dialogs.
  • Redesigns SettingsModal database list UI (row actions, upgrade progress banner, WCAG contrast tweaks) and updates banner host cycling/pagination.

Reviewed changes

Copilot reviewed 111 out of 112 changed files in this pull request and generated 2 comments.

Show a summary per file
File Description
src/EventLogExpert/wwwroot/css/app.css Adds inset surface + status-fill contrast variables; adjusts highlight colors for contrast.
src/EventLogExpert/_Imports.razor Imports new EventLogExpert.Components.Base namespace.
src/EventLogExpert/Shared/UnhandledExceptionHandler.razor.cs Routes UI unhandled exceptions to critical banner path.
src/EventLogExpert/Shared/Components/ValueSelect.razor.cs Switches base input component namespace to Components.Base.
src/EventLogExpert/Shared/Components/ValueSelect.razor Removes now-unneeded local @using for base components.
src/EventLogExpert/Shared/Components/TextInput.razor.cs Switches base input component namespace to Components.Base.
src/EventLogExpert/Shared/Components/TextInput.razor Updates @inherits to new base input component import.
src/EventLogExpert/Shared/Components/SettingsModal.razor.css Adds “classification pending” spinner styling.
src/EventLogExpert/Shared/Components/SettingsModal.razor Integrates upgrade banner + new DatabaseEntryRow list rendering.
src/EventLogExpert/Shared/Components/Filters/FilterRow.razor.cs Updates usings (services → interfaces).
src/EventLogExpert/Shared/Components/Filters/FilterGroupModal.razor.cs Updates usings (services → interfaces).
src/EventLogExpert/Shared/Components/Filters/FilterGroup.razor.cs Updates usings (services → interfaces).
src/EventLogExpert/Shared/Components/Filters/FilterCacheModal.razor.cs Updates usings (services → interfaces).
src/EventLogExpert/Shared/Base/ModalBase.cs Uses Components.Base chrome/types; removes stale inline-alert comment.
src/EventLogExpert/Shared/Base/FooterPreset.cs Removes old footer preset enum (moved to Components.Base).
src/EventLogExpert/Services/MauiMenuActionService.cs Returns success/failure for opening Settings modal.
src/EventLogExpert/Services/KeyboardShortcutService.cs Adds explanatory exception comments for teardown paths.
src/EventLogExpert/MauiProgram.cs Rebinds DatabaseService as single owner; wires ILogReloadCoordinator; eagerly instantiates banner service.
src/EventLogExpert/MainPage.xaml.cs Removes legacy DB-loaded event wiring and related providers.
src/EventLogExpert/Main.razor Adds DatabaseRecoveryHost inside error handler; clarifies component placement.
src/EventLogExpert/Components/EventTable.razor.cs Adds explanatory comments for JS disconnect teardown.
src/EventLogExpert/Components/DetailsPane.razor.css Prevents horizontal overflow and improves wrapping behavior.
src/EventLogExpert/Components/DetailsPane.razor.cs Adds defensive comments for CTS cancel/dispose and JS disconnect.
src/EventLogExpert/App.xaml.cs Removes legacy DB provider dependencies from app wiring.
src/EventLogExpert.slnx Adds new EventDbTool test project to solution.
src/EventLogExpert.UI/Store/EventLog/LiveLogWatcherService.cs Makes log removal async + disposes watchers off UI thread to avoid deadlocks.
src/EventLogExpert.UI/Store/EventLog/ILogReloadCoordinator.cs Adds coordinator abstraction for log close/reopen around DB removal.
src/EventLogExpert.UI/Services/ModalAlertDialogService.cs Routes “error alerts” to banner service with optional action button.
src/EventLogExpert.UI/Services/EnabledDatabaseCollectionProvider.cs Removes legacy enabled-db provider (DatabaseService becomes the source of truth).
src/EventLogExpert.UI/Services/BannerViewSelector.cs Replaces single-view selector with cycle builder (errors/attention/progress/infos).
src/EventLogExpert.UI/Services/BannerService.cs Adds attention + upgrade progress slices; refactors critical/error handling and robust StateChanged dispatch.
src/EventLogExpert.UI/Services/AlertPresentation.cs Adds missing using for interface references.
src/EventLogExpert.UI/Services/AlertDialogService.cs Removes old interface definition (moved to UI.Interfaces).
src/EventLogExpert.UI/Models/UpgradeProgressScope.cs Adds enum for background vs settings-triggered upgrade progress.
src/EventLogExpert.UI/Models/UpgradePhase.cs Adds enum for upgrade phases.
src/EventLogExpert.UI/Models/UpgradeFailure.cs Adds failure record for upgrade results.
src/EventLogExpert.UI/Models/UpgradeBatchStartedEventArgs.cs Adds started event args with safe cancellation wrapper.
src/EventLogExpert.UI/Models/UpgradeBatchResult.cs Adds batch result record (succeeded/cancelled/failed).
src/EventLogExpert.UI/Models/UpgradeBatchProgressEventArgs.cs Adds progress event args.
src/EventLogExpert.UI/Models/UpgradeBatchCompletedEventArgs.cs Adds completion event args.
src/EventLogExpert.UI/Models/ImportResult.cs Adds import result record (imported + failures).
src/EventLogExpert.UI/Models/ImportFailure.cs Replaces prior CriticalAlertEntry model with ImportFailure record.
src/EventLogExpert.UI/Models/ErrorBannerEntry.cs Adds error banner entry model (optional action).
src/EventLogExpert.UI/Models/DatabaseEntry.cs Adds per-entry DB model with status + backup marker.
src/EventLogExpert.UI/Models/BannerProgressEntry.cs Adds banner progress model for upgrades.
src/EventLogExpert.UI/Interfaces/IMenuActionService.cs Changes OpenSettingsAsync to return success boolean.
src/EventLogExpert.UI/Interfaces/IDatabaseService.cs Redesigns DB service API (entries/status/upgrade/import/remove/recovery + events).
src/EventLogExpert.UI/Interfaces/IBannerService.cs Redesigns banner API (critical/error/attention/progress slices).
src/EventLogExpert.UI/Interfaces/IAlertDialogService.cs Moves/defines alert dialog interface in UI.Interfaces; adds ShowErrorAlert with action support.
src/EventLogExpert.UI/Enums.cs Adds DatabaseStatus enum for classification/upgrade states.
src/EventLogExpert.UI/DatabaseStatusLabels.cs Adds centralized status/badge labeling helpers.
src/EventLogExpert.UI.Tests/TestUtils/DatabaseSeedUtils.cs Adds helpers to seed multiple historical DB schemas for tests.
src/EventLogExpert.UI.Tests/Services/ModalAlertDialogServiceTests.cs Updates tests for ShowErrorAlert + action passthrough behavior.
src/EventLogExpert.UI.Tests/Services/EnabledDatabaseCollectionProviderTests.cs Removes tests for deleted legacy provider.
src/EventLogExpert.UI.Tests/Services/BannerViewSelectorTests.cs Rewrites tests for new cycle-based banner selection behavior.
src/EventLogExpert.UI.Tests/DatabaseStatusLabelsTests.cs Adds tests for new status label helpers.
src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs Ensures Unregister waits for in-flight callbacks to finish to release resolver scopes/SQLite handles.
src/EventLogExpert.Eventing/Providers/ProviderDetails.cs Maps ResolvedFromOwningPublisher into DB; updates IsEmpty semantics accordingly.
src/EventLogExpert.Eventing/EventResolvers/IDatabaseCollectionProvider.cs Removes mutating setter from provider collection interface.
src/EventLogExpert.Eventing/EventResolvers/EventResolver.cs Distinguishes unknown vs obsolete DB schemas; relies on NOCASE collation for provider name lookup.
src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDetailsMerger.cs Adds case-insensitive duplicate merge for provider rows with conflict detection.
src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDatabaseSchemaVersion.cs Defines current/unknown schema versions (v4).
src/EventLogExpert.Eventing/EventProviderDatabase/ProviderDatabaseSchemaState.cs Adds schema state record with NeedsUpgrade helper.
src/EventLogExpert.Eventing/EventProviderDatabase/EventProviderDbContext.cs Adds schema version detection, v4 upgrade path, NOCASE collation, and controlled EnsureCreated behavior.
src/EventLogExpert.Eventing/EventProviderDatabase/DatabaseUpgradeException.cs Adds explicit exception type for upgrade/schema errors.
src/EventLogExpert.Eventing.Tests/Providers/ProviderDetailsTests.cs Adds tests for IsEmpty semantics with new field.
src/EventLogExpert.Eventing.Tests/EventProviderDatabase/ProviderDetailsMergerTests.cs Adds coverage for duplicate merging and conflict detection rules.
src/EventLogExpert.EventDbTool/UpgradeDatabaseCommand.cs Updates tool’s upgrade-needed detection to schema state API.
src/EventLogExpert.EventDbTool/ProviderSource.cs Adds schema validation for source DBs; refuses unknown/obsolete schemas during load/diff/merge.
src/EventLogExpert.EventDbTool/Properties/AssemblyInfo.cs Exposes internals to new EventDbTool test project.
src/EventLogExpert.EventDbTool/MergeDatabaseCommand.cs Validates target schema before merge; relies on NOCASE schema for name matching.
src/EventLogExpert.EventDbTool/DiffDatabaseCommand.cs Validates source schemas before diff; preserves full ProviderDetails entities.
src/EventLogExpert.EventDbTool.Tests/TestUtils/DatabaseTestUtils.cs Adds helpers to create v3/v4/unknown-shape DBs for tests.
src/EventLogExpert.EventDbTool.Tests/TestUtils/Constants/Constants.Database.cs Adds shared provider-name constants for EventDbTool tests.
src/EventLogExpert.EventDbTool.Tests/ProviderSourceTests.cs Adds tests for schema validation behavior over files/directories.
src/EventLogExpert.EventDbTool.Tests/GlobalUsings.cs Adds xUnit global using.
src/EventLogExpert.EventDbTool.Tests/EventLogExpert.EventDbTool.Tests.csproj Adds new test project for EventDbTool.
src/EventLogExpert.EventDbTool.Tests/DiffDatabaseCommandTests.cs Adds regression test ensuring new ProviderDetails field is preserved in diff output.
src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor.css Styles sticky in-settings upgrade progress banner.
src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor.cs Implements banner component subscribing to IBannerService changes and cancel handler.
src/EventLogExpert.Components/SettingsUpgradeProgressBanner.razor Renders settings-scoped upgrade progress with cancel action.
src/EventLogExpert.Components/DatabaseRecoveryHost.razor.cs Adds host that raises recovery banner and opens recovery dialog when backups exist.
src/EventLogExpert.Components/DatabaseRecoveryHost.razor Renders recovery dialog when open flag is set.
src/EventLogExpert.Components/DatabaseRecoveryDialog.razor.css Styles recovery dialog list and failure highlighting.
src/EventLogExpert.Components/DatabaseRecoveryDialog.razor.cs Implements apply/restore/delete recovery workflow with per-row selection.
src/EventLogExpert.Components/DatabaseRecoveryDialog.razor Renders recovery UI with bulk actions and per-db restore/delete choice.
src/EventLogExpert.Components/DatabaseEntryRow.razor.css Adds redesigned DB row with revealable recessed trash strip and action states.
src/EventLogExpert.Components/DatabaseEntryRow.razor.cs Computes badge/action rendering logic for per-entry DB state.
src/EventLogExpert.Components/DatabaseEntryRow.razor Renders per-entry row (toggle/upgrade/retry/spinner/badge + remove).
src/EventLogExpert.Components/BooleanSelect.razor.css Improves status-fill contrast and disabled toggle affordance.
src/EventLogExpert.Components/BooleanSelect.razor.cs Moves component to Components namespace; adds Disabled parameter.
src/EventLogExpert.Components/BooleanSelect.razor Applies Disabled to radio inputs and updates base import.
src/EventLogExpert.Components/Base/ModalChrome.razor.css Refines inline-alert layout/wrapping and dialog overflow behavior.
src/EventLogExpert.Components/Base/ModalChrome.razor.cs Moves to Components.Base; adds FooterDisabled; refactors inline-alert focus logic.
src/EventLogExpert.Components/Base/ModalChrome.razor Disables footer buttons when FooterDisabled; keeps inline-alert behavior intact.
src/EventLogExpert.Components/Base/InputComponent.cs Moves base input component to Components.Base namespace.
src/EventLogExpert.Components/Base/FooterPreset.cs Reintroduces FooterPreset enum under Components.Base.
src/EventLogExpert.Components/BannerHost.razor.css Adds styling for attention/progress banners and cycle navigation/buttons.
src/EventLogExpert.Components/BannerHost.razor.cs Adds cycle/pagination logic; integrates attention banner and settings launcher.
src/EventLogExpert.Components/BannerHost.razor Renders critical/error/attention/progress/info via cycle selection.
src/EventLogExpert.Components.Tests/SettingsUpgradeProgressBannerTests.cs Adds bUnit tests for settings upgrade progress banner rendering and cancel behavior.
src/EventLogExpert.Components.Tests/DatabaseRecoveryHostTests.cs Adds bUnit tests for recovery banner lifecycle and dialog opening behavior.
src/EventLogExpert.Components.Tests/DatabaseEntryRowTests.cs Adds bUnit tests for per-status action/badge rendering and callbacks.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs
Comment thread src/EventLogExpert.EventDbTool/UpgradeDatabaseCommand.cs Outdated
@jschick04 jschick04 marked this pull request as draft May 3, 2026 16:21
@jschick04 jschick04 requested a review from Copilot May 3, 2026 17:02
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 114 out of 115 changed files in this pull request and generated 3 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/EventLogExpert.Components/DatabaseRecoveryDialog.razor Outdated
Comment thread src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 114 out of 115 changed files in this pull request and generated 1 comment.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs
@jschick04 jschick04 marked this pull request as ready for review May 3, 2026 17:25
bill-long
bill-long previously approved these changes May 3, 2026
bill-long
bill-long previously approved these changes May 4, 2026
@jschick04 jschick04 force-pushed the jschick/db-upgrade branch from ea79b65 to 2958101 Compare May 4, 2026 16:18
Copilot AI review requested due to automatic review settings May 4, 2026 16:18
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 114 out of 115 changed files in this pull request and generated 4 comments.


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread src/EventLogExpert.EventDbTool/ProviderSource.cs
Comment thread src/EventLogExpert.EventDbTool/ProviderSource.cs
Comment thread src/EventLogExpert.EventDbTool/ProviderSource.cs
Comment thread src/EventLogExpert.Eventing/Readers/EventLogWatcher.cs
@jschick04 jschick04 force-pushed the jschick/db-upgrade branch from 2958101 to c145edc Compare May 4, 2026 16:40
@jschick04 jschick04 requested a review from bill-long May 4, 2026 16:45
@jschick04 jschick04 merged commit b73f78f into main May 4, 2026
6 checks passed
@jschick04 jschick04 deleted the jschick/db-upgrade branch May 4, 2026 17:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants