1 line
14 KiB
JSON
1 line
14 KiB
JSON
{"path":"NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs","purpose":"EF Core migration designer that defines the target EF model for the AppDbContext: configures entities, relationships, indices, Postgres/vector extensions and includes seed data for subscription plans.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["[DbContext(typeof(AppDbContext))] and [Migration(...)] attributes (lines 15-16)","Override of BuildTargetModel(ModelBuilder) that configures entities (line 20)","HasData seeding for SubscriptionPlans (lines 498-530)"]},"className":"FinalNormalizedSubscriptionArchitecture","methods":[{"name":"BuildTargetModel","line":20,"endLine":650,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Populates the EF Core ModelBuilder with entity types, columns, keys, indices, relationships, Postgres/vector extensions and seed data for this migration snapshot.","calls":[],"actions":[{"id":"annotation_23","kind":"mapping","label":"Sets model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\",\"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\",63)","visibility":"detail-only","confidence":0.7},{"id":"external-call_27","kind":"external-call","label":"Enables Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"external-call_28","kind":"external-call","label":"Configures identity column behavior","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_30","kind":"mapping","label":"Microsoft.AspNetCore.Identity.IdentityRole","line":30,"detail":"Defines Id, ConcurrencyStamp, Name, NormalizedName, primary key and unique index RoleNameIndex","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_162","kind":"mapping","label":"NexusReader.Domain.Entities.Ebook","line":162,"detail":"Defines Id, AddedDate, Author, FilePath, TenantId, Title, UserId; indices on TenantId and UserId; table Ebooks","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_209","kind":"mapping","label":"NexusReader.Domain.Entities.KnowledgeUnit","line":209,"detail":"Defines Id, Content, CreatedAt, SourceId, TenantId, Type, Vector (vector(768)), Version; indices on SourceId and TenantId","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_255","kind":"mapping","label":"NexusReader.Domain.Entities.KnowledgeUnitLink","line":255,"detail":"Defines Id (identity), RelationType, SourceUnitId, TargetUnitId; indices on SourceUnitId and TargetUnitId","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_287","kind":"mapping","label":"NexusReader.Domain.Entities.NexusUser","line":287,"detail":"Defines identity fields, subscription plan FK (SubscriptionPlanId default 1), indices on NormalizedEmail, NormalizedUserName, SubscriptionPlanId, TenantId","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_422","kind":"mapping","label":"NexusReader.Domain.Entities.SemanticKnowledgeCache","line":422,"detail":"Defines ContentHash PK, CreatedAt, JsonData, ModelId, OriginalText, PromptVersion, TenantId, Vector (vector(1536)); unique index on ContentHash","visibility":"detail-only","confidence":0.7},{"id":"entity-configuration_467","kind":"mapping","label":"NexusReader.Domain.Entities.SubscriptionPlan","line":467,"detail":"Defines Id (identity), AITokenLimit, MonthlyPrice, PlanName, StripeProductId; unique index on PlanName; seeds four plans via HasData","visibility":"detail-only","confidence":0.7},{"id":"persistence-seed_498","kind":"mapping","label":"Seeds SubscriptionPlans","line":498,"detail":"HasData inserts 4 subscription plan rows: Free, Basic, Pro, Enterprise with Ids 1..4 and token/price values","visibility":"detail-only","confidence":0.7},{"id":"relationship_533","kind":"mapping","label":"Identity and domain relationships","line":533,"detail":"Configures FK relations and cascade behaviors (e.g. IdentityRoleClaim->IdentityRole, User related FKs, Ebook.User, QuizResult.User, KnowledgeUnitLink.SourceUnit/TargetUnit, NexusUser.SubscriptionPlan with Restrict)","visibility":"detail-only","confidence":0.7},{"id":"navigation_636","kind":"mapping","label":"Entity navigations enabled","line":636,"detail":"Declares entity navigation properties to enable relationships (e.g. NexusUser.Ebooks, NexusUser.QuizResults, KnowledgeUnit.IncomingLinks/OutgoingLinks)","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"purpose":"Identity role mapping configured in the EF model for AspNetRoles table","fields":[{"name":"Id","type":"string","required":true,"line":32,"description":"Primary key"},{"name":"Name","type":"string","required":false,"line":39,"description":"Role name (max 256)"},{"name":"NormalizedName","type":"string","required":false,"line":43,"description":"Normalized role name (indexed unique)"}]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":162,"purpose":"Domain entity configuration for ebooks table","fields":[{"name":"Id","type":"Guid","required":true,"line":164,"description":"PK, generated"},{"name":"Author","type":"string","required":true,"line":171,"description":"Author name"},{"name":"FilePath","type":"string","required":true,"line":179,"description":"Path to ebook file"},{"name":"TenantId","type":"string","required":true,"line":186,"description":"Tenant scope"},{"name":"UserId","type":"string","required":true,"line":196,"description":"Owner user FK"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":209,"purpose":"Vectorized knowledge unit used for semantic search and storage","fields":[{"name":"Id","type":"string","required":true,"line":211,"description":"PK (max 128)"},{"name":"Content","type":"string","required":true,"line":215,"description":"Text content"},{"name":"SourceId","type":"string","required":true,"line":225,"description":"Source identifier"},{"name":"TenantId","type":"string","required":true,"line":230,"description":"Tenant scope"},{"name":"Vector","type":"Vector","required":false,"line":238,"description":"Embedding vector column (vector(768))"},{"name":"Version","type":"string","required":true,"line":241,"description":"Version string (max 50)"}]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":255,"purpose":"Represents directional links between knowledge units","fields":[{"name":"Id","type":"int","required":true,"line":257,"description":"PK, identity"},{"name":"SourceUnitId","type":"string","required":true,"line":268,"description":"FK to Source KnowledgeUnit"},{"name":"TargetUnitId","type":"string","required":true,"line":273,"description":"FK to Target KnowledgeUnit"},{"name":"RelationType","type":"string","required":true,"line":263,"description":"Relation type (max 50)"}]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":287,"purpose":"Application user mapped to AspNetUsers with subscription and tenant info","fields":[{"name":"Id","type":"string","required":true,"line":289,"description":"User id (PK)"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":352,"description":"FK to SubscriptionPlan, default 1"},{"name":"TenantId","type":"string","required":true,"line":356,"description":"Tenant scope"}]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":422,"purpose":"Cached semantic results with embedding vector and prompt/model metadata","fields":[{"name":"ContentHash","type":"string","required":true,"line":424,"description":"PK (max 128)"},{"name":"JsonData","type":"string","required":true,"line":431,"description":"Stored JSON result"},{"name":"Vector","type":"Vector","required":false,"line":454,"description":"Embedding vector column (vector(1536))"}]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":467,"purpose":"Subscription plan catalog with token limits, price and Stripe product id; seeded by migration","fields":[{"name":"Id","type":"int","required":true,"line":469,"description":"PK, identity"},{"name":"AITokenLimit","type":"int","required":true,"line":475,"description":"AI token quota"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":478,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":481,"description":"Unique plan name (max 50)"},{"name":"StripeProductId","type":"string","required":true,"line":486,"description":"Stripe product identifier"}]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":385,"purpose":"User quiz result entries with score and topic","fields":[{"name":"Id","type":"Guid","required":true,"line":387,"description":"PK"},{"name":"Score","type":"int","required":true,"line":394,"description":"Quiz score"},{"name":"TenantId","type":"string","required":true,"line":397,"description":"Tenant scope"},{"name":"UserId","type":"string","required":true,"line":409,"description":"FK to NexusUser"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data/Persistence/AppDbContext.cs","NexusReader.Domain/Entities/Ebook.cs","NexusReader.Domain/Entities/KnowledgeUnit.cs","NexusReader.Domain/Entities/KnowledgeUnitLink.cs","NexusReader.Domain/Entities/NexusUser.cs","NexusReader.Domain/Entities/SemanticKnowledgeCache.cs","NexusReader.Domain/Entities/SubscriptionPlan.cs","NexusReader.Domain/Entities/QuizResult.cs"],"patterns":["EF Core Migration","Data Seeding","Entity Configuration"],"domainConcepts":["SubscriptionPlan","NexusUser","KnowledgeUnit","KnowledgeUnitLink","SemanticKnowledgeCache","Ebook","QuizResult"],"keyDetails":"Migration snapshot configures Postgres vector extension and embedding columns (vector(768)/vector(1536)), defines identity and domain entities with indices and FKs, and inserts four SubscriptionPlan seed rows (Free, Basic, Pro, Enterprise).","orchestrationMethods":[{"name":"BuildTargetModel","line":20,"confidence":0.69,"reason":"Contains 2 architectural actions relevant to business execution.","actionKinds":["mapping","external-call"],"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}],"typedContracts":[{"name":"Microsoft.AspNetCore.Identity.IdentityRole","kind":"entity","line":30,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.Ebook","kind":"entity","line":162,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnit","kind":"entity","line":209,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.KnowledgeUnitLink","kind":"entity","line":255,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.NexusUser","kind":"entity","line":287,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SemanticKnowledgeCache","kind":"entity","line":422,"fieldCount":3,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.SubscriptionPlan","kind":"entity","line":467,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"name":"NexusReader.Domain.Entities.QuizResult","kind":"entity","line":385,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[{"methodName":"BuildTargetModel","line":27,"kind":"external-call","detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"methodName":"BuildTargetModel","line":28,"kind":"external-call","detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}],"evidenceAnchors":[{"kind":"orchestration-method","label":"BuildTargetModel","line":20,"summary":"Contains 2 architectural actions relevant to business execution.","confidence":0.69,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"Microsoft.AspNetCore.Identity.IdentityRole","line":30,"summary":"entity with 3 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.Ebook","line":162,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.KnowledgeUnit","line":209,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"typed-contract","label":"NexusReader.Domain.Entities.KnowledgeUnitLink","line":255,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"external-call","label":"BuildTargetModel","line":27,"summary":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]},{"kind":"external-call","label":"BuildTargetModel","line":28,"summary":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260503175906_FinalNormalizedSubscriptionArchitecture.Designer.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"35d8008b677976512c18ef7ed48833914212d2412b469641fb7e1da44c119791","sourceByteSize":24565,"analyzedAt":"2026-05-23T16:24:37.216Z","technology":"dotnet"}} |