Files
Nexus.Reader/src/.documentation/cache/summaries/NexusReader.Data__Migrations__20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs.json
T
2026-05-25 14:02:56 +02:00

1 line
13 KiB
JSON

{"path":"NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs","purpose":"EF Core migration designer that builds the target EF Core model for the migration UpdateSubscriptionPlanIsUnlimitedTokens; contains the model snapshot/configuration (entities, properties, indexes, relations, and seed data) used by EF migrations.","classification":{"role":"database-config","layer":"data","confidence":0.9,"evidence":["DTO/view-model naming pattern","Class is decorated with [Migration(...)] and [DbContext(typeof(AppDbContext))]","Defines BuildTargetModel(ModelBuilder) which configures entities, relations, indexes and seed data","Contains HasData(...) seeding for SubscriptionPlans"]},"className":"UpdateSubscriptionPlanIsUnlimitedTokens","methods":[{"name":"BuildTargetModel","line":20,"endLine":657,"signature":"(modelBuilder: ModelBuilder) -> void","purpose":"Constructs the EF Core model for this migration: configures entities, properties, constraints, relationships, annotations and seed data.","calls":[],"actions":[{"id":"warning-directive_22","kind":"mapping","label":"Suppress obsolete warnings","line":22,"detail":"#pragma warning disable 612, 618 (and restore at end)","visibility":"detail-only","confidence":0.7},{"id":"annotation_23","kind":"mapping","label":"Set model annotations","line":23,"detail":"modelBuilder.HasAnnotation(\"ProductVersion\",\"10.0.7\").HasAnnotation(\"Relational:MaxIdentifierLength\", 63)","visibility":"detail-only","confidence":0.7},{"id":"extension-enable_27","kind":"mapping","label":"Enable Postgres vector extension","line":27,"detail":"NpgsqlModelBuilderExtensions.HasPostgresExtension(modelBuilder, \"vector\")","visibility":"detail-only","confidence":0.7},{"id":"identity-config_28","kind":"mapping","label":"Use identity-by-default columns for Postgres","line":28,"detail":"NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder)","visibility":"detail-only","confidence":0.7},{"id":"define-entity_162","kind":"mapping","label":"Define entity 'Ebook'","line":162,"detail":"Configures properties, keys, indexes (TenantId, UserId), table name 'Ebooks', and required constraints","visibility":"detail-only","confidence":0.7},{"id":"define-entity_209","kind":"mapping","label":"Define entity 'KnowledgeUnit'","line":209,"detail":"Configures properties (including Vector vector(768)), keys, indexes (SourceId, TenantId), table 'KnowledgeUnits'","visibility":"detail-only","confidence":0.7},{"id":"define-entity_255","kind":"mapping","label":"Define entity 'KnowledgeUnitLink'","line":255,"detail":"Configures identity Id, relation fields, indexes, table 'KnowledgeUnitLinks'","visibility":"detail-only","confidence":0.7},{"id":"define-entity_287","kind":"mapping","label":"Define entity 'NexusUser'","line":287,"detail":"Configures many identity/user properties, SubscriptionPlanId default and index, indexes (NormalizedEmail, NormalizedUserName, SubscriptionPlanId, TenantId), table 'AspNetUsers'","visibility":"detail-only","confidence":0.7},{"id":"define-entity_385","kind":"mapping","label":"Define entity 'QuizResult'","line":385,"detail":"Configures quiz result properties, indexes (TenantId, UserId), table 'QuizResults'","visibility":"detail-only","confidence":0.7},{"id":"define-entity_422","kind":"mapping","label":"Define entity 'SemanticKnowledgeCache'","line":422,"detail":"Configures properties including Vector vector(1536), primary key ContentHash, unique index and TenantId index, table 'SemanticKnowledgeCache'","visibility":"detail-only","confidence":0.7},{"id":"define-entity_467","kind":"mapping","label":"Define entity 'SubscriptionPlan' with seed data","line":467,"detail":"Configures SubscriptionPlan properties (AITokenLimit, IsUnlimitedTokens, MonthlyPrice, PlanName, StripeProductId), unique index on PlanName and seed data rows for Free, Basic, Pro, Enterprise","visibility":"detail-only","confidence":0.7},{"id":"seed-data_501","kind":"mapping","label":"Seed SubscriptionPlans","line":501,"detail":"HasData adds four SubscriptionPlan rows (Ids 1..4) including Enterprise with IsUnlimitedTokens = true","visibility":"detail-only","confidence":0.7},{"id":"relationship_540","kind":"mapping","label":"Identity / role and user relations (FKs with cascade)","line":540,"detail":"Configures foreign keys and cascade delete between IdentityRoleClaim, IdentityUserClaim, IdentityUserLogin, IdentityUserRole, IdentityUserToken and identity/user tables","visibility":"detail-only","confidence":0.7},{"id":"relationship_591","kind":"mapping","label":"Ebook -> NexusUser (FK, cascade)","line":591,"detail":"b.HasOne(...).WithMany(\"Ebooks\").HasForeignKey(\"UserId\").OnDelete(DeleteBehavior.Cascade).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"relationship_602","kind":"mapping","label":"KnowledgeUnitLink -> KnowledgeUnit (FKs, cascade)","line":602,"detail":"SourceUnit and TargetUnit FKs with cascade delete and navigations","visibility":"detail-only","confidence":0.7},{"id":"relationship_621","kind":"mapping","label":"NexusUser -> SubscriptionPlan (FK, restrict)","line":621,"detail":"b.HasOne(SubscriptionPlan).WithMany().HasForeignKey(\"SubscriptionPlanId\").OnDelete(DeleteBehavior.Restrict).IsRequired()","visibility":"detail-only","confidence":0.7},{"id":"navigation_643","kind":"mapping","label":"Configure entity navigations","line":643,"detail":"Sets navigation properties for KnowledgeUnit Incoming/OutgoingLinks and NexusUser Ebooks/QuizResults","visibility":"detail-only","confidence":0.7}]}],"types":[{"name":"Ebook","kind":"entity","line":162,"purpose":"Represents an uploaded ebook file and metadata belonging to a user/tenant.","fields":[{"name":"Id","type":"Guid","required":true,"line":164,"description":"Primary key, uuid"},{"name":"AddedDate","type":"DateTime","required":true,"line":168,"description":"Date added"},{"name":"Author","type":"string","required":true,"line":171,"description":"Author name"},{"name":"FilePath","type":"string","required":true,"line":179,"description":"Storage path"},{"name":"TenantId","type":"string","required":true,"line":186,"description":"Tenant identifier"},{"name":"UserId","type":"string","required":true,"line":196,"description":"Owning user id (FK)"}]},{"name":"KnowledgeUnit","kind":"entity","line":209,"purpose":"Represents a chunk of semantic content with vector embedding and metadata for tenant/source.","fields":[{"name":"Id","type":"string","required":true,"line":211,"description":"Primary key (max 128)"},{"name":"Content","type":"string","required":true,"line":215,"description":"Text content"},{"name":"CreatedAt","type":"DateTime","required":true,"line":219,"description":"Creation timestamp"},{"name":"Vector","type":"Vector","required":false,"line":238,"description":"Embedding stored as vector(768)"},{"name":"SourceId","type":"string","required":true,"line":225,"description":"Source identifier"},{"name":"TenantId","type":"string","required":true,"line":230,"description":"Tenant identifier"}]},{"name":"KnowledgeUnitLink","kind":"entity","line":255,"purpose":"Represents a directed relation/link between knowledge units.","fields":[{"name":"Id","type":"int","required":true,"line":257,"description":"Primary key (identity)"},{"name":"RelationType","type":"string","required":true,"line":263,"description":"Relation type (max 50)"},{"name":"SourceUnitId","type":"string","required":true,"line":268,"description":"FK to source knowledge unit"},{"name":"TargetUnitId","type":"string","required":true,"line":273,"description":"FK to target knowledge unit"}]},{"name":"NexusUser","kind":"entity","line":287,"purpose":"Application user entity (extends IdentityUser style) with AI token tracking and subscription reference.","fields":[{"name":"Id","type":"string","required":true,"line":289,"description":"User id"},{"name":"AITokenLimit","type":"int","required":true,"line":292,"description":"AI token quota"},{"name":"AITokensUsed","type":"int","required":true,"line":295,"description":"Consumed AI tokens"},{"name":"SubscriptionPlanId","type":"int","required":true,"line":352,"description":"FK to SubscriptionPlan with default value 1"},{"name":"TenantId","type":"string","required":true,"line":356,"description":"Tenant identifier"}]},{"name":"QuizResult","kind":"entity","line":385,"purpose":"Stores quiz completion results for a user and tenant.","fields":[{"name":"Id","type":"Guid","required":true,"line":387,"description":"Primary key"},{"name":"CompletedDate","type":"DateTime","required":true,"line":391,"description":"When completed"},{"name":"Score","type":"int","required":true,"line":394,"description":"Score value"},{"name":"UserId","type":"string","required":true,"line":409,"description":"Owning user id (FK)"}]},{"name":"SemanticKnowledgeCache","kind":"entity","line":422,"purpose":"Caches semantic embedding results with original text, model and tenant scoping.","fields":[{"name":"ContentHash","type":"string","required":true,"line":424,"description":"Primary key & unique content hash"},{"name":"JsonData","type":"string","required":true,"line":431,"description":"Cached JSON payload"},{"name":"ModelId","type":"string","required":true,"line":435,"description":"Model identifier used for embedding"},{"name":"Vector","type":"Vector","required":false,"line":454,"description":"Embedding vector column vector(1536)"},{"name":"TenantId","type":"string","required":true,"line":449,"description":"Tenant identifier"}]},{"name":"SubscriptionPlan","kind":"entity","line":467,"purpose":"Represents subscription tiers including AI token limits and a flag for unlimited tokens; seeded with default plans.","fields":[{"name":"Id","type":"int","required":true,"line":469,"description":"Primary key (identity)"},{"name":"AITokenLimit","type":"int","required":true,"line":475,"description":"Token limit for AI usage"},{"name":"IsUnlimitedTokens","type":"bool","required":true,"line":478,"description":"Flag indicating unlimited tokens"},{"name":"MonthlyPrice","type":"decimal","required":true,"line":481,"description":"Monthly price"},{"name":"PlanName","type":"string","required":true,"line":484,"description":"Unique plan name"},{"name":"StripeProductId","type":"string","required":true,"line":489,"description":"Stripe product id mapping"}]}],"serviceRegistrations":[],"startupActions":[],"dependencies":["NexusReader.Data.Persistence/AppDbContext (referenced in [DbContext(typeof(AppDbContext))])"],"patterns":["Entity Framework Core Migration","EF Core Model Snapshot / Fluent API configuration"],"domainConcepts":["SubscriptionPlan","NexusUser","KnowledgeUnit","Ebook","QuizResult","SemanticKnowledgeCache","KnowledgeUnitLink"],"keyDetails":"This auto-generated migration designer configures schema details including vector columns (pgvector), identity defaults for Postgres, navigation and FK behaviors (cascade/restrict), and seeds four SubscriptionPlan rows — notably Enterprise has IsUnlimitedTokens = true and a very large AITokenLimit.","orchestrationMethods":[],"typedContracts":[{"name":"Ebook","kind":"entity","line":162,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"KnowledgeUnit","kind":"entity","line":209,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"KnowledgeUnitLink","kind":"entity","line":255,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"NexusUser","kind":"entity","line":287,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"QuizResult","kind":"entity","line":385,"fieldCount":4,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"SemanticKnowledgeCache","kind":"entity","line":422,"fieldCount":5,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"name":"SubscriptionPlan","kind":"entity","line":467,"fieldCount":6,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}],"persistenceInteractions":[],"externalInteractions":[],"evidenceAnchors":[{"kind":"typed-contract","label":"Ebook","line":162,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnit","line":209,"summary":"entity with 6 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"KnowledgeUnitLink","line":255,"summary":"entity with 4 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]},{"kind":"typed-contract","label":"NexusUser","line":287,"summary":"entity with 5 fields.","confidence":0.8,"evidencePaths":["NexusReader.Data/Migrations/20260506184227_UpdateSubscriptionPlanIsUnlimitedTokens.Designer.cs"]}],"cacheMetadata":{"schemaVersion":2,"analysisVersion":"2026-05-23.cache-v1","contentChecksum":"50898b244713fa5a454911d2f38aa321d1245dcb9634d9b01677ffd45732bcfa","sourceByteSize":24917,"analyzedAt":"2026-05-23T16:24:55.219Z","technology":"dotnet"}}