// ========================================================================== // Squidex Headless CMS // ========================================================================== // Copyright (c) Squidex UG (haftungsbeschraenkt) // All rights reserved. Licensed under the MIT license. // ========================================================================== using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; using OpenIddict.EntityFrameworkCore.Models; using Squidex.Assets.TusAdapter; using Squidex.Domain.Apps.Entities.Apps; using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Billing; using Squidex.Domain.Apps.Entities.Contents.Counter; using Squidex.Domain.Apps.Entities.Jobs; using Squidex.Domain.Apps.Entities.Rules.UsageTracking; using Squidex.Domain.Apps.Entities.Tags; using Squidex.Domain.Users; using Squidex.Infrastructure; using Squidex.Infrastructure.EventSourcing.Consume; using Squidex.Infrastructure.Json; using Squidex.Infrastructure.Queries; using Squidex.Infrastructure.States; using YDotNet.Server.EntityFramework; namespace Squidex; public abstract class AppDbContext(DbContextOptions options, IJsonSerializer jsonSerializer) : IdentityDbContext(options), IDbContextWithDialect { public abstract SqlDialect Dialect { get; } protected override void OnModelCreating(ModelBuilder builder) { var jsonColumnType = Dialect.JsonColumnType(); builder.UseApps(jsonSerializer, jsonColumnType); builder.UseAssetKeyValueStore(); builder.UseAssets(jsonSerializer, jsonColumnType); builder.UseCache(); builder.UseChatStore(); builder.UseContent(jsonSerializer, jsonColumnType, string.Empty); builder.UseContentReferences(string.Empty); builder.UseContentTables(); builder.UseCounters(jsonSerializer, jsonColumnType); builder.UseCronJobs(); builder.UseEvents(jsonSerializer, jsonColumnType); builder.UseEventStore(); builder.UseFlows(); builder.UseHistory(jsonSerializer, jsonColumnType); builder.UseIdentity(jsonSerializer, jsonColumnType); builder.UseJobs(jsonSerializer, jsonColumnType); builder.UseMessagingDataStore(); builder.UseMessagingTransport(); builder.UseMigration(); builder.UseNames(jsonSerializer, jsonColumnType); builder.UseOpenIddict(); builder.UseOpenIddictTokenType(); builder.UseRequest(jsonSerializer, jsonColumnType); builder.UseRules(jsonSerializer, jsonColumnType); builder.UseSchema(jsonSerializer, jsonColumnType); builder.UseSettings(jsonSerializer, jsonColumnType); builder.UseTags(jsonSerializer, jsonColumnType); builder.UseTeams(jsonSerializer, jsonColumnType); builder.UseTextIndex(); builder.UseUsage(); builder.UseUsageTracking(jsonSerializer, jsonColumnType); builder.UseYDotNet(); base.OnModelCreating(builder); } } #pragma warning disable MA0048 // File name must match type name internal static class Extensions #pragma warning restore MA0048 // File name must match type name { // The pinned Squidex.OpenIdDict.EntityFramework fork still limits the token type to 50 characters, // but OpenIddict 7.4 persists the full token type identifiers instead of the short names it used // before. The longest of them, "urn:openiddict:params:oauth:token-type:authorization_code", needs // 57 characters, so every interactive login failed to store its authorization code. Official // OpenIddict widened the column to 150 characters for the same reason, so use the same length here. public static void UseOpenIddictTokenType(this ModelBuilder builder) { builder.Entity() .Property(x => x.Type) .HasMaxLength(150); } public static void UseIdentity(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseUsageTracking(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); builder.UseSnapshot(jsonSerializer, jsonColumn); builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseCounters(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseEvents(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseNames(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseJobs(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseSettings(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } public static void UseTags(this ModelBuilder builder, IJsonSerializer jsonSerializer, string? jsonColumn) { builder.UseSnapshot(jsonSerializer, jsonColumn); } }