using LinqToDB.Mapping;
using MaksIT.CertsUI.Engine;
using MaksIT.CertsUI.Engine.Dto.Certs;
using MaksIT.CertsUI.Engine.Dto.Identity;
namespace MaksIT.CertsUI.Engine.Data;
///
/// Builds Linq2Db mapping schema: table names from , columns aligned with the FluentMigrator baseline.
///
public static class CertsLinq2DbMapping {
static MappingSchema? _schema;
public static MappingSchema Schema => _schema ??= Build();
public static MappingSchema Build() {
var schema = new MappingSchema();
var builder = new FluentMappingBuilder(schema);
// UserDto -> users
builder.Entity()
.HasTableName(Table.Users.Name)
.Property(x => x.Id).HasColumnName("Id").IsPrimaryKey()
.Property(x => x.Name).HasColumnName("Name")
.Property(x => x.Salt).HasColumnName("Salt")
.Property(x => x.Hash).HasColumnName("Hash")
.Property(x => x.LastLoginUtc).HasColumnName("LastLoginUtc")
.Property(x => x.IsActive).HasColumnName("IsActive")
.Property(x => x.TwoFactorSharedKey).HasColumnName("TwoFactorSharedKey")
.Property(x => x.JwtTokens).IsNotColumn()
.Property(x => x.TwoFactorRecoveryCodes).IsNotColumn();
builder.Entity()
.HasTableName(Table.TwoFactorRecoveryCodes.Name)
.Property(x => x.Id).HasColumnName("Id").IsPrimaryKey()
.Property(x => x.UserId).HasColumnName("UserId")
.Property(x => x.Salt).HasColumnName("Salt")
.Property(x => x.Hash).HasColumnName("Hash")
.Property(x => x.IsUsed).HasColumnName("IsUsed");
// JwtTokenDto -> jwt_tokens
builder.Entity()
.HasTableName(Table.JwtTokens.Name)
.Property(x => x.Id).HasColumnName("Id").IsPrimaryKey()
.Property(x => x.UserId).HasColumnName("UserId")
.Property(x => x.Token).HasColumnName("Token")
.Property(x => x.RefreshToken).HasColumnName("RefreshToken")
.Property(x => x.IssuedAt).HasColumnName("IssuedAt")
.Property(x => x.ExpiresAt).HasColumnName("ExpiresAt")
.Property(x => x.RefreshTokenExpiresAt).HasColumnName("RefreshTokenExpiresAt")
.Property(x => x.IsRevoked).HasColumnName("IsRevoked");
// ApiKeyDto -> api_keys
builder.Entity()
.HasTableName(Table.ApiKeys.Name)
.Property(x => x.Id).HasColumnName("Id").IsPrimaryKey()
.Property(x => x.Description).HasColumnName("Description")
.Property(x => x.ExpiresAtUtc).HasColumnName("ExpiresAtUtc")
.Property(x => x.KeySalt).HasColumnName("KeySalt")
.Property(x => x.KeyHashHex).HasColumnName("KeyHashHex")
.Property(x => x.CreatedAtUtc).HasColumnName("CreatedAtUtc")
.Property(x => x.RevokedAtUtc).HasColumnName("RevokedAtUtc");
// RegistrationCacheDto -> registration_caches
builder.Entity()
.HasTableName(Table.RegistrationCaches.Name)
.Property(x => x.AccountId).HasColumnName("AccountId").IsPrimaryKey()
.Property(x => x.Version).HasColumnName("Version")
.Property(x => x.PayloadJson).HasColumnName("PayloadJson");
builder.Entity()
.HasTableName("acme_http_challenges")
.Property(x => x.FileName).HasColumnName("file_name").IsPrimaryKey()
.Property(x => x.TokenValue).HasColumnName("token_value")
.Property(x => x.CreatedAtUtc).HasColumnName("created_at_utc");
builder.Entity()
.HasTableName(Table.TermsOfServiceCache.Name)
.Property(x => x.Url).HasColumnName("url").IsPrimaryKey()
.Property(x => x.UrlHashHex).HasColumnName("url_hash_hex")
.Property(x => x.ETag).HasColumnName("etag")
.Property(x => x.LastModifiedUtc).HasColumnName("last_modified_utc")
.Property(x => x.ContentType).HasColumnName("content_type")
.Property(x => x.ContentBytes).HasColumnName("content_bytes")
.Property(x => x.FetchedAtUtc).HasColumnName("fetched_at_utc")
.Property(x => x.ExpiresAtUtc).HasColumnName("expires_at_utc");
builder.Entity()
.HasTableName(Table.AcmeSessions.Name)
.Property(x => x.SessionId).HasColumnName("session_id").IsPrimaryKey()
.Property(x => x.PayloadJson).HasColumnName("payload_json")
.Property(x => x.UpdatedAtUtc).HasColumnName("updated_at_utc")
.Property(x => x.ExpiresAtUtc).HasColumnName("expires_at_utc");
builder.Build();
return schema;
}
}