From 93746d11d7dc8c32dc87f3e6c22876e6f0018193 Mon Sep 17 00:00:00 2001 From: Phil Schneider Date: Thu, 21 Mar 2024 15:20:47 +0100 Subject: [PATCH] feat: add statuslist to credential creation Refs: #2 --- .../templates/deployment-issuer-service.yaml | 6 ++ charts/ssi-credential-issuer/values.yaml | 2 + consortia/environments/values-beta.yaml | 2 + consortia/environments/values-dev.yaml | 2 + consortia/environments/values-int.yaml | 2 + consortia/environments/values-pen.yaml | 2 + consortia/environments/values-rc.yaml | 2 + .../CompanySsiDetailsRepository.cs | 12 +-- .../ICompanySsiDetailsRepository.cs | 5 +- .../AuditCompanySsiDetail20240228.cs | 1 + .../Entities/CompanySsiDetail.cs | 5 +- ... => 20240321135530_1.0.0-rc.1.Designer.cs} | 16 +++- ...0-rc.1.cs => 20240321135530_1.0.0-rc.1.cs} | 6 +- .../IssuerDbContextModelSnapshot.cs | 14 ++- .../BusinessLogic/IssuerBusinessLogic.cs | 68 ++++++++------ .../BusinessLogic/IssuerSettings.cs | 10 ++- .../CompanyDataErrorMessageContainer.cs | 88 ------------------ .../CredentialErrorMessageContainer.cs | 90 +++++++++++++++++++ .../Models/CredentialData.cs | 14 ++- .../SsiCredentialIssuer.Service/Program.cs | 2 +- .../appsettings.json | 2 + .../ExpiryCheckServiceTests.cs | 5 +- .../CompanySsiDetailsRepositoryTests.cs | 2 +- .../IssuerDbContextTests.cs | 4 +- .../Seeder/Data/company_ssi_details.test.json | 7 ++ .../BusinessLogic/WalletBusinessLogicTests.cs | 6 +- .../BusinessLogic/IssuerBusinessLogicTests.cs | 47 +++++----- 27 files changed, 257 insertions(+), 165 deletions(-) rename src/database/SsiCredentialIssuer.Migrations/Migrations/{20240320153632_1.0.0-rc.1.Designer.cs => 20240321135530_1.0.0-rc.1.Designer.cs} (95%) rename src/database/SsiCredentialIssuer.Migrations/Migrations/{20240320153632_1.0.0-rc.1.cs => 20240321135530_1.0.0-rc.1.cs} (94%) delete mode 100644 src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CompanyDataErrorMessageContainer.cs create mode 100644 src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CredentialErrorMessageContainer.cs diff --git a/charts/ssi-credential-issuer/templates/deployment-issuer-service.yaml b/charts/ssi-credential-issuer/templates/deployment-issuer-service.yaml index dba0cb92..6409468f 100644 --- a/charts/ssi-credential-issuer/templates/deployment-issuer-service.yaml +++ b/charts/ssi-credential-issuer/templates/deployment-issuer-service.yaml @@ -108,6 +108,12 @@ spec: value: "{{ .Values.issuer.portal.scope }}" - name: "PORTAL__USERNAME" value: "empty" + - name: "CREDENTIAL__ISSUERDID" + value: "{{ .Values.issuer.credential.issuerDid }}" + - name: "CREDENTIAL__ISSUERBPN" + value: "{{ .Values.issuer.credential.issuerBpn }}" + - name: "CREDENTIAL__STATUSLISTURL" + value: "{{ .Values.issuer.credential.statusListUrl }}" - name: "CREDENTIAL__ENCRYPTIONCONFIG__ENCRYPTIONCONFIGINDEX" value: "{{ .Values.issuer.credential.encryptionConfigIndex }}" - name: "CREDENTIAL__ENCRYPTIONCONFIGS__0__INDEX" diff --git a/charts/ssi-credential-issuer/values.yaml b/charts/ssi-credential-issuer/values.yaml index dad754df..e05d9792 100644 --- a/charts/ssi-credential-issuer/values.yaml +++ b/charts/ssi-credential-issuer/values.yaml @@ -53,6 +53,8 @@ issuer: clientSecret: "" credential: issuerDid: "" + issuerBpn: "" + statusListUrl: "" encryptionConfigIndex: 0 encryptionConfigs: index0: diff --git a/consortia/environments/values-beta.yaml b/consortia/environments/values-beta.yaml index 5af970f8..2ac0d801 100644 --- a/consortia/environments/values-beta.yaml +++ b/consortia/environments/values-beta.yaml @@ -39,6 +39,8 @@ ingress: issuer: swaggerEnabled: true + credential: + issuerBpn: "BPNL00000003CRHK" issuermigrations: logging: diff --git a/consortia/environments/values-dev.yaml b/consortia/environments/values-dev.yaml index 5e61f3af..03fad9f1 100644 --- a/consortia/environments/values-dev.yaml +++ b/consortia/environments/values-dev.yaml @@ -42,6 +42,8 @@ issuer: tag: "dev" imagePullPolicy: "Always" swaggerEnabled: true + credential: + issuerBpn: "BPNL00000003CRHK" issuermigrations: image: diff --git a/consortia/environments/values-int.yaml b/consortia/environments/values-int.yaml index 1656b8d2..12a895cb 100644 --- a/consortia/environments/values-int.yaml +++ b/consortia/environments/values-int.yaml @@ -39,6 +39,8 @@ ingress: issuer: swaggerEnabled: true + credential: + issuerBpn: "BPNL00000003CRHK" issuermigrations: logging: diff --git a/consortia/environments/values-pen.yaml b/consortia/environments/values-pen.yaml index 34ceeaee..bd27861d 100644 --- a/consortia/environments/values-pen.yaml +++ b/consortia/environments/values-pen.yaml @@ -39,6 +39,8 @@ ingress: issuer: swaggerEnabled: true + credential: + issuerBpn: "BPNL00000003CRHK" issuermigrations: logging: diff --git a/consortia/environments/values-rc.yaml b/consortia/environments/values-rc.yaml index 16adcc00..fabbf41e 100644 --- a/consortia/environments/values-rc.yaml +++ b/consortia/environments/values-rc.yaml @@ -42,6 +42,8 @@ issuer: tag: "rc" imagePullPolicy: "Always" swaggerEnabled: true + credential: + issuerBpn: "BPNL00000003CRHK" issuermigrations: image: diff --git a/src/database/SsiCredentialIssuer.DbAccess/Repositories/CompanySsiDetailsRepository.cs b/src/database/SsiCredentialIssuer.DbAccess/Repositories/CompanySsiDetailsRepository.cs index acad63d5..0f230919 100644 --- a/src/database/SsiCredentialIssuer.DbAccess/Repositories/CompanySsiDetailsRepository.cs +++ b/src/database/SsiCredentialIssuer.DbAccess/Repositories/CompanySsiDetailsRepository.cs @@ -45,7 +45,7 @@ public IAsyncEnumerable GetUseCaseParticipatio .Where(t => t.VerifiedCredentialTypeAssignedKind!.VerifiedCredentialTypeKindId == VerifiedCredentialTypeKindId.FRAMEWORK) .Select(t => new { - UseCase = t.VerifiedCredentialTypeAssignedUseCase!.UseCase, + t.VerifiedCredentialTypeAssignedUseCase!.UseCase, TypeId = t.Id, ExternalTypeDetails = t.VerifiedCredentialTypeAssignedExternalType!.VerifiedCredentialExternalType!.VerifiedCredentialExternalTypeDetailVersions }) @@ -126,9 +126,9 @@ public IAsyncEnumerable GetSsiCertificates(string bp .ToAsyncEnumerable(); /// - public CompanySsiDetail CreateSsiDetails(string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, Guid docId, CompanySsiDetailStatusId companySsiDetailStatusId, Guid userId, Action? setOptionalFields) + public CompanySsiDetail CreateSsiDetails(string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, CompanySsiDetailStatusId companySsiDetailStatusId, string issuerBpn, Guid userId, Action? setOptionalFields) { - var detail = new CompanySsiDetail(Guid.NewGuid(), bpnl, verifiedCredentialTypeId, companySsiDetailStatusId, userId, DateTimeOffset.UtcNow); + var detail = new CompanySsiDetail(Guid.NewGuid(), bpnl, verifiedCredentialTypeId, companySsiDetailStatusId, issuerBpn, userId, DateTimeOffset.UtcNow); setOptionalFields?.Invoke(detail); return _context.CompanySsiDetails.Add(detail).Entity; } @@ -165,7 +165,7 @@ public Task CheckSsiDetailsExistsForCompany(string bpnl, VerifiedCredentia x.VerifiedCredentialTypeKindId != VerifiedCredentialTypeKindId.FRAMEWORK) .Select(x => new ValueTuple>( true, - x.VerifiedCredentialType!.VerifiedCredentialTypeAssignedExternalType!.VerifiedCredentialExternalType!.VerifiedCredentialExternalTypeDetailVersions.Select(x => x.Id) + x.VerifiedCredentialType!.VerifiedCredentialTypeAssignedExternalType!.VerifiedCredentialExternalType!.VerifiedCredentialExternalTypeDetailVersions.Select(v => v.Id) )) .SingleOrDefaultAsync(); @@ -216,7 +216,7 @@ public IQueryable GetAllCredentialDetails(CompanySsiDetailStat /// public void AttachAndModifyCompanySsiDetails(Guid id, Action? initialize, Action updateFields) { - var entity = new CompanySsiDetail(id, null!, default, default, Guid.Empty, default); + var entity = new CompanySsiDetail(id, null!, default, default, null!, Guid.Empty, DateTimeOffset.MinValue); initialize?.Invoke(entity); _context.Attach(entity); updateFields.Invoke(entity); @@ -270,7 +270,7 @@ public IAsyncEnumerable GetExpiryData(DateTimeOffset now, } public void RemoveSsiDetail(Guid companySsiDetailId) => - _context.CompanySsiDetails.Remove(new CompanySsiDetail(companySsiDetailId, null!, default, default, Guid.Empty, default)); + _context.CompanySsiDetails.Remove(new CompanySsiDetail(companySsiDetailId, null!, default, default, null!, Guid.Empty, DateTimeOffset.MinValue)); public void CreateProcessData(Guid companySsiDetailId, JsonDocument schema, VerifiedCredentialTypeKindId credentialTypeKindId, Action? setOptionalFields) { diff --git a/src/database/SsiCredentialIssuer.DbAccess/Repositories/ICompanySsiDetailsRepository.cs b/src/database/SsiCredentialIssuer.DbAccess/Repositories/ICompanySsiDetailsRepository.cs index d6680cae..225a51e0 100644 --- a/src/database/SsiCredentialIssuer.DbAccess/Repositories/ICompanySsiDetailsRepository.cs +++ b/src/database/SsiCredentialIssuer.DbAccess/Repositories/ICompanySsiDetailsRepository.cs @@ -47,13 +47,12 @@ public interface ICompanySsiDetailsRepository /// /// Id of the company /// Id of the credential types - /// id of the document /// id of detail status + /// bpn of the credential issuer /// Id of the creator - /// Id of the linked Process /// sets the optional fields /// The created entity - CompanySsiDetail CreateSsiDetails(string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, Guid docId, CompanySsiDetailStatusId companySsiDetailStatusId, Guid userId, Action? setOptionalFields); + CompanySsiDetail CreateSsiDetails(string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, CompanySsiDetailStatusId companySsiDetailStatusId, string issuerBpn, Guid userId, Action? setOptionalFields); /// /// Checks whether the credential details are already exists for the company and the given version diff --git a/src/database/SsiCredentialIssuer.Entities/AuditEntities/AuditCompanySsiDetail20240228.cs b/src/database/SsiCredentialIssuer.Entities/AuditEntities/AuditCompanySsiDetail20240228.cs index 58fd13cb..be5dd3fb 100644 --- a/src/database/SsiCredentialIssuer.Entities/AuditEntities/AuditCompanySsiDetail20240228.cs +++ b/src/database/SsiCredentialIssuer.Entities/AuditEntities/AuditCompanySsiDetail20240228.cs @@ -32,6 +32,7 @@ public class AuditCompanySsiDetail20240228 : IAuditEntityV1 public Guid Id { get; set; } public string Bpnl { get; set; } = null!; + public string IssuerBpn { get; set; } = null!; public VerifiedCredentialTypeId VerifiedCredentialTypeId { get; set; } public CompanySsiDetailStatusId CompanySsiDetailStatusId { get; set; } public DateTimeOffset DateCreated { get; private set; } diff --git a/src/database/SsiCredentialIssuer.Entities/Entities/CompanySsiDetail.cs b/src/database/SsiCredentialIssuer.Entities/Entities/CompanySsiDetail.cs index 95facf0c..102e6776 100644 --- a/src/database/SsiCredentialIssuer.Entities/Entities/CompanySsiDetail.cs +++ b/src/database/SsiCredentialIssuer.Entities/Entities/CompanySsiDetail.cs @@ -30,22 +30,25 @@ public class CompanySsiDetail : IAuditableV1, IBaseEntity private CompanySsiDetail() { Bpnl = null!; + IssuerBpn = null!; Documents = new HashSet(); } - public CompanySsiDetail(Guid id, string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, CompanySsiDetailStatusId companySsiDetailStatusId, Guid creatorUserId, DateTimeOffset dateCreated) + public CompanySsiDetail(Guid id, string bpnl, VerifiedCredentialTypeId verifiedCredentialTypeId, CompanySsiDetailStatusId companySsiDetailStatusId, string issuerBpn, Guid creatorUserId, DateTimeOffset dateCreated) : this() { Id = id; Bpnl = bpnl; VerifiedCredentialTypeId = verifiedCredentialTypeId; CompanySsiDetailStatusId = companySsiDetailStatusId; + IssuerBpn = issuerBpn; CreatorUserId = creatorUserId; DateCreated = dateCreated; } public Guid Id { get; set; } public string Bpnl { get; set; } + public string IssuerBpn { get; set; } public VerifiedCredentialTypeId VerifiedCredentialTypeId { get; set; } public CompanySsiDetailStatusId CompanySsiDetailStatusId { get; set; } public DateTimeOffset DateCreated { get; set; } diff --git a/src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.Designer.cs b/src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.Designer.cs similarity index 95% rename from src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.Designer.cs rename to src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.Designer.cs index 04f48662..2b3c68d7 100644 --- a/src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.Designer.cs +++ b/src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.Designer.cs @@ -32,7 +32,7 @@ namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Migrations.Migrations { [DbContext(typeof(IssuerDbContext))] - [Migration("20240320153632_1.0.0-rc.1")] + [Migration("20240321135530_1.0.0-rc.1")] partial class _100rc1 { /// @@ -107,6 +107,11 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnType("uuid") .HasColumnName("id"); + b.Property("IssuerBpn") + .IsRequired() + .HasColumnType("text") + .HasColumnName("issuer_bpn"); + b.Property("LastEditorId") .HasColumnType("uuid") .HasColumnName("last_editor_id"); @@ -242,6 +247,11 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) .HasColumnType("uuid") .HasColumnName("external_credential_id"); + b.Property("IssuerBpn") + .IsRequired() + .HasColumnType("text") + .HasColumnName("issuer_bpn"); + b.Property("LastEditorId") .HasColumnType("uuid") .HasColumnName("last_editor_id"); @@ -284,8 +294,8 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) }); b - .HasAnnotation("LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();") - .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); + .HasAnnotation("LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();") + .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); }); modelBuilder.Entity("Org.Eclipse.TractusX.SsiCredentialIssuer.Entities.Entities.CompanySsiDetailAssignedDocument", b => diff --git a/src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.cs b/src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.cs similarity index 94% rename from src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.cs rename to src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.cs index 4ba2bb78..2a110962 100644 --- a/src/database/SsiCredentialIssuer.Migrations/Migrations/20240320153632_1.0.0-rc.1.cs +++ b/src/database/SsiCredentialIssuer.Migrations/Migrations/20240321135530_1.0.0-rc.1.cs @@ -44,6 +44,7 @@ protected override void Up(MigrationBuilder migrationBuilder) audit_v1id = table.Column(type: "uuid", nullable: false), id = table.Column(type: "uuid", nullable: false), bpnl = table.Column(type: "text", nullable: false), + issuer_bpn = table.Column(type: "text", nullable: false), verified_credential_type_id = table.Column(type: "integer", nullable: false), company_ssi_detail_status_id = table.Column(type: "integer", nullable: false), date_created = table.Column(type: "timestamp with time zone", nullable: false), @@ -457,6 +458,7 @@ protected override void Up(MigrationBuilder migrationBuilder) { id = table.Column(type: "uuid", nullable: false), bpnl = table.Column(type: "text", nullable: false), + issuer_bpn = table.Column(type: "text", nullable: false), verified_credential_type_id = table.Column(type: "integer", nullable: false), company_ssi_detail_status_id = table.Column(type: "integer", nullable: false), date_created = table.Column(type: "timestamp with time zone", nullable: false), @@ -830,9 +832,9 @@ protected override void Up(MigrationBuilder migrationBuilder) column: "verified_credential_type_id", unique: true); - migrationBuilder.Sql("CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();"); + migrationBuilder.Sql("CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();"); - migrationBuilder.Sql("CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); + migrationBuilder.Sql("CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); migrationBuilder.Sql("CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_DOCUMENT\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_DOCUMENT$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_document20240305\" (\"id\", \"date_created\", \"document_hash\", \"document_content\", \"document_name\", \"media_type_id\", \"document_type_id\", \"document_status_id\", \"company_user_id\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"date_created\", \r\n NEW.\"document_hash\", \r\n NEW.\"document_content\", \r\n NEW.\"document_name\", \r\n NEW.\"media_type_id\", \r\n NEW.\"document_type_id\", \r\n NEW.\"document_status_id\", \r\n NEW.\"company_user_id\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_DOCUMENT$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_DOCUMENT AFTER INSERT\r\nON \"issuer\".\"documents\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_DOCUMENT\"();"); diff --git a/src/database/SsiCredentialIssuer.Migrations/Migrations/IssuerDbContextModelSnapshot.cs b/src/database/SsiCredentialIssuer.Migrations/Migrations/IssuerDbContextModelSnapshot.cs index 12d213b4..bf3c8653 100644 --- a/src/database/SsiCredentialIssuer.Migrations/Migrations/IssuerDbContextModelSnapshot.cs +++ b/src/database/SsiCredentialIssuer.Migrations/Migrations/IssuerDbContextModelSnapshot.cs @@ -100,6 +100,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("uuid") .HasColumnName("id"); + b.Property("IssuerBpn") + .IsRequired() + .HasColumnType("text") + .HasColumnName("issuer_bpn"); + b.Property("LastEditorId") .HasColumnType("uuid") .HasColumnName("last_editor_id"); @@ -235,6 +240,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasColumnType("uuid") .HasColumnName("external_credential_id"); + b.Property("IssuerBpn") + .IsRequired() + .HasColumnType("text") + .HasColumnName("issuer_bpn"); + b.Property("LastEditorId") .HasColumnType("uuid") .HasColumnName("last_editor_id"); @@ -277,8 +287,8 @@ protected override void BuildModel(ModelBuilder modelBuilder) }); b - .HasAnnotation("LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();") - .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); + .HasAnnotation("LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 1, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL AFTER INSERT\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_INSERT_COMPANYSSIDETAIL\"();") + .HasAnnotation("LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL", "CREATE FUNCTION \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"() RETURNS trigger as $LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$\r\nBEGIN\r\n INSERT INTO \"issuer\".\"audit_company_ssi_detail20240228\" (\"id\", \"bpnl\", \"issuer_bpn\", \"verified_credential_type_id\", \"company_ssi_detail_status_id\", \"date_created\", \"creator_user_id\", \"expiry_date\", \"verified_credential_external_type_detail_version_id\", \"expiry_check_type_id\", \"process_id\", \"external_credential_id\", \"credential\", \"date_last_changed\", \"last_editor_id\", \"audit_v1id\", \"audit_v1operation_id\", \"audit_v1date_last_changed\", \"audit_v1last_editor_id\") SELECT NEW.\"id\", \r\n NEW.\"bpnl\", \r\n NEW.\"issuer_bpn\", \r\n NEW.\"verified_credential_type_id\", \r\n NEW.\"company_ssi_detail_status_id\", \r\n NEW.\"date_created\", \r\n NEW.\"creator_user_id\", \r\n NEW.\"expiry_date\", \r\n NEW.\"verified_credential_external_type_detail_version_id\", \r\n NEW.\"expiry_check_type_id\", \r\n NEW.\"process_id\", \r\n NEW.\"external_credential_id\", \r\n NEW.\"credential\", \r\n NEW.\"date_last_changed\", \r\n NEW.\"last_editor_id\", \r\n gen_random_uuid(), \r\n 2, \r\n CURRENT_DATE, \r\n NEW.\"last_editor_id\";\r\nRETURN NEW;\r\nEND;\r\n$LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL$ LANGUAGE plpgsql;\r\nCREATE TRIGGER LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL AFTER UPDATE\r\nON \"issuer\".\"company_ssi_details\"\r\nFOR EACH ROW EXECUTE PROCEDURE \"issuer\".\"LC_TRIGGER_AFTER_UPDATE_COMPANYSSIDETAIL\"();"); }); modelBuilder.Entity("Org.Eclipse.TractusX.SsiCredentialIssuer.Entities.Entities.CompanySsiDetailAssignedDocument", b => diff --git a/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerBusinessLogic.cs b/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerBusinessLogic.cs index 22830a0d..65743337 100644 --- a/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerBusinessLogic.cs +++ b/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerBusinessLogic.cs @@ -45,6 +45,7 @@ namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Service.BusinessLogic; public class IssuerBusinessLogic : IIssuerBusinessLogic { + private const string StatusList = "StatusList2021"; private static readonly JsonSerializerOptions Options = new() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase }; private static readonly IEnumerable Context = new[] { "https://www.w3.org/2018/credentials/v1", "https://w3id.org/catenax/credentials/v1.0.0" }; @@ -101,7 +102,7 @@ await _repositories d.ExpiryDate, d.Documents)) .SingleOrDefault(), - (InvalidOperationException _) => throw ConflictException.Create(CompanyDataErrors.MULTIPLE_SSI_DETAIL)))) + (InvalidOperationException _) => throw ConflictException.Create(CredentialErrors.MULTIPLE_SSI_DETAIL)))) .ToList())) .ToListAsync() .ConfigureAwait(false); @@ -125,7 +126,7 @@ await _repositories d.ExpiryDate, d.Documents)) .SingleOrDefault(), - (InvalidOperationException _) => throw ConflictException.Create(CompanyDataErrors.MULTIPLE_SSI_DETAIL)))) + (InvalidOperationException _) => throw ConflictException.Create(CredentialErrors.MULTIPLE_SSI_DETAIL)))) .ToList())) .ToListAsync() .ConfigureAwait(false); @@ -194,7 +195,7 @@ public async Task ApproveCredential(Guid credentialId, CancellationToken cancell c.ExpiryDate = expiry; c.ProcessId = processId; }); - var typeValue = data.Type.GetEnumValue() ?? throw UnexpectedConditionException.Create(CompanyDataErrors.CREDENTIAL_TYPE_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialType", data.Type.ToString()) }); + var typeValue = data.Type.GetEnumValue() ?? throw UnexpectedConditionException.Create(CredentialErrors.CREDENTIAL_TYPE_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialType", data.Type.ToString()) }); var content = JsonSerializer.Serialize(new { data.Type, CredentialId = credentialId }, Options); await _portalService.AddNotification(content, _identity.IdentityId, NotificationTypeId.CREDENTIAL_APPROVAL, cancellationToken).ConfigureAwait(false); var mailParameters = new Dictionary @@ -219,37 +220,37 @@ private static void ValidateApprovalData(Guid credentialId, bool exists, SsiAppr { if (!exists) { - throw NotFoundException.Create(CompanyDataErrors.SSI_DETAILS_NOT_FOUND, new ErrorParameter[] { new("credentialId", credentialId.ToString()) }); + throw NotFoundException.Create(CredentialErrors.SSI_DETAILS_NOT_FOUND, new ErrorParameter[] { new("credentialId", credentialId.ToString()) }); } if (data.Status != CompanySsiDetailStatusId.PENDING) { - throw ConflictException.Create(CompanyDataErrors.CREDENTIAL_NOT_PENDING, new ErrorParameter[] { new("credentialId", credentialId.ToString()), new("status", CompanySsiDetailStatusId.PENDING.ToString()) }); + throw ConflictException.Create(CredentialErrors.CREDENTIAL_NOT_PENDING, new ErrorParameter[] { new("credentialId", credentialId.ToString()), new("status", CompanySsiDetailStatusId.PENDING.ToString()) }); } if (string.IsNullOrWhiteSpace(data.Bpn)) { - throw UnexpectedConditionException.Create(CompanyDataErrors.BPN_NOT_SET); + throw UnexpectedConditionException.Create(CredentialErrors.BPN_NOT_SET); } if (data.DetailData == null && data.Kind == VerifiedCredentialTypeKindId.FRAMEWORK) { - throw ConflictException.Create(CompanyDataErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET); + throw ConflictException.Create(CredentialErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET); } if (data.Kind != VerifiedCredentialTypeKindId.FRAMEWORK && data.Kind != VerifiedCredentialTypeKindId.MEMBERSHIP && data.Kind != VerifiedCredentialTypeKindId.BPN) { - throw ConflictException.Create(CompanyDataErrors.KIND_NOT_SUPPORTED, new ErrorParameter[] { new("kind", data.Kind != null ? data.Kind.Value.ToString() : "empty kind") }); + throw ConflictException.Create(CredentialErrors.KIND_NOT_SUPPORTED, new ErrorParameter[] { new("kind", data.Kind != null ? data.Kind.Value.ToString() : "empty kind") }); } if (data.Kind == VerifiedCredentialTypeKindId.FRAMEWORK && string.IsNullOrWhiteSpace(data.DetailData!.Version)) { - throw ConflictException.Create(CompanyDataErrors.EMPTY_VERSION); + throw ConflictException.Create(CredentialErrors.EMPTY_VERSION); } if (data.ProcessId is not null) { - throw UnexpectedConditionException.Create(CompanyDataErrors.ALREADY_LINKED_PROCESS); + throw UnexpectedConditionException.Create(CredentialErrors.ALREADY_LINKED_PROCESS); } } @@ -261,7 +262,7 @@ private DateTimeOffset GetExpiryDate(DateTimeOffset? expiryDate) if (expiry < now) { - throw ConflictException.Create(CompanyDataErrors.EXPIRY_DATE_IN_PAST); + throw ConflictException.Create(CredentialErrors.EXPIRY_DATE_IN_PAST); } return expiry > future ? future : expiry; @@ -274,15 +275,15 @@ public async Task RejectCredential(Guid credentialId, CancellationToken cancella var (exists, status, type, processId, processStepIds) = await companySsiRepository.GetSsiRejectionData(credentialId).ConfigureAwait(false); if (!exists) { - throw NotFoundException.Create(CompanyDataErrors.SSI_DETAILS_NOT_FOUND, new ErrorParameter[] { new("credentialId", credentialId.ToString()) }); + throw NotFoundException.Create(CredentialErrors.SSI_DETAILS_NOT_FOUND, new ErrorParameter[] { new("credentialId", credentialId.ToString()) }); } if (status != CompanySsiDetailStatusId.PENDING) { - throw ConflictException.Create(CompanyDataErrors.CREDENTIAL_NOT_PENDING, new ErrorParameter[] { new("credentialId", credentialId.ToString()), new("status", CompanySsiDetailStatusId.PENDING.ToString()) }); + throw ConflictException.Create(CredentialErrors.CREDENTIAL_NOT_PENDING, new ErrorParameter[] { new("credentialId", credentialId.ToString()), new("status", CompanySsiDetailStatusId.PENDING.ToString()) }); } - var typeValue = type.GetEnumValue() ?? throw UnexpectedConditionException.Create(CompanyDataErrors.CREDENTIAL_TYPE_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialType", type.ToString()) }); + var typeValue = type.GetEnumValue() ?? throw UnexpectedConditionException.Create(CredentialErrors.CREDENTIAL_TYPE_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialType", type.ToString()) }); var content = JsonSerializer.Serialize(new { Type = type, CredentialId = credentialId }, Options); await _portalService.AddNotification(content, _identity.IdentityId, NotificationTypeId.CREDENTIAL_REJECTED, cancellationToken).ConfigureAwait(false); @@ -338,7 +339,10 @@ public async Task CreateBpnCredential(CreateBpnCredentialRequest requestDa holderDid, requestData.BusinessPartnerNumber, requestData.BusinessPartnerNumber - ) + ), + new CredentialStatus( + _settings.StatusListUrl, + StatusList) ); var schema = JsonSerializer.Serialize(schemaData, Options); return await HandleCredentialProcessCreation(requestData.BusinessPartnerNumber, VerifiedCredentialTypeKindId.BPN, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, schema, requestData.TechnicalUserDetails, null, requestData.CallbackUrl, companyCredentialDetailsRepository); @@ -362,7 +366,10 @@ public async Task CreateMembershipCredential(CreateMembershipCredentialReq holderDid, requestData.HolderBpn, requestData.MemberOf - ) + ), + new CredentialStatus( + _settings.StatusListUrl, + StatusList) ); var schema = JsonSerializer.Serialize(schemaData, Options); return await HandleCredentialProcessCreation(requestData.HolderBpn, VerifiedCredentialTypeKindId.MEMBERSHIP, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, schema, requestData.TechnicalUserDetails, null, requestData.CallbackUrl, companyCredentialDetailsRepository); @@ -374,27 +381,27 @@ public async Task CreateFrameworkCredential(CreateFrameworkCredentialReque var result = await companyCredentialDetailsRepository.CheckCredentialTypeIdExistsForExternalTypeDetailVersionId(requestData.UseCaseFrameworkVersionId, requestData.UseCaseFrameworkId).ConfigureAwait(false); if (!result.Exists) { - throw ControllerArgumentException.Create(CompanyDataErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialExternalTypeDetailId", requestData.UseCaseFrameworkId.ToString()) }); + throw ControllerArgumentException.Create(CredentialErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND, new ErrorParameter[] { new("verifiedCredentialExternalTypeDetailId", requestData.UseCaseFrameworkId.ToString()) }); } if (result.Expiry < _dateTimeProvider.OffsetNow) { - throw ControllerArgumentException.Create(CompanyDataErrors.EXPIRY_DATE_IN_PAST); + throw ControllerArgumentException.Create(CredentialErrors.EXPIRY_DATE_IN_PAST); } if (string.IsNullOrWhiteSpace(result.Version)) { - throw ControllerArgumentException.Create(CompanyDataErrors.EMPTY_VERSION); + throw ControllerArgumentException.Create(CredentialErrors.EMPTY_VERSION); } if (string.IsNullOrWhiteSpace(result.Template)) { - throw ControllerArgumentException.Create(CompanyDataErrors.EMPTY_TEMPLATE); + throw ControllerArgumentException.Create(CredentialErrors.EMPTY_TEMPLATE); } if (result.UseCase.Count() != 1) { - throw ControllerArgumentException.Create(CompanyDataErrors.MULTIPLE_USE_CASES); + throw ControllerArgumentException.Create(CredentialErrors.MULTIPLE_USE_CASES); } var useCase = result.UseCase.Single(); @@ -415,7 +422,10 @@ public async Task CreateFrameworkCredential(CreateFrameworkCredentialReque useCase, result.Template!, result.Version! - ) + ), + new CredentialStatus( + _settings.StatusListUrl, + StatusList) ); var schema = JsonSerializer.Serialize(schemaData, Options); return await HandleCredentialProcessCreation(_identity.Bpnl, VerifiedCredentialTypeKindId.FRAMEWORK, requestData.UseCaseFrameworkId, schema, requestData.TechnicalUserDetails, requestData.UseCaseFrameworkVersionId, requestData.CallbackUrl, companyCredentialDetailsRepository); @@ -429,13 +439,21 @@ private async Task GetHolderInformation(string didDocumentLocation, Canc var did = await result.Content.ReadFromJsonAsync(Options, cancellationToken).ConfigureAwait(false); if (did == null) { - throw ConflictException.Create(CompanyDataErrors.DID_NOT_SET); + throw ConflictException.Create(CredentialErrors.DID_NOT_SET); } return did.Id; } - private async Task HandleCredentialProcessCreation(string bpnl, VerifiedCredentialTypeKindId kindId, VerifiedCredentialTypeId typeId, string schema, TechnicalUserDetails? technicalUserDetails, Guid? detailVersionId, string? callbackUrl, ICompanySsiDetailsRepository companyCredentialDetailsRepository) + private async Task HandleCredentialProcessCreation( + string bpnl, + VerifiedCredentialTypeKindId kindId, + VerifiedCredentialTypeId typeId, + string schema, + TechnicalUserDetails? technicalUserDetails, + Guid? detailVersionId, + string? callbackUrl, + ICompanySsiDetailsRepository companyCredentialDetailsRepository) { var documentContent = System.Text.Encoding.UTF8.GetBytes(schema); var hash = SHA512.HashData(documentContent); @@ -458,8 +476,8 @@ private async Task HandleCredentialProcessCreation(string bpnl, VerifiedCr var ssiDetailId = companyCredentialDetailsRepository.CreateSsiDetails( bpnl, typeId, - docId, status, + _settings.IssuerBpn, _identity.IdentityId, c => { diff --git a/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerSettings.cs b/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerSettings.cs index 6867ce47..fda6d5c9 100644 --- a/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerSettings.cs +++ b/src/issuer/SsiCredentialIssuer.Service/BusinessLogic/IssuerSettings.cs @@ -28,6 +28,7 @@ public class IssuerSettings /// /// The Did of the issuer /// + [Required(AllowEmptyStrings = false)] public string IssuerDid { get; set; } = null!; /// @@ -40,14 +41,19 @@ public class IssuerSettings [Required] public int EncrptionConfigIndex { get; set; } + + [Required(AllowEmptyStrings = false)] + public string StatusListUrl { get; set; } = null!; + + [Required(AllowEmptyStrings = false)] + public string IssuerBpn { get; set; } = null!; } public static class CompanyDataSettingsExtensions { public static IServiceCollection ConfigureCredentialSettings( this IServiceCollection services, - IConfigurationSection section - ) + IConfigurationSection section) { services.AddOptions() .Bind(section) diff --git a/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CompanyDataErrorMessageContainer.cs b/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CompanyDataErrorMessageContainer.cs deleted file mode 100644 index 4669cecc..00000000 --- a/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CompanyDataErrorMessageContainer.cs +++ /dev/null @@ -1,88 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2024 Contributors to the Eclipse Foundation - * - * See the NOTICE file(s) distributed with this work for additional - * information regarding copyright ownership. - * - * This program and the accompanying materials are made available under the - * terms of the Apache License, Version 2.0 which is available at - * https://www.apache.org/licenses/LICENSE-2.0. - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - * SPDX-License-Identifier: Apache-2.0 - ********************************************************************************/ - -using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Service; -using System.Collections.Immutable; - -namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Service.ErrorHandling; - -public class CompanyDataErrorMessageContainer : IErrorMessageContainer -{ - private static readonly IReadOnlyDictionary _messageContainer = new Dictionary { - { CompanyDataErrors.INVALID_COMPANY, "company {companyId} is not a valid company" }, - { CompanyDataErrors.INVALID_COMPANY_STATUS, "Company Status is Incorrect" }, - { CompanyDataErrors.USE_CASE_NOT_FOUND, "UseCaseId {useCaseId} is not available" }, - { CompanyDataErrors.INVALID_LANGUAGECODE, "language {languageShortName} is not a valid languagecode" }, - { CompanyDataErrors.COMPANY_NOT_FOUND, "company {companyId} does not exist" }, - { CompanyDataErrors.COMPANY_ROLE_IDS_CONSENT_STATUS_NULL, "neither CompanyRoleIds nor ConsentStatusDetails should ever be null here" }, - { CompanyDataErrors.MISSING_AGREEMENTS, "All agreements need to get signed as Active or InActive. Missing consents: [{missingConsents}]" }, - { CompanyDataErrors.UNASSIGN_ALL_ROLES, "Company can't unassign from all roles, Atleast one Company role need to signed as active" }, - { CompanyDataErrors.AGREEMENTS_NOT_ASSIGNED_WITH_ROLES, "Agreements not associated with requested companyRoles: [{companyRoles}]" }, - { CompanyDataErrors.MULTIPLE_SSI_DETAIL, "There should only be one pending or active ssi detail be assigne" }, - { CompanyDataErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND, "VerifiedCredentialExternalTypeDetail {verifiedCredentialExternalTypeDetailId} does not exist" }, - { CompanyDataErrors.EXPIRY_DATE_IN_PAST, "The expiry date must not be in the past" }, - { CompanyDataErrors.CREDENTIAL_NO_CERTIFICATE, "{credentialTypeId} is not assigned to a certificate" }, - { CompanyDataErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET, "The VerifiedCredentialExternalTypeDetailId must be set" }, - { CompanyDataErrors.CREDENTIAL_ALREADY_EXISTING, "Credential request already existing" }, - { CompanyDataErrors.CREDENTIAL_TYPE_NOT_FOUND, "VerifiedCredentialType {verifiedCredentialType} does not exists" }, - { CompanyDataErrors.SSI_DETAILS_NOT_FOUND, "CompanySsiDetail {credentialId} does not exists" }, - { CompanyDataErrors.CREDENTIAL_NOT_PENDING, "Credential {credentialId} must be {status}" }, - { CompanyDataErrors.BPN_NOT_SET, "Bpn should be set for company" }, - { CompanyDataErrors.EXPIRY_DATE_NOT_SET, "Expiry date must always be set for use cases" }, - { CompanyDataErrors.EMPTY_VERSION, "External Detail Version must not be null" }, - { CompanyDataErrors.EMPTY_TEMPLATE, "Template must not be null" }, - { CompanyDataErrors.KIND_NOT_SUPPORTED, "{kind} is currently not supported" }, - { CompanyDataErrors.MULTIPLE_USE_CASES, "There must only be one use case" }, - { CompanyDataErrors.DID_NOT_SET, "Did must not be null" }, - { CompanyDataErrors.ALREADY_LINKED_PROCESS, "Credential should not already be linked to a process" }, - }.ToImmutableDictionary(x => (int)x.Key, x => x.Value); - - public Type Type { get => typeof(CompanyDataErrors); } - public IReadOnlyDictionary MessageContainer { get => _messageContainer; } -} - -public enum CompanyDataErrors -{ - INVALID_COMPANY, - INVALID_COMPANY_STATUS, - USE_CASE_NOT_FOUND, - INVALID_LANGUAGECODE, - COMPANY_NOT_FOUND, - COMPANY_ROLE_IDS_CONSENT_STATUS_NULL, - MISSING_AGREEMENTS, - UNASSIGN_ALL_ROLES, - AGREEMENTS_NOT_ASSIGNED_WITH_ROLES, - MULTIPLE_SSI_DETAIL, - EXTERNAL_TYPE_DETAIL_NOT_FOUND, - EXPIRY_DATE_IN_PAST, - CREDENTIAL_NO_CERTIFICATE, - EXTERNAL_TYPE_DETAIL_ID_NOT_SET, - CREDENTIAL_ALREADY_EXISTING, - CREDENTIAL_TYPE_NOT_FOUND, - SSI_DETAILS_NOT_FOUND, - CREDENTIAL_NOT_PENDING, - BPN_NOT_SET, - EXPIRY_DATE_NOT_SET, - EMPTY_VERSION, - EMPTY_TEMPLATE, - KIND_NOT_SUPPORTED, - MULTIPLE_USE_CASES, - DID_NOT_SET, - ALREADY_LINKED_PROCESS -} diff --git a/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CredentialErrorMessageContainer.cs b/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CredentialErrorMessageContainer.cs new file mode 100644 index 00000000..e1aabb34 --- /dev/null +++ b/src/issuer/SsiCredentialIssuer.Service/ErrorHandling/CredentialErrorMessageContainer.cs @@ -0,0 +1,90 @@ +/******************************************************************************** + * Copyright (c) 2024 Contributors to the Eclipse Foundation + * + * See the NOTICE file(s) distributed with this work for additional + * information regarding copyright ownership. + * + * This program and the accompanying materials are made available under the + * terms of the Apache License, Version 2.0 which is available at + * https://www.apache.org/licenses/LICENSE-2.0. + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + * SPDX-License-Identifier: Apache-2.0 + ********************************************************************************/ + +using Org.Eclipse.TractusX.Portal.Backend.Framework.ErrorHandling.Service; +using System.Collections.Immutable; +using System.Diagnostics.CodeAnalysis; + +namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Service.ErrorHandling; + +[ExcludeFromCodeCoverage] +public class CredentialErrorMessageContainer : IErrorMessageContainer +{ + private static readonly IReadOnlyDictionary _messageContainer = new Dictionary { + { CredentialErrors.INVALID_COMPANY, "company {companyId} is not a valid company" }, + { CredentialErrors.INVALID_COMPANY_STATUS, "Company Status is Incorrect" }, + { CredentialErrors.USE_CASE_NOT_FOUND, "UseCaseId {useCaseId} is not available" }, + { CredentialErrors.INVALID_LANGUAGECODE, "language {languageShortName} is not a valid languagecode" }, + { CredentialErrors.COMPANY_NOT_FOUND, "company {companyId} does not exist" }, + { CredentialErrors.COMPANY_ROLE_IDS_CONSENT_STATUS_NULL, "neither CompanyRoleIds nor ConsentStatusDetails should ever be null here" }, + { CredentialErrors.MISSING_AGREEMENTS, "All agreements need to get signed as Active or InActive. Missing consents: [{missingConsents}]" }, + { CredentialErrors.UNASSIGN_ALL_ROLES, "Company can't unassign from all roles, Atleast one Company role need to signed as active" }, + { CredentialErrors.AGREEMENTS_NOT_ASSIGNED_WITH_ROLES, "Agreements not associated with requested companyRoles: [{companyRoles}]" }, + { CredentialErrors.MULTIPLE_SSI_DETAIL, "There should only be one pending or active ssi detail be assigne" }, + { CredentialErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND, "VerifiedCredentialExternalTypeDetail {verifiedCredentialExternalTypeDetailId} does not exist" }, + { CredentialErrors.EXPIRY_DATE_IN_PAST, "The expiry date must not be in the past" }, + { CredentialErrors.CREDENTIAL_NO_CERTIFICATE, "{credentialTypeId} is not assigned to a certificate" }, + { CredentialErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET, "The VerifiedCredentialExternalTypeDetailId must be set" }, + { CredentialErrors.CREDENTIAL_ALREADY_EXISTING, "Credential request already existing" }, + { CredentialErrors.CREDENTIAL_TYPE_NOT_FOUND, "VerifiedCredentialType {verifiedCredentialType} does not exists" }, + { CredentialErrors.SSI_DETAILS_NOT_FOUND, "CompanySsiDetail {credentialId} does not exists" }, + { CredentialErrors.CREDENTIAL_NOT_PENDING, "Credential {credentialId} must be {status}" }, + { CredentialErrors.BPN_NOT_SET, "Bpn should be set for company" }, + { CredentialErrors.EXPIRY_DATE_NOT_SET, "Expiry date must always be set for use cases" }, + { CredentialErrors.EMPTY_VERSION, "External Detail Version must not be null" }, + { CredentialErrors.EMPTY_TEMPLATE, "Template must not be null" }, + { CredentialErrors.KIND_NOT_SUPPORTED, "{kind} is currently not supported" }, + { CredentialErrors.MULTIPLE_USE_CASES, "There must only be one use case" }, + { CredentialErrors.DID_NOT_SET, "Did must not be null" }, + { CredentialErrors.ALREADY_LINKED_PROCESS, "Credential should not already be linked to a process" }, + }.ToImmutableDictionary(x => (int)x.Key, x => x.Value); + + public Type Type { get => typeof(CredentialErrors); } + public IReadOnlyDictionary MessageContainer { get => _messageContainer; } +} + +public enum CredentialErrors +{ + INVALID_COMPANY, + INVALID_COMPANY_STATUS, + USE_CASE_NOT_FOUND, + INVALID_LANGUAGECODE, + COMPANY_NOT_FOUND, + COMPANY_ROLE_IDS_CONSENT_STATUS_NULL, + MISSING_AGREEMENTS, + UNASSIGN_ALL_ROLES, + AGREEMENTS_NOT_ASSIGNED_WITH_ROLES, + MULTIPLE_SSI_DETAIL, + EXTERNAL_TYPE_DETAIL_NOT_FOUND, + EXPIRY_DATE_IN_PAST, + CREDENTIAL_NO_CERTIFICATE, + EXTERNAL_TYPE_DETAIL_ID_NOT_SET, + CREDENTIAL_ALREADY_EXISTING, + CREDENTIAL_TYPE_NOT_FOUND, + SSI_DETAILS_NOT_FOUND, + CREDENTIAL_NOT_PENDING, + BPN_NOT_SET, + EXPIRY_DATE_NOT_SET, + EMPTY_VERSION, + EMPTY_TEMPLATE, + KIND_NOT_SUPPORTED, + MULTIPLE_USE_CASES, + DID_NOT_SET, + ALREADY_LINKED_PROCESS +} diff --git a/src/issuer/SsiCredentialIssuer.Service/Models/CredentialData.cs b/src/issuer/SsiCredentialIssuer.Service/Models/CredentialData.cs index fba1f917..378379d6 100644 --- a/src/issuer/SsiCredentialIssuer.Service/Models/CredentialData.cs +++ b/src/issuer/SsiCredentialIssuer.Service/Models/CredentialData.cs @@ -30,7 +30,8 @@ public record FrameworkCredential( [property: JsonPropertyName("issuanceDate")] DateTimeOffset IssuanceDate, [property: JsonPropertyName("expirationDate")] DateTimeOffset ExpirationDate, [property: JsonPropertyName("issuer")] string Issuer, - [property: JsonPropertyName("credentialSubject")] FrameworkCredentialSubject CredentialSubject); + [property: JsonPropertyName("credentialSubject")] FrameworkCredentialSubject CredentialSubject, + [property: JsonPropertyName("credentialStatus")] CredentialStatus CredentialStatus); public record FrameworkCredentialSubject( [property: JsonPropertyName("id")] string Did, @@ -50,7 +51,8 @@ public record MembershipCredential( [property: JsonPropertyName("issuanceDate")] DateTimeOffset IssuanceDate, [property: JsonPropertyName("expirationDate")] DateTimeOffset ExpirationDate, [property: JsonPropertyName("issuer")] string Issuer, - [property: JsonPropertyName("credentialSubject")] MembershipCredentialSubject CredentialSubject); + [property: JsonPropertyName("credentialSubject")] MembershipCredentialSubject CredentialSubject, + [property: JsonPropertyName("credentialStatus")] CredentialStatus CredentialStatus); public record MembershipCredentialSubject( [property: JsonPropertyName("id")] string Did, @@ -67,7 +69,13 @@ public record BpnCredential( [property: JsonPropertyName("issuanceDate")] DateTimeOffset IssuanceDate, [property: JsonPropertyName("expirationDate")] DateTimeOffset ExpirationDate, [property: JsonPropertyName("issuer")] string Issuer, - [property: JsonPropertyName("credentialSubject")] BpnCredentialSubject CredentialSubject); + [property: JsonPropertyName("credentialSubject")] BpnCredentialSubject CredentialSubject, + [property: JsonPropertyName("credentialStatus")] CredentialStatus CredentialStatus); + +public record CredentialStatus( + [property: JsonPropertyName("id")] string Id, + [property: JsonPropertyName("type")] string Type +); public record BpnCredentialSubject( [property: JsonPropertyName("id")] string Did, diff --git a/src/issuer/SsiCredentialIssuer.Service/Program.cs b/src/issuer/SsiCredentialIssuer.Service/Program.cs index 42636399..3b1dcd7f 100644 --- a/src/issuer/SsiCredentialIssuer.Service/Program.cs +++ b/src/issuer/SsiCredentialIssuer.Service/Program.cs @@ -54,7 +54,7 @@ .AddCredentialService(builder.Configuration.GetSection("Credential")) .AddPortalService(builder.Configuration.GetSection("Portal")) .AddSingleton() - .AddSingleton(); + .AddSingleton(); }, (app, _) => { diff --git a/src/issuer/SsiCredentialIssuer.Service/appsettings.json b/src/issuer/SsiCredentialIssuer.Service/appsettings.json index 067a0d57..67731a38 100644 --- a/src/issuer/SsiCredentialIssuer.Service/appsettings.json +++ b/src/issuer/SsiCredentialIssuer.Service/appsettings.json @@ -55,6 +55,8 @@ }, "Credential": { "IssuerDid": "", + "IssuerBpn": "", + "StatusListUrl": "", "MaxPageSize": 15, "EncryptionConfigIndex": 0, "EncryptionConfigs": [ diff --git a/tests/credentials/SsiCredentialIssuer.Expiry.App.Tests/ExpiryCheckServiceTests.cs b/tests/credentials/SsiCredentialIssuer.Expiry.App.Tests/ExpiryCheckServiceTests.cs index 78e3f9ef..ffa94ee0 100644 --- a/tests/credentials/SsiCredentialIssuer.Expiry.App.Tests/ExpiryCheckServiceTests.cs +++ b/tests/credentials/SsiCredentialIssuer.Expiry.App.Tests/ExpiryCheckServiceTests.cs @@ -45,6 +45,7 @@ public class ExpiryCheckServiceTests private readonly ExpiryCheckServiceSettings _settings; private readonly string Bpnl = "BPNL00000001TEST"; + private static readonly string IssuerBpnl = "BPNL000001ISSUER"; public ExpiryCheckServiceTests() { @@ -111,7 +112,7 @@ public async Task ExecuteAsync_WithPendingAndExpiryBeforeNow_DeclinesRequest() // Arrange var now = DateTimeOffset.UtcNow; var expiredVcsToDeleteInMonth = now.AddMonths(-_settings.ExpiredVcsToDeleteInMonth); - var ssiDetail = new CompanySsiDetail(Guid.NewGuid(), Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, CompanySsiDetailStatusId.PENDING, Guid.NewGuid(), now) + var ssiDetail = new CompanySsiDetail(Guid.NewGuid(), Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, CompanySsiDetailStatusId.PENDING, IssuerBpnl, Guid.NewGuid(), now) { ExpiryDate = expiredVcsToDeleteInMonth.AddDays(-2), CreatorUserId = Guid.NewGuid() @@ -154,7 +155,7 @@ public async Task ExecuteAsync_WithActiveCloseToExpiry_NotifiesCreator(int days, { // Arrange var now = DateTimeOffset.UtcNow; - var ssiDetail = new CompanySsiDetail(Guid.NewGuid(), Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, CompanySsiDetailStatusId.ACTIVE, Guid.NewGuid(), now) + var ssiDetail = new CompanySsiDetail(Guid.NewGuid(), Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, CompanySsiDetailStatusId.ACTIVE, IssuerBpnl, Guid.NewGuid(), now) { ExpiryDate = now.AddDays(-days), ExpiryCheckTypeId = currentExpiryCheckTypeId, diff --git a/tests/database/SsiCredentialIssuer.DbAccess.Tests/CompanySsiDetailsRepositoryTests.cs b/tests/database/SsiCredentialIssuer.DbAccess.Tests/CompanySsiDetailsRepositoryTests.cs index e17fbe35..09e18438 100644 --- a/tests/database/SsiCredentialIssuer.DbAccess.Tests/CompanySsiDetailsRepositoryTests.cs +++ b/tests/database/SsiCredentialIssuer.DbAccess.Tests/CompanySsiDetailsRepositoryTests.cs @@ -196,7 +196,7 @@ public async Task CreateSsiDetails_WithValidData_ReturnsExpected() var (sut, context) = await CreateSutWithContext(); // Act - sut.CreateSsiDetails(new("9f5b9934-4014-4099-91e9-7b1aee696b03"), VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, new Guid("00000000-0000-0000-0000-000000000001"), CompanySsiDetailStatusId.PENDING, _userId, null); + sut.CreateSsiDetails(new("9f5b9934-4014-4099-91e9-7b1aee696b03"), VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, "BPNL0001ISSUER", _userId, null); // Assert context.ChangeTracker.HasChanges().Should().BeTrue(); diff --git a/tests/database/SsiCredentialIssuer.DbAccess.Tests/IssuerDbContextTests.cs b/tests/database/SsiCredentialIssuer.DbAccess.Tests/IssuerDbContextTests.cs index 8b9b400e..35ec7098 100644 --- a/tests/database/SsiCredentialIssuer.DbAccess.Tests/IssuerDbContextTests.cs +++ b/tests/database/SsiCredentialIssuer.DbAccess.Tests/IssuerDbContextTests.cs @@ -61,7 +61,7 @@ public async Task SaveCreatedAuditableEntity_SetsLastEditorId() var before = now.AddDays(-1); var id = Guid.NewGuid(); - var ca = new CompanySsiDetail(id, "BPNL00000001TEST", VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, new Guid("ac1cf001-7fbc-1f2f-817f-bce058020001"), before); + var ca = new CompanySsiDetail(id, "BPNL00000001TEST", VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, "BPNL0001ISSUER", new Guid("ac1cf001-7fbc-1f2f-817f-bce058020001"), before); var sut = await CreateContext().ConfigureAwait(false); using var trans = await sut.Database.BeginTransactionAsync().ConfigureAwait(false); @@ -89,7 +89,7 @@ public async Task SaveDeletedAuditableEntity_SetsLastEditorId() var before = now.AddDays(-1); var id = Guid.NewGuid(); - var ca = new CompanySsiDetail(id, "BPNL00000001TEST", VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, new Guid("ac1cf001-7fbc-1f2f-817f-bce058020001"), before); + var ca = new CompanySsiDetail(id, "BPNL00000001TEST", VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, "BPNL0001ISSUER", new Guid("ac1cf001-7fbc-1f2f-817f-bce058020001"), before); var sut = await CreateContext().ConfigureAwait(false); using var trans = await sut.Database.BeginTransactionAsync().ConfigureAwait(false); diff --git a/tests/database/SsiCredentialIssuer.DbAccess.Tests/Seeder/Data/company_ssi_details.test.json b/tests/database/SsiCredentialIssuer.DbAccess.Tests/Seeder/Data/company_ssi_details.test.json index e4ab9086..201e84d9 100644 --- a/tests/database/SsiCredentialIssuer.DbAccess.Tests/Seeder/Data/company_ssi_details.test.json +++ b/tests/database/SsiCredentialIssuer.DbAccess.Tests/Seeder/Data/company_ssi_details.test.json @@ -2,6 +2,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b03", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 1, "company_ssi_detail_status_id": 1, "document_id": "e020787d-1e04-4c0b-9c06-bd1cd44724b1", @@ -16,6 +17,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b04", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 2, "company_ssi_detail_status_id": 1, "document_id": "5adbdf90-c6ef-47a5-b596-2f00a731c39b", @@ -28,6 +30,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b05", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 4, "company_ssi_detail_status_id": 1, "document_id": "5adbdf90-c6ef-47a5-b596-2f00a731c39a", @@ -40,6 +43,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b06", "bpnl": "BPNL00000001LLHA", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 1, "company_ssi_detail_status_id": 1, "document_id": "3291cae8-3c7b-4862-8cec-93ea0dc8c61e", @@ -52,6 +56,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b07", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 3, "company_ssi_detail_status_id": 4, "document_id": "e020787d-1e04-4c0b-9c06-bd1cd44724b2", @@ -64,6 +69,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b08", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 4, "company_ssi_detail_status_id": 4, "document_id": "9685f744-9d90-4102-a949-fcd0bb86f954", @@ -76,6 +82,7 @@ { "id": "9f5b9934-4014-4099-91e9-7b1aee696b09", "bpnl": "BPNL00000003AYRE", + "issuer_bpn": "BPNL000003ISSUER", "verified_credential_type_id": 4, "company_ssi_detail_status_id": 4, "document_id": "88793f9f-c5a4-4621-847b-3d47cd839283", diff --git a/tests/externalservices/Wallet.Service.Tests/BusinessLogic/WalletBusinessLogicTests.cs b/tests/externalservices/Wallet.Service.Tests/BusinessLogic/WalletBusinessLogicTests.cs index 359d9b71..a35049f1 100644 --- a/tests/externalservices/Wallet.Service.Tests/BusinessLogic/WalletBusinessLogicTests.cs +++ b/tests/externalservices/Wallet.Service.Tests/BusinessLogic/WalletBusinessLogicTests.cs @@ -22,6 +22,8 @@ namespace Org.Eclipse.TractusX.SsiCredentialIssuer.Wallet.Service.Tests.Business public class WalletBusinessLogicTests { + private static readonly string IssuerBpnl = "BPNL000001ISSUER"; + private readonly WalletBusinessLogic _sut; private readonly IWalletService _walletService; private readonly ICompanySsiDetailsRepository _companySsiDetailRepository; @@ -72,7 +74,7 @@ public async Task CreateCredential_CallsExpected() var id = Guid.NewGuid(); var externalId = Guid.NewGuid(); var schema = JsonDocument.Parse("{}"); - var ssiDetail = new CompanySsiDetail(id, null!, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, Guid.NewGuid(), DateTimeOffset.UtcNow); + var ssiDetail = new CompanySsiDetail(id, null!, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, IssuerBpnl, Guid.NewGuid(), DateTimeOffset.UtcNow); A.CallTo(() => _companySsiDetailRepository.AttachAndModifyCompanySsiDetails(A._, A>._, A>._)) .Invokes((Guid _, Action? initialize, Action setupOptionalFields) => { @@ -103,7 +105,7 @@ public async Task SignCredential_CallsExpected() // Arrange var id = Guid.NewGuid(); var credentialId = Guid.NewGuid(); - var ssiDetail = new CompanySsiDetail(id, null!, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, Guid.NewGuid(), DateTimeOffset.UtcNow); + var ssiDetail = new CompanySsiDetail(id, null!, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, IssuerBpnl, Guid.NewGuid(), DateTimeOffset.UtcNow); A.CallTo(() => _companySsiDetailRepository.AttachAndModifyCompanySsiDetails(A._, A>._, A>._)) .Invokes((Guid _, Action? initialize, Action setupOptionalFields) => { diff --git a/tests/issuer/SsiCredentialIssuer.Service.Tests/BusinessLogic/IssuerBusinessLogicTests.cs b/tests/issuer/SsiCredentialIssuer.Service.Tests/BusinessLogic/IssuerBusinessLogicTests.cs index 433c49cf..22dc7065 100644 --- a/tests/issuer/SsiCredentialIssuer.Service.Tests/BusinessLogic/IssuerBusinessLogicTests.cs +++ b/tests/issuer/SsiCredentialIssuer.Service.Tests/BusinessLogic/IssuerBusinessLogicTests.cs @@ -43,6 +43,7 @@ public class IssuerBusinessLogicTests { private static readonly Guid CredentialId = Guid.NewGuid(); private static readonly string Bpnl = "BPNL00000001TEST"; + private static readonly string IssuerBpnl = "BPNL000001ISSUER"; private readonly IFixture _fixture; private readonly ICompanySsiDetailsRepository _companySsiDetailsRepository; @@ -95,7 +96,9 @@ public IssuerBusinessLogicTests() }, 1), MaxPageSize = 15, IssuerDid = "did:web:example:org:bpn:18273z682734rt", - EncrptionConfigIndex = 0 + IssuerBpn = IssuerBpnl, + EncrptionConfigIndex = 0, + StatusListUrl = "https://example.org/statuslist" }); _sut = new IssuerBusinessLogic(_issuerRepositories, _identityService, _dateTimeProvider, _clientFactory, _portalService, options); @@ -150,7 +153,7 @@ public async Task ApproveCredential_WithoutExistingSsiDetail_ThrowsNotFoundExcep var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.SSI_DETAILS_NOT_FOUND.ToString()); + ex.Message.Should().Be(CredentialErrors.SSI_DETAILS_NOT_FOUND.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialApproval", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _issuerRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -173,7 +176,7 @@ public async Task ApproveCredential_WithStatusNotPending_ThrowsConflictException var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.CREDENTIAL_NOT_PENDING.ToString()); + ex.Message.Should().Be(CredentialErrors.CREDENTIAL_NOT_PENDING.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialApproval", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _issuerRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -195,7 +198,7 @@ public async Task ApproveCredential_WithBpnNotSetActiveSsiDetail_ThrowsConflictE var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.BPN_NOT_SET.ToString()); + ex.Message.Should().Be(CredentialErrors.BPN_NOT_SET.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialApproval", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _issuerRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -231,7 +234,7 @@ public async Task ApproveCredential_WithExpiryInThePast_ReturnsExpected() var ex = await Assert.ThrowsAsync(Act); // Assert - ex.Message.Should().Be(CompanyDataErrors.EXPIRY_DATE_IN_PAST.ToString()); + ex.Message.Should().Be(CredentialErrors.EXPIRY_DATE_IN_PAST.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialApproval", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _portalService.AddNotification(A._, A._, A._, A._)).MustNotHaveHappened(); @@ -268,7 +271,7 @@ public async Task ApproveCredential_WithInvalidCredentialType_ThrowsException() // Assert var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); - ex.Message.Should().Be(CompanyDataErrors.CREDENTIAL_TYPE_NOT_FOUND.ToString()); + ex.Message.Should().Be(CredentialErrors.CREDENTIAL_TYPE_NOT_FOUND.ToString()); } [Fact] @@ -299,7 +302,7 @@ public async Task ApproveCredential_WithDetailVersionNotSet_ThrowsConflictExcept A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.CREATE_CREDENTIAL)) .MustNotHaveHappened(); - ex.Message.Should().Be(CompanyDataErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET.ToString()); + ex.Message.Should().Be(CredentialErrors.EXTERNAL_TYPE_DETAIL_ID_NOT_SET.ToString()); } [Fact] @@ -335,7 +338,7 @@ public async Task ApproveCredential_WithAlreadyLinkedProcess_ThrowsConflictExcep A.CallTo(() => _processStepRepository.CreateProcess(ProcessTypeId.CREATE_CREDENTIAL)) .MustNotHaveHappened(); - ex.Message.Should().Be(CompanyDataErrors.ALREADY_LINKED_PROCESS.ToString()); + ex.Message.Should().Be(CredentialErrors.ALREADY_LINKED_PROCESS.ToString()); } [Theory] @@ -362,7 +365,7 @@ public async Task ApproveCredential_WithValid_ReturnsExpected(VerifiedCredential detailData ); - var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, typeId, CompanySsiDetailStatusId.PENDING, Guid.NewGuid(), DateTimeOffset.Now); + var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, typeId, CompanySsiDetailStatusId.PENDING, "", Guid.NewGuid(), DateTimeOffset.Now); A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now); A.CallTo(() => _companySsiDetailsRepository.GetSsiApprovalData(CredentialId)) .Returns(new ValueTuple(true, data)); @@ -404,7 +407,7 @@ public async Task RejectCredential_WithoutExistingSsiDetail_ThrowsNotFoundExcept var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.SSI_DETAILS_NOT_FOUND.ToString()); + ex.Message.Should().Be(CredentialErrors.SSI_DETAILS_NOT_FOUND.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialRejected", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _issuerRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -430,7 +433,7 @@ public async Task RejectCredential_WithNotPendingSsiDetail_ThrowsNotFoundExcepti var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.CREDENTIAL_NOT_PENDING.ToString()); + ex.Message.Should().Be(CredentialErrors.CREDENTIAL_NOT_PENDING.ToString()); A.CallTo(() => _portalService.TriggerMail("CredentialRejected", A._, A>._, A._)).MustNotHaveHappened(); A.CallTo(() => _issuerRepositories.SaveAsync()).MustNotHaveHappened(); } @@ -440,7 +443,7 @@ public async Task RejectCredential_WithValidRequest_ReturnsExpected() { // Arrange var now = DateTimeOffset.UtcNow; - var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, Guid.NewGuid(), DateTimeOffset.Now); + var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, IssuerBpnl, Guid.NewGuid(), DateTimeOffset.Now); A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now); A.CallTo(() => _companySsiDetailsRepository.GetSsiRejectionData(CredentialId)) .Returns(new ValueTuple>( @@ -473,7 +476,7 @@ public async Task RejectCredential_WithValidRequestAndPendingProcessStepIds_Retu { // Arrange var now = DateTimeOffset.UtcNow; - var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, Guid.NewGuid(), DateTimeOffset.Now); + var detail = new CompanySsiDetail(CredentialId, _identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, IssuerBpnl, Guid.NewGuid(), DateTimeOffset.Now); A.CallTo(() => _dateTimeProvider.OffsetNow).Returns(now); A.CallTo(() => _companySsiDetailsRepository.GetSsiRejectionData(CredentialId)) .Returns(new ValueTuple>( @@ -544,7 +547,7 @@ public async Task CreateBpnCredential_ReturnsExpected() // Assert A.CallTo(() => _documentRepository.CreateDocument("schema.json", A._, A._, MediaTypeId.JSON, DocumentTypeId.PRESENTATION, A>._)) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, A._, CompanySsiDetailStatusId.ACTIVE, _identity.IdentityId, A>._)) + A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.BUSINESS_PARTNER_NUMBER, CompanySsiDetailStatusId.ACTIVE, IssuerBpnl, _identity.IdentityId, A>._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _documentRepository.AssignDocumentToCompanySsiDetails(A._, A._)) .MustHaveHappenedOnceExactly(); @@ -577,7 +580,7 @@ public async Task CreateMembershipCredential_ReturnsExpected() // Assert A.CallTo(() => _documentRepository.CreateDocument("schema.json", A._, A._, MediaTypeId.JSON, DocumentTypeId.PRESENTATION, A>._)) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, A._, CompanySsiDetailStatusId.ACTIVE, _identity.IdentityId, A>._)) + A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.DISMANTLER_CERTIFICATE, CompanySsiDetailStatusId.ACTIVE, IssuerBpnl, _identity.IdentityId, A>._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _documentRepository.AssignDocumentToCompanySsiDetails(A._, A._)) .MustHaveHappenedOnceExactly(); @@ -602,7 +605,7 @@ public async Task CreateFrameworkCredential_WithVersionNotExisting_ThrowsControl var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND.ToString()); + ex.Message.Should().Be(CredentialErrors.EXTERNAL_TYPE_DETAIL_NOT_FOUND.ToString()); } [Fact] @@ -621,7 +624,7 @@ public async Task CreateFrameworkCredential_WithExpiryInPast_ThrowsControllerArg var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.EXPIRY_DATE_IN_PAST.ToString()); + ex.Message.Should().Be(CredentialErrors.EXPIRY_DATE_IN_PAST.ToString()); } [Fact] @@ -640,7 +643,7 @@ public async Task CreateFrameworkCredential_WithEmptyVersion_ThrowsControllerArg var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.EMPTY_VERSION.ToString()); + ex.Message.Should().Be(CredentialErrors.EMPTY_VERSION.ToString()); } [Fact] @@ -659,7 +662,7 @@ public async Task CreateFrameworkCredential_WithEmptyTemplate_ThrowsControllerAr var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.EMPTY_TEMPLATE.ToString()); + ex.Message.Should().Be(CredentialErrors.EMPTY_TEMPLATE.ToString()); } [Fact] @@ -678,7 +681,7 @@ public async Task CreateFrameworkCredential_WithMoreThanOneUseCase_ThrowsControl var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.MULTIPLE_USE_CASES.ToString()); + ex.Message.Should().Be(CredentialErrors.MULTIPLE_USE_CASES.ToString()); } [Fact] @@ -697,7 +700,7 @@ public async Task CreateFrameworkCredential_WithNoUseCase_ThrowsControllerArgume var ex = await Assert.ThrowsAsync(Act).ConfigureAwait(false); // Assert - ex.Message.Should().Be(CompanyDataErrors.MULTIPLE_USE_CASES.ToString()); + ex.Message.Should().Be(CredentialErrors.MULTIPLE_USE_CASES.ToString()); } [Fact] @@ -725,7 +728,7 @@ public async Task CreateFrameworkCredential_ReturnsExpected() // Assert A.CallTo(() => _documentRepository.CreateDocument("schema.json", A._, A._, MediaTypeId.JSON, DocumentTypeId.PRESENTATION, A>._)) .MustHaveHappenedOnceExactly(); - A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, A._, CompanySsiDetailStatusId.PENDING, _identity.IdentityId, A>._)) + A.CallTo(() => _companySsiDetailsRepository.CreateSsiDetails(_identity.Bpnl, VerifiedCredentialTypeId.TRACEABILITY_FRAMEWORK, CompanySsiDetailStatusId.PENDING, IssuerBpnl, _identity.IdentityId, A>._)) .MustHaveHappenedOnceExactly(); A.CallTo(() => _documentRepository.AssignDocumentToCompanySsiDetails(A._, A._)) .MustHaveHappenedOnceExactly();