From ea93697b4a6f641e7fc0243af4a275f01d0255d3 Mon Sep 17 00:00:00 2001 From: Keith Williams Date: Thu, 10 Feb 2022 14:16:16 -0600 Subject: [PATCH] Bug fixes --- .../20220128173456_Idatafy.Designer.cs | 4697 +++++++++++++++++ .../Migrations/20220128173456_Idatafy.cs | 93 + .../20220201182528_Idatafy-Clr-FK.Designer.cs | 4692 ++++++++++++++++ .../20220201182528_Idatafy-Clr-FK.cs | 80 + .../WalletDbContextModelSnapshot.cs | 61 +- .../Contexts/WalletDbContext.cs | 287 +- .../Dtos/Idatafy/SmartResumePost.cs | 17 + .../Models/ClrEntities/ClrModel.cs | 3 + .../Models/Idatafy/SmartResume.cs | 37 + .../Options/IdatafyOptions.cs | 14 + .../Options/SiteSettingsOptions.cs | 1 + .../ViewModels/nG/ApiBadRequestResponse.cs | 7 + .../ViewModels/nG/ClrSimplified/ClrVM.cs | 7 +- .../RegisterServices.cs | 2 + .../src/OAuth/RegistrationRequest.cs | 5 +- .../CredentialPackageService.cs | 57 +- .../Implementations/CredentialService.cs | 15 +- .../Implementations/DownloadService.cs | 1 + .../Implementations/ForgetMeService.cs | 136 + .../Implementations/IdatafyService.cs | 98 + .../Implementations/ProfileImageService.cs | 33 +- .../OpenCredentialPublisher.Services.csproj | 1 + .../Startup.cs | 1 + .../src/ClientApp/src/app/app.component.ts | 28 +- .../ClientApp/src/app/auth/auth.service.ts | 69 +- .../ClientApp/src/app/auth/login.service.ts | 2 +- .../app/core/services/smart-resume.service.ts | 27 + .../login-with-proof.component.ts | 8 +- .../access/pages/logout/logout.component.ts | 9 +- .../app/modules/account/account.service.ts | 10 + .../personal-data.component.html | 20 +- .../personal-data/personal-data.component.ts | 21 +- .../shared/components/clr/clr.component.html | 1 + .../smart-resume/smart-resume.component.html | 16 + .../smart-resume/smart-resume.component.scss | 3 + .../smart-resume/smart-resume.component.ts | 47 + .../ClientApp/src/app/shared/models/clrVM.ts | 7 +- .../app/shared/models/smartResumePostModel.ts | 5 + .../src/app/shared/models/verifyVM.ts | 1 + .../ClientApp/src/app/shared/shared.module.ts | 3 + OpenCredentialPublisher.Wallet/src/Config.cs | 3 +- .../Controllers/Account/AccountController.cs | 36 +- .../src/Controllers/CredentialsController.cs | 4 +- .../src/Controllers/PublicController.cs | 11 +- .../src/Controllers/SmartResumeController.cs | 46 + .../src/Controllers/SourcesController.cs | 2 +- OpenCredentialPublisher.Wallet/src/Startup.cs | 16 +- .../src/wwwroot/images/ocp-badge-logo.svg | 46 + 48 files changed, 10643 insertions(+), 143 deletions(-) create mode 100644 OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.Designer.cs create mode 100644 OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.cs create mode 100644 OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.Designer.cs create mode 100644 OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.cs create mode 100644 OpenCredentialPublisher.Data/Dtos/Idatafy/SmartResumePost.cs create mode 100644 OpenCredentialPublisher.Data/Models/Idatafy/SmartResume.cs create mode 100644 OpenCredentialPublisher.Data/Options/IdatafyOptions.cs create mode 100644 OpenCredentialPublisher.Services/Implementations/ForgetMeService.cs create mode 100644 OpenCredentialPublisher.Services/Implementations/IdatafyService.cs create mode 100644 OpenCredentialPublisher.Wallet/src/ClientApp/src/app/core/services/smart-resume.service.ts create mode 100644 OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.html create mode 100644 OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.scss create mode 100644 OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.ts create mode 100644 OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/smartResumePostModel.ts create mode 100644 OpenCredentialPublisher.Wallet/src/Controllers/SmartResumeController.cs create mode 100644 OpenCredentialPublisher.Wallet/src/wwwroot/images/ocp-badge-logo.svg diff --git a/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.Designer.cs b/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.Designer.cs new file mode 100644 index 0000000..de8fddc --- /dev/null +++ b/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.Designer.cs @@ -0,0 +1,4697 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using OpenCredentialPublisher.Data.Contexts; + +namespace OpenCredentialPublisher.Data.Contexts.Migrations +{ + [DbContext(typeof(WalletDbContext))] + [Migration("20220128173456_Idatafy")] + partial class Idatafy + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.5") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b => + { + b.Property("UserCode") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("DeviceCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Expiration") + .IsRequired() + .HasColumnType("datetime2"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("UserCode"); + + b.HasIndex("DeviceCode") + .IsUnique(); + + b.HasIndex("Expiration"); + + b.ToTable("DeviceCodes"); + }); + + modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ConsumedTime") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Key"); + + b.HasIndex("Expiration"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.HasIndex("SubjectId", "SessionId", "Type"); + + b.ToTable("PersistedGrants"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.Property("AchievementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementType") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreditsAvailable") + .HasColumnType("real"); + + b.Property("CriteriaId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("FieldOfStudy") + .HasColumnType("nvarchar(max)"); + + b.Property("HumanCode") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerProfileId") + .HasColumnType("int"); + + b.Property("Level") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Specialization") + .HasColumnType("nvarchar(max)"); + + b.Property("Tags") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("AchievementId"); + + b.HasIndex("CriteriaId") + .IsUnique() + .HasFilter("[CriteriaId] IS NOT NULL"); + + b.HasIndex("IssuerProfileId"); + + b.ToTable("Achievements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AgentContextModel", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("AgentName") + .HasColumnType("nvarchar(max)"); + + b.Property("ApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("ContextJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("DomainDid") + .HasColumnType("nvarchar(max)"); + + b.Property("EndpointUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerDid") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerRegistered") + .HasColumnType("bit"); + + b.Property("IssuerVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Network") + .HasColumnType("nvarchar(max)"); + + b.Property("ProvisioningTokenId") + .HasColumnType("int"); + + b.Property("SdkVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("SdkVerKeyId") + .HasColumnType("nvarchar(max)"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("TokenHash") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityAgentVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityPublicDid") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityPublicVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.Property("WalletKey") + .HasColumnType("nvarchar(max)"); + + b.Property("WalletPath") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("AgentContexts"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("ProfileImageUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.Property("ArtifactId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("ClrIssuedOn") + .HasColumnType("datetime2"); + + b.Property("ClrName") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EvidenceName") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsPdf") + .HasColumnType("bit"); + + b.Property("IsUrl") + .HasColumnType("bit"); + + b.Property("MediaType") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NameContainsTranscript") + .HasColumnType("bit"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ArtifactId"); + + b.HasIndex("ClrId"); + + b.ToTable("Artifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.Property("AssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("ActivityEndDate") + .HasColumnType("datetime2"); + + b.Property("ActivityStartDate") + .HasColumnType("datetime2"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreditsEarned") + .HasColumnType("real"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("Expires") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsSelfPublished") + .HasColumnType("bit"); + + b.Property("IsSigned") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("LicenseNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentAssertionId") + .HasColumnType("int"); + + b.Property("RecipientId") + .HasColumnType("int"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("Role") + .HasColumnType("nvarchar(max)"); + + b.Property("SignedAssertion") + .HasColumnType("nvarchar(max)"); + + b.Property("SignedEndorsements") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceId") + .HasColumnType("int"); + + b.Property("Term") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("AssertionId"); + + b.HasIndex("AchievementId") + .IsUnique() + .HasFilter("[AchievementId] IS NOT NULL"); + + b.HasIndex("ParentAssertionId"); + + b.HasIndex("RecipientId") + .IsUnique() + .HasFilter("[RecipientId] IS NOT NULL"); + + b.HasIndex("SourceId"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Assertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("AccessToken") + .HasColumnType("nvarchar(max)"); + + b.Property("AuthorizationCode") + .HasColumnType("nvarchar(max)"); + + b.Property("CodeVerifier") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Endpoint") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Method") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("RefreshToken") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceForeignKey") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidTo") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("SourceForeignKey"); + + b.HasIndex("UserId"); + + b.ToTable("Authorizations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrAssertionModel", b => + { + b.Property("BadgrAssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Acceptance") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeClassJson") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeClassOpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Badgeclass") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgrBackpackId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Expires") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("InternalIdentifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBadgr") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsValidJson") + .HasColumnType("bit"); + + b.Property("IssueStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Issuer") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerJson") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerOpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("OpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("Pending") + .HasColumnType("bit"); + + b.Property("RecipientJson") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedAssertion") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ValidationStatus") + .HasColumnType("nvarchar(max)"); + + b.HasKey("BadgrAssertionId"); + + b.HasIndex("BadgrBackpackId"); + + b.ToTable("BadgrAssertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBadgr") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("Provider") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique(); + + b.ToTable("BadgrBackpacks", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CertificateModel", b => + { + b.Property("Host") + .HasColumnType("nvarchar(450)"); + + b.Property("IssuedByName") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuedToName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Host"); + + b.ToTable("Certificates"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", b => + { + b.Property("AlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EducationalFramework") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("TargetCode") + .HasColumnType("nvarchar(max)"); + + b.Property("TargetDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("TargetName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TargetType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TargetUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("AlignmentId"); + + b.ToTable("Alignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", b => + { + b.Property("AssociationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssociationType") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("TargetId") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("AssociationId"); + + b.ToTable("Associations", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", b => + { + b.Property("CriteriaId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("CriteriaId"); + + b.ToTable("Criteria", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", b => + { + b.Property("EndorsementClaimId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementComment") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("EndorsementClaimId"); + + b.ToTable("EndorsementClaims", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", b => + { + b.Property("IdentityId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Hashed") + .HasColumnType("bit"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("Identity") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Salt") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("IdentityId"); + + b.ToTable("Identities", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.Property("ProfileId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalName") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("BirthDate") + .HasColumnType("datetime2"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FamilyName") + .HasColumnType("nvarchar(max)"); + + b.Property("GivenName") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsEndorsementProfile") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Official") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentProfileId") + .HasColumnType("int"); + + b.Property("PublicKey") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationList") + .HasColumnType("nvarchar(max)"); + + b.Property("SourcedId") + .HasColumnType("nvarchar(max)"); + + b.Property("StudentId") + .HasColumnType("nvarchar(max)"); + + b.Property("Telephone") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("ProfileId"); + + b.HasIndex("ParentProfileId"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Profiles", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", b => + { + b.Property("AchievementAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementAlignmentId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.ToTable("AchievementAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", b => + { + b.Property("AchievementAssociationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AssociationId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementAssociationId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("AssociationId") + .IsUnique(); + + b.ToTable("AchievementAssociations", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", b => + { + b.Property("AchievementEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementEndorsementId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("AchievementEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", b => + { + b.Property("AssertionEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AssertionEndorsementId"); + + b.HasIndex("AssertionId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("AssertionEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", b => + { + b.Property("AssertionEvidenceId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EvidenceId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AssertionEvidenceId"); + + b.HasIndex("AssertionId"); + + b.HasIndex("EvidenceId") + .IsUnique(); + + b.ToTable("AssertionEvidence", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", b => + { + b.Property("ClrAchievementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrAchievementId"); + + b.HasIndex("AchievementId") + .IsUnique(); + + b.HasIndex("ClrId"); + + b.ToTable("ClrAchievements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", b => + { + b.Property("ClrAssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrAssertionId"); + + b.HasIndex("AssertionId") + .IsUnique(); + + b.HasIndex("ClrId"); + + b.ToTable("ClrAssertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", b => + { + b.Property("ClrEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrEndorsementId"); + + b.HasIndex("ClrId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("ClrEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", b => + { + b.Property("EvidenceArtifactId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ArtifactId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EvidenceId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("EvidenceArtifactId"); + + b.HasIndex("ArtifactId") + .IsUnique(); + + b.HasIndex("EvidenceId"); + + b.ToTable("EvidenceArtifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", b => + { + b.Property("ProfileEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ProfileId") + .HasColumnType("int"); + + b.HasKey("ProfileEndorsementId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.HasIndex("ProfileId"); + + b.ToTable("ProfileEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", b => + { + b.Property("ResultAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultId") + .HasColumnType("int"); + + b.HasKey("ResultAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("ResultId"); + + b.ToTable("ResultAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", b => + { + b.Property("ResultDescriptionAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultDescriptionId") + .HasColumnType("int"); + + b.HasKey("ResultDescriptionAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("ResultDescriptionId"); + + b.ToTable("ResultDescriptionAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", b => + { + b.Property("RubricCriterionLevelAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RubricCriterionLevelId") + .HasColumnType("int"); + + b.HasKey("RubricCriterionLevelAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("RubricCriterionLevelId"); + + b.ToTable("RubricCriterionLevelAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.Property("ResultDescriptionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AllowedValues") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RequiredLevel") + .HasColumnType("nvarchar(max)"); + + b.Property("RequiredValue") + .HasColumnType("nvarchar(max)"); + + b.Property("ResultType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("ValueMax") + .HasColumnType("nvarchar(max)"); + + b.Property("ValueMin") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ResultDescriptionId"); + + b.HasIndex("AchievementId"); + + b.ToTable("ResultDescriptions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.Property("ResultId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievedLevel") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultDescription") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ResultId"); + + b.HasIndex("AssertionId"); + + b.ToTable("Results", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.Property("RubricCriterionLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Level") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("nvarchar(max)"); + + b.Property("ResultDescriptionId") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("RubricCriterionLevelId"); + + b.HasIndex("ResultDescriptionId"); + + b.ToTable("RubricCriterionLevels", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", b => + { + b.Property("VerificationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AllowedOrigins") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Creator") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("StartsWith") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("int"); + + b.Property("VerificationProperty") + .HasColumnType("nvarchar(max)"); + + b.HasKey("VerificationId"); + + b.ToTable("Verifications", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.Property("ClrId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("AuthorizationForeignKey") + .HasColumnType("nvarchar(450)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("LearnerId") + .HasColumnType("int"); + + b.Property("LearnerName") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentClrSetId") + .HasColumnType("int"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("ParentVerifiableCredentialId") + .HasColumnType("int"); + + b.Property("Partial") + .HasColumnType("bit"); + + b.Property("PublisherId") + .HasColumnType("int"); + + b.Property("PublisherName") + .HasColumnType("nvarchar(max)"); + + b.Property("RefreshedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedClr") + .HasColumnType("nvarchar(max)"); + + b.Property("SmartResumeId") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("ClrId"); + + b.HasIndex("AuthorizationForeignKey"); + + b.HasIndex("CredentialPackageId"); + + b.HasIndex("LearnerId"); + + b.HasIndex("ParentClrSetId"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique() + .HasFilter("[ParentCredentialPackageId] IS NOT NULL"); + + b.HasIndex("ParentVerifiableCredentialId"); + + b.HasIndex("PublisherId"); + + b.HasIndex("SmartResumeId") + .IsUnique() + .HasFilter("[SmartResumeId] IS NOT NULL"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Clrs", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrsCount") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("ParentVerifiableCredentialId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique() + .HasFilter("[ParentCredentialPackageId] IS NOT NULL"); + + b.HasIndex("ParentVerifiableCredentialId"); + + b.ToTable("ClrSets", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConnectionRequestStep") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(450)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletRelationshipId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("ThreadId") + .IsUnique() + .HasFilter("[ThreadId] IS NOT NULL"); + + b.HasIndex("UserId"); + + b.HasIndex("WalletRelationshipId"); + + b.ToTable("ConnectionRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ConnectionRequestSteps"); + + b.HasData( + new + { + Id = 0, + Name = "Initiated" + }, + new + { + Id = 1, + Name = "PendingAgent" + }, + new + { + Id = 2, + Name = "StartingInvitation" + }, + new + { + Id = 3, + Name = "RequestingInvitation" + }, + new + { + Id = 4, + Name = "InvitationGenerated" + }, + new + { + Id = 5, + Name = "InvitationAccepted" + }, + new + { + Id = 6, + Name = "InvitationCompleted" + }, + new + { + Id = 13, + Name = "Error" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialDefinitionId") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Tag") + .HasColumnType("nvarchar(max)"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("CredentialSchemaId"); + + b.ToTable("CredentialDefinitions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialListView", b => + { + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.ToView("vw_CredentialList", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageArtifactView", b => + { + b.Property("ArtifactId") + .HasColumnType("int"); + + b.Property("AssertionId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("ClrIssuedOn") + .HasColumnType("datetime2"); + + b.Property("ClrName") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EvidenceName") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsPdf") + .HasColumnType("bit"); + + b.Property("IsUrl") + .HasColumnType("bit"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("TypeId") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(max)"); + + b.ToView("CredentialPackageArtifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("AuthorizationForeignKey") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("TypeId") + .HasColumnType("int"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationForeignKey"); + + b.HasIndex("UserId"); + + b.ToTable("CredentialPackages", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialDefinitionId") + .HasColumnType("int"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("CredentialRequestStep") + .HasColumnType("int"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("ErrorMessage") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletRelationshipId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("CredentialDefinitionId"); + + b.HasIndex("CredentialPackageId"); + + b.HasIndex("CredentialSchemaId"); + + b.HasIndex("UserId"); + + b.HasIndex("WalletRelationshipId"); + + b.ToTable("CredentialRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CredentialRequestSteps"); + + b.HasData( + new + { + Id = 0, + Name = "Initiated" + }, + new + { + Id = 1, + Name = "PendingAgent" + }, + new + { + Id = 2, + Name = "PendingSchema" + }, + new + { + Id = 3, + Name = "PendingCredentialDefinition" + }, + new + { + Id = 4, + Name = "ReadyToSend" + }, + new + { + Id = 5, + Name = "SendingOffer" + }, + new + { + Id = 6, + Name = "OfferSent" + }, + new + { + Id = 7, + Name = "OfferAccepted" + }, + new + { + Id = 8, + Name = "CheckingRevocationStatus" + }, + new + { + Id = 9, + Name = "CredentialIsRevoked" + }, + new + { + Id = 10, + Name = "CredentialIsStillValid" + }, + new + { + Id = 11, + Name = "PendingSchemaEndorsement" + }, + new + { + Id = 12, + Name = "PendingCredentialDefinitionEndorsement" + }, + new + { + Id = 13, + Name = "Error" + }, + new + { + Id = 14, + Name = "ErrorWritingSchema" + }, + new + { + Id = 15, + Name = "ErrorWritingCredentialDefinition" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSchema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Attributes") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Hash") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NetworkId") + .HasColumnType("nvarchar(max)"); + + b.Property("SchemaId") + .HasColumnType("nvarchar(max)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeName") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CredentialSchema"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSearchView", b => + { + b.Property("CredentialDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialName") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialNarrative") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialType") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.ToView("vw_CredentialSearch", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", b => + { + b.Property("DiscoveryDocumentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ApiBase") + .HasColumnType("nvarchar(max)"); + + b.Property("AuthorizationUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PrivacyPolicyUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RegistrationUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ScopesOffered") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SourceForeignKey") + .HasColumnType("int"); + + b.Property("TermsOfServiceUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TokenRevocationUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("TokenUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.HasKey("DiscoveryDocumentId"); + + b.HasIndex("SourceForeignKey") + .IsUnique(); + + b.ToTable("DiscoveryDocumentModel", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EmailVerification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EmailAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("EmailVerificationCredentialQrCode") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("MessageId") + .HasColumnType("int"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("OfferContents") + .HasColumnType("nvarchar(max)"); + + b.Property("OfferId") + .HasColumnType("nvarchar(max)"); + + b.Property("OfferPayload") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.Property("VerificationString") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("MessageId"); + + b.HasIndex("UserId"); + + b.ToTable("EmailVerifications"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.Property("EndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementClaimId") + .HasColumnType("int"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsSigned") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("IssuerId") + .HasColumnType("int"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedEndorsement") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("EndorsementId"); + + b.HasIndex("EndorsementClaimId") + .IsUnique(); + + b.HasIndex("IssuerId"); + + b.HasIndex("VerificationId") + .IsUnique(); + + b.ToTable("Endorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EvidenceModel", b => + { + b.Property("EvidenceId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Audience") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Genre") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("EvidenceId"); + + b.ToTable("Evidence", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.HttpClientLog", b => + { + b.Property("HttpClientLogId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Machine") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestContentBody") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestContentType") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestHeaders") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestIpAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestMethod") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestRouteData") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestRouteTemplate") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestTimestamp") + .HasColumnType("datetime2"); + + b.Property("RequestUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseContentBody") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseContentType") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseHeaders") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseStatusCode") + .HasColumnType("int"); + + b.Property("ResponseTimestamp") + .HasColumnType("datetime2"); + + b.Property("User") + .HasColumnType("nvarchar(max)"); + + b.HasKey("HttpClientLogId"); + + b.ToTable("HttpClientLogs"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsReady") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("SmartResumeUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("SmartResumes", "idatafy"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.IdentityCertificateModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Certificate") + .HasColumnType("nvarchar(max)"); + + b.Property("DnsName") + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .HasColumnType("nvarchar(max)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.ToTable("IdentityCertificates"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ClrForeignKey") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialRequestId") + .HasColumnType("int"); + + b.Property("DisplayCount") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Nickname") + .HasColumnType("nvarchar(max)"); + + b.Property("RequiresAccessKey") + .HasColumnType("bit"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("ClrForeignKey"); + + b.HasIndex("CredentialRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("Links"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LoginProofRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EmailAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ProofAttributeId") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofContent") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofId") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofPayload") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofRequestStatus") + .HasColumnType("int"); + + b.Property("ProofResponse") + .HasColumnType("nvarchar(max)"); + + b.Property("PublicId") + .HasColumnType("nvarchar(max)"); + + b.Property("QrCodeUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("State") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginProofRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.MessageModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Body") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ProofRequestId") + .HasColumnType("int"); + + b.Property("Recipient") + .HasColumnType("nvarchar(max)"); + + b.Property("SendAttempts") + .HasColumnType("int"); + + b.Property("ShareId") + .HasColumnType("int"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Subject") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ProofRequestId"); + + b.HasIndex("ShareId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("ForRelationship") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationId") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationLink") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationQrCode") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NotificationAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofPredicates") + .HasColumnType("nvarchar(max)"); + + b.Property("PublicId") + .HasColumnType("nvarchar(max)"); + + b.Property("ShortInvitationLink") + .HasColumnType("nvarchar(max)"); + + b.Property("StepId") + .HasColumnType("int"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("CredentialSchemaId"); + + b.HasIndex("UserId"); + + b.ToTable("ProofRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ProofRequestSteps"); + + b.HasData( + new + { + Id = 1, + Name = "Created" + }, + new + { + Id = 2, + Name = "WaitingForAgentContext" + }, + new + { + Id = 3, + Name = "InvitationLinkRequested" + }, + new + { + Id = 4, + Name = "InvitationLinkReceived" + }, + new + { + Id = 5, + Name = "ProofReceived" + }, + new + { + Id = 6, + Name = "RequestedRelationship" + }, + new + { + Id = 7, + Name = "CreatedRelationship" + }, + new + { + Id = 8, + Name = "ReceivingProofResponse" + }, + new + { + Id = 9, + Name = "Deleted" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Predicates") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofRequestId") + .HasColumnType("int"); + + b.Property("ProofResultId") + .HasColumnType("nvarchar(max)"); + + b.Property("RevealedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("SelfAttestedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("UnrevealedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationResult") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ProofRequestId") + .IsUnique(); + + b.ToTable("ProofResponses"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Nonce") + .HasColumnType("nvarchar(max)"); + + b.Property("Sig") + .HasColumnType("nvarchar(max)"); + + b.Property("SponseeId") + .HasColumnType("nvarchar(max)"); + + b.Property("SponsorId") + .HasColumnType("nvarchar(max)"); + + b.Property("SponsorVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("Timestamp") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId") + .IsUnique(); + + b.ToTable("ProvisioningToken"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RecipientModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Recipients"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RevocationModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerId") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationListId") + .HasColumnType("nvarchar(max)"); + + b.Property("RevokedId") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceId") + .HasColumnType("int"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("SourceId"); + + b.HasIndex("UserId"); + + b.ToTable("Revocations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AccessKey") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LinkId") + .HasColumnType("nvarchar(450)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RecipientId") + .HasColumnType("int"); + + b.Property("ShareTypeId") + .HasColumnType("int"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("UseCount") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("LinkId"); + + b.HasIndex("RecipientId"); + + b.ToTable("Shares"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareTypeModel", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ShareTypes"); + + b.HasData( + new + { + Id = 1, + Name = "Email" + }, + new + { + Id = 2, + Name = "Pdf" + }, + new + { + Id = 3, + Name = "Wallet" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.SourceModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeletable") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Scope") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceTypeId") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Sources"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.StatusModel", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Statuses"); + + b.HasData( + new + { + Id = 1, + Name = "Pending" + }, + new + { + Id = 2, + Name = "Accepted" + }, + new + { + Id = 3, + Name = "Used" + }, + new + { + Id = 4, + Name = "Expired" + }, + new + { + Id = 5, + Name = "Rejected" + }, + new + { + Id = 6, + Name = "Created" + }, + new + { + Id = 7, + Name = "Deleted" + }, + new + { + Id = 8, + Name = "Visible" + }, + new + { + Id = 9, + Name = "Hidden" + }, + new + { + Id = 10, + Name = "Submitted" + }, + new + { + Id = 11, + Name = "Active" + }, + new + { + Id = 12, + Name = "Sent" + }, + new + { + Id = 13, + Name = "Error" + }, + new + { + Id = 14, + Name = "WaitingForScoreReport" + }, + new + { + Id = 15, + Name = "ReadyForVerification" + }, + new + { + Id = 16, + Name = "Verified" + }, + new + { + Id = 17, + Name = "Unused" + }, + new + { + Id = 18, + Name = "Success" + }, + new + { + Id = 19, + Name = "NeedsEndorsement" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialsCount") + .HasColumnType("int"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Issuer") + .HasColumnType("nvarchar(max)"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique(); + + b.ToTable("VerifiableCredentials", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerityThread", b => + { + b.Property("ThreadId") + .HasColumnType("nvarchar(450)"); + + b.Property("FlowTypeId") + .HasColumnType("int"); + + b.HasKey("ThreadId"); + + b.ToTable("VerityThreads"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("InviteUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("IsConnected") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RelationshipDid") + .HasColumnType("nvarchar(max)"); + + b.Property("RelationshipVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("UserId"); + + b.ToTable("WalletRelationships"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", "Requirement") + .WithOne("Achievement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AchievementModel", "CriteriaId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Issuer") + .WithMany() + .HasForeignKey("IssuerProfileId"); + + b.Navigation("Issuer"); + + b.Navigation("Requirement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("Artifacts") + .HasForeignKey("ClrId"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "AchievementId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "ParentAssertion") + .WithMany("ChildAssertions") + .HasForeignKey("ParentAssertionId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", "Recipient") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "RecipientId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Source") + .WithMany() + .HasForeignKey("SourceId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "VerificationId"); + + b.Navigation("Achievement"); + + b.Navigation("ParentAssertion"); + + b.Navigation("Recipient"); + + b.Navigation("Source"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithMany("Authorizations") + .HasForeignKey("SourceForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Source"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrAssertionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", "BadgrBackpack") + .WithMany("BadgrAssertions") + .HasForeignKey("BadgrBackpackId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("BadgrBackpack"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("BadgrBackpack") + .HasForeignKey("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", "ParentCredentialPackageId"); + + b.Navigation("ParentCredentialPackage"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "ParentOrg") + .WithMany("ChildrenOrgs") + .HasForeignKey("ParentProfileId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Profile") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "VerificationId"); + + b.Navigation("ParentOrg"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementAlignments") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("AchievementAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Alignment"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementAssociations") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", "Association") + .WithOne("AchievementAssociation") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", "AssociationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Association"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementEndorsements") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("AchievementEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("AssertionEndorsements") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("AssertionEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("AssertionEvidences") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EvidenceModel", "Evidence") + .WithOne("AssertionEvidence") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", "EvidenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Evidence"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithOne("ClrAchievement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", "AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrAchievements") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithOne("ClrAssertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", "AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrAssertions") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrEndorsements") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("ClrEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Clr"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ArtifactModel", "Artifact") + .WithOne("EvidenceArtifact") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", "ArtifactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EvidenceModel", "Evidence") + .WithMany("EvidenceArtifacts") + .HasForeignKey("EvidenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artifact"); + + b.Navigation("Evidence"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("ProfileEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Profile") + .WithMany("ProfileEndorsements") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Endorsement"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("ResultAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", "Result") + .WithMany("ResultAlignments") + .HasForeignKey("ResultId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("Result"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("ResultDescriptionAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", "ResultDescription") + .WithMany("ResultDescriptionAlignments") + .HasForeignKey("ResultDescriptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("ResultDescription"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("RubricCriterionLevelAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", "RubricCriterionLevel") + .WithMany("RubricCriterionLevelAlignments") + .HasForeignKey("RubricCriterionLevelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("RubricCriterionLevel"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("ResultDescriptions") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("Results") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", "ResultDescription") + .WithMany("RubricCriterionLevels") + .HasForeignKey("ResultDescriptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ResultDescription"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AuthorizationModel", "Authorization") + .WithMany("Clrs") + .HasForeignKey("AuthorizationForeignKey"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "CredentialPackage") + .WithMany("ContainedClrs") + .HasForeignKey("CredentialPackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Learner") + .WithMany() + .HasForeignKey("LearnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrSetModel", "ParentClrSet") + .WithMany("Clrs") + .HasForeignKey("ParentClrSetId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("Clr") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrModel", "ParentCredentialPackageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentVerifiableCredential") + .WithMany("Clrs") + .HasForeignKey("ParentVerifiableCredentialId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Publisher") + .WithMany() + .HasForeignKey("PublisherId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", "SmartResume") + .WithOne("Clr") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrModel", "SmartResumeId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Clr") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrModel", "VerificationId"); + + b.Navigation("Authorization"); + + b.Navigation("CredentialPackage"); + + b.Navigation("Learner"); + + b.Navigation("ParentClrSet"); + + b.Navigation("ParentCredentialPackage"); + + b.Navigation("ParentVerifiableCredential"); + + b.Navigation("Publisher"); + + b.Navigation("SmartResume"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("ClrSet") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrSetModel", "ParentCredentialPackageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentVerifiableCredential") + .WithMany("ClrSets") + .HasForeignKey("ParentVerifiableCredentialId"); + + b.Navigation("ParentCredentialPackage"); + + b.Navigation("ParentVerifiableCredential"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", "WalletRelationship") + .WithMany() + .HasForeignKey("WalletRelationshipId"); + + b.Navigation("AgentContext"); + + b.Navigation("User"); + + b.Navigation("WalletRelationship"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialDefinition", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany("CredentialDefinitions") + .HasForeignKey("CredentialSchemaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("CredentialSchema"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AuthorizationModel", "Authorization") + .WithMany("CredentialPackages") + .HasForeignKey("AuthorizationForeignKey") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Authorization"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialDefinition", "CredentialDefinition") + .WithMany() + .HasForeignKey("CredentialDefinitionId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "CredentialPackage") + .WithMany() + .HasForeignKey("CredentialPackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany() + .HasForeignKey("CredentialSchemaId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", "WalletRelationship") + .WithMany("CredentialRequests") + .HasForeignKey("WalletRelationshipId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("CredentialDefinition"); + + b.Navigation("CredentialPackage"); + + b.Navigation("CredentialSchema"); + + b.Navigation("User"); + + b.Navigation("WalletRelationship"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithOne("DiscoveryDocument") + .HasForeignKey("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", "SourceForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Source"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EmailVerification", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.MessageModel", "Message") + .WithMany() + .HasForeignKey("MessageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Message"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", "EndorsementClaim") + .WithOne("Endorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.EndorsementModel", "EndorsementClaimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Issuer") + .WithMany() + .HasForeignKey("IssuerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Endorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.EndorsementModel", "VerificationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EndorsementClaim"); + + b.Navigation("Issuer"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("Links") + .HasForeignKey("ClrForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialRequestModel", "CredentialRequest") + .WithMany() + .HasForeignKey("CredentialRequestId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Clr"); + + b.Navigation("CredentialRequest"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LoginProofRequest", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.MessageModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ProofRequest", "ProofRequest") + .WithMany("Messages") + .HasForeignKey("ProofRequestId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ShareModel", "Share") + .WithMany("Messages") + .HasForeignKey("ShareId"); + + b.Navigation("ProofRequest"); + + b.Navigation("Share"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany() + .HasForeignKey("CredentialSchemaId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("CredentialSchema"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofResponse", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ProofRequest", "ProofRequest") + .WithOne("ProofResponse") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ProofResponse", "ProofRequestId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("ProofRequest"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithOne("ProvisioningToken") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", "AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RecipientModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RevocationModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithMany("Revocations") + .HasForeignKey("SourceId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Source"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.LinkModel", "Link") + .WithMany("Shares") + .HasForeignKey("LinkId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.RecipientModel", "Recipient") + .WithMany() + .HasForeignKey("RecipientId"); + + b.Navigation("Link"); + + b.Navigation("Recipient"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("VerifiableCredential") + .HasForeignKey("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentCredentialPackageId"); + + b.Navigation("ParentCredentialPackage"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.Navigation("AchievementAlignments"); + + b.Navigation("AchievementAssociations"); + + b.Navigation("AchievementEndorsements"); + + b.Navigation("Assertion"); + + b.Navigation("ClrAchievement"); + + b.Navigation("ResultDescriptions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AgentContextModel", b => + { + b.Navigation("ProvisioningToken"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.Navigation("EvidenceArtifact"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.Navigation("AssertionEndorsements"); + + b.Navigation("AssertionEvidences"); + + b.Navigation("ChildAssertions"); + + b.Navigation("ClrAssertion"); + + b.Navigation("Results"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.Navigation("Clrs"); + + b.Navigation("CredentialPackages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.Navigation("BadgrAssertions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", b => + { + b.Navigation("AchievementAlignment"); + + b.Navigation("ResultAlignment"); + + b.Navigation("ResultDescriptionAlignment"); + + b.Navigation("RubricCriterionLevelAlignment"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", b => + { + b.Navigation("AchievementAssociation"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", b => + { + b.Navigation("Achievement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", b => + { + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", b => + { + b.Navigation("Assertion"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.Navigation("ChildrenOrgs"); + + b.Navigation("ProfileEndorsements"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.Navigation("ResultDescriptionAlignments"); + + b.Navigation("RubricCriterionLevels"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.Navigation("ResultAlignments"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.Navigation("RubricCriterionLevelAlignments"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", b => + { + b.Navigation("Assertion"); + + b.Navigation("Clr"); + + b.Navigation("Endorsement"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.Navigation("Artifacts"); + + b.Navigation("ClrAchievements"); + + b.Navigation("ClrAssertions"); + + b.Navigation("ClrEndorsements"); + + b.Navigation("Links"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.Navigation("Clrs"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.Navigation("BadgrBackpack"); + + b.Navigation("Clr"); + + b.Navigation("ClrSet"); + + b.Navigation("ContainedClrs"); + + b.Navigation("VerifiableCredential"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSchema", b => + { + b.Navigation("CredentialDefinitions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.Navigation("AchievementEndorsement"); + + b.Navigation("AssertionEndorsement"); + + b.Navigation("ClrEndorsement"); + + b.Navigation("ProfileEndorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EvidenceModel", b => + { + b.Navigation("AssertionEvidence"); + + b.Navigation("EvidenceArtifacts"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.Navigation("Shares"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.Navigation("Messages"); + + b.Navigation("ProofResponse"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.Navigation("Messages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.SourceModel", b => + { + b.Navigation("Authorizations"); + + b.Navigation("DiscoveryDocument"); + + b.Navigation("Revocations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.Navigation("Clrs"); + + b.Navigation("ClrSets"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.Navigation("CredentialRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.cs b/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.cs new file mode 100644 index 0000000..accc6a2 --- /dev/null +++ b/OpenCredentialPublisher.Data/Contexts/Migrations/20220128173456_Idatafy.cs @@ -0,0 +1,93 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace OpenCredentialPublisher.Data.Contexts.Migrations +{ + public partial class Idatafy : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.EnsureSchema( + name: "idatafy"); + + migrationBuilder.AddColumn( + name: "SmartResumeId", + schema: "cred", + table: "Clrs", + type: "int", + nullable: true); + + migrationBuilder.CreateTable( + name: "SmartResumes", + schema: "idatafy", + columns: table => new + { + Id = table.Column(type: "int", nullable: false) + .Annotation("SqlServer:Identity", "1, 1"), + UserId = table.Column(type: "nvarchar(450)", nullable: true), + ClrId = table.Column(type: "int", nullable: false), + SmartResumeUrl = table.Column(type: "nvarchar(max)", nullable: true), + IsReady = table.Column(type: "bit", nullable: false), + IsDeleted = table.Column(type: "bit", nullable: false), + CreatedAt = table.Column(type: "datetime2", nullable: false), + ModifiedAt = table.Column(type: "datetime2", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_SmartResumes", x => x.Id); + table.ForeignKey( + name: "FK_SmartResumes_AspNetUsers_UserId", + column: x => x.UserId, + principalTable: "AspNetUsers", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_Clrs_SmartResumeId", + schema: "cred", + table: "Clrs", + column: "SmartResumeId", + unique: true, + filter: "[SmartResumeId] IS NOT NULL"); + + migrationBuilder.CreateIndex( + name: "IX_SmartResumes_UserId", + schema: "idatafy", + table: "SmartResumes", + column: "UserId"); + + migrationBuilder.AddForeignKey( + name: "FK_Clrs_SmartResumes_SmartResumeId", + schema: "cred", + table: "Clrs", + column: "SmartResumeId", + principalSchema: "idatafy", + principalTable: "SmartResumes", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Clrs_SmartResumes_SmartResumeId", + schema: "cred", + table: "Clrs"); + + migrationBuilder.DropTable( + name: "SmartResumes", + schema: "idatafy"); + + migrationBuilder.DropIndex( + name: "IX_Clrs_SmartResumeId", + schema: "cred", + table: "Clrs"); + + migrationBuilder.DropColumn( + name: "SmartResumeId", + schema: "cred", + table: "Clrs"); + } + } +} diff --git a/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.Designer.cs b/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.Designer.cs new file mode 100644 index 0000000..871d041 --- /dev/null +++ b/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.Designer.cs @@ -0,0 +1,4692 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using OpenCredentialPublisher.Data.Contexts; + +namespace OpenCredentialPublisher.Data.Contexts.Migrations +{ + [DbContext(typeof(WalletDbContext))] + [Migration("20220201182528_Idatafy-Clr-FK")] + partial class IdatafyClrFK + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("ProductVersion", "5.0.5") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.DeviceFlowCodes", b => + { + b.Property("UserCode") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("DeviceCode") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Expiration") + .IsRequired() + .HasColumnType("datetime2"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.HasKey("UserCode"); + + b.HasIndex("DeviceCode") + .IsUnique(); + + b.HasIndex("Expiration"); + + b.ToTable("DeviceCodes"); + }); + + modelBuilder.Entity("IdentityServer4.EntityFramework.Entities.PersistedGrant", b => + { + b.Property("Key") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ClientId") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("ConsumedTime") + .HasColumnType("datetime2"); + + b.Property("CreationTime") + .HasColumnType("datetime2"); + + b.Property("Data") + .IsRequired() + .HasMaxLength(50000) + .HasColumnType("nvarchar(max)"); + + b.Property("Description") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Expiration") + .HasColumnType("datetime2"); + + b.Property("SessionId") + .HasMaxLength(100) + .HasColumnType("nvarchar(100)"); + + b.Property("SubjectId") + .HasMaxLength(200) + .HasColumnType("nvarchar(200)"); + + b.Property("Type") + .IsRequired() + .HasMaxLength(50) + .HasColumnType("nvarchar(50)"); + + b.HasKey("Key"); + + b.HasIndex("Expiration"); + + b.HasIndex("SubjectId", "ClientId", "Type"); + + b.HasIndex("SubjectId", "SessionId", "Type"); + + b.ToTable("PersistedGrants"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("RoleId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType") + .HasColumnType("nvarchar(max)"); + + b.Property("ClaimValue") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderKey") + .HasColumnType("nvarchar(450)"); + + b.Property("ProviderDisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("RoleId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("LoginProvider") + .HasColumnType("nvarchar(450)"); + + b.Property("Name") + .HasColumnType("nvarchar(450)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.Property("AchievementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementType") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreditsAvailable") + .HasColumnType("real"); + + b.Property("CriteriaId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("FieldOfStudy") + .HasColumnType("nvarchar(max)"); + + b.Property("HumanCode") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerProfileId") + .HasColumnType("int"); + + b.Property("Level") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Specialization") + .HasColumnType("nvarchar(max)"); + + b.Property("Tags") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("AchievementId"); + + b.HasIndex("CriteriaId") + .IsUnique() + .HasFilter("[CriteriaId] IS NOT NULL"); + + b.HasIndex("IssuerProfileId"); + + b.ToTable("Achievements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AgentContextModel", b => + { + b.Property("Id") + .HasColumnType("uniqueidentifier"); + + b.Property("Active") + .HasColumnType("bit"); + + b.Property("AgentName") + .HasColumnType("nvarchar(max)"); + + b.Property("ApiKey") + .HasColumnType("nvarchar(max)"); + + b.Property("ContextJson") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("DomainDid") + .HasColumnType("nvarchar(max)"); + + b.Property("EndpointUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerDid") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerRegistered") + .HasColumnType("bit"); + + b.Property("IssuerVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Network") + .HasColumnType("nvarchar(max)"); + + b.Property("ProvisioningTokenId") + .HasColumnType("int"); + + b.Property("SdkVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("SdkVerKeyId") + .HasColumnType("nvarchar(max)"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("TokenHash") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityAgentVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityPublicDid") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityPublicVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("VerityUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.Property("WalletKey") + .HasColumnType("nvarchar(max)"); + + b.Property("WalletPath") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("AgentContexts"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("AccessFailedCount") + .HasColumnType("int"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("nvarchar(max)"); + + b.Property("DisplayName") + .HasMaxLength(255) + .HasColumnType("nvarchar(255)"); + + b.Property("Email") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("EmailConfirmed") + .HasColumnType("bit"); + + b.Property("LockoutEnabled") + .HasColumnType("bit"); + + b.Property("LockoutEnd") + .HasColumnType("datetimeoffset"); + + b.Property("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.Property("PasswordHash") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("PhoneNumberConfirmed") + .HasColumnType("bit"); + + b.Property("ProfileImageUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("SecurityStamp") + .HasColumnType("nvarchar(max)"); + + b.Property("TwoFactorEnabled") + .HasColumnType("bit"); + + b.Property("UserName") + .HasMaxLength(256) + .HasColumnType("nvarchar(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.Property("ArtifactId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("ClrIssuedOn") + .HasColumnType("datetime2"); + + b.Property("ClrName") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EvidenceName") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsPdf") + .HasColumnType("bit"); + + b.Property("IsUrl") + .HasColumnType("bit"); + + b.Property("MediaType") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NameContainsTranscript") + .HasColumnType("bit"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ArtifactId"); + + b.HasIndex("ClrId"); + + b.ToTable("Artifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.Property("AssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("ActivityEndDate") + .HasColumnType("datetime2"); + + b.Property("ActivityStartDate") + .HasColumnType("datetime2"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CreditsEarned") + .HasColumnType("real"); + + b.Property("DisplayName") + .HasColumnType("nvarchar(max)"); + + b.Property("Expires") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsSelfPublished") + .HasColumnType("bit"); + + b.Property("IsSigned") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("LicenseNumber") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentAssertionId") + .HasColumnType("int"); + + b.Property("RecipientId") + .HasColumnType("int"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("Role") + .HasColumnType("nvarchar(max)"); + + b.Property("SignedAssertion") + .HasColumnType("nvarchar(max)"); + + b.Property("SignedEndorsements") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceId") + .HasColumnType("int"); + + b.Property("Term") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("AssertionId"); + + b.HasIndex("AchievementId") + .IsUnique() + .HasFilter("[AchievementId] IS NOT NULL"); + + b.HasIndex("ParentAssertionId"); + + b.HasIndex("RecipientId") + .IsUnique() + .HasFilter("[RecipientId] IS NOT NULL"); + + b.HasIndex("SourceId"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Assertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("nvarchar(450)"); + + b.Property("AccessToken") + .HasColumnType("nvarchar(max)"); + + b.Property("AuthorizationCode") + .HasColumnType("nvarchar(max)"); + + b.Property("CodeVerifier") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Endpoint") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Method") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Payload") + .HasColumnType("nvarchar(max)"); + + b.Property("RefreshToken") + .HasColumnType("nvarchar(max)"); + + b.Property("Scopes") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceForeignKey") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidTo") + .HasColumnType("datetime2"); + + b.HasKey("Id"); + + b.HasIndex("SourceForeignKey"); + + b.HasIndex("UserId"); + + b.ToTable("Authorizations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrAssertionModel", b => + { + b.Property("BadgrAssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Acceptance") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeClassJson") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeClassOpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgeJson") + .HasColumnType("nvarchar(max)"); + + b.Property("Badgeclass") + .HasColumnType("nvarchar(max)"); + + b.Property("BadgrBackpackId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Expires") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("InternalIdentifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBadgr") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsValidJson") + .HasColumnType("bit"); + + b.Property("IssueStatus") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Issuer") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerJson") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuerOpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("OpenBadgeId") + .HasColumnType("nvarchar(max)"); + + b.Property("Pending") + .HasColumnType("bit"); + + b.Property("RecipientJson") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedAssertion") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ValidationStatus") + .HasColumnType("nvarchar(max)"); + + b.HasKey("BadgrAssertionId"); + + b.HasIndex("BadgrBackpackId"); + + b.ToTable("BadgrAssertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsBadgr") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("Provider") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique(); + + b.ToTable("BadgrBackpacks", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CertificateModel", b => + { + b.Property("Host") + .HasColumnType("nvarchar(450)"); + + b.Property("IssuedByName") + .HasColumnType("nvarchar(max)"); + + b.Property("IssuedToName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Host"); + + b.ToTable("Certificates"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", b => + { + b.Property("AlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EducationalFramework") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("TargetCode") + .HasColumnType("nvarchar(max)"); + + b.Property("TargetDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("TargetName") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TargetType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TargetUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("AlignmentId"); + + b.ToTable("Alignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", b => + { + b.Property("AssociationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssociationType") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("TargetId") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Title") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("AssociationId"); + + b.ToTable("Associations", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", b => + { + b.Property("CriteriaId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("CriteriaId"); + + b.ToTable("Criteria", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", b => + { + b.Property("EndorsementClaimId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementComment") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("EndorsementClaimId"); + + b.ToTable("EndorsementClaims", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", b => + { + b.Property("IdentityId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Hashed") + .HasColumnType("bit"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("Identity") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Salt") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.HasKey("IdentityId"); + + b.ToTable("Identities", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.Property("ProfileId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalName") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("BirthDate") + .HasColumnType("datetime2"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Email") + .HasColumnType("nvarchar(max)"); + + b.Property("FamilyName") + .HasColumnType("nvarchar(max)"); + + b.Property("GivenName") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsEndorsementProfile") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Official") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentProfileId") + .HasColumnType("int"); + + b.Property("PublicKey") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationList") + .HasColumnType("nvarchar(max)"); + + b.Property("SourcedId") + .HasColumnType("nvarchar(max)"); + + b.Property("StudentId") + .HasColumnType("nvarchar(max)"); + + b.Property("Telephone") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("ProfileId"); + + b.HasIndex("ParentProfileId"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Profiles", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", b => + { + b.Property("AchievementAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementAlignmentId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.ToTable("AchievementAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", b => + { + b.Property("AchievementAssociationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AssociationId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementAssociationId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("AssociationId") + .IsUnique(); + + b.ToTable("AchievementAssociations", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", b => + { + b.Property("AchievementEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AchievementEndorsementId"); + + b.HasIndex("AchievementId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("AchievementEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", b => + { + b.Property("AssertionEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AssertionEndorsementId"); + + b.HasIndex("AssertionId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("AssertionEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", b => + { + b.Property("AssertionEvidenceId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EvidenceId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("AssertionEvidenceId"); + + b.HasIndex("AssertionId"); + + b.HasIndex("EvidenceId") + .IsUnique(); + + b.ToTable("AssertionEvidence", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", b => + { + b.Property("ClrAchievementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrAchievementId"); + + b.HasIndex("AchievementId") + .IsUnique(); + + b.HasIndex("ClrId"); + + b.ToTable("ClrAchievements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", b => + { + b.Property("ClrAssertionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrAssertionId"); + + b.HasIndex("AssertionId") + .IsUnique(); + + b.HasIndex("ClrId"); + + b.ToTable("ClrAssertions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", b => + { + b.Property("ClrEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("ClrEndorsementId"); + + b.HasIndex("ClrId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.ToTable("ClrEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", b => + { + b.Property("EvidenceArtifactId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ArtifactId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EvidenceId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.HasKey("EvidenceArtifactId"); + + b.HasIndex("ArtifactId") + .IsUnique(); + + b.HasIndex("EvidenceId"); + + b.ToTable("EvidenceArtifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", b => + { + b.Property("ProfileEndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ProfileId") + .HasColumnType("int"); + + b.HasKey("ProfileEndorsementId"); + + b.HasIndex("EndorsementId") + .IsUnique(); + + b.HasIndex("ProfileId"); + + b.ToTable("ProfileEndorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", b => + { + b.Property("ResultAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultId") + .HasColumnType("int"); + + b.HasKey("ResultAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("ResultId"); + + b.ToTable("ResultAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", b => + { + b.Property("ResultDescriptionAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultDescriptionId") + .HasColumnType("int"); + + b.HasKey("ResultDescriptionAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("ResultDescriptionId"); + + b.ToTable("ResultDescriptionAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", b => + { + b.Property("RubricCriterionLevelAlignmentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AlignmentId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RubricCriterionLevelId") + .HasColumnType("int"); + + b.HasKey("RubricCriterionLevelAlignmentId"); + + b.HasIndex("AlignmentId") + .IsUnique(); + + b.HasIndex("RubricCriterionLevelId"); + + b.ToTable("RubricCriterionLevelAlignments", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.Property("ResultDescriptionId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievementId") + .HasColumnType("int"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AllowedValues") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("RequiredLevel") + .HasColumnType("nvarchar(max)"); + + b.Property("RequiredValue") + .HasColumnType("nvarchar(max)"); + + b.Property("ResultType") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("ValueMax") + .HasColumnType("nvarchar(max)"); + + b.Property("ValueMin") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ResultDescriptionId"); + + b.HasIndex("AchievementId"); + + b.ToTable("ResultDescriptions", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.Property("ResultId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AchievedLevel") + .HasColumnType("nvarchar(max)"); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("ResultDescription") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("Value") + .HasColumnType("nvarchar(max)"); + + b.HasKey("ResultId"); + + b.HasIndex("AssertionId"); + + b.ToTable("Results", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.Property("RubricCriterionLevelId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Level") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Order") + .HasColumnType("int"); + + b.Property("Points") + .HasColumnType("nvarchar(max)"); + + b.Property("ResultDescriptionId") + .HasColumnType("int"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("RubricCriterionLevelId"); + + b.HasIndex("ResultDescriptionId"); + + b.ToTable("RubricCriterionLevels", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", b => + { + b.Property("VerificationId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AllowedOrigins") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Creator") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("StartsWith") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("int"); + + b.Property("VerificationProperty") + .HasColumnType("nvarchar(max)"); + + b.HasKey("VerificationId"); + + b.ToTable("Verifications", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.Property("ClrId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("AuthorizationForeignKey") + .HasColumnType("nvarchar(450)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("LearnerId") + .HasColumnType("int"); + + b.Property("LearnerName") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentClrSetId") + .HasColumnType("int"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("ParentVerifiableCredentialId") + .HasColumnType("int"); + + b.Property("Partial") + .HasColumnType("bit"); + + b.Property("PublisherId") + .HasColumnType("int"); + + b.Property("PublisherName") + .HasColumnType("nvarchar(max)"); + + b.Property("RefreshedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedClr") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("ClrId"); + + b.HasIndex("AuthorizationForeignKey"); + + b.HasIndex("CredentialPackageId"); + + b.HasIndex("LearnerId"); + + b.HasIndex("ParentClrSetId"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique() + .HasFilter("[ParentCredentialPackageId] IS NOT NULL"); + + b.HasIndex("ParentVerifiableCredentialId"); + + b.HasIndex("PublisherId"); + + b.HasIndex("VerificationId") + .IsUnique() + .HasFilter("[VerificationId] IS NOT NULL"); + + b.ToTable("Clrs", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrsCount") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("ParentVerifiableCredentialId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique() + .HasFilter("[ParentCredentialPackageId] IS NOT NULL"); + + b.HasIndex("ParentVerifiableCredentialId"); + + b.ToTable("ClrSets", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("ConnectionRequestStep") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(450)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletRelationshipId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("ThreadId") + .IsUnique() + .HasFilter("[ThreadId] IS NOT NULL"); + + b.HasIndex("UserId"); + + b.HasIndex("WalletRelationshipId"); + + b.ToTable("ConnectionRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ConnectionRequestSteps"); + + b.HasData( + new + { + Id = 0, + Name = "Initiated" + }, + new + { + Id = 1, + Name = "PendingAgent" + }, + new + { + Id = 2, + Name = "StartingInvitation" + }, + new + { + Id = 3, + Name = "RequestingInvitation" + }, + new + { + Id = 4, + Name = "InvitationGenerated" + }, + new + { + Id = 5, + Name = "InvitationAccepted" + }, + new + { + Id = 6, + Name = "InvitationCompleted" + }, + new + { + Id = 13, + Name = "Error" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialDefinition", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialDefinitionId") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Tag") + .HasColumnType("nvarchar(max)"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("CredentialSchemaId"); + + b.ToTable("CredentialDefinitions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialListView", b => + { + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.ToView("vw_CredentialList", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageArtifactView", b => + { + b.Property("ArtifactId") + .HasColumnType("int"); + + b.Property("AssertionId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("ClrIssuedOn") + .HasColumnType("datetime2"); + + b.Property("ClrName") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("EvidenceName") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsPdf") + .HasColumnType("bit"); + + b.Property("IsUrl") + .HasColumnType("bit"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("TypeId") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(max)"); + + b.ToView("CredentialPackageArtifacts", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AssertionsCount") + .HasColumnType("int"); + + b.Property("AuthorizationForeignKey") + .HasMaxLength(450) + .HasColumnType("nvarchar(450)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("TypeId") + .HasColumnType("int"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("AuthorizationForeignKey"); + + b.HasIndex("UserId"); + + b.ToTable("CredentialPackages", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialDefinitionId") + .HasColumnType("int"); + + b.Property("CredentialPackageId") + .HasColumnType("int"); + + b.Property("CredentialRequestStep") + .HasColumnType("int"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("ErrorMessage") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletRelationshipId") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("CredentialDefinitionId"); + + b.HasIndex("CredentialPackageId"); + + b.HasIndex("CredentialSchemaId"); + + b.HasIndex("UserId"); + + b.HasIndex("WalletRelationshipId"); + + b.ToTable("CredentialRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CredentialRequestSteps"); + + b.HasData( + new + { + Id = 0, + Name = "Initiated" + }, + new + { + Id = 1, + Name = "PendingAgent" + }, + new + { + Id = 2, + Name = "PendingSchema" + }, + new + { + Id = 3, + Name = "PendingCredentialDefinition" + }, + new + { + Id = 4, + Name = "ReadyToSend" + }, + new + { + Id = 5, + Name = "SendingOffer" + }, + new + { + Id = 6, + Name = "OfferSent" + }, + new + { + Id = 7, + Name = "OfferAccepted" + }, + new + { + Id = 8, + Name = "CheckingRevocationStatus" + }, + new + { + Id = 9, + Name = "CredentialIsRevoked" + }, + new + { + Id = 10, + Name = "CredentialIsStillValid" + }, + new + { + Id = 11, + Name = "PendingSchemaEndorsement" + }, + new + { + Id = 12, + Name = "PendingCredentialDefinitionEndorsement" + }, + new + { + Id = 13, + Name = "Error" + }, + new + { + Id = 14, + Name = "ErrorWritingSchema" + }, + new + { + Id = 15, + Name = "ErrorWritingCredentialDefinition" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSchema", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Attributes") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Hash") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NetworkId") + .HasColumnType("nvarchar(max)"); + + b.Property("SchemaId") + .HasColumnType("nvarchar(max)"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("TypeName") + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("CredentialSchema"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSearchView", b => + { + b.Property("CredentialDescription") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialName") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialNarrative") + .HasColumnType("nvarchar(max)"); + + b.Property("CredentialType") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.ToView("vw_CredentialSearch", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", b => + { + b.Property("DiscoveryDocumentId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ApiBase") + .HasColumnType("nvarchar(max)"); + + b.Property("AuthorizationUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Context") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("Image") + .HasColumnType("nvarchar(max)"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("PrivacyPolicyUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("RegistrationUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("ScopesOffered") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("SourceForeignKey") + .HasColumnType("int"); + + b.Property("TermsOfServiceUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("TokenRevocationUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("TokenUrl") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Version") + .HasColumnType("nvarchar(max)"); + + b.HasKey("DiscoveryDocumentId"); + + b.HasIndex("SourceForeignKey") + .IsUnique(); + + b.ToTable("DiscoveryDocumentModel", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EmailVerification", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EmailAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("EmailVerificationCredentialQrCode") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("MessageId") + .HasColumnType("int"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("OfferContents") + .HasColumnType("nvarchar(max)"); + + b.Property("OfferId") + .HasColumnType("nvarchar(max)"); + + b.Property("OfferPayload") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.Property("VerificationString") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("MessageId"); + + b.HasIndex("UserId"); + + b.ToTable("EmailVerifications"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.Property("EndorsementId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EndorsementClaimId") + .HasColumnType("int"); + + b.Property("Id") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsSigned") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("IssuerId") + .HasColumnType("int"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.Property("SignedEndorsement") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationId") + .HasColumnType("int"); + + b.HasKey("EndorsementId"); + + b.HasIndex("EndorsementClaimId") + .IsUnique(); + + b.HasIndex("IssuerId"); + + b.HasIndex("VerificationId") + .IsUnique(); + + b.ToTable("Endorsements", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EvidenceModel", b => + { + b.Property("EvidenceId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AdditionalProperties") + .HasColumnType("nvarchar(max)"); + + b.Property("Audience") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Description") + .HasColumnType("nvarchar(max)"); + + b.Property("Genre") + .HasColumnType("nvarchar(max)"); + + b.Property("Id") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("Narrative") + .HasColumnType("nvarchar(max)"); + + b.Property("Type") + .HasColumnType("nvarchar(max)"); + + b.HasKey("EvidenceId"); + + b.ToTable("Evidence", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.HttpClientLog", b => + { + b.Property("HttpClientLogId") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Machine") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestContentBody") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestContentType") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestHeaders") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestIpAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestMethod") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestRouteData") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestRouteTemplate") + .HasColumnType("nvarchar(max)"); + + b.Property("RequestTimestamp") + .HasColumnType("datetime2"); + + b.Property("RequestUri") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseContentBody") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseContentType") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseHeaders") + .HasColumnType("nvarchar(max)"); + + b.Property("ResponseStatusCode") + .HasColumnType("int"); + + b.Property("ResponseTimestamp") + .HasColumnType("datetime2"); + + b.Property("User") + .HasColumnType("nvarchar(max)"); + + b.HasKey("HttpClientLogId"); + + b.ToTable("HttpClientLogs"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsReady") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("SmartResumeUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("ClrId") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("SmartResumes", "idatafy"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.IdentityCertificateModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Certificate") + .HasColumnType("nvarchar(max)"); + + b.Property("DnsName") + .HasColumnType("nvarchar(max)"); + + b.Property("Password") + .HasColumnType("nvarchar(max)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.ToTable("IdentityCertificates"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.Property("Id") + .HasColumnType("nvarchar(450)"); + + b.Property("ClrForeignKey") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialRequestId") + .HasColumnType("int"); + + b.Property("DisplayCount") + .HasColumnType("int"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Nickname") + .HasColumnType("nvarchar(max)"); + + b.Property("RequiresAccessKey") + .HasColumnType("bit"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("ClrForeignKey"); + + b.HasIndex("CredentialRequestId"); + + b.HasIndex("UserId"); + + b.ToTable("Links"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LoginProofRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("EmailAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ProofAttributeId") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofContent") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofId") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofPayload") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofRequestStatus") + .HasColumnType("int"); + + b.Property("ProofResponse") + .HasColumnType("nvarchar(max)"); + + b.Property("PublicId") + .HasColumnType("nvarchar(max)"); + + b.Property("QrCodeUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("State") + .HasColumnType("nvarchar(max)"); + + b.Property("Status") + .HasColumnType("int"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.Property("ValidUntil") + .HasColumnType("datetimeoffset"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("LoginProofRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.MessageModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Body") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("ProofRequestId") + .HasColumnType("int"); + + b.Property("Recipient") + .HasColumnType("nvarchar(max)"); + + b.Property("SendAttempts") + .HasColumnType("int"); + + b.Property("ShareId") + .HasColumnType("int"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("Subject") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ProofRequestId"); + + b.HasIndex("ShareId"); + + b.ToTable("Messages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialSchemaId") + .HasColumnType("int"); + + b.Property("ForRelationship") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationId") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationLink") + .HasColumnType("nvarchar(max)"); + + b.Property("InvitationQrCode") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("NotificationAddress") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofPredicates") + .HasColumnType("nvarchar(max)"); + + b.Property("PublicId") + .HasColumnType("nvarchar(max)"); + + b.Property("ShortInvitationLink") + .HasColumnType("nvarchar(max)"); + + b.Property("StepId") + .HasColumnType("int"); + + b.Property("ThreadId") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("CredentialSchemaId"); + + b.HasIndex("UserId"); + + b.ToTable("ProofRequests"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequestStep", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ProofRequestSteps"); + + b.HasData( + new + { + Id = 1, + Name = "Created" + }, + new + { + Id = 2, + Name = "WaitingForAgentContext" + }, + new + { + Id = 3, + Name = "InvitationLinkRequested" + }, + new + { + Id = 4, + Name = "InvitationLinkReceived" + }, + new + { + Id = 5, + Name = "ProofReceived" + }, + new + { + Id = 6, + Name = "RequestedRelationship" + }, + new + { + Id = 7, + Name = "CreatedRelationship" + }, + new + { + Id = 8, + Name = "ReceivingProofResponse" + }, + new + { + Id = 9, + Name = "Deleted" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofResponse", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Identifiers") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Predicates") + .HasColumnType("nvarchar(max)"); + + b.Property("ProofRequestId") + .HasColumnType("int"); + + b.Property("ProofResultId") + .HasColumnType("nvarchar(max)"); + + b.Property("RevealedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("SelfAttestedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("UnrevealedAttributes") + .HasColumnType("nvarchar(max)"); + + b.Property("VerificationResult") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("ProofRequestId") + .IsUnique(); + + b.ToTable("ProofResponses"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Nonce") + .HasColumnType("nvarchar(max)"); + + b.Property("Sig") + .HasColumnType("nvarchar(max)"); + + b.Property("SponseeId") + .HasColumnType("nvarchar(max)"); + + b.Property("SponsorId") + .HasColumnType("nvarchar(max)"); + + b.Property("SponsorVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("Timestamp") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId") + .IsUnique(); + + b.ToTable("ProvisioningToken"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RecipientModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("Email") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .IsRequired() + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("Recipients"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RevocationModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuerId") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RevocationListId") + .HasColumnType("nvarchar(max)"); + + b.Property("RevokedId") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceId") + .HasColumnType("int"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("SourceId"); + + b.HasIndex("UserId"); + + b.ToTable("Revocations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AccessKey") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("LinkId") + .HasColumnType("nvarchar(450)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RecipientId") + .HasColumnType("int"); + + b.Property("ShareTypeId") + .HasColumnType("int"); + + b.Property("StatusId") + .HasColumnType("int"); + + b.Property("UseCount") + .HasColumnType("int"); + + b.HasKey("Id"); + + b.HasIndex("LinkId"); + + b.HasIndex("RecipientId"); + + b.ToTable("Shares"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareTypeModel", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("ShareTypes"); + + b.HasData( + new + { + Id = 1, + Name = "Email" + }, + new + { + Id = 2, + Name = "Pdf" + }, + new + { + Id = 3, + Name = "Wallet" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.SourceModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClientId") + .HasColumnType("nvarchar(max)"); + + b.Property("ClientSecret") + .HasColumnType("nvarchar(max)"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeletable") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("Scope") + .HasColumnType("nvarchar(max)"); + + b.Property("SourceTypeId") + .HasColumnType("int"); + + b.Property("Url") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Sources"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.StatusModel", b => + { + b.Property("Id") + .HasColumnType("int"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.ToTable("Statuses"); + + b.HasData( + new + { + Id = 1, + Name = "Pending" + }, + new + { + Id = 2, + Name = "Accepted" + }, + new + { + Id = 3, + Name = "Used" + }, + new + { + Id = 4, + Name = "Expired" + }, + new + { + Id = 5, + Name = "Rejected" + }, + new + { + Id = 6, + Name = "Created" + }, + new + { + Id = 7, + Name = "Deleted" + }, + new + { + Id = 8, + Name = "Visible" + }, + new + { + Id = 9, + Name = "Hidden" + }, + new + { + Id = 10, + Name = "Submitted" + }, + new + { + Id = 11, + Name = "Active" + }, + new + { + Id = 12, + Name = "Sent" + }, + new + { + Id = 13, + Name = "Error" + }, + new + { + Id = 14, + Name = "WaitingForScoreReport" + }, + new + { + Id = 15, + Name = "ReadyForVerification" + }, + new + { + Id = 16, + Name = "Verified" + }, + new + { + Id = 17, + Name = "Unused" + }, + new + { + Id = 18, + Name = "Success" + }, + new + { + Id = 19, + Name = "NeedsEndorsement" + }); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("CredentialsCount") + .HasColumnType("int"); + + b.Property("Identifier") + .HasColumnType("nvarchar(max)"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IssuedOn") + .HasColumnType("datetime2"); + + b.Property("Issuer") + .HasColumnType("nvarchar(max)"); + + b.Property("Json") + .HasColumnType("nvarchar(max)"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("Name") + .HasColumnType("nvarchar(max)"); + + b.Property("ParentCredentialPackageId") + .HasColumnType("int"); + + b.Property("RevocationReason") + .HasColumnType("nvarchar(max)"); + + b.Property("Revoked") + .HasColumnType("bit"); + + b.HasKey("Id"); + + b.HasIndex("ParentCredentialPackageId") + .IsUnique(); + + b.ToTable("VerifiableCredentials", "cred"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerityThread", b => + { + b.Property("ThreadId") + .HasColumnType("nvarchar(450)"); + + b.Property("FlowTypeId") + .HasColumnType("int"); + + b.HasKey("ThreadId"); + + b.ToTable("VerityThreads"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AgentContextId") + .HasColumnType("uniqueidentifier"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("InviteUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("IsConnected") + .HasColumnType("bit"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("RelationshipDid") + .HasColumnType("nvarchar(max)"); + + b.Property("RelationshipVerKey") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("nvarchar(450)"); + + b.Property("WalletName") + .HasColumnType("nvarchar(max)"); + + b.HasKey("Id"); + + b.HasIndex("AgentContextId"); + + b.HasIndex("UserId"); + + b.ToTable("WalletRelationships"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", "Requirement") + .WithOne("Achievement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AchievementModel", "CriteriaId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Issuer") + .WithMany() + .HasForeignKey("IssuerProfileId"); + + b.Navigation("Issuer"); + + b.Navigation("Requirement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("Artifacts") + .HasForeignKey("ClrId"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "AchievementId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "ParentAssertion") + .WithMany("ChildAssertions") + .HasForeignKey("ParentAssertionId") + .OnDelete(DeleteBehavior.Restrict); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", "Recipient") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "RecipientId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Source") + .WithMany() + .HasForeignKey("SourceId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Assertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.AssertionModel", "VerificationId"); + + b.Navigation("Achievement"); + + b.Navigation("ParentAssertion"); + + b.Navigation("Recipient"); + + b.Navigation("Source"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithMany("Authorizations") + .HasForeignKey("SourceForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Source"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrAssertionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", "BadgrBackpack") + .WithMany("BadgrAssertions") + .HasForeignKey("BadgrBackpackId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("BadgrBackpack"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("BadgrBackpack") + .HasForeignKey("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", "ParentCredentialPackageId"); + + b.Navigation("ParentCredentialPackage"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "ParentOrg") + .WithMany("ChildrenOrgs") + .HasForeignKey("ParentProfileId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Profile") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "VerificationId"); + + b.Navigation("ParentOrg"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementAlignments") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("AchievementAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Alignment"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementAssociations") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", "Association") + .WithOne("AchievementAssociation") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementAssociation", "AssociationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Association"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("AchievementEndorsements") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("AchievementEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AchievementEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("AssertionEndorsements") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("AssertionEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("AssertionEvidences") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EvidenceModel", "Evidence") + .WithOne("AssertionEvidence") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.AssertionEvidence", "EvidenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Evidence"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithOne("ClrAchievement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAchievement", "AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrAchievements") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithOne("ClrAssertion") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrAssertion", "AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrAssertions") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + + b.Navigation("Clr"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("ClrEndorsements") + .HasForeignKey("ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("ClrEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ClrEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Clr"); + + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ArtifactModel", "Artifact") + .WithOne("EvidenceArtifact") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.EvidenceArtifact", "ArtifactId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.EvidenceModel", "Evidence") + .WithMany("EvidenceArtifacts") + .HasForeignKey("EvidenceId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Artifact"); + + b.Navigation("Evidence"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.EndorsementModel", "Endorsement") + .WithOne("ProfileEndorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ProfileEndorsement", "EndorsementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Profile") + .WithMany("ProfileEndorsements") + .HasForeignKey("ProfileId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Endorsement"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("ResultAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", "Result") + .WithMany("ResultAlignments") + .HasForeignKey("ResultId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("Result"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("ResultDescriptionAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.ResultDescriptionAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", "ResultDescription") + .WithMany("ResultDescriptionAlignments") + .HasForeignKey("ResultDescriptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("ResultDescription"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", "Alignment") + .WithOne("RubricCriterionLevelAlignment") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrEntities.Relationships.RubricCriterionLevelAlignment", "AlignmentId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", "RubricCriterionLevel") + .WithMany("RubricCriterionLevelAlignments") + .HasForeignKey("RubricCriterionLevelId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Alignment"); + + b.Navigation("RubricCriterionLevel"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AchievementModel", "Achievement") + .WithMany("ResultDescriptions") + .HasForeignKey("AchievementId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Achievement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AssertionModel", "Assertion") + .WithMany("Results") + .HasForeignKey("AssertionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Assertion"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", "ResultDescription") + .WithMany("RubricCriterionLevels") + .HasForeignKey("ResultDescriptionId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ResultDescription"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AuthorizationModel", "Authorization") + .WithMany("Clrs") + .HasForeignKey("AuthorizationForeignKey"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "CredentialPackage") + .WithMany("ContainedClrs") + .HasForeignKey("CredentialPackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Learner") + .WithMany() + .HasForeignKey("LearnerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrSetModel", "ParentClrSet") + .WithMany("Clrs") + .HasForeignKey("ParentClrSetId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("Clr") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrModel", "ParentCredentialPackageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentVerifiableCredential") + .WithMany("Clrs") + .HasForeignKey("ParentVerifiableCredentialId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Publisher") + .WithMany() + .HasForeignKey("PublisherId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Clr") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrModel", "VerificationId"); + + b.Navigation("Authorization"); + + b.Navigation("CredentialPackage"); + + b.Navigation("Learner"); + + b.Navigation("ParentClrSet"); + + b.Navigation("ParentCredentialPackage"); + + b.Navigation("ParentVerifiableCredential"); + + b.Navigation("Publisher"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("ClrSet") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ClrSetModel", "ParentCredentialPackageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentVerifiableCredential") + .WithMany("ClrSets") + .HasForeignKey("ParentVerifiableCredentialId"); + + b.Navigation("ParentCredentialPackage"); + + b.Navigation("ParentVerifiableCredential"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ConnectionRequestModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", "WalletRelationship") + .WithMany() + .HasForeignKey("WalletRelationshipId"); + + b.Navigation("AgentContext"); + + b.Navigation("User"); + + b.Navigation("WalletRelationship"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialDefinition", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany("CredentialDefinitions") + .HasForeignKey("CredentialSchemaId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("CredentialSchema"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AuthorizationModel", "Authorization") + .WithMany("CredentialPackages") + .HasForeignKey("AuthorizationForeignKey") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Authorization"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialRequestModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialDefinition", "CredentialDefinition") + .WithMany() + .HasForeignKey("CredentialDefinitionId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "CredentialPackage") + .WithMany() + .HasForeignKey("CredentialPackageId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany() + .HasForeignKey("CredentialSchemaId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", "WalletRelationship") + .WithMany("CredentialRequests") + .HasForeignKey("WalletRelationshipId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("CredentialDefinition"); + + b.Navigation("CredentialPackage"); + + b.Navigation("CredentialSchema"); + + b.Navigation("User"); + + b.Navigation("WalletRelationship"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithOne("DiscoveryDocument") + .HasForeignKey("OpenCredentialPublisher.Data.Models.DiscoveryDocumentModel", "SourceForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Source"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EmailVerification", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.MessageModel", "Message") + .WithMany() + .HasForeignKey("MessageId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Message"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", "EndorsementClaim") + .WithOne("Endorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.EndorsementModel", "EndorsementClaimId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", "Issuer") + .WithMany() + .HasForeignKey("IssuerId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", "Verification") + .WithOne("Endorsement") + .HasForeignKey("OpenCredentialPublisher.Data.Models.EndorsementModel", "VerificationId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("EndorsementClaim"); + + b.Navigation("Issuer"); + + b.Navigation("Verification"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithOne("SmartResume") + .HasForeignKey("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", "ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Clr"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithMany("Links") + .HasForeignKey("ClrForeignKey") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialRequestModel", "CredentialRequest") + .WithMany() + .HasForeignKey("CredentialRequestId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Clr"); + + b.Navigation("CredentialRequest"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LoginProofRequest", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.MessageModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ProofRequest", "ProofRequest") + .WithMany("Messages") + .HasForeignKey("ProofRequestId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ShareModel", "Share") + .WithMany("Messages") + .HasForeignKey("ShareId"); + + b.Navigation("ProofRequest"); + + b.Navigation("Share"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialSchema", "CredentialSchema") + .WithMany() + .HasForeignKey("CredentialSchemaId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.NoAction); + + b.Navigation("CredentialSchema"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofResponse", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ProofRequest", "ProofRequest") + .WithOne("ProofResponse") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ProofResponse", "ProofRequestId") + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(); + + b.Navigation("ProofRequest"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithOne("ProvisioningToken") + .HasForeignKey("OpenCredentialPublisher.Data.Models.ProvisioningTokenModel", "AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RecipientModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.RevocationModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.SourceModel", "Source") + .WithMany("Revocations") + .HasForeignKey("SourceId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Source"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.LinkModel", "Link") + .WithMany("Shares") + .HasForeignKey("LinkId"); + + b.HasOne("OpenCredentialPublisher.Data.Models.RecipientModel", "Recipient") + .WithMany() + .HasForeignKey("RecipientId"); + + b.Navigation("Link"); + + b.Navigation("Recipient"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.CredentialPackageModel", "ParentCredentialPackage") + .WithOne("VerifiableCredential") + .HasForeignKey("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", "ParentCredentialPackageId"); + + b.Navigation("ParentCredentialPackage"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.AgentContextModel", "AgentContext") + .WithMany() + .HasForeignKey("AgentContextId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("AgentContext"); + + b.Navigation("User"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AchievementModel", b => + { + b.Navigation("AchievementAlignments"); + + b.Navigation("AchievementAssociations"); + + b.Navigation("AchievementEndorsements"); + + b.Navigation("Assertion"); + + b.Navigation("ClrAchievement"); + + b.Navigation("ResultDescriptions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AgentContextModel", b => + { + b.Navigation("ProvisioningToken"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => + { + b.Navigation("EvidenceArtifact"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => + { + b.Navigation("AssertionEndorsements"); + + b.Navigation("AssertionEvidences"); + + b.Navigation("ChildAssertions"); + + b.Navigation("ClrAssertion"); + + b.Navigation("Results"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AuthorizationModel", b => + { + b.Navigation("Clrs"); + + b.Navigation("CredentialPackages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Badgr.BadgrBackpackModel", b => + { + b.Navigation("BadgrAssertions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AlignmentModel", b => + { + b.Navigation("AchievementAlignment"); + + b.Navigation("ResultAlignment"); + + b.Navigation("ResultDescriptionAlignment"); + + b.Navigation("RubricCriterionLevelAlignment"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.AssociationModel", b => + { + b.Navigation("AchievementAssociation"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.CriteriaModel", b => + { + b.Navigation("Achievement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.EndorsementClaimModel", b => + { + b.Navigation("Endorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.IdentityModel", b => + { + b.Navigation("Assertion"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ProfileModel", b => + { + b.Navigation("ChildrenOrgs"); + + b.Navigation("ProfileEndorsements"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultDescriptionModel", b => + { + b.Navigation("ResultDescriptionAlignments"); + + b.Navigation("RubricCriterionLevels"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.ResultModel", b => + { + b.Navigation("ResultAlignments"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.RubricCriterionLevelModel", b => + { + b.Navigation("RubricCriterionLevelAlignments"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrEntities.VerificationModel", b => + { + b.Navigation("Assertion"); + + b.Navigation("Clr"); + + b.Navigation("Endorsement"); + + b.Navigation("Profile"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrModel", b => + { + b.Navigation("Artifacts"); + + b.Navigation("ClrAchievements"); + + b.Navigation("ClrAssertions"); + + b.Navigation("ClrEndorsements"); + + b.Navigation("Links"); + + b.Navigation("SmartResume"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => + { + b.Navigation("Clrs"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialPackageModel", b => + { + b.Navigation("BadgrBackpack"); + + b.Navigation("Clr"); + + b.Navigation("ClrSet"); + + b.Navigation("ContainedClrs"); + + b.Navigation("VerifiableCredential"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.CredentialSchema", b => + { + b.Navigation("CredentialDefinitions"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EndorsementModel", b => + { + b.Navigation("AchievementEndorsement"); + + b.Navigation("AssertionEndorsement"); + + b.Navigation("ClrEndorsement"); + + b.Navigation("ProfileEndorsement"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.EvidenceModel", b => + { + b.Navigation("AssertionEvidence"); + + b.Navigation("EvidenceArtifacts"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => + { + b.Navigation("Shares"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ProofRequest", b => + { + b.Navigation("Messages"); + + b.Navigation("ProofResponse"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ShareModel", b => + { + b.Navigation("Messages"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.SourceModel", b => + { + b.Navigation("Authorizations"); + + b.Navigation("DiscoveryDocument"); + + b.Navigation("Revocations"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.VerifiableCredentialModel", b => + { + b.Navigation("Clrs"); + + b.Navigation("ClrSets"); + }); + + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.WalletRelationshipModel", b => + { + b.Navigation("CredentialRequests"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.cs b/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.cs new file mode 100644 index 0000000..014d270 --- /dev/null +++ b/OpenCredentialPublisher.Data/Contexts/Migrations/20220201182528_Idatafy-Clr-FK.cs @@ -0,0 +1,80 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +namespace OpenCredentialPublisher.Data.Contexts.Migrations +{ + public partial class IdatafyClrFK : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_Clrs_SmartResumes_SmartResumeId", + schema: "cred", + table: "Clrs"); + + migrationBuilder.DropIndex( + name: "IX_Clrs_SmartResumeId", + schema: "cred", + table: "Clrs"); + + migrationBuilder.DropColumn( + name: "SmartResumeId", + schema: "cred", + table: "Clrs"); + + migrationBuilder.CreateIndex( + name: "IX_SmartResumes_ClrId", + schema: "idatafy", + table: "SmartResumes", + column: "ClrId", + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_SmartResumes_Clrs_ClrId", + schema: "idatafy", + table: "SmartResumes", + column: "ClrId", + principalSchema: "cred", + principalTable: "Clrs", + principalColumn: "ClrId", + onDelete: ReferentialAction.Cascade); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_SmartResumes_Clrs_ClrId", + schema: "idatafy", + table: "SmartResumes"); + + migrationBuilder.DropIndex( + name: "IX_SmartResumes_ClrId", + schema: "idatafy", + table: "SmartResumes"); + + migrationBuilder.AddColumn( + name: "SmartResumeId", + schema: "cred", + table: "Clrs", + type: "int", + nullable: true); + + migrationBuilder.CreateIndex( + name: "IX_Clrs_SmartResumeId", + schema: "cred", + table: "Clrs", + column: "SmartResumeId", + unique: true, + filter: "[SmartResumeId] IS NOT NULL"); + + migrationBuilder.AddForeignKey( + name: "FK_Clrs_SmartResumes_SmartResumeId", + schema: "cred", + table: "Clrs", + column: "SmartResumeId", + principalSchema: "idatafy", + principalTable: "SmartResumes", + principalColumn: "Id", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/OpenCredentialPublisher.Data/Contexts/Migrations/WalletDbContextModelSnapshot.cs b/OpenCredentialPublisher.Data/Contexts/Migrations/WalletDbContextModelSnapshot.cs index 12f9c42..70722b2 100644 --- a/OpenCredentialPublisher.Data/Contexts/Migrations/WalletDbContextModelSnapshot.cs +++ b/OpenCredentialPublisher.Data/Contexts/Migrations/WalletDbContextModelSnapshot.cs @@ -2784,6 +2784,44 @@ namespace OpenCredentialPublisher.Data.Contexts.Migrations b.ToTable("HttpClientLogs"); }); + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("int") + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClrId") + .HasColumnType("int"); + + b.Property("CreatedAt") + .HasColumnType("datetime2"); + + b.Property("IsDeleted") + .HasColumnType("bit"); + + b.Property("IsReady") + .HasColumnType("bit"); + + b.Property("ModifiedAt") + .HasColumnType("datetime2"); + + b.Property("SmartResumeUrl") + .HasColumnType("nvarchar(max)"); + + b.Property("UserId") + .HasColumnType("nvarchar(450)"); + + b.HasKey("Id"); + + b.HasIndex("ClrId") + .IsUnique(); + + b.HasIndex("UserId"); + + b.ToTable("SmartResumes", "idatafy"); + }); + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.IdentityCertificateModel", b => { b.Property("Id") @@ -3659,9 +3697,11 @@ namespace OpenCredentialPublisher.Data.Contexts.Migrations modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ArtifactModel", b => { - b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", null) + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") .WithMany("Artifacts") .HasForeignKey("ClrId"); + + b.Navigation("Clr"); }); modelBuilder.Entity("OpenCredentialPublisher.Data.Models.AssertionModel", b => @@ -4260,6 +4300,23 @@ namespace OpenCredentialPublisher.Data.Contexts.Migrations b.Navigation("Verification"); }); + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", b => + { + b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") + .WithOne("SmartResume") + .HasForeignKey("OpenCredentialPublisher.Data.Models.Idatafy.SmartResume", "ClrId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("OpenCredentialPublisher.Data.Models.ApplicationUser", "User") + .WithMany() + .HasForeignKey("UserId"); + + b.Navigation("Clr"); + + b.Navigation("User"); + }); + modelBuilder.Entity("OpenCredentialPublisher.Data.Models.LinkModel", b => { b.HasOne("OpenCredentialPublisher.Data.Models.ClrModel", "Clr") @@ -4545,6 +4602,8 @@ namespace OpenCredentialPublisher.Data.Contexts.Migrations b.Navigation("ClrEndorsements"); b.Navigation("Links"); + + b.Navigation("SmartResume"); }); modelBuilder.Entity("OpenCredentialPublisher.Data.Models.ClrSetModel", b => diff --git a/OpenCredentialPublisher.Data/Contexts/WalletDbContext.cs b/OpenCredentialPublisher.Data/Contexts/WalletDbContext.cs index 156ce7c..573a48c 100644 --- a/OpenCredentialPublisher.Data/Contexts/WalletDbContext.cs +++ b/OpenCredentialPublisher.Data/Contexts/WalletDbContext.cs @@ -9,6 +9,7 @@ using OpenCredentialPublisher.Data.Models.Badgr; using OpenCredentialPublisher.Data.Models.ClrEntities; using OpenCredentialPublisher.Data.Models.ClrEntities.Relationships; using OpenCredentialPublisher.Data.Models.Enums; +using OpenCredentialPublisher.Data.Models.Idatafy; using System; using System.Collections.Generic; using System.Linq; @@ -116,7 +117,9 @@ namespace OpenCredentialPublisher.Data.Contexts public DbSet WalletRelationships { get; set; } - + #region Idatafy + public DbSet SmartResumes { get; set; } + #endregion #region Views public DbSet CredentialListViews { get; set; } @@ -124,6 +127,23 @@ namespace OpenCredentialPublisher.Data.Contexts public DbSet CredentialPackageArtifactView { get; set; } #endregion + private ValueComparer> StringValueComparer() => + new ValueComparer>((l, r) => l.SequenceEqual(r), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), + c => c.ToList()); + + private ValueComparer> SystemIdentifierDTypeValueComparer() => + new ValueComparer>((l, r) => l.SequenceEqual(r), + c => c.Aggregate(0, (a, v) => HashCode.Combine(a, JsonSerializer.Serialize(v, null).GetHashCode())), + c => c.ToList()); + + private ValueComparer> DictionaryValueComparer() => + new ValueComparer> + ( + (l, r) => JsonSerializer.Serialize(l, null) == JsonSerializer.Serialize(r, null), + v => v == null ? 0 : JsonSerializer.Serialize(v, null).GetHashCode(), + v => JsonSerializer.Deserialize>(JsonSerializer.Serialize(v, null), null) + ); protected override void OnModelCreating(ModelBuilder modelBuilder) { @@ -166,54 +186,80 @@ namespace OpenCredentialPublisher.Data.Contexts modelBuilder.Entity().ToTable("RubricCriterionLevelAlignments", schema: "cred"); #endregion + #region Idatafy + modelBuilder.Entity(sr => + { + sr.ToTable("SmartResumes", "idatafy"); + sr.HasQueryFilter(sr => !sr.Clr.IsDeleted); + }); + + modelBuilder.Entity() + .HasOne(clr => clr.SmartResume) + .WithOne(sr => sr.Clr) + .HasForeignKey(sr => sr.ClrId); + #endregion + modelBuilder.Entity() .Property(x => x.ScopesOffered) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); - var stringListValueComparer = new ValueComparer>( - (c1, c2) => c1.SequenceEqual(c2), - c => c.Aggregate(0, (a, v) => HashCode.Combine(a, v.GetHashCode())), - c => c.ToList()); - - var dictValueComparer = new ValueComparer> - ( - (l, r) => JsonSerializer.Serialize(l, null) == JsonSerializer.Serialize(r, null), - v => v == null ? 0 : JsonSerializer.Serialize(v, null).GetHashCode(), - v => JsonSerializer.Deserialize>(JsonSerializer.Serialize(v, null), null) - ); - modelBuilder .Entity() .Property(x => x.ScopesOffered) .Metadata - .SetValueComparer(stringListValueComparer); + .SetValueComparer(StringValueComparer()); modelBuilder.Entity() .Property(x => x.Scopes) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); + modelBuilder.Entity() + .Property(x => x.Scopes) + .Metadata + .SetValueComparer(StringValueComparer()); + modelBuilder.Entity() .Property(x => x.Tags) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); + modelBuilder.Entity() + .Property(x => x.Tags) + .Metadata + .SetValueComparer(StringValueComparer()); + modelBuilder.Entity() .Property(x => x.AllowedValues) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); + modelBuilder.Entity() + .Property(x => x.AllowedValues) + .Metadata + .SetValueComparer(StringValueComparer()); + modelBuilder.Entity() .Property(x => x.AllowedOrigins) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); + modelBuilder.Entity() + .Property(x => x.AllowedOrigins) + .Metadata + .SetValueComparer(StringValueComparer()); + modelBuilder.Entity() .Property(x => x.StartsWith) .HasConversion(v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null)); + modelBuilder.Entity() + .Property(x => x.StartsWith) + .Metadata + .SetValueComparer(StringValueComparer()); + #region AdditionalProperties modelBuilder.Entity() .Property(b => b.AdditionalProperties) @@ -222,6 +268,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.Identifiers) .HasConversion( @@ -229,6 +281,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(b => b.Identifiers) + .Metadata + .SetValueComparer(SystemIdentifierDTypeValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -236,6 +294,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -243,6 +307,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -250,6 +320,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -257,6 +333,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -264,6 +346,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -271,6 +359,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -278,6 +372,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -285,6 +385,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -292,6 +398,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -299,6 +411,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.PublicKey) .HasConversion( @@ -306,6 +424,8 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize(v, null) ); + // add converter + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -313,6 +433,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.Identifiers) .HasConversion( @@ -320,13 +446,26 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); - modelBuilder.Entity() + modelBuilder + .Entity() + .Property(b => b.Identifiers) + .Metadata + .SetValueComparer(SystemIdentifierDTypeValueComparer()); + // add list converter + + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(b => b.AdditionalProperties) .HasConversion( @@ -338,7 +477,7 @@ namespace OpenCredentialPublisher.Data.Contexts .Entity() .Property(x => x.AdditionalProperties) .Metadata - .SetValueComparer(dictValueComparer); + .SetValueComparer(DictionaryValueComparer()); modelBuilder.Entity() .Property(x => x.SignedEndorsements) @@ -347,6 +486,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.SignedEndorsements) + .Metadata + .SetValueComparer(StringValueComparer()); + modelBuilder.Entity() .Property(x => x.AdditionalProperties) .HasConversion( @@ -354,6 +499,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); + modelBuilder.Entity() .Property(x => x.AdditionalProperties) .HasConversion( @@ -361,19 +512,11 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Deserialize>(v, null) ); - modelBuilder.Entity() - .Property(x => x.SignedEndorsements) - .HasConversion( - v => JsonSerializer.Serialize(v, null), - v => JsonSerializer.Deserialize>(v, null) - ); - - modelBuilder.Entity() + modelBuilder + .Entity() .Property(x => x.AdditionalProperties) - .HasConversion( - v => JsonSerializer.Serialize(v, null), - v => JsonSerializer.Deserialize>(v, null) - ); + .Metadata + .SetValueComparer(DictionaryValueComparer()); modelBuilder.Entity() .Property(x => x.AdditionalProperties) @@ -381,6 +524,12 @@ namespace OpenCredentialPublisher.Data.Contexts v => JsonSerializer.Serialize(v, null), v => JsonSerializer.Deserialize>(v, null) ); + + modelBuilder + .Entity() + .Property(x => x.AdditionalProperties) + .Metadata + .SetValueComparer(DictionaryValueComparer()); #endregion modelBuilder.Entity() @@ -389,12 +538,6 @@ namespace OpenCredentialPublisher.Data.Contexts .HasForeignKey(pt => pt.ParentAssertionId) .OnDelete(DeleteBehavior.Restrict); - modelBuilder - .Entity() - .Property(x => x.Scopes) - .Metadata - .SetValueComparer(stringListValueComparer); - modelBuilder.Entity() .HasMany(clrModel => clrModel.Links) .WithOne(linkModel => linkModel.Clr) @@ -547,18 +690,6 @@ namespace OpenCredentialPublisher.Data.Contexts .HasForeignKey(pkg => pkg.AuthorizationForeignKey) .OnDelete(DeleteBehavior.SetNull); - modelBuilder.Entity() - .HasOne(pr => pr.ProofResponse) - .WithOne(pr => pr.ProofRequest) - .HasForeignKey(pr => pr.ProofRequestId) - .OnDelete(DeleteBehavior.NoAction); - - modelBuilder.Entity() - .HasOne(pr => pr.CredentialSchema) - .WithMany() - .HasForeignKey(pr => pr.CredentialSchemaId) - .OnDelete(DeleteBehavior.NoAction); - modelBuilder.Entity() .HasOne(sourceModel => sourceModel.DiscoveryDocument) .WithOne(documentModel => documentModel.Source) @@ -703,27 +834,46 @@ namespace OpenCredentialPublisher.Data.Contexts .Property(w => w.CredentialRequestStep) .HasConversion(); - modelBuilder.Entity() - .HasOne(ac => ac.ProvisioningToken).WithOne(pt => pt.AgentContext) - .HasForeignKey(pt => pt.AgentContextId); - - modelBuilder.Entity() - .Property(s => s.Id) - .HasConversion(); - - modelBuilder.Entity() - .HasData(Enum.GetValues(typeof(ProofRequestStepEnum)).Cast().Select(s => new ProofRequestStep { Id = s, Name = s.ToString() })); + modelBuilder.Entity(acm => + { + acm.HasOne(ac => ac.ProvisioningToken).WithOne(pt => pt.AgentContext) + .HasForeignKey(pt => pt.AgentContextId); + acm.HasQueryFilter(x => !x.IsDeleted); + }); - modelBuilder.Entity() - .Property(w => w.StepId) - .HasConversion(); + modelBuilder.Entity(prs => + { + prs.Property(s => s.Id) + .HasConversion(); + prs.HasData( + Enum.GetValues(typeof(ProofRequestStepEnum)) + .Cast() + .Select(s => new ProofRequestStep { Id = s, Name = s.ToString() })); + }); - modelBuilder.Entity() - .HasOne(pr => pr.User) - .WithMany() - .HasForeignKey(c => c.UserId) - .OnDelete(DeleteBehavior.NoAction) - .IsRequired(false); + modelBuilder.Entity(pr => + { + pr.HasOne(pr => pr.ProofResponse) + .WithOne(pr => pr.ProofRequest) + .HasForeignKey(pr => pr.ProofRequestId) + .OnDelete(DeleteBehavior.NoAction); + + pr.HasOne(pr => pr.CredentialSchema) + .WithMany() + .HasForeignKey(pr => pr.CredentialSchemaId) + .OnDelete(DeleteBehavior.NoAction); + + pr.Property(w => w.StepId) + .HasConversion(); + + pr.HasOne(pr => pr.User) + .WithMany() + .HasForeignKey(c => c.UserId) + .OnDelete(DeleteBehavior.NoAction) + .IsRequired(false); + + pr.HasQueryFilter(x => !x.IsDeleted); + }); modelBuilder.Entity() .Property(w => w.FlowTypeId) @@ -732,9 +882,14 @@ namespace OpenCredentialPublisher.Data.Contexts // IsDeleted Filters, use .IgnoreQueryFilters() to include deleted items // IsDeleted Filters, use .IgnoreQueryFilters() to include deleted items modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); + modelBuilder.Entity().HasQueryFilter(x => !x.Source.IsDeleted); + modelBuilder.Entity().HasQueryFilter(x => !x.Source.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); + modelBuilder.Entity().HasQueryFilter(x => !x.Clr.IsDeleted); + modelBuilder.Entity().HasQueryFilter(x => !x.Clr.IsDeleted); + modelBuilder.Entity().HasQueryFilter(x => !x.Clr.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); @@ -746,11 +901,9 @@ namespace OpenCredentialPublisher.Data.Contexts modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); - modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); - modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); modelBuilder.Entity().HasQueryFilter(x => !x.IsDeleted); diff --git a/OpenCredentialPublisher.Data/Dtos/Idatafy/SmartResumePost.cs b/OpenCredentialPublisher.Data/Dtos/Idatafy/SmartResumePost.cs new file mode 100644 index 0000000..8108bc2 --- /dev/null +++ b/OpenCredentialPublisher.Data/Dtos/Idatafy/SmartResumePost.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.Json.Serialization; +using System.Threading.Tasks; + +namespace OpenCredentialPublisher.Data.Dtos.Idatafy +{ + public class SmartResumePost + { + [JsonPropertyName("packageId")] + public int PackageId { get; set; } + [JsonPropertyName("clrId")] + public int ClrId { get; set; } + } +} diff --git a/OpenCredentialPublisher.Data/Models/ClrEntities/ClrModel.cs b/OpenCredentialPublisher.Data/Models/ClrEntities/ClrModel.cs index ea8cec2..aa906f1 100644 --- a/OpenCredentialPublisher.Data/Models/ClrEntities/ClrModel.cs +++ b/OpenCredentialPublisher.Data/Models/ClrEntities/ClrModel.cs @@ -1,6 +1,7 @@ using OpenCredentialPublisher.ClrLibrary.Models; using OpenCredentialPublisher.Data.Models.ClrEntities; using OpenCredentialPublisher.Data.Models.ClrEntities.Relationships; +using OpenCredentialPublisher.Data.Models.Idatafy; using System; using System.Collections.Generic; using System.ComponentModel; @@ -181,6 +182,8 @@ namespace OpenCredentialPublisher.Data.Models public int PublisherId { get; set; } public int? VerificationId { get; set; } + public SmartResume SmartResume { get; set; } + //Relationships public List Links { get; set; } [ForeignKey("CredentialPackageId")] diff --git a/OpenCredentialPublisher.Data/Models/Idatafy/SmartResume.cs b/OpenCredentialPublisher.Data/Models/Idatafy/SmartResume.cs new file mode 100644 index 0000000..6e8ee78 --- /dev/null +++ b/OpenCredentialPublisher.Data/Models/Idatafy/SmartResume.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OpenCredentialPublisher.Data.Models.Idatafy +{ + public class SmartResume: IBaseEntity + { + [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] + public int Id { get; set; } + public string UserId { get; set; } + + public int ClrId { get; set; } + public string SmartResumeUrl { get; set; } + + public bool IsReady { get; set; } + + + [ForeignKey("UserId")] + public ApplicationUser User { get; set; } + public ClrModel Clr { get; set; } + + public bool IsDeleted { get; set; } + public DateTime CreatedAt { get; set; } + public DateTime ModifiedAt { get; set; } + + public void Delete() + { + this.IsDeleted = true; + this.ModifiedAt = DateTime.UtcNow; + } + } +} diff --git a/OpenCredentialPublisher.Data/Options/IdatafyOptions.cs b/OpenCredentialPublisher.Data/Options/IdatafyOptions.cs new file mode 100644 index 0000000..32d9075 --- /dev/null +++ b/OpenCredentialPublisher.Data/Options/IdatafyOptions.cs @@ -0,0 +1,14 @@ +namespace OpenCredentialPublisher.Data.Options +{ + public class IdatafyOptions + { + public const string Section = "Idatafy"; + public string Username { get; set; } + public string Password { get; set; } + public string Server { get; set; } + public string DropFolder { get; set; } + public int Port { get; set; } + public string SmartResumeUrl { get; set; } + public bool UseUserEmail { get; set; } + } +} diff --git a/OpenCredentialPublisher.Data/Options/SiteSettingsOptions.cs b/OpenCredentialPublisher.Data/Options/SiteSettingsOptions.cs index 1aa9860..2e96f0e 100644 --- a/OpenCredentialPublisher.Data/Options/SiteSettingsOptions.cs +++ b/OpenCredentialPublisher.Data/Options/SiteSettingsOptions.cs @@ -15,6 +15,7 @@ namespace OpenCredentialPublisher.Data.Options public bool EnableSource { get; set; } public bool EnableCollections { get; set; } + public bool EnableSmartResume { get; set; } public int SessionTimeout { get; set; } public string SiteName { get; set; } diff --git a/OpenCredentialPublisher.Data/ViewModels/nG/ApiBadRequestResponse.cs b/OpenCredentialPublisher.Data/ViewModels/nG/ApiBadRequestResponse.cs index e0c2935..a47666f 100644 --- a/OpenCredentialPublisher.Data/ViewModels/nG/ApiBadRequestResponse.cs +++ b/OpenCredentialPublisher.Data/ViewModels/nG/ApiBadRequestResponse.cs @@ -22,5 +22,12 @@ namespace OpenCredentialPublisher.Data.ViewModels.nG Errors = modelState.SelectMany(x => x.Value.Errors) .Select(x => x.ErrorMessage).ToArray(); } + + public ApiBadRequestResponse(String error) + : base(400) + { + + Errors = new List { error }; + } } } diff --git a/OpenCredentialPublisher.Data/ViewModels/nG/ClrSimplified/ClrVM.cs b/OpenCredentialPublisher.Data/ViewModels/nG/ClrSimplified/ClrVM.cs index 3789bd4..a593aed 100644 --- a/OpenCredentialPublisher.Data/ViewModels/nG/ClrSimplified/ClrVM.cs +++ b/OpenCredentialPublisher.Data/ViewModels/nG/ClrSimplified/ClrVM.cs @@ -21,6 +21,9 @@ namespace OpenCredentialPublisher.Data.ViewModels.nG.ClrSimplified public List AchievementIds { get; set; } public ProfileVM Learner { get; set; } public ProfileVM Publisher { get; set; } + public bool HasSmartResume { get; set; } + public bool EnableSmartResume { get; set; } + public string SmartResumeUrl { get; set; } public static ClrVM FromModel(ClrModel clr, List achievementIds = null) { @@ -39,7 +42,9 @@ namespace OpenCredentialPublisher.Data.ViewModels.nG.ClrSimplified Identifier = clr.Id, AchievementIds = achievementIds ?? new List(), Learner = ProfileVM.FromModel(clr.Learner), - Publisher = ProfileVM.FromModel(clr.Publisher) + Publisher = ProfileVM.FromModel(clr.Publisher), + HasSmartResume = clr?.SmartResume != null && clr.SmartResume.IsReady, + SmartResumeUrl = clr?.SmartResume?.SmartResumeUrl, }; } } diff --git a/OpenCredentialPublisher.DependencyInjection/RegisterServices.cs b/OpenCredentialPublisher.DependencyInjection/RegisterServices.cs index fb31dde..73de2c3 100644 --- a/OpenCredentialPublisher.DependencyInjection/RegisterServices.cs +++ b/OpenCredentialPublisher.DependencyInjection/RegisterServices.cs @@ -38,6 +38,8 @@ namespace OpenCredentialPublisher.DependencyInjection services.AddTransient(); services.AddTransient(); services.AddTransient(); + services.AddTransient(); + services.AddTransient(); return services; } diff --git a/OpenCredentialPublisher.ObcLibrary/src/OAuth/RegistrationRequest.cs b/OpenCredentialPublisher.ObcLibrary/src/OAuth/RegistrationRequest.cs index 20e4f65..387edf5 100644 --- a/OpenCredentialPublisher.ObcLibrary/src/OAuth/RegistrationRequest.cs +++ b/OpenCredentialPublisher.ObcLibrary/src/OAuth/RegistrationRequest.cs @@ -1,4 +1,4 @@ -using System.Collections.Generic; +using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Text.Json; using System.Text.Json.Serialization; @@ -29,6 +29,9 @@ namespace ObcLibrary.OAuth [JsonPropertyName("logo_uri")] public string LogoUri { get; set; } + [JsonPropertyName("image")] + public string Image => LogoUri; + /// /// URL string that points to a human-readable terms of service /// document for the client that describes a contractual relationship diff --git a/OpenCredentialPublisher.Services/Implementations/CredentialPackageService.cs b/OpenCredentialPublisher.Services/Implementations/CredentialPackageService.cs index 0a372b3..4d839ef 100644 --- a/OpenCredentialPublisher.Services/Implementations/CredentialPackageService.cs +++ b/OpenCredentialPublisher.Services/Implementations/CredentialPackageService.cs @@ -69,50 +69,57 @@ namespace OpenCredentialPublisher.Services.Implementations return await _context.CredentialPackages.AsNoTracking().FirstOrDefaultAsync(cp => cp.Id == id && cp.UserId == userId); } - public async Task GetCredentialPackageViewModelAsync(CredentialPackageModel model) + public CredentialPackageViewModel GetCredentialPackageViewModel(CredentialPackageModel model) { + GetCredentialPackageModel(ref model); + return CredentialPackageViewModel.FromCredentialPackageModel(model); + } + + public void GetCredentialPackageModel(ref CredentialPackageModel model, bool includeSource = true, bool includeDeleted = false) + { + var packageId = model.Id; + var query = _context.CredentialPackages.AsNoTracking(); + if (includeDeleted) + query = query.IgnoreQueryFilters(); + if (model.TypeId == PackageTypeEnum.Clr) { - model = await _context.CredentialPackages.AsNoTracking() - .Include(cp => cp.Clr).FirstOrDefaultAsync(cp => cp.Id == model.Id); + model = query + .Include(cp => cp.Clr).FirstOrDefault(cp => cp.Id == packageId); } else if (model.TypeId == PackageTypeEnum.ClrSet) { - model = await _context.CredentialPackages.AsNoTracking() + model = query .Include(cp => cp.ClrSet) .ThenInclude(clrs => clrs.Clrs) - .FirstOrDefaultAsync(cp => cp.Id == model.Id); + .FirstOrDefault(cp => cp.Id == packageId); } else if (model.TypeId == PackageTypeEnum.VerifiableCredential) { - model = await _context.CredentialPackages.AsNoTracking() + model = query .Include(cp => cp.VerifiableCredential) .ThenInclude(vc => vc.ClrSets) .ThenInclude(clrSets => clrSets.Clrs) .Include(cp => cp.VerifiableCredential) .ThenInclude(vc => vc.Clrs) - .FirstOrDefaultAsync(cp => cp.Id == model.Id); - } - else if (model.TypeId == PackageTypeEnum.OpenBadge) - { - model = await _context.CredentialPackages.AsNoTracking() - .Include(cp => cp.BadgrBackpack) - .ThenInclude(bdgr => bdgr.BadgrAssertions) - .Include(cp => cp.Authorization) - .ThenInclude(au => au.Source) - .FirstOrDefaultAsync(cp => cp.Id == model.Id); + .FirstOrDefault(cp => cp.Id == packageId); } - else if (model.TypeId == PackageTypeEnum.OpenBadgeConnect) + else if (model.TypeId == PackageTypeEnum.OpenBadge || model.TypeId == PackageTypeEnum.OpenBadgeConnect) { - model = await _context.CredentialPackages.AsNoTracking() - .Include(cp => cp.BadgrBackpack) - .ThenInclude(bdgr => bdgr.BadgrAssertions) - .Include(cp => cp.Authorization) - .ThenInclude(au => au.Source) - .FirstOrDefaultAsync(cp => cp.Id == model.Id); - } + var badgeQuery = query + .Include(cp => cp.BadgrBackpack) + .ThenInclude(bdgr => bdgr.BadgrAssertions) + .Include(cp => cp.Authorization); - return CredentialPackageViewModel.FromCredentialPackageModel(model); + if (includeSource) + { + model = badgeQuery.ThenInclude(au => au.Source).FirstOrDefault(cp => cp.Id == packageId); + } + else + { + model = badgeQuery.FirstOrDefault(cp => cp.Id == packageId); + } + } } public async Task<(bool revoked, string revocationReason)> CheckRevocationAsync(CredentialPackageModel package) diff --git a/OpenCredentialPublisher.Services/Implementations/CredentialService.cs b/OpenCredentialPublisher.Services/Implementations/CredentialService.cs index 1032bf8..5228d0e 100644 --- a/OpenCredentialPublisher.Services/Implementations/CredentialService.cs +++ b/OpenCredentialPublisher.Services/Implementations/CredentialService.cs @@ -225,6 +225,7 @@ namespace OpenCredentialPublisher.Services.Implementations var clr = await _context.Clrs.AsNoTracking() .Include(c => c.Learner) .Include(c => c.Publisher) + .Include(c => c.SmartResume) .Include(c => c.ClrAchievements) .ThenInclude(c => c.Achievement) .Where(clr => clr.ClrId == id) @@ -303,10 +304,16 @@ namespace OpenCredentialPublisher.Services.Implementations } - public async Task GetClrForVerificationAsync(int id) + public async Task GetClrForDeletionAsync(int id) { - return await _context.Clrs.AsNoTracking() - + return await _context.Clrs.AsNoTracking().IgnoreQueryFilters() + .Include(c => c.SmartResume) + .Include(c => c.Artifacts) + .ThenInclude(a => a.EvidenceArtifact) + .Include(a => a.ClrAssertions) + .ThenInclude(ca => ca.Assertion) + .ThenInclude(a => a.AssertionEvidences) + .ThenInclude(e => e.Evidence) .Include(a => a.ClrAssertions) .ThenInclude(ca => ca.Assertion) .ThenInclude(a => a.Results) @@ -318,9 +325,7 @@ namespace OpenCredentialPublisher.Services.Implementations .ThenInclude(ca => ca.Assertion) .ThenInclude(a => a.Achievement) .ThenInclude(aa => aa.Issuer) - .Include(x => x.CredentialPackage) .Include(x => x.Authorization) - .ThenInclude(x => x.Source) .Include(x => x.Verification) //All Endorsements .Include(c => c.Learner) diff --git a/OpenCredentialPublisher.Services/Implementations/DownloadService.cs b/OpenCredentialPublisher.Services/Implementations/DownloadService.cs index 551f18b..6e195fc 100644 --- a/OpenCredentialPublisher.Services/Implementations/DownloadService.cs +++ b/OpenCredentialPublisher.Services/Implementations/DownloadService.cs @@ -104,6 +104,7 @@ namespace OpenCredentialPublisher.Services.Implementations .FirstOrDefaultAsync(); link.ModifiedAt = DateTime.UtcNow; + link.RequiresAccessKey = true; await _linkService.AddShareAsync(shareModel); await _linkService.UpdateAsync(link); diff --git a/OpenCredentialPublisher.Services/Implementations/ForgetMeService.cs b/OpenCredentialPublisher.Services/Implementations/ForgetMeService.cs new file mode 100644 index 0000000..2ae9649 --- /dev/null +++ b/OpenCredentialPublisher.Services/Implementations/ForgetMeService.cs @@ -0,0 +1,136 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using OpenCredentialPublisher.Data.Contexts; +using OpenCredentialPublisher.Data.Models; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Cryptography; +using System.Text; +using System.Text.Json; +using System.Threading.Tasks; + +namespace OpenCredentialPublisher.Services.Implementations +{ + public class ForgetMeService + { + private readonly WalletDbContext _walletContext; + private readonly CredentialPackageService _credentialPackageService; + private readonly CredentialService _credentialService; + private readonly ILogger _logger; + public ForgetMeService(WalletDbContext walletContext, CredentialPackageService credentialPackageService, CredentialService credentialService, ILogger logger) + { + _credentialPackageService = credentialPackageService; + _credentialService = credentialService; + _walletContext = walletContext; + _logger = logger; + } + + + public async Task ForgetUser(string userId) + { + try + { + var revocations = _walletContext.Revocations.IgnoreQueryFilters().Where(r => r.UserId == userId); + _walletContext.RemoveRange(revocations); + + var connections = _walletContext.ConnectionRequests.IgnoreQueryFilters().Where(cr => cr.UserId == userId); + _walletContext.RemoveRange(connections); + + var loginProofRequests = _walletContext.LoginProofRequests.IgnoreQueryFilters().Where(pr => pr.UserId == userId); + _walletContext.RemoveRange(loginProofRequests); + + var proofRequests = _walletContext.ProofRequests.IgnoreQueryFilters() + .Include(pr => pr.Messages) + .Where(pr => pr.UserId == userId); + _walletContext.RemoveRange(proofRequests); + + var emailVerifications = _walletContext.EmailVerifications.IgnoreQueryFilters() + .Include(ev => ev.Message) + .Where(ev => ev.UserId == userId); + _walletContext.RemoveRange(emailVerifications); + + var smartResumes = _walletContext.SmartResumes.IgnoreQueryFilters().Where(sr => sr.UserId == userId); + _walletContext.RemoveRange(smartResumes); + + var links = _walletContext.Links + .Include(l => l.Shares) + .ThenInclude(s => s.Messages) + .Where(l => l.UserId == userId); + + _walletContext.RemoveRange(links); + + var recipients = _walletContext.Recipients.IgnoreQueryFilters().Where(r => r.UserId == userId); + _walletContext.RemoveRange(recipients); + + var credentialRequests = _walletContext.CredentialRequests.IgnoreQueryFilters().Where(cr => cr.UserId == userId); + _walletContext.RemoveRange(credentialRequests); + + var wallets = _walletContext.WalletRelationships.IgnoreQueryFilters().Where(wr => wr.UserId == userId); + _walletContext.RemoveRange(wallets); + + await _walletContext.SaveChangesAsync(); + _walletContext.ChangeTracker.Clear(); + } + catch (Exception ex) + { + _logger.LogError(ex, "There was a problem deleting part of your profile."); + } + + try + { + + var credentialPackages = await _credentialService.GetAllShallow(userId).ToListAsync(); + for (var p = 0; p < credentialPackages.Count; p++) + { + var package = credentialPackages[p]; + _credentialPackageService.GetCredentialPackageModel(ref package, false, true); + if (package.TypeId == Data.Models.Enums.PackageTypeEnum.OpenBadgeConnect || package.TypeId == Data.Models.Enums.PackageTypeEnum.OpenBadge) + { + var backpack = await _credentialService.GetBackpackPackageAsync(userId, package.Id); + package.BadgrBackpack = backpack.BadgrBackpack; + } + else if (package.TypeId == Data.Models.Enums.PackageTypeEnum.Clr) + { + package.Clr = await _credentialService.GetClrForDeletionAsync(package.Clr.ClrId); + + } + else if (package.TypeId == Data.Models.Enums.PackageTypeEnum.ClrSet) + { + for (var i = 0; i < package.ClrSet.Clrs.Count; i++) + { + package.ClrSet.Clrs[i] = await _credentialService.GetClrForDeletionAsync(package.ClrSet.Clrs[i].ClrId); + } + } + else if (package.TypeId == Data.Models.Enums.PackageTypeEnum.VerifiableCredential) + { + if (package.VerifiableCredential?.Clrs?.Any() == true) + { + for (var i = 0; i < package.VerifiableCredential.Clrs.Count; i++) + { + package.VerifiableCredential.Clrs[i] = await _credentialService.GetClrForDeletionAsync(package.VerifiableCredential.Clrs[i].ClrId); + } + } + else if (package.VerifiableCredential?.ClrSets?.Any() == true) + { + foreach (var clrSet in package.VerifiableCredential.ClrSets) + { + for (var i = 0; i < clrSet.Clrs.Count; i++) + { + clrSet.Clrs[i] = await _credentialService.GetClrForDeletionAsync(clrSet.Clrs[i].ClrId); + } + } + } + } + _walletContext.Remove(package); + await _walletContext.SaveChangesAsync(); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "There was a problem deleting your package."); + } + + } + } +} diff --git a/OpenCredentialPublisher.Services/Implementations/IdatafyService.cs b/OpenCredentialPublisher.Services/Implementations/IdatafyService.cs new file mode 100644 index 0000000..adc02d2 --- /dev/null +++ b/OpenCredentialPublisher.Services/Implementations/IdatafyService.cs @@ -0,0 +1,98 @@ +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using Newtonsoft.Json; +using OpenCredentialPublisher.ClrLibrary.Models; +using OpenCredentialPublisher.Data.Contexts; +using OpenCredentialPublisher.Data.Models.Idatafy; +using OpenCredentialPublisher.Data.Options; +using Renci.SshNet; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace OpenCredentialPublisher.Services.Implementations +{ + public class IdatafyService + { + private readonly CredentialPackageService _credentialPackageService; + private readonly CredentialService _credentialService; + private readonly WalletDbContext _context; + private readonly IdatafyOptions _idatafyOptions; + private readonly ILogger _logger; + public IdatafyService(CredentialPackageService credentialPackageService + , CredentialService credentialService + , WalletDbContext context + , IOptions idatafyOptions + , ILogger logger) + { + _credentialPackageService = credentialPackageService; + _credentialService = credentialService; + _context = context; + _idatafyOptions = idatafyOptions?.Value ?? throw new Exception("You must specify IdatafyOptions if loading this service."); + _logger = logger; + } + + + public async Task SendSmartResumeAsync(string userId, int packageId, int clrId) + { + try + { + var clr = await _credentialService.GetClrAsync(userId, clrId); + if (clr == null) + { + throw new Exception($"The CLR with id {clrId} could not be found."); + } + + var clrDType = JsonConvert.DeserializeObject(clr.Json); + if (_idatafyOptions.UseUserEmail) + { + var user = await _context.Users.AsNoTracking().FirstOrDefaultAsync(u => u.Id == userId); + clrDType.Learner.Email = user.Email; + } + var jsonFile = clrDType.ToJson(); + + var sftp = new SftpClient(_idatafyOptions.Server + , _idatafyOptions.Port + , _idatafyOptions.Username + , _idatafyOptions.Password); + + sftp.Connect(); + + sftp.ChangeDirectory(_idatafyOptions.DropFolder); + + using (var stream = new MemoryStream(UTF8Encoding.UTF8.GetBytes(jsonFile))) + { + sftp.UploadFile(stream, $"{userId}-{clrId}-{DateTime.UtcNow.Ticks}.json"); + } + + var smartResume = new SmartResume + { + UserId = userId, + ClrId = clrId, + IsReady = true, + CreatedAt = DateTime.UtcNow, + SmartResumeUrl = _idatafyOptions.SmartResumeUrl + }; + + clr.SmartResume = smartResume; + + await _context.SmartResumes.AddAsync(smartResume); + await _context.SaveChangesAsync(); + + return _idatafyOptions.SmartResumeUrl; + } + catch (Exception ex) + { + _logger.LogError(ex, userId, packageId, clrId); + throw; + } + + } + + + } +} diff --git a/OpenCredentialPublisher.Services/Implementations/ProfileImageService.cs b/OpenCredentialPublisher.Services/Implementations/ProfileImageService.cs index 8739105..cac7ede 100644 --- a/OpenCredentialPublisher.Services/Implementations/ProfileImageService.cs +++ b/OpenCredentialPublisher.Services/Implementations/ProfileImageService.cs @@ -1,5 +1,6 @@ using Azure.Storage.Blobs; using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using OpenCredentialPublisher.Data.Models; using OpenCredentialPublisher.Data.Options; @@ -14,10 +15,12 @@ namespace OpenCredentialPublisher.Services.Implementations public class ProfileImageService { private const string BlobContainerName = "ocp-profile-images"; + private readonly ILogger _logger; private readonly UserManager _userManager; private readonly PublicBlobOptions _publicBlobOptions; - public ProfileImageService(UserManager userManager, IOptions publicBlobOptions) + public ProfileImageService(UserManager userManager, IOptions publicBlobOptions, ILogger logger) { + _logger = logger; _userManager = userManager; _publicBlobOptions = publicBlobOptions?.Value; } @@ -30,6 +33,11 @@ namespace OpenCredentialPublisher.Services.Implementations await container.SetAccessPolicyAsync(Azure.Storage.Blobs.Models.PublicAccessType.Blob); } + var user = await _userManager.FindByIdAsync(userId); + if (!string.IsNullOrWhiteSpace(user.ProfileImageUrl)) + { + await DeleteImageFromBlobAsync(user.ProfileImageUrl); + } if (!string.IsNullOrWhiteSpace(extension) && !extension.StartsWith('.')) extension = extension.Insert(0, "."); @@ -48,7 +56,7 @@ namespace OpenCredentialPublisher.Services.Implementations await blob.UploadAsync(ms); } - var user = await _userManager.FindByIdAsync(userId); + user.ProfileImageUrl = location; var result = await _userManager.UpdateAsync(user); if (result.Succeeded) @@ -57,5 +65,26 @@ namespace OpenCredentialPublisher.Services.Implementations } throw new Exception("There was a problem saving your profile image to your account."); } + + public async Task DeleteImageFromBlobAsync(string filename) + { + var container = new BlobContainerClient(_publicBlobOptions.StorageConnectionString, BlobContainerName); + if (!(await container.ExistsAsync())) + { + await container.CreateIfNotExistsAsync(); + await container.SetAccessPolicyAsync(Azure.Storage.Blobs.Models.PublicAccessType.Blob); + } + try + { + + BlobClient blob = container.GetBlobClient(filename); + return await blob.DeleteIfExistsAsync(); + } + catch (Exception ex) + { + _logger.LogError(ex, $"There was a problem deleting {filename} from {BlobContainerName}"); + } + return false; + } } } diff --git a/OpenCredentialPublisher.Services/OpenCredentialPublisher.Services.csproj b/OpenCredentialPublisher.Services/OpenCredentialPublisher.Services.csproj index ca376e8..06d1e52 100644 --- a/OpenCredentialPublisher.Services/OpenCredentialPublisher.Services.csproj +++ b/OpenCredentialPublisher.Services/OpenCredentialPublisher.Services.csproj @@ -21,6 +21,7 @@ + diff --git a/OpenCredentialPublisher.VerityFunctionApp/Startup.cs b/OpenCredentialPublisher.VerityFunctionApp/Startup.cs index 1eec7eb..baa141f 100644 --- a/OpenCredentialPublisher.VerityFunctionApp/Startup.cs +++ b/OpenCredentialPublisher.VerityFunctionApp/Startup.cs @@ -65,6 +65,7 @@ namespace OpenCredentialPublisher.VerityFunctionApp //services.Configure((o) => new HostSettings()); services.Configure(config.GetSection(AzureBlobOptions.Section)); + services.Configure(config.GetSection(PublicBlobOptions.Section)); var verityConfig = config.GetSection(VerityOptions.Section); services.Configure(verityConfig); diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/app.component.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/app.component.ts index c95de85..f0c443c 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/app.component.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/app.component.ts @@ -1,4 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Event as NavigationEvent, NavigationStart, Router } from '@angular/router'; import { AppService } from '@core/services/app.service'; import { environment } from '@environment/environment'; import { Idle } from '@ng-idle/core'; @@ -18,6 +19,9 @@ export class AppComponent implements OnInit, OnDestroy { envName = environment.name; + + private currentUrl: string; + private navigationEvents$; private debug = environment.debug; constructor( public appService: AppService @@ -25,8 +29,16 @@ export class AppComponent implements OnInit, OnDestroy { , private loginService: LoginService , private timeoutService: TimeoutService , private authService: AuthService + , private router: Router ) { - + this.navigationEvents$ = this.router.events + .subscribe( + (event: NavigationEvent) => { + if(event instanceof NavigationStart) { + this.currentUrl = event.url; + if (this.debug) console.log(this.currentUrl); + } + }); } ngOnInit() { @@ -38,9 +50,15 @@ export class AppComponent implements OnInit, OnDestroy { this.loginService.signOut("Your session timed out, please login again."); }); - this.authService.checkLogin(); - this.authService.clearStaleStorage(); - + this.authService.clearStaleStorage(); + + this.authService.silentRenewError.pipe(untilDestroyed(this)).subscribe(ev => { + if (this.debug) { + console.log(`Current url is ${this.currentUrl} and silent renew error is ${ev}`); + } + }) + this.authService.checkLogin(); + this.authService.signIn(); // if (environment.debug) console.log('AppComponent ngOnInit'); // this.loginService.checkAuthIncludingServer().subscribe((result) => { @@ -77,7 +95,7 @@ export class AppComponent implements OnInit, OnDestroy { } ngOnDestroy() { - + this.navigationEvents$.unsubscribe(); } getData():any { diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/auth.service.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/auth.service.ts index 9c52ddb..76c2aba 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/auth.service.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/auth.service.ts @@ -80,10 +80,16 @@ export class AuthService { if (environment.debug) console.log("User is logged in: ", this._user); return new Observable((obs) => { if (this._user) { - if (this._user.expired) { + if (this._user?.expired) { if (environment.debug) console.log("User expired, refreshing login"); - this.getUser().then(() => obs.next(!this._user.expired)); + this.getUser().then(() => { + let loggedIn = !(this._user == null || this._user.expired); + if (!loggedIn) { + this.stopSilentRenew(); + } + obs.next(loggedIn); + }); } else { obs.next(!this._user.expired); @@ -105,33 +111,52 @@ export class AuthService { } checkLogin(): Promise { + if (this._user?.expired === false) + { + this.startSilentRenew(); + return Promise.resolve(true); + } + else if (this._user?.expired) { + return this.signIn(); + } + return Promise.resolve(false); + } + + signIn(): Promise { return this._userManager.signinSilent().then((user) => { this._user = user; - if (!this._silientRenewStarted) { - this._userManager.startSilentRenew(); - this._silientRenewStarted = true; - } + this.startSilentRenew(); return true; }, (reason) => { if (environment.debug) console.log("Not logged in: ", reason); - if (this._silientRenewStarted) { - this._userManager.stopSilentRenew(); - this._silientRenewStarted = false; - } - localStorage.clear(); + this.stopSilentRenew(); + this.clearLocalStorage(); return false; }); } + clearLocalStorage() { + let keysToRemove: string[] = []; + for(let i = 0; i < localStorage.length; i++) { + let key = localStorage.key(i); + if (key != 'originalReturnUrl') + keysToRemove.push(key); + } + + keysToRemove.forEach(k => { + if (environment.debug) { + console.log("Removing: ", k); + } + localStorage.removeItem(k); + }); + } + clearStaleStorage() { this._userManager.clearStaleState(); } logout(): Promise { - if (this._silientRenewStarted) { - this._userManager.stopSilentRenew(); - this._silientRenewStarted = false; - } + this.stopSilentRenew(); return this._userManager.revokeAccessToken().then(() => { return this._userManager.removeUser().then(() => { this._user = null; @@ -139,6 +164,20 @@ export class AuthService { }); } + private startSilentRenew() { + if (!this._silientRenewStarted) { + this._userManager.startSilentRenew(); + this._silientRenewStarted = true; + } + } + + private stopSilentRenew() { + if (this._silientRenewStarted) { + this._userManager.stopSilentRenew(); + this._silientRenewStarted = false; + } + } + private getUser() { return this._userManager.getUser().then((user) => { this._user = user; diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/login.service.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/login.service.ts index cecd2b8..12d314a 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/login.service.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/auth/login.service.ts @@ -35,7 +35,7 @@ export class LoginService { completeLogin() { if (this.debug) console.log(`OAuthService doLogin()`); - return this.authService.checkLogin(); + return this.authService.signIn(); } storeReturnUrl(returnUrl) { diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/core/services/smart-resume.service.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/core/services/smart-resume.service.ts new file mode 100644 index 0000000..783a94b --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/core/services/smart-resume.service.ts @@ -0,0 +1,27 @@ +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { UtilsService } from '@core/services/utils.service'; +import { environment } from '@environment/environment'; +import { ApiResponse } from '@shared/models/apiResponse'; +import { SmartResumePostModel } from '@shared/models/SmartResumePostModel'; +import { Observable } from 'rxjs'; +import { catchError } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root' +}) +export class SmartResumeService { + private debug = false; + + constructor(private http: HttpClient, private utilsService: UtilsService) { } + + submit(post: SmartResumePostModel): Observable { + const urlApi = `${environment.apiEndPoint}SmartResume/`; + if (this.debug) console.log(`smart resume service ${urlApi}`); + return this.http.post(urlApi, post) + .pipe( + catchError(err => this.utilsService.handleError(err) + ) + ); + } +} diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/login-with-proof/login-with-proof.component.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/login-with-proof/login-with-proof.component.ts index 172f722..cd91dcf 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/login-with-proof/login-with-proof.component.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/login-with-proof/login-with-proof.component.ts @@ -52,9 +52,13 @@ export class LoginWithProofComponent implements OnInit, OnDestroy { this.message = 'proof received... redirecting'; let returnUrl = this.loginService.returnUrl this.loginService.completeLogin().then(resp => { + if (resp) { + clearInterval(this.timeout); + this.router.navigate([returnUrl ?? '/credentials']); + + } }); - clearInterval(this.timeout); - //this.router.navigate([returnUrl]); + } else if (response.status == 'Rejected') { this.modelErrors = new Array(); diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/logout/logout.component.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/logout/logout.component.ts index 3603675..9b55d9b 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/logout/logout.component.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/access/pages/logout/logout.component.ts @@ -32,9 +32,12 @@ ngOnInit() { var self = this; setTimeout((self) => { this.ngZone.run(() => { - this.authService.logout(); - console.log(this._infoMessage); - this.router.navigate(["/access/login"], { queryParams: { infoMessage: this._infoMessage }}); + this.authService.logout().then( + () => { + console.log(this._infoMessage); + this.router.navigate(["/access/login"], { queryParams: { infoMessage: this._infoMessage }}); + } + ); }, self); }, 500, [ self ]); } diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/account.service.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/account.service.ts index c1ae191..ce57ef9 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/account.service.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/account.service.ts @@ -225,4 +225,14 @@ export class AccountService { ) ); } + + deleteUser(): Observable { + const urlApi = `${environment.apiEndPoint}account/deleteUser`; + if (this.debug) console.log(`account service ${urlApi}`); + return this.http.post(urlApi, null) + .pipe( + catchError(err => this.utilsService.handleError(err) + ) + ); + } } diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.html b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.html index 60adf7a..da09434 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.html +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.html @@ -18,10 +18,28 @@

- Delete + Delete

+ + + + + + diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.ts index 0a7a2cf..d8439d0 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/modules/account/pages/personal-data/personal-data.component.ts @@ -1,7 +1,8 @@ import { Component, OnInit } from '@angular/core'; import { DownloadService } from '@core/services/download.service'; -import { environment } from '@environment/environment'; import { AccountService } from '@modules/account/account.service'; +import { NgbModal } from '@ng-bootstrap/ng-bootstrap'; +import { LoginService } from '@root/app/auth/login.service'; import { take } from 'rxjs/operators'; @Component({ @@ -14,7 +15,7 @@ export class PersonalDataComponent implements OnInit { showSpinner = false; private debug = false; - constructor(private acctService: AccountService, private downloads: DownloadService ) { } + constructor(private acctService: AccountService, private downloads: DownloadService, private loginService: LoginService, private modalService: NgbModal ) { } ngOnInit(): void { } @@ -27,8 +28,22 @@ export class PersonalDataComponent implements OnInit { var contentDispositionHeader = resp.headers.get('Content-Disposition'); var filename = contentDispositionHeader.split(';')[1].trim().split('=')[1].replace(/"/g, ''); if (this.debug) console.log(`DisplayCredentialComponent VCJson:${JSON.stringify(resp.body)}`); - this.downloads.saveAs(JSON.stringify(resp.body), filename, 'Pdf'); + this.downloads.saveAs(JSON.stringify(resp.body), filename, 'json'); this.showSpinner = false; }); } + + confirmDelete(modalContent) { + this.modalService.open(modalContent); + } + + deleteUser() { + this.acctService.deleteUser().subscribe(resp => { + if (this.modalService.hasOpenModals) + this.modalService.dismissAll("Signing you out now..."); + this.loginService.signOut('Your account was deleted.'); + }, error => { + console.log(error); + }); + } } diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/clr/clr.component.html b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/clr/clr.component.html index 9ca7a06..2f90223 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/clr/clr.component.html +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/clr/clr.component.html @@ -26,6 +26,7 @@
+
diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.html b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.html new file mode 100644 index 0000000..eab0d37 --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.html @@ -0,0 +1,16 @@ + + +
+
+ +
+
+
+ + + +
diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.scss b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.scss new file mode 100644 index 0000000..1239898 --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.scss @@ -0,0 +1,3 @@ +span img { + width:24px !important; +} diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.ts new file mode 100644 index 0000000..aa31c8d --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/components/smart-resume/smart-resume.component.ts @@ -0,0 +1,47 @@ +import { Component, Input, OnInit } from '@angular/core'; +import { SmartResumeService } from '@core/services/smart-resume.service'; +import { UtilsService } from '@core/services/utils.service'; +import { ApiOkResponse } from '@shared/models/apiOkResponse'; +import { ClrVM } from '@shared/models/clrVM'; +import { take } from 'rxjs/operators'; + +@Component({ + selector: 'app-smart-resume', + templateUrl: './smart-resume.component.html', + styleUrls: ['./smart-resume.component.scss'] +}) +export class SmartResumeComponent implements OnInit { + @Input() clr: ClrVM; + + message = ''; + showSpinner = false; + miniSpinner = false; + private debug = false; + + constructor(private utilsService: UtilsService, private smartResumeService: SmartResumeService) { } + + ngOnChanges() { + + if (this.debug) console.log('SmartResumeComponent ngOnChanges'); + } + + ngOnInit(): void { + if (this.debug) console.log('SmartResumeComponent ngOnInit'); + } + + submit(){ + this.miniSpinner = true; + + this.smartResumeService.submit({ packageId: this.clr.packageId, clrId: this.clr.id }) + .pipe(take(1)).subscribe(data => { + if (this.debug) + console.log(data); + if (data.statusCode == 200) { + this.clr.smartResumeUrl = (data).result; + if (this.clr.smartResumeUrl) + this.clr.hasSmartResume = true; + } + this.miniSpinner = false; + }); + } +} diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/clrVM.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/clrVM.ts index d9c8493..e8332e7 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/clrVM.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/clrVM.ts @@ -1,4 +1,3 @@ -import { AchievementDType } from "./clrLibrary/achievementDType"; import { ProfileVM } from "./clrSimplified/profileVM"; export class ClrVM { @@ -15,6 +14,9 @@ export class ClrVM { isCollapsed = false; identifier = ''; achievementIds: string[]; + enableSmartResume: boolean = false; + hasSmartResume: boolean = false; + smartResumeUrl: string = ''; learner: ProfileVM; publisher: ProfileVM; constructor(){ @@ -33,5 +35,8 @@ export class ClrVM { this.achievementIds = new Array(); this.learner = null; this.publisher = null; + this.enableSmartResume = false; + this.hasSmartResume = false; + this.smartResumeUrl = ''; } } diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/smartResumePostModel.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/smartResumePostModel.ts new file mode 100644 index 0000000..02a1f27 --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/smartResumePostModel.ts @@ -0,0 +1,5 @@ + +export class SmartResumePostModel { + packageId: number; + clrId: number; +} diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/verifyVM.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/verifyVM.ts index 613b47e..2320756 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/verifyVM.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/models/verifyVM.ts @@ -9,3 +9,4 @@ export class VerifyVM { ancestors: string; ancestorKeys: string; } + diff --git a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/shared.module.ts b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/shared.module.ts index 82d3f3f..98aee8f 100644 --- a/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/shared.module.ts +++ b/OpenCredentialPublisher.Wallet/src/ClientApp/src/app/shared/shared.module.ts @@ -27,6 +27,7 @@ import { ProofComponent } from './components/proof/proof.component'; import { PublicKeyComponent } from './components/public-key/public-key.component'; import { ResultComponent } from './components/result/result.component'; import { ResultsComponent } from './components/results/results.component'; +import { SmartResumeComponent } from './components/smart-resume/smart-resume.component'; import { UploadComponent } from './components/upload/upload.component'; import { VCVerificationComponent } from './components/vc-verification/vc-verification.component'; import { VerificationComponent } from './components/verification/verification.component'; @@ -62,6 +63,7 @@ import { DisableControlDirective } from './directives/disable-control.directive' ResultsComponent, ResultsComponent, ResultComponent, + SmartResumeComponent, SpinnerComponent, UploadComponent, VCVerificationComponent, @@ -98,6 +100,7 @@ import { DisableControlDirective } from './directives/disable-control.directive' ReactiveFormsModule, ResultsComponent, ResultComponent, + SmartResumeComponent, SpinnerComponent, UploadComponent, VCVerificationComponent, diff --git a/OpenCredentialPublisher.Wallet/src/Config.cs b/OpenCredentialPublisher.Wallet/src/Config.cs index ccb7371..5b7359b 100644 --- a/OpenCredentialPublisher.Wallet/src/Config.cs +++ b/OpenCredentialPublisher.Wallet/src/Config.cs @@ -52,7 +52,7 @@ namespace OpenCredentialPublisher.ClrWallet { $"{SpaClientUrl}" }, - AllowedGrantTypes = GrantTypes.CodeAndClientCredentials, + AllowedGrantTypes = GrantTypes.Code, AllowedScopes = { IdentityServerConstants.StandardScopes.OfflineAccess, "roles", @@ -80,6 +80,7 @@ namespace OpenCredentialPublisher.ClrWallet $"{SpaClientUrl}" }, + RefreshTokenUsage = TokenUsage.OneTimeOnly, RefreshTokenExpiration = TokenExpiration.Sliding, RequireConsent = false, RequireClientSecret = false, diff --git a/OpenCredentialPublisher.Wallet/src/Controllers/Account/AccountController.cs b/OpenCredentialPublisher.Wallet/src/Controllers/Account/AccountController.cs index 42ac2b7..c23e9ef 100644 --- a/OpenCredentialPublisher.Wallet/src/Controllers/Account/AccountController.cs +++ b/OpenCredentialPublisher.Wallet/src/Controllers/Account/AccountController.cs @@ -30,16 +30,19 @@ namespace OpenCredentialPublisher.Wallet.Controllers public class AccountController : SecureApiController { private readonly CredentialService _credentialService; + private readonly ForgetMeService _forgetMeService; private readonly RevocationService _revocationService; private readonly ProfileImageService _profileImageService; private readonly SignInManager _signInManager; private readonly IEmailSender _emailSender; - public AccountController(UserManager userManager, ILogger logger, CredentialService credentialService + public AccountController(UserManager userManager, ILogger logger + , CredentialService credentialService, ForgetMeService forgetMeService , RevocationService revocationService, ProfileImageService profileImageService, IEmailSender emailSender , SignInManager signInManager) : base(userManager, logger) { + _forgetMeService = forgetMeService; _credentialService = credentialService; _revocationService = revocationService; _profileImageService = profileImageService; @@ -135,6 +138,37 @@ namespace OpenCredentialPublisher.Wallet.Controllers return ApiOk(user.ProfileImageUrl); } + [HttpPost] + [Route("deleteUser")] + public async Task DeleteUser() + { + var user = await _userManager.FindByIdAsync(User.JwtUserId()); + if (user == null) + { + return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'."); + } + + await _forgetMeService.ForgetUser(user.Id); + + if (await _profileImageService.DeleteImageFromBlobAsync(user.ProfileImageUrl)) + { + user.ProfileImageUrl = null; + await _userManager.UpdateAsync(user); + } + + await _userManager.DeleteAsync(user); + try + { + await _signInManager.SignOutAsync(); + } + catch(Exception ex) + { + _logger.LogError(ex, ex.Message, user); + } + + return Ok(); + } + [HttpPost("saveProfileImage"), DisableRequestSizeLimit] public async Task SaveProfileImage([FromForm] FileInput theFile) { diff --git a/OpenCredentialPublisher.Wallet/src/Controllers/CredentialsController.cs b/OpenCredentialPublisher.Wallet/src/Controllers/CredentialsController.cs index 0083a46..1db46e9 100644 --- a/OpenCredentialPublisher.Wallet/src/Controllers/CredentialsController.cs +++ b/OpenCredentialPublisher.Wallet/src/Controllers/CredentialsController.cs @@ -99,7 +99,9 @@ namespace OpenCredentialPublisher.Wallet.Controllers var clrs = await _credentialService.GetPackageClrsAsync(id); foreach (var clr in clrs) { - clrVMs.Add(ClrVM.FromModel(clr)); + var clrVM = ClrVM.FromModel(clr); + clrVM.EnableSmartResume = _siteSettings.EnableSmartResume; + clrVMs.Add(clrVM); } return ApiOk(clrVMs); diff --git a/OpenCredentialPublisher.Wallet/src/Controllers/PublicController.cs b/OpenCredentialPublisher.Wallet/src/Controllers/PublicController.cs index 21a2bd5..b0b15f0 100644 --- a/OpenCredentialPublisher.Wallet/src/Controllers/PublicController.cs +++ b/OpenCredentialPublisher.Wallet/src/Controllers/PublicController.cs @@ -361,14 +361,17 @@ namespace OpenCredentialPublisher.Wallet.Controllers var achIds = new List(); var clr = await _credentialService.GetSingleClrAsync(id); - var rawClr = GetRawClr(clr); + //var rawClr = GetRawClr(clr); if (clr.ClrAchievements.Count > 0 ) { achIds = clr.ClrAchievements.Select(a => a.Achievement.Id).ToList(); - return ApiOk(ClrVM.FromModel(clr, achIds)); + var clrVM = ClrVM.FromModel(clr, achIds); + clrVM.EnableSmartResume = _siteSettings.EnableSmartResume; + return ApiOk(clrVM); } - - return ApiOk(ClrVM.FromModel(clr)); + var model = ClrVM.FromModel(clr); + model.EnableSmartResume = _siteSettings.EnableSmartResume; + return ApiOk(model); } catch (Exception ex) { diff --git a/OpenCredentialPublisher.Wallet/src/Controllers/SmartResumeController.cs b/OpenCredentialPublisher.Wallet/src/Controllers/SmartResumeController.cs new file mode 100644 index 0000000..c620100 --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/Controllers/SmartResumeController.cs @@ -0,0 +1,46 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using OpenCredentialPublisher.Data.Dtos.Idatafy; +using OpenCredentialPublisher.Data.Models; +using OpenCredentialPublisher.Data.Options; +using OpenCredentialPublisher.Data.ViewModels.nG; +using OpenCredentialPublisher.Services.Implementations; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace OpenCredentialPublisher.Wallet.Controllers +{ + public class SmartResumeController : SecureApiController + { + private readonly IdatafyService _idatafyService; + private readonly SiteSettingsOptions _siteSettings; + public SmartResumeController(IOptions siteSettings, IdatafyService idatafyService, UserManager userManager, ILogger logger) : base(userManager, logger) + { + _idatafyService = idatafyService; + _siteSettings = siteSettings?.Value; + + if (!_siteSettings.EnableSmartResume) + throw new Exception("This controller relies upon Idatafy which is not enabled in SiteSettings."); + } + + [HttpPost, Route("")] + public async Task PostSmartResumeAsync([FromBody]SmartResumePost model) + { + try + { + var result = await _idatafyService.SendSmartResumeAsync(_userId, model.PackageId, model.ClrId); + return ApiOk(result); + } + catch (Exception ex) + { + _logger.LogError(ex, ex.Message, model); + return Ok(new ApiBadRequestResponse(ex.Message)); + } + } + } +} diff --git a/OpenCredentialPublisher.Wallet/src/Controllers/SourcesController.cs b/OpenCredentialPublisher.Wallet/src/Controllers/SourcesController.cs index a5c132c..bd3289c 100644 --- a/OpenCredentialPublisher.Wallet/src/Controllers/SourcesController.cs +++ b/OpenCredentialPublisher.Wallet/src/Controllers/SourcesController.cs @@ -840,7 +840,7 @@ namespace OpenCredentialPublisher.Wallet.Controllers ClientName = "Open Credential Publisher", ClientUri = GetUrl(Request, "/", tmpIsBadgr), GrantTypes = new[] { OpenIdConnectGrantTypes.AuthorizationCode, OpenIdConnectGrantTypes.RefreshToken }, - LogoUri = GetUrl(Request, "/assets/images/Logo_with_text.png", tmpIsBadgr), + LogoUri = GetUrl(Request, "/images/ocp-badge-logo.svg", tmpIsBadgr), PolicyUri = GetUrl(Request, "/public/privacy", tmpIsBadgr), TosUri = GetUrl(Request, "/public/terms", tmpIsBadgr), RedirectUris = new[] { GetUrl(Request, _sourcesSettings.CallbackUrl) }, diff --git a/OpenCredentialPublisher.Wallet/src/Startup.cs b/OpenCredentialPublisher.Wallet/src/Startup.cs index de739a8..9db6356 100644 --- a/OpenCredentialPublisher.Wallet/src/Startup.cs +++ b/OpenCredentialPublisher.Wallet/src/Startup.cs @@ -79,6 +79,11 @@ namespace OpenCredentialPublisher.ClrWallet Config.UseSlidingSessionExpiration = siteSettingsOptions.SlidingSessionExpiration; Config.SessionTimeout = siteSettingsOptions.SessionTimeout; + if (siteSettingsOptions.EnableSmartResume) + { + services.Configure(Configuration.GetSection(IdatafyOptions.Section)); + } + services.Configure(Configuration.GetSection(VerityOptions.Section)); services.Configure(Configuration.GetSection(nameof(HostSettings))); var keyVaultSection = Configuration.GetSection(nameof(KeyVaultOptions)); @@ -142,6 +147,7 @@ namespace OpenCredentialPublisher.ClrWallet { options.UseSqlServer(connectionString, sql => { + sql.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); sql.EnableRetryOnFailure(5); }); }); @@ -194,13 +200,19 @@ namespace OpenCredentialPublisher.ClrWallet { options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, - sql => sql.MigrationsAssembly(migrationsAssembly)); + sql => { + sql.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); + sql.MigrationsAssembly(migrationsAssembly); + }); }) .AddOperationalStore(options => { options.ConfigureDbContext = builder => builder.UseSqlServer(connectionString, - sql => sql.MigrationsAssembly(migrationsAssembly)); + sql => { + sql.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery); + sql.MigrationsAssembly(migrationsAssembly); + }); }); diff --git a/OpenCredentialPublisher.Wallet/src/wwwroot/images/ocp-badge-logo.svg b/OpenCredentialPublisher.Wallet/src/wwwroot/images/ocp-badge-logo.svg new file mode 100644 index 0000000..51020c4 --- /dev/null +++ b/OpenCredentialPublisher.Wallet/src/wwwroot/images/ocp-badge-logo.svg @@ -0,0 +1,46 @@ + + + + + + + + + + -- GitLab