refactor: reorganise models and data-layer structure across the solution #21
Reference in New Issue
Block a user
Delete Branch "refactor/models-data-layer-structure"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Complete restructure of project naming, namespaces, and responsibility boundaries across the myAi solution — all pure refactoring, zero runtime behaviour changes.
Why
The solution had grown two DbContexts embedded inside API projects (cv-matcher-api,
ag-api), breaking the established data-layer pattern. Project names like cv-search-models and myai-models carried a -models suffix but contained EF entities and migrations. shared-models implied general sharing but held only infrastructure primitives. This refactor makes every project follow exactly one rule, readable from the name alone.
Changes
shared-modelstocommon; update all consumers; remove staleAspNetCore.Http.Featuresreferenceshared-datawith abstractBaseEntity(Id + CreatedAt)myai-modelstomyai-data; update namespaces + consumerscv-search-modelstocv-search-data; moveJobSearchSettingstocv-matcher-api-models; applyBaseEntityto eligible entitiesrag-datafromrag-api(DbContext, entities, migrations); fix duplicate service registrations inrag-api/Program.cscv-matcher-datafromcv-matcher-api(DbContext, entities, migrations)cv-cleanup-job-modelsandcv-search-job-modelsfor future growth.slnvirtual folders (addModels/andData/folders); updateCLAUDE.mdfilesDirectory.Packages.propsfor centralised NuGet version managementdocs/skills/general-dev-workflow.mdTesting
dotnet build myAi.slnpasses; EF migration dry-run verified for all 4 contextsRisk Assessment
Checklist
Phases 1-10 of the planned refactoring: Phase 1: rename shared-models -> common - namespace Shared.Models -> Common throughout - remove stale AspNetCore.Http.Features 5.0 reference Phase 2: create shared-data with abstract BaseEntity - BaseEntity: required string Id { get; init; } + DateTime CreatedAt { get; init; } Phase 3: rename myai-models -> myai-data - namespace MyAi.Models -> MyAi.Data - MigrationsAssembly("myai-data") Phase 4: rename cv-search-models -> cv-search-data - namespace CvSearch.Models -> CvSearch.Data - move JobSearchSettings to cv-matcher-api-models - JobSearch*Entity now inherits BaseEntity Phase 5: extract rag-data from rag-api - new project: Apis/rag-data with RagDbContext + entities + migrations - RagDocumentEntity inherits BaseEntity; cache entities use CacheKey PK - fix duplicate AddHttpClient<RagAiClient>/AddScoped registrations in rag-api - MigrationsAssembly("rag-data") Phase 6: extract cv-matcher-data from cv-matcher-api - new project: Apis/cv-matcher-data with CvMatcherDbContext + entities + migrations - CvMatchResultEntity inherits BaseEntity; CvMatcherChatCacheEntity uses CacheKey PK - MigrationsAssembly("cv-matcher-data") Phase 7: create empty cv-cleanup-job-models and cv-search-job-models Phase 8: update all 5 Dockerfiles for renamed/new projects Phase 9: reorganise .sln virtual folders (Apis/Jobs/Models/Data/Helpers) - update root CLAUDE.md with new project taxonomy and migration commands - update cv-matcher-api/CLAUDE.md and cv-search-job/CLAUDE.md Phase 10: add Directory.Packages.props for centralised NuGet versions - remove Version= from all PackageReference elements in active .csproj files No database changes. No runtime behaviour changes. All MigrationId strings in __EFMigrationsHistory are unaffected. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>