// using System; using MicCheck.Api.Data; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Infrastructure; using Microsoft.EntityFrameworkCore.Migrations; using Microsoft.EntityFrameworkCore.Storage.ValueConversion; using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; #nullable disable namespace MicCheck.Api.Migrations { [DbContext(typeof(MicCheckDbContext))] [Migration("20260617194113_AddFeatureUsageDaily")] partial class AddFeatureUsageDaily { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder .HasAnnotation("ProductVersion", "10.0.5") .HasAnnotation("Relational:MaxIdentifierLength", 63); NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); modelBuilder.Entity("FeatureTags", b => { b.Property("FeatureId") .HasColumnType("integer"); b.Property("TagsId") .HasColumnType("integer"); b.HasKey("FeatureId", "TagsId"); b.HasIndex("TagsId"); b.ToTable("FeatureTags"); }); modelBuilder.Entity("MicCheck.Api.Audit.AuditLog", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Action") .IsRequired() .HasMaxLength(50) .HasColumnType("character varying(50)"); b.Property("ActorUserId") .HasColumnType("integer"); b.Property("Changes") .HasColumnType("text"); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("OrganizationId") .HasColumnType("integer"); b.Property("ProjectId") .HasColumnType("integer"); b.Property("ResourceId") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)"); b.Property("ResourceType") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)"); b.HasKey("Id"); b.HasIndex("OrganizationId", "CreatedAt"); b.ToTable("AuditLogs"); }); modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("ExpiresAt") .HasColumnType("timestamp with time zone"); b.Property("IsActive") .HasColumnType("boolean"); b.Property("Key") .IsRequired() .HasMaxLength(512) .HasColumnType("character varying(512)"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("OrganizationId") .HasColumnType("integer"); b.Property("Prefix") .IsRequired() .HasMaxLength(8) .HasColumnType("character varying(8)"); b.HasKey("Id"); b.HasIndex("Key") .IsUnique(); b.HasIndex("OrganizationId"); b.ToTable("ApiKeys"); }); modelBuilder.Entity("MicCheck.Api.Common.Security.Authorization.UserProjectPermission", b => { b.Property("UserId") .HasColumnType("integer"); b.Property("ProjectId") .HasColumnType("integer"); b.Property("IsAdmin") .HasColumnType("boolean"); b.Property("Permissions") .IsRequired() .HasColumnType("text"); b.HasKey("UserId", "ProjectId"); b.ToTable("UserProjectPermissions"); }); modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ApiKey") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)"); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("ProjectId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("ApiKey") .IsUnique(); b.HasIndex("ProjectId"); b.ToTable("Environments"); }); modelBuilder.Entity("MicCheck.Api.Features.Feature", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("DefaultEnabled") .HasColumnType("boolean"); b.Property("Description") .HasMaxLength(2000) .HasColumnType("character varying(2000)"); b.Property("InitialValue") .HasMaxLength(20000) .HasColumnType("character varying(20000)"); b.Property("Name") .IsRequired() .HasMaxLength(150) .HasColumnType("character varying(150)"); b.Property("ProjectId") .HasColumnType("integer"); b.Property("Type") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("ProjectId", "Name") .IsUnique(); b.ToTable("Features"); }); modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("FeatureId") .HasColumnType("integer"); b.Property("Priority") .HasColumnType("integer"); b.Property("SegmentId") .HasColumnType("integer"); b.HasKey("Id"); b.ToTable("FeatureSegments"); }); modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Enabled") .HasColumnType("boolean"); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("FeatureId") .HasColumnType("integer"); b.Property("FeatureSegmentId") .HasColumnType("integer"); b.Property("IdentityId") .HasColumnType("integer"); b.Property("UpdatedAt") .HasColumnType("timestamp with time zone"); b.Property("Value") .HasMaxLength(20000) .HasColumnType("character varying(20000)"); b.Property("Version") .IsConcurrencyToken() .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("EnvironmentId"); b.HasIndex("FeatureSegmentId") .IsUnique(); b.HasIndex("IdentityId"); b.HasIndex("FeatureId", "EnvironmentId", "IdentityId") .IsUnique(); b.ToTable("FeatureStates"); }); modelBuilder.Entity("MicCheck.Api.Features.FeatureUsageDaily", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Count") .HasColumnType("bigint"); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("FeatureId") .HasColumnType("integer"); b.Property("FeatureName") .IsRequired() .HasMaxLength(150) .HasColumnType("character varying(150)"); b.Property("UpdatedAt") .HasColumnType("timestamp with time zone"); b.Property("UsageDate") .HasColumnType("date"); b.HasKey("Id"); b.HasIndex("EnvironmentId", "UsageDate"); b.HasIndex("EnvironmentId", "FeatureId", "UsageDate") .IsUnique(); b.ToTable("FeatureUsageDaily"); }); modelBuilder.Entity("MicCheck.Api.Features.Tag", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Color") .IsRequired() .HasMaxLength(20) .HasColumnType("character varying(20)"); b.Property("Label") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("ProjectId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("ProjectId"); b.ToTable("Tags"); }); modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("Identifier") .IsRequired() .HasMaxLength(2000) .HasColumnType("character varying(2000)"); b.HasKey("Id"); b.HasIndex("EnvironmentId", "Identifier") .IsUnique(); b.ToTable("Identities"); }); modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("IdentityId") .HasColumnType("integer"); b.Property("Key") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("Value") .IsRequired() .HasMaxLength(2000) .HasColumnType("character varying(2000)"); b.Property("ValueType") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("IdentityId", "Key") .IsUnique(); b.ToTable("IdentityTraits"); }); modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("InviteToken") .HasMaxLength(64) .HasColumnType("character varying(64)"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.HasKey("Id"); b.HasIndex("InviteToken") .IsUnique() .HasFilter("\"InviteToken\" IS NOT NULL"); b.ToTable("Organizations"); }); modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => { b.Property("OrganizationId") .HasColumnType("integer"); b.Property("UserId") .HasColumnType("integer"); b.Property("IsPrimary") .ValueGeneratedOnAdd() .HasColumnType("boolean") .HasDefaultValue(false); b.Property("Role") .HasColumnType("integer"); b.HasKey("OrganizationId", "UserId"); b.HasIndex("UserId"); b.ToTable("OrganizationUsers"); }); modelBuilder.Entity("MicCheck.Api.Projects.Project", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("HideDisabledFlags") .HasColumnType("boolean"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("OrganizationId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("OrganizationId"); b.ToTable("Projects"); }); modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Name") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("ProjectId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("ProjectId"); b.ToTable("Segments"); }); modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("Operator") .HasColumnType("integer"); b.Property("Property") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("RuleId") .HasColumnType("integer"); b.Property("Value") .IsRequired() .HasMaxLength(1000) .HasColumnType("character varying(1000)"); b.HasKey("Id"); b.HasIndex("RuleId"); b.ToTable("SegmentConditions"); }); modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("ParentRuleId") .HasColumnType("integer"); b.Property("SegmentId") .HasColumnType("integer"); b.Property("Type") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("ParentRuleId"); b.HasIndex("SegmentId"); b.ToTable("SegmentRules"); }); modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("ExpiresAt") .HasColumnType("timestamp with time zone"); b.Property("IsRevoked") .HasColumnType("boolean"); b.Property("Token") .IsRequired() .HasMaxLength(512) .HasColumnType("character varying(512)"); b.Property("UserId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("Token") .IsUnique(); b.HasIndex("UserId"); b.ToTable("RefreshTokens"); }); modelBuilder.Entity("MicCheck.Api.Users.User", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Email") .IsRequired() .HasMaxLength(500) .HasColumnType("character varying(500)"); b.Property("FirstName") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("IsActive") .HasColumnType("boolean"); b.Property("IsTwoFactorEnabled") .HasColumnType("boolean"); b.Property("LastLoginAt") .HasColumnType("timestamp with time zone"); b.Property("LastName") .IsRequired() .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("PasswordHash") .IsRequired() .HasColumnType("text"); b.HasKey("Id"); b.HasIndex("Email") .IsUnique(); b.ToTable("Users"); }); modelBuilder.Entity("MicCheck.Api.Webhooks.Webhook", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("CreatedAt") .HasColumnType("timestamp with time zone"); b.Property("Enabled") .HasColumnType("boolean"); b.Property("EnvironmentId") .HasColumnType("integer"); b.Property("OrganizationId") .HasColumnType("integer"); b.Property("Scope") .HasColumnType("integer"); b.Property("Secret") .HasMaxLength(200) .HasColumnType("character varying(200)"); b.Property("Url") .IsRequired() .HasMaxLength(500) .HasColumnType("character varying(500)"); b.HasKey("Id"); b.HasIndex("EnvironmentId"); b.ToTable("Webhooks"); }); modelBuilder.Entity("MicCheck.Api.Webhooks.WebhookDeliveryLog", b => { b.Property("Id") .ValueGeneratedOnAdd() .HasColumnType("integer"); NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property("Id")); b.Property("AttemptNumber") .HasColumnType("integer"); b.Property("AttemptedAt") .HasColumnType("timestamp with time zone"); b.Property("Duration") .HasColumnType("interval"); b.Property("ErrorMessage") .HasColumnType("text"); b.Property("EventType") .IsRequired() .HasMaxLength(100) .HasColumnType("character varying(100)"); b.Property("PayloadJson") .IsRequired() .HasColumnType("text"); b.Property("ResponseBody") .HasColumnType("text"); b.Property("ResponseStatusCode") .HasColumnType("integer"); b.Property("Success") .HasColumnType("boolean"); b.Property("WebhookId") .HasColumnType("integer"); b.HasKey("Id"); b.HasIndex("WebhookId"); b.ToTable("WebhookDeliveryLogs"); }); modelBuilder.Entity("FeatureTags", b => { b.HasOne("MicCheck.Api.Features.Feature", null) .WithMany() .HasForeignKey("FeatureId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("MicCheck.Api.Features.Tag", null) .WithMany() .HasForeignKey("TagsId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Common.Security.ApiKeys.ApiKey", b => { b.HasOne("MicCheck.Api.Organizations.Organization", null) .WithMany("ApiKeys") .HasForeignKey("OrganizationId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => { b.HasOne("MicCheck.Api.Projects.Project", null) .WithMany("Environments") .HasForeignKey("ProjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Features.Feature", b => { b.HasOne("MicCheck.Api.Projects.Project", null) .WithMany("Features") .HasForeignKey("ProjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Features.FeatureState", b => { b.HasOne("MicCheck.Api.Environments.Environment", null) .WithMany("FeatureStates") .HasForeignKey("EnvironmentId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("MicCheck.Api.Features.Feature", null) .WithMany("FeatureStates") .HasForeignKey("FeatureId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("MicCheck.Api.Features.FeatureSegment", null) .WithOne("FeatureState") .HasForeignKey("MicCheck.Api.Features.FeatureState", "FeatureSegmentId") .OnDelete(DeleteBehavior.SetNull); b.HasOne("MicCheck.Api.Identities.Identity", null) .WithMany("FeatureStateOverrides") .HasForeignKey("IdentityId") .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("MicCheck.Api.Features.Tag", b => { b.HasOne("MicCheck.Api.Projects.Project", null) .WithMany() .HasForeignKey("ProjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Identities.IdentityTrait", b => { b.HasOne("MicCheck.Api.Identities.Identity", null) .WithMany("Traits") .HasForeignKey("IdentityId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Organizations.OrganizationUser", b => { b.HasOne("MicCheck.Api.Organizations.Organization", null) .WithMany("Members") .HasForeignKey("OrganizationId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.HasOne("MicCheck.Api.Users.User", "User") .WithMany("Organizations") .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("User"); }); modelBuilder.Entity("MicCheck.Api.Projects.Project", b => { b.HasOne("MicCheck.Api.Organizations.Organization", null) .WithMany("Projects") .HasForeignKey("OrganizationId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => { b.HasOne("MicCheck.Api.Projects.Project", null) .WithMany("Segments") .HasForeignKey("ProjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Segments.SegmentCondition", b => { b.HasOne("MicCheck.Api.Segments.SegmentRule", null) .WithMany("Conditions") .HasForeignKey("RuleId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => { b.HasOne("MicCheck.Api.Segments.SegmentRule", null) .WithMany("ChildRules") .HasForeignKey("ParentRuleId") .OnDelete(DeleteBehavior.NoAction); b.HasOne("MicCheck.Api.Segments.Segment", null) .WithMany("Rules") .HasForeignKey("SegmentId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); modelBuilder.Entity("MicCheck.Api.Users.RefreshToken", b => { b.HasOne("MicCheck.Api.Users.User", "User") .WithMany() .HasForeignKey("UserId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); b.Navigation("User"); }); modelBuilder.Entity("MicCheck.Api.Environments.Environment", b => { b.Navigation("FeatureStates"); }); modelBuilder.Entity("MicCheck.Api.Features.Feature", b => { b.Navigation("FeatureStates"); }); modelBuilder.Entity("MicCheck.Api.Features.FeatureSegment", b => { b.Navigation("FeatureState"); }); modelBuilder.Entity("MicCheck.Api.Identities.Identity", b => { b.Navigation("FeatureStateOverrides"); b.Navigation("Traits"); }); modelBuilder.Entity("MicCheck.Api.Organizations.Organization", b => { b.Navigation("ApiKeys"); b.Navigation("Members"); b.Navigation("Projects"); }); modelBuilder.Entity("MicCheck.Api.Projects.Project", b => { b.Navigation("Environments"); b.Navigation("Features"); b.Navigation("Segments"); }); modelBuilder.Entity("MicCheck.Api.Segments.Segment", b => { b.Navigation("Rules"); }); modelBuilder.Entity("MicCheck.Api.Segments.SegmentRule", b => { b.Navigation("ChildRules"); b.Navigation("Conditions"); }); modelBuilder.Entity("MicCheck.Api.Users.User", b => { b.Navigation("Organizations"); }); #pragma warning restore 612, 618 } } }