From 94d43bce24bee39f6c3df6d5e39e84ddb3a4fa81 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 13:37:54 +0200 Subject: [PATCH 01/15] Deprecate repositories and update service interfaces - Marked `IEnvelopeReceiverRepository` and several repository classes as obsolete, recommending the use of `IRepository`. - Corrected `using` directive in `IReceiverService.cs`. - Removed `UpdateAsync` method from `IReceiverService`. - Enhanced `ISmsSender` interface with new properties and methods. - Updated `ReceiverCreateDto`, `ReceiverReadDto`, and `UserReceiverDto` to enforce non-nullable properties. - Refactored `TestReceiverController` to suggest using `MediatR`. --- .../IEnvelopeReceiverRepository.cs | 1 + .../Contracts/Services/IReceiverService.cs | 11 +----- .../Contracts/Services/ISmsSender.cs | 12 +++++++ .../DTOs/Receiver/ReceiverCreateDto.cs | 4 +-- .../DTOs/Receiver/ReceiverReadDto.cs | 35 +++++++++++++++++-- .../DTOs/UserReceiverDto.cs | 2 +- .../Repositories/ConfigRepository.cs | 1 + .../DocumentReceiverElementRepository.cs | 1 + .../Repositories/DocumentStatusRepository.cs | 2 +- .../EnvelopeCertificateRepository.cs | 1 + .../EnvelopeDocumentRepository.cs | 1 + .../EnvelopeReceiverReadOnlyRepository.cs | 1 + .../Repositories/EnvelopeRepository.cs | 1 + .../Repositories/EnvelopeTypeRepository.cs | 1 + .../Repositories/ReceiverRepository.cs | 1 + .../Repositories/UserReceiverRepository.cs | 1 + .../Test/TestReceiverController.cs | 10 +++--- 17 files changed, 65 insertions(+), 21 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs index 135071de..c822f1fa 100644 --- a/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Application/Contracts/Repositories/IEnvelopeReceiverRepository.cs @@ -6,6 +6,7 @@ namespace EnvelopeGenerator.Application.Contracts.Repositories; /// /// /// +[Obsolete("Use IRepository")] public interface IEnvelopeReceiverRepository : ICRUDRepository { /// diff --git a/EnvelopeGenerator.Application/Contracts/Services/IReceiverService.cs b/EnvelopeGenerator.Application/Contracts/Services/IReceiverService.cs index 0f9293db..f6379c15 100644 --- a/EnvelopeGenerator.Application/Contracts/Services/IReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/Services/IReceiverService.cs @@ -1,5 +1,4 @@ -using DigitalData.Core.Abstractions; -using DigitalData.Core.Abstraction.Application; +using DigitalData.Core.Abstraction.Application; using DigitalData.Core.Abstraction.Application.DTO; using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; @@ -27,12 +26,4 @@ public interface IReceiverService : ICRUDService /// Task DeleteByAsync(string? emailAddress = null, string? signature = null); - - /// - /// - /// - /// - /// - /// - Task UpdateAsync(TUpdateDto updateDto); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Contracts/Services/ISmsSender.cs b/EnvelopeGenerator.Application/Contracts/Services/ISmsSender.cs index 7c437660..01bc5ec8 100644 --- a/EnvelopeGenerator.Application/Contracts/Services/ISmsSender.cs +++ b/EnvelopeGenerator.Application/Contracts/Services/ISmsSender.cs @@ -3,9 +3,21 @@ namespace EnvelopeGenerator.Application.Contracts.Services; //TODO: move to DigitalData.Core +/// +/// +/// public interface ISmsSender { + /// + /// + /// string ServiceProvider { get; } + /// + /// + /// + /// + /// + /// Task SendSmsAsync(string recipient, string message); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs index e20d2be2..9484bac4 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverCreateDto.cs @@ -18,7 +18,7 @@ public record ReceiverCreateDto { _sha256HexOfMail = new(() => { - var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress.ToUpper()); + var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress!.ToUpper()); var hash_arr = SHA256.HashData(bytes_arr); var hexa_str = BitConverter.ToString(hash_arr); return hexa_str.Replace("-", string.Empty); @@ -37,7 +37,7 @@ public record ReceiverCreateDto public string? TotpSecretkey { get; init; } /// - /// var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress.ToUpper());
+ /// var bytes_arr = Encoding.UTF8.GetBytes(EmailAddress.ToUpper());
/// var hash_arr = SHA256.HashData(bytes_arr); /// var hexa_str = BitConverter.ToString(hash_arr); /// return hexa_str.Replace("-", string.Empty); diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs index 1b1d75dd..0252e398 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs @@ -4,26 +4,57 @@ using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs.Receiver; +/// +/// +/// [ApiExplorerSettings(IgnoreApi = true)] public class ReceiverReadDto { + /// + /// + /// public int Id { get; set; } - public string EmailAddress { get; set; } + /// + /// + /// + public required string EmailAddress { get; set; } - public string Signature { get; set; } + /// + /// + /// + public required string Signature { get; set; } + /// + /// + /// public DateTime AddedWhen { get; set; } + /// + /// + /// [JsonIgnore] public IEnumerable? EnvelopeReceivers { get; set; } + /// + /// + /// public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name; + /// + /// + /// public string? TotpSecretkey { get; set; } = null; + /// + /// + /// public DateTime? TfaRegDeadline { get; set; } + /// + /// + /// + /// public override int GetHashCode() { return Id.GetHashCode(); diff --git a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs index eb9f5d66..02c5533e 100644 --- a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs +++ b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs @@ -26,7 +26,7 @@ public class UserReceiverDto /// /// Gets or sets the name of the receiver. /// - public string Name { get; set; } + public required string Name { get; set; } /// /// Gets or sets the company name of the receiver. diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs index 103e2ddb..24618f72 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class ConfigRepository : CRUDRepository, IConfigRepository { public ConfigRepository(EGDbContext dbContext) : base(dbContext, dbContext.Configs) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs index c663c7fe..c3c13c59 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class DocumentReceiverElementRepository : CRUDRepository, IDocumentReceiverElementRepository { public DocumentReceiverElementRepository(EGDbContext dbContext) : base(dbContext, dbContext.DocumentReceiverElements) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs index 83b3e638..dd375cbf 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs @@ -1,10 +1,10 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class DocumentStatusRepository : CRUDRepository, IDocumentStatusRepository { public DocumentStatusRepository(EGDbContext dbContext) : base(dbContext, dbContext.DocumentStatus) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs index c5a0dba3..0969d86e 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class EnvelopeCertificateRepository : CRUDRepository, IEnvelopeCertificateRepository { public EnvelopeCertificateRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeCertificates) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs index 2f15f10f..1481507f 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class EnvelopeDocumentRepository : CRUDRepository, IEnvelopeDocumentRepository { public EnvelopeDocumentRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeDocument) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs index 5f442d64..b69bbefb 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeReceiverReadOnlyRepository.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class EnvelopeReceiverReadOnlyRepository : CRUDRepository, IEnvelopeReceiverReadOnlyRepository { private readonly IEnvelopeRepository _envRepo; diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs index 5efbe348..5fb74c5c 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class EnvelopeRepository : CRUDRepository, IEnvelopeRepository { public EnvelopeRepository(EGDbContext dbContext) : base(dbContext, dbContext.Envelopes) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs index 3ab4488f..db87d712 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class EnvelopeTypeRepository : CRUDRepository, IEnvelopeTypeRepository { public EnvelopeTypeRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeTypes) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs index 89f795c2..bb339fee 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs @@ -5,6 +5,7 @@ using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class ReceiverRepository : CRUDRepository, IReceiverRepository { public ReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.Receivers) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs index 4b9f8f22..e258d402 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Application.Contracts.Repositories; namespace EnvelopeGenerator.Infrastructure.Repositories; +[Obsolete("Use IRepository")] public class UserReceiverRepository : CRUDRepository, IUserReceiverRepository { public UserReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.UserReceivers) diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestReceiverController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestReceiverController.cs index 85fe012b..62576cca 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestReceiverController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestReceiverController.cs @@ -3,13 +3,13 @@ using EnvelopeGenerator.Application.Contracts.Services; using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; -namespace EnvelopeGenerator.Web.Controllers.Test +namespace EnvelopeGenerator.Web.Controllers.Test; + +[Obsolete("Use MediatR")] +public class TestReceiverController : CRUDControllerBase { - public class TestReceiverController : CRUDControllerBase + public TestReceiverController(ILogger logger, IReceiverService service) : base(logger, service) { - public TestReceiverController(ILogger logger, IReceiverService service) : base(logger, service) - { - } } } \ No newline at end of file From 1c51fafb6915bd73b0326a3ea5b20aa4685494a1 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 13:44:43 +0200 Subject: [PATCH 02/15] Remove UserReceiver functionality and related components This commit marks the `IUserReceiverRepository` and `IUserReceiverService` as obsolete and removes their implementations. The `UserReceiverDto`, `UserReceiver`, `UserReceiverService`, and `UserReceiverRepository` classes have been deleted, along with their mappings in the `MappingProfile`. Additionally, the `TestUserReceiverController` has been removed, reflecting the complete removal of user receiver functionality from the codebase. --- .../Repositories/IUserReceiverRepository.cs | 12 ----- .../Services/IUserReceiverService.cs | 13 ------ .../DTOs/MappingProfile.cs | 2 - .../DTOs/UserReceiverDto.cs | 45 ------------------- .../Services/UserReceiverService.cs | 25 ----------- .../Entities/UserReceiver.cs | 39 ---------------- .../Repositories/UserReceiverRepository.cs | 13 ------ .../Test/TestUserReceiverController.cs | 14 ------ 8 files changed, 163 deletions(-) delete mode 100644 EnvelopeGenerator.Application/Contracts/Repositories/IUserReceiverRepository.cs delete mode 100644 EnvelopeGenerator.Application/Contracts/Services/IUserReceiverService.cs delete mode 100644 EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs delete mode 100644 EnvelopeGenerator.Application/Services/UserReceiverService.cs delete mode 100644 EnvelopeGenerator.Domain/Entities/UserReceiver.cs delete mode 100644 EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs delete mode 100644 EnvelopeGenerator.Web/Controllers/Test/TestUserReceiverController.cs diff --git a/EnvelopeGenerator.Application/Contracts/Repositories/IUserReceiverRepository.cs b/EnvelopeGenerator.Application/Contracts/Repositories/IUserReceiverRepository.cs deleted file mode 100644 index e94fbd9e..00000000 --- a/EnvelopeGenerator.Application/Contracts/Repositories/IUserReceiverRepository.cs +++ /dev/null @@ -1,12 +0,0 @@ -using DigitalData.Core.Abstraction.Application.Repository; -using EnvelopeGenerator.Domain.Entities; - -namespace EnvelopeGenerator.Application.Contracts.Repositories; - -/// -/// -/// -[Obsolete("Use IRepository")] -public interface IUserReceiverRepository : ICRUDRepository -{ -} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Contracts/Services/IUserReceiverService.cs b/EnvelopeGenerator.Application/Contracts/Services/IUserReceiverService.cs deleted file mode 100644 index dea30c94..00000000 --- a/EnvelopeGenerator.Application/Contracts/Services/IUserReceiverService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using DigitalData.Core.Abstraction.Application; -using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Domain.Entities; - -namespace EnvelopeGenerator.Application.Contracts.Services; - -/// -/// -/// -[Obsolete("Use MediatR")] -public interface IUserReceiverService : IBasicCRUDService -{ -} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/MappingProfile.cs b/EnvelopeGenerator.Application/DTOs/MappingProfile.cs index 3dd3797a..a5815ce0 100644 --- a/EnvelopeGenerator.Application/DTOs/MappingProfile.cs +++ b/EnvelopeGenerator.Application/DTOs/MappingProfile.cs @@ -37,7 +37,6 @@ public class MappingProfile : Profile CreateMap(); CreateMap(); CreateMap(); - CreateMap(); CreateMap(); // DTO to Entity mappings @@ -55,7 +54,6 @@ public class MappingProfile : Profile CreateMap().ForMember(rcv => rcv.EnvelopeReceivers, rcvReadDto => rcvReadDto.Ignore()); CreateMap(); CreateMap(); - CreateMap(); CreateMap(); CreateMap(); CreateMap(); diff --git a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs deleted file mode 100644 index 02c5533e..00000000 --- a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs +++ /dev/null @@ -1,45 +0,0 @@ -using Microsoft.AspNetCore.Mvc; - -namespace EnvelopeGenerator.Application.DTOs; - -/// -/// Data Transfer Object representing a user receiver with associated details. -/// -[ApiExplorerSettings(IgnoreApi = true)] -public class UserReceiverDto -{ - /// - /// Gets or sets the unique identifier of the user receiver. - /// - public int Id { get; set; } - - /// - /// Gets or sets the identifier of the user associated with the receiver. - /// - public int UserId { get; set; } - - /// - /// Gets or sets the identifier of the receiver. - /// - public int ReceiverId { get; set; } - - /// - /// Gets or sets the name of the receiver. - /// - public required string Name { get; set; } - - /// - /// Gets or sets the company name of the receiver. - /// - public string CompanyName { get; set; } - - /// - /// Gets or sets the job title of the receiver. - /// - public string JobTitle { get; set; } - - /// - /// Gets or sets the timestamp when the user receiver was added. - /// - public DateTime AddedWhen { get; set; } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/UserReceiverService.cs b/EnvelopeGenerator.Application/Services/UserReceiverService.cs deleted file mode 100644 index d4dc7b0f..00000000 --- a/EnvelopeGenerator.Application/Services/UserReceiverService.cs +++ /dev/null @@ -1,25 +0,0 @@ -using AutoMapper; -using DigitalData.Core.Application; -using EnvelopeGenerator.Application.Contracts.Services; -using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Domain.Entities; -using EnvelopeGenerator.Application.Contracts.Repositories; - -namespace EnvelopeGenerator.Application.Services; - -/// -/// -/// -[Obsolete("Use MediatR")] -public class UserReceiverService : BasicCRUDService, IUserReceiverService -{ - /// - /// - /// - /// - /// - public UserReceiverService(IUserReceiverRepository repository, IMapper mapper) - : base(repository, mapper) - { - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/UserReceiver.cs b/EnvelopeGenerator.Domain/Entities/UserReceiver.cs deleted file mode 100644 index 6260c3d5..00000000 --- a/EnvelopeGenerator.Domain/Entities/UserReceiver.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; -#if NETFRAMEWORK -using System; -#endif - -namespace EnvelopeGenerator.Domain.Entities -{ - [Table("TBSIG_USER_RECEIVER", Schema = "dbo")] - public class UserReceiver - { - [Key] - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - [Column("GUID")] - public int Id { get; set; } - - [Required] - [Column("USER_ID")] - public int UserId { get; set; } - - [Required] - [Column("RECEIVER_ID")] - public int ReceiverId { get; set; } - - [Required] - [Column("NAME", TypeName = "nvarchar(128)")] - public string Name { get; set; } - - [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] - public string CompanyName { get; set; } - - [Column("JOB_TITLE", TypeName = "nvarchar(128)")] - public string JobTitle { get; set; } - - [Required] - [Column("ADDED_WHEN", TypeName = "datetime")] - public DateTime AddedWhen { get; set; } - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs deleted file mode 100644 index e258d402..00000000 --- a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs +++ /dev/null @@ -1,13 +0,0 @@ -using DigitalData.Core.Infrastructure; -using EnvelopeGenerator.Domain.Entities; -using EnvelopeGenerator.Application.Contracts.Repositories; - -namespace EnvelopeGenerator.Infrastructure.Repositories; - -[Obsolete("Use IRepository")] -public class UserReceiverRepository : CRUDRepository, IUserReceiverRepository -{ - public UserReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.UserReceivers) - { - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestUserReceiverController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestUserReceiverController.cs deleted file mode 100644 index c4af2335..00000000 --- a/EnvelopeGenerator.Web/Controllers/Test/TestUserReceiverController.cs +++ /dev/null @@ -1,14 +0,0 @@ -using EnvelopeGenerator.Application.Contracts.Services; -using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Domain.Entities; - -namespace EnvelopeGenerator.Web.Controllers.Test; - -[Obsolete("Use MediatR")] -public class TestUserReceiverController : TestControllerBase< IUserReceiverService, UserReceiverDto, UserReceiver, int> -{ - public TestUserReceiverController(ILogger logger, IUserReceiverService service) : base(logger, service) - { - - } -} \ No newline at end of file From 9756303d6ee475b1e750e10d8a3356cce0f5fd0e Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 13:56:49 +0200 Subject: [PATCH 03/15] Refactor repositories and enhance documentation - Mark `IEmailTemplateRepository` and `_repository` in `ReadEmailTemplateQueryHandler` as obsolete, suggesting the use of `IRepository`. - Update `ResetEmailTemplateCommand` with additional documentation and examples for `Type`. - Change return type of `CreateEnvelopeReceiverCommand` to `IRequest`. - Improve caching methods in `CacheExtensions.cs` for better functionality and clarity. - Add XML documentation to the `Ok` method in `MappingExtensions`. - Make `UserReference` property required in `ReadHistoryResponse`. --- .../Repositories/IEmailTemplateRepository.cs | 2 +- .../Reset/ResetEmailTemplateCommand.cs | 27 +- .../Read/ReadEmailTemplateQueryHandler.cs | 5 +- .../Create/CreateEnvelopeReceiverCommand.cs | 2 +- .../CreateEnvelopeReceiverCommandHandler.cs | 2 +- .../Extensions/CacheExtensions.cs | 293 ++++++++++++------ .../Extensions/MappingExtensions.cs | 31 +- .../Queries/Read/ReadHistoryQueryHandler.cs | 4 +- .../Queries/Read/ReadHistoryResponse.cs | 2 +- 9 files changed, 238 insertions(+), 130 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/Repositories/IEmailTemplateRepository.cs b/EnvelopeGenerator.Application/Contracts/Repositories/IEmailTemplateRepository.cs index a36de569..73749745 100644 --- a/EnvelopeGenerator.Application/Contracts/Repositories/IEmailTemplateRepository.cs +++ b/EnvelopeGenerator.Application/Contracts/Repositories/IEmailTemplateRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Application.Contracts.Repositories; /// /// /// -[Obsolete("Use Read-method returning IReadQuery instead.")] +[Obsolete("Use IRepository")] public interface IEmailTemplateRepository : ICRUDRepository { /// diff --git a/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEmailTemplateCommand.cs b/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEmailTemplateCommand.cs index 1bcfda0e..fa988a54 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEmailTemplateCommand.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Commands/Reset/ResetEmailTemplateCommand.cs @@ -5,20 +5,19 @@ namespace EnvelopeGenerator.Application.EmailTemplates.Commands.Reset; /// /// Ein Befehl zum Zurücksetzen einer E-Mail-Vorlage auf die Standardwerte. -/// Erbt von und ermöglicht die Angabe einer optionalen ID und eines Typs der E-Mail-Vorlage. +/// Erbt von und ermöglicht die Angabe einer optionalen ID und eines Typs der E-Mail-Vorlage.

+/// Beispiele:
+/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments.
+/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments.
+/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments.
+/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments.
+/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes.
+/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments.
+/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis.
+/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird.
+/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird.
+/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird.
///
-/// Beispiele: -/// 0 - DocumentReceived: Benachrichtigung über den Empfang eines Dokuments. -/// 1 - DocumentSigned: Benachrichtigung über die Unterzeichnung eines Dokuments. -/// 2 - DocumentDeleted: Benachrichtigung über das Löschen eines Dokuments. -/// 3 - DocumentCompleted: Benachrichtigung über den Abschluss eines Dokuments. -/// 4 - DocumentAccessCodeReceived: Benachrichtigung über den Erhalt eines Zugangscodes. -/// 5 - DocumentShared: Benachrichtigung über das Teilen eines Dokuments. -/// 6 - TotpSecret: Benachrichtigung über ein TOTP-Geheimnis. -/// 7 - DocumentRejected_ADM (Für den Absender): Mail an den Absender, wenn das Dokument abgelehnt wird. -/// 8 - DocumentRejected_REC (Für den ablehnenden Empfänger): Mail an den ablehnenden Empfänger, wenn das Dokument abgelehnt wird. -/// 9 - DocumentRejected_REC_2 (Für sonstige Empfänger): Mail an andere Empfänger (Brief), wenn das Dokument abgelehnt wird. -/// public record ResetEmailTemplateCommand : EmailTemplateQuery, IRequest { /// @@ -34,7 +33,7 @@ public record ResetEmailTemplateCommand : EmailTemplateQuery, IRequest /// /// /// Die optionale ID der E-Mail-Vorlage, die zurückgesetzt werden soll. - /// Der Typ der E-Mail-Vorlage, z. B. (optional). + /// Der Typ der E-Mail-Vorlage, z. B. (optional). public ResetEmailTemplateCommand(int? Id = null, Constants.EmailTemplateType? Type = null) : base(Id, Type) { } diff --git a/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQueryHandler.cs b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQueryHandler.cs index 433838dc..84478ee1 100644 --- a/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQueryHandler.cs +++ b/EnvelopeGenerator.Application/EmailTemplates/Queries/Read/ReadEmailTemplateQueryHandler.cs @@ -12,6 +12,7 @@ public class ReadEmailTemplateQueryHandler : IRequestHandler instead.")] private readonly IEmailTemplateRepository _repository; /// @@ -21,6 +22,7 @@ public class ReadEmailTemplateQueryHandler : IRequestHandler /// Die AutoMapper-Instanz, die zum Zuordnen von Objekten verwendet wird. /// + [Obsolete("Use Read-method returning IReadQuery instead.")] public ReadEmailTemplateQueryHandler(IMapper mapper, IEmailTemplateRepository repository) { _mapper = mapper; @@ -34,6 +36,7 @@ public class ReadEmailTemplateQueryHandler : IRequestHandler /// /// + [Obsolete("Use IRepository")] public async Task Handle(ReadEmailTemplateQuery request, CancellationToken cancellationToken) { var temp = request.Id is int id @@ -46,4 +49,4 @@ public class ReadEmailTemplateQueryHandler : IRequestHandler Receivers, bool TFAEnabled = false - ) : CreateEnvelopeCommand(Title, Message, TFAEnabled), IRequest; \ No newline at end of file + ) : CreateEnvelopeCommand(Title, Message, TFAEnabled), IRequest; \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommandHandler.cs b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommandHandler.cs index 3ab6fda1..b4315258 100644 --- a/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommandHandler.cs +++ b/EnvelopeGenerator.Application/EnvelopeReceivers/Commands/Create/CreateEnvelopeReceiverCommandHandler.cs @@ -64,4 +64,4 @@ public class CreateEnvelopeReceiverCommandHandler : IRequestHandler>(sentRecipients); return res; } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Extensions/CacheExtensions.cs b/EnvelopeGenerator.Application/Extensions/CacheExtensions.cs index 5e9eebd8..16a533c4 100644 --- a/EnvelopeGenerator.Application/Extensions/CacheExtensions.cs +++ b/EnvelopeGenerator.Application/Extensions/CacheExtensions.cs @@ -1,131 +1,222 @@ using Microsoft.Extensions.Caching.Distributed; -namespace EnvelopeGenerator.Application.Extensions +namespace EnvelopeGenerator.Application.Extensions; + +/// +/// +/// +public static class CacheExtensions { - public static class CacheExtensions + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static Task SetLongAsync(this IDistributedCache cache, string key, long value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) + => options is null + ? cache.SetAsync(key, BitConverter.GetBytes(value), token: cToken) + : cache.SetAsync(key, BitConverter.GetBytes(value), options: options, token: cToken); + + /// + /// + /// + /// + /// + /// + /// + public static async Task GetLongAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) { - public static Task SetLongAsync(this IDistributedCache cache, string key, long value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) - => options is null - ? cache.SetAsync(key, BitConverter.GetBytes(value), token: cToken) - : cache.SetAsync(key, BitConverter.GetBytes(value), options: options, token: cToken); + var value = await cache.GetAsync(key, cToken); + return value is null ? null : BitConverter.ToInt64(value, 0); + } - public static async Task GetLongAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) - { - var value = await cache.GetAsync(key, cToken); - return value is null ? null : BitConverter.ToInt64(value, 0); - } + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static Task SetDateTimeAsync(this IDistributedCache cache, string key, DateTime value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) + => cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken: cToken); + + /// + /// + /// + /// + /// + /// + /// + public static async Task GetDateTimeAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) + { + var value = await cache.GetAsync(key, cToken); + return value is null ? null : new(BitConverter.ToInt64(value, 0)); + } - public static Task SetDateTimeAsync(this IDistributedCache cache, string key, DateTime value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) - => cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken: cToken); + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static Task SetTimeSpanAsync(this IDistributedCache cache, string key, TimeSpan value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) + => cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken); + + /// + /// + /// + /// + /// + /// + /// + public static async Task GetTimeSpanAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) + { + var value = await cache.GetAsync(key, cToken); + return value is null ? null : new(BitConverter.ToInt64(value, 0)); + } - public static async Task GetDateTimeAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) + //TODO: use code generator + #region GetOrSetAsync + + #region string + + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + { + var value = await cache.GetStringAsync(key, cToken); + if (value is null) { - var value = await cache.GetAsync(key, cToken); - return value is null ? null : new(BitConverter.ToInt64(value, 0)); - } + // create new and save + value = factory(); - public static Task SetTimeSpanAsync(this IDistributedCache cache, string key, TimeSpan value, DistributedCacheEntryOptions? options = null, CancellationToken cToken = default) - => cache.SetLongAsync(key: key, value: value.Ticks, options: options, cToken); + Task CacheAsync() => options is null + ? cache.SetStringAsync(key, value, cToken) + : cache.SetStringAsync(key, value, options, cToken); - public static async Task GetTimeSpanAsync(this IDistributedCache cache, string key, CancellationToken cToken = default) - { - var value = await cache.GetAsync(key, cToken); - return value is null ? null : new(BitConverter.ToInt64(value, 0)); + if (cacheInBackground) + _ = Task.Run(async () => await CacheAsync(), cToken); + else + await CacheAsync(); } - //TODO: use code generator - #region GetOrSetAsync + return value; + } - #region string - public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func> factoryAsync, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + { + var value = await cache.GetStringAsync(key, cToken); + if(value is null) { - var value = await cache.GetStringAsync(key, cToken); - if (value is null) - { - // create new and save - value = factory(); - - Task CacheAsync() => options is null - ? cache.SetStringAsync(key, value, cToken) - : cache.SetStringAsync(key, value, options, cToken); - - if (cacheInBackground) - _ = Task.Run(async () => await CacheAsync(), cToken); - else - await CacheAsync(); - } - - return value; - } + // create new and save + value = await factoryAsync(); - public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func> factoryAsync, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) - { - var value = await cache.GetStringAsync(key, cToken); - if(value is null) - { - // create new and save - value = await factoryAsync(); - - Task CacheAsync() => options is null - ? cache.SetStringAsync(key: key, value: value, token: cToken) - : cache.SetStringAsync(key: key, value: value, options: options, token: cToken); - - if (cacheInBackground) - _ = Task.Run(async () => await CacheAsync(), cToken); - else - await CacheAsync(); - } - - return value; + Task CacheAsync() => options is null + ? cache.SetStringAsync(key: key, value: value, token: cToken) + : cache.SetStringAsync(key: key, value: value, options: options, token: cToken); + + if (cacheInBackground) + _ = Task.Run(async () => await CacheAsync(), cToken); + else + await CacheAsync(); } - #endregion - #region DateTime - public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + return value; + } + #endregion + + #region DateTime + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + { + if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue) + return dateTimeValue; + else { - if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue) - return dateTimeValue; - else - { - // create new and save - var newValue = factory(); + // create new and save + var newValue = factory(); - Task CacheAsync() => options is null - ? cache.SetDateTimeAsync(key, newValue, cToken: cToken) - : cache.SetDateTimeAsync(key, newValue, options, cToken); + Task CacheAsync() => options is null + ? cache.SetDateTimeAsync(key, newValue, cToken: cToken) + : cache.SetDateTimeAsync(key, newValue, options, cToken); - if (cacheInBackground) - _ = Task.Run(async () => await CacheAsync(), cToken); - else - await CacheAsync(); + if (cacheInBackground) + _ = Task.Run(async () => await CacheAsync(), cToken); + else + await CacheAsync(); - return newValue; - } + return newValue; } + } - public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static async Task GetOrSetAsync(this IDistributedCache cache, string key, Func> factory, DistributedCacheEntryOptions? options = null, bool cacheInBackground = false, CancellationToken cToken = default) + { + if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue) + return dateTimeValue; + else { - if (await cache.GetDateTimeAsync(key, cToken) is DateTime dateTimeValue) - return dateTimeValue; - else - { - // create new and save - var newValue = await factory(); + // create new and save + var newValue = await factory(); - Task CacheAsync() => options is null - ? cache.SetDateTimeAsync(key, newValue, cToken: cToken) - : cache.SetDateTimeAsync(key, newValue, options, cToken); + Task CacheAsync() => options is null + ? cache.SetDateTimeAsync(key, newValue, cToken: cToken) + : cache.SetDateTimeAsync(key, newValue, options, cToken); - if (cacheInBackground) - _ = Task.Run(async () => await CacheAsync(), cToken); - else - await CacheAsync(); + if (cacheInBackground) + _ = Task.Run(async () => await CacheAsync(), cToken); + else + await CacheAsync(); - return newValue; - } + return newValue; } - #endregion - - #endregion } + #endregion + + #endregion } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Extensions/MappingExtensions.cs b/EnvelopeGenerator.Application/Extensions/MappingExtensions.cs index 3a8a65f7..d2bde296 100644 --- a/EnvelopeGenerator.Application/Extensions/MappingExtensions.cs +++ b/EnvelopeGenerator.Application/Extensions/MappingExtensions.cs @@ -1,14 +1,27 @@ using EnvelopeGenerator.Application.DTOs.Messaging; -namespace EnvelopeGenerator.Application.Extensions +namespace EnvelopeGenerator.Application.Extensions; + +/// +/// Provides extension methods for common mapping and conversion operations. +/// +public static class MappingExtensions { - public static class MappingExtensions - { - public static bool Ok(this GtxMessagingResponse gtxMessagingResponse) - => gtxMessagingResponse.TryGetValue("message-status", out var status) - && status?.ToString()?.ToLower() == "ok"; + /// + /// Determines whether the response indicates a successful "OK" message status. + /// + /// The response object to evaluate. + /// if the response contains a "message-status" key with a value of "ok" (case-insensitive); + /// otherwise, . + public static bool Ok(this GtxMessagingResponse gtxMessagingResponse) + => gtxMessagingResponse.TryGetValue("message-status", out var status) + && status?.ToString()?.ToLower() == "ok"; - public static string ToBase64String(this byte[] bytes) - => Convert.ToBase64String(bytes); - } + /// + /// Converts the specified byte array to its equivalent string representation encoded in base-64. + /// + /// The byte array to encode. + /// A base-64 encoded string representation of the input byte array. + public static string ToBase64String(this byte[] bytes) + => Convert.ToBase64String(bytes); } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQueryHandler.cs b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQueryHandler.cs index 95c650d5..91354492 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQueryHandler.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryQueryHandler.cs @@ -10,6 +10,7 @@ namespace EnvelopeGenerator.Application.Histories.Queries.Read; /// public class ReadHistoryQueryHandler : IRequestHandler> { + [Obsolete("Use IRepository")] private readonly IEnvelopeHistoryRepository _repository; private readonly IMapper _mapper; @@ -19,6 +20,7 @@ public class ReadHistoryQueryHandler : IRequestHandler /// /// + [Obsolete("Use IRepository")] public ReadHistoryQueryHandler(IEnvelopeHistoryRepository repository, IMapper mapper) { _repository = repository; @@ -41,4 +43,4 @@ public class ReadHistoryQueryHandler : IRequestHandler>(hists); } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryResponse.cs b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryResponse.cs index 3c0cd725..7957839b 100644 --- a/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryResponse.cs +++ b/EnvelopeGenerator.Application/Histories/Queries/Read/ReadHistoryResponse.cs @@ -20,7 +20,7 @@ public class ReadHistoryResponse /// /// Gets or sets the reference identifier of the user who performed the action. /// - public string UserReference { get; set; } + public required string UserReference { get; set; } /// /// Gets or sets the status code of the envelope. From 13899cf70ae931e3c75ae9d29a1d09600dabf6fc Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 13:59:18 +0200 Subject: [PATCH 04/15] Refactor ConfigDto class and update properties - Change namespace to `EnvelopeGenerator.Application.DTOs` - Remove `DocumentPath` property - Update `SignatureHost` to be a required string --- EnvelopeGenerator.Application/DTOs/ConfigDto.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs index 00ffb8dd..0745a55a 100644 --- a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs +++ b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs @@ -8,11 +8,6 @@ namespace EnvelopeGenerator.Application.DTOs; [ApiExplorerSettings(IgnoreApi = true)] public class ConfigDto { - /// - /// Gets or sets the path to the document. - /// - public string? DocumentPath { get; set; } - /// /// Gets or sets the sending profile identifier. /// @@ -21,7 +16,7 @@ public class ConfigDto /// /// Gets or sets the signature host URL or name. /// - public string? SignatureHost { get; set; } + public required string SignatureHost { get; set; } /// /// Gets or sets the name of the external program. From 532dc41004c1daf76aac45b488baac3a3cd83823 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:01:30 +0200 Subject: [PATCH 05/15] Remove DocumentPath, add SignatureHost to Config Removed the `DocumentPath` property from the `Config` class. Added a new required property `SignatureHost` of type `string`, mapped to the database column `SIGNATURE_HOST` (nvarchar(128)). Other properties remain unchanged. --- EnvelopeGenerator.Domain/Entities/Config.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/EnvelopeGenerator.Domain/Entities/Config.cs b/EnvelopeGenerator.Domain/Entities/Config.cs index 65d4263a..fe011b68 100644 --- a/EnvelopeGenerator.Domain/Entities/Config.cs +++ b/EnvelopeGenerator.Domain/Entities/Config.cs @@ -6,14 +6,12 @@ namespace EnvelopeGenerator.Domain.Entities [Table("TBSIG_CONFIG", Schema = "dbo")] public class Config { - [Column("DOCUMENT_PATH", TypeName = "nvarchar(256)")] - public string DocumentPath { get; set; } - [Column("SENDING_PROFILE", TypeName = "int")] [Required] public int SendingProfile { get; set; } [Column("SIGNATURE_HOST", TypeName = "nvarchar(128)")] + [Required] public string SignatureHost { get; set; } [Column("EXTERNAL_PROGRAM_NAME", TypeName = "nvarchar(30)")] From b9f5ae826ae162d7da44c07861b3ba23fb9edb07 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:05:36 +0200 Subject: [PATCH 06/15] Deprecate user service interfaces in controllers Added [Obsolete] attributes to _userService in AuthController, _repository in EmailTemplateController, and _userRepository in EnvelopeExecutor. These changes guide developers to transition to using MediatR and IRepository. --- EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs | 2 ++ .../Controllers/EmailTemplateController.cs | 4 +++- EnvelopeGenerator.Infrastructure/Executor/EnvelopeExecutor.cs | 3 +++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs index 812ddba9..1d7208b9 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/AuthController.cs @@ -16,6 +16,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers; public partial class AuthController : ControllerBase { private readonly ILogger _logger; + [Obsolete("Use MediatR")] private readonly IUserService _userService; private readonly IDirectorySearchService _dirSearchService; @@ -25,6 +26,7 @@ public partial class AuthController : ControllerBase /// The logger instance. /// The user service instance. /// The directory search service instance. + [Obsolete("Use MediatR")] public AuthController(ILogger logger, IUserService userService, IDirectorySearchService dirSearchService) { _logger = logger; diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs index 41927e85..bd1b47ab 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EmailTemplateController.cs @@ -27,6 +27,7 @@ public class EmailTemplateController : ControllerBase private readonly IMapper _mapper; + [Obsolete("Use IRepository")] private readonly IEmailTemplateRepository _repository; private readonly IMediator _mediator; @@ -38,6 +39,7 @@ public class EmailTemplateController : ControllerBase /// /// Die AutoMapper-Instanz, die zum Zuordnen von Objekten verwendet wird. /// + [Obsolete("Use IRepository")] public EmailTemplateController(IMapper mapper, IEmailTemplateRepository repository, ILogger logger, IMediator mediator) { _mapper = mapper; @@ -115,4 +117,4 @@ public class EmailTemplateController : ControllerBase return Ok(); } } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Executor/EnvelopeExecutor.cs b/EnvelopeGenerator.Infrastructure/Executor/EnvelopeExecutor.cs index c5147778..7b41ca79 100644 --- a/EnvelopeGenerator.Infrastructure/Executor/EnvelopeExecutor.cs +++ b/EnvelopeGenerator.Infrastructure/Executor/EnvelopeExecutor.cs @@ -12,13 +12,16 @@ namespace EnvelopeGenerator.Infrastructure.Executor; public class EnvelopeExecutor : SQLExecutor, IEnvelopeExecutor { + [Obsolete("Use IRepository")] private readonly IUserRepository _userRepository; + [Obsolete("Use IRepository")] public EnvelopeExecutor(IServiceProvider provider, IOptions sqlExecutorParamsOptions, IUserRepository userRepository) : base(provider, sqlExecutorParamsOptions) { _userRepository = userRepository; } + [Obsolete("Use IRepository")] public async Task CreateEnvelopeAsync(int userId, string title = "", string message = "", bool tfaEnabled = false, CancellationToken cancellation = default) { using var connection = new SqlConnection(Params.ConnectionString); From c453a1650ab30e18bc3d819b2423329ab3f317a4 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:06:26 +0200 Subject: [PATCH 07/15] Suppress obsolete warnings and update auth options Added pragma directives to suppress warnings for obsolete types when configuring user manager and envelope generator services. Also set a logout path and enabled sliding expiration for authentication options. --- EnvelopeGenerator.GeneratorAPI/Program.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 7cf0eaca..53b83c20 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -167,7 +167,9 @@ try }); // User manager +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddUserManager(); +#pragma warning restore CS0618 // Type or member is obsolete // LDAP builder.ConfigureBySection(); @@ -177,9 +179,11 @@ try builder.Services.AddCookieBasedLocalizer(); // Envelope generator serives +#pragma warning disable CS0618 // Type or member is obsolete builder.Services .AddEnvelopeGeneratorInfrastructureServices(sqlExecutorConfigureOptions: executor => executor.ConnectionString = connStr) .AddEnvelopeGeneratorServices(config); +#pragma warning restore CS0618 // Type or member is obsolete var app = builder.Build(); From 6930d7a43199906464adcc19bea59652028e40f6 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:07:39 +0200 Subject: [PATCH 08/15] Mark CommandManager as obsolete; add warning suppression Updated `CommandManager` to mark the `_envelopeReceiverService` field and its constructor as obsolete, recommending the use of `MediatR`. Added a new obsolete property `EnvelopeReceiver` for accessing the service. In `Program.cs`, added warning suppression for the obsolete member during command manager runner registration. --- EnvelopeGenerator.Terminal/CommandManager.cs | 5 ++++- EnvelopeGenerator.Terminal/Program.cs | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Terminal/CommandManager.cs b/EnvelopeGenerator.Terminal/CommandManager.cs index a593df00..c4fe43d7 100644 --- a/EnvelopeGenerator.Terminal/CommandManager.cs +++ b/EnvelopeGenerator.Terminal/CommandManager.cs @@ -13,9 +13,11 @@ public class CommandManager { WriteIndented = true }; + [Obsolete("Use MediatR")] private readonly IEnvelopeReceiverService _envelopeReceiverService; private readonly IMediator _mediator; + [Obsolete("Use MediatR")] public CommandManager(IEnvelopeReceiverService envelopeReceiverService, IMediator mediator) { _envelopeReceiverService = envelopeReceiverService; @@ -29,6 +31,7 @@ public class CommandManager Console.WriteLine($"v{Assembly.GetExecutingAssembly().GetName().Version}"); } + [Obsolete("Use MediatR")] [Subcommand] public IEnvelopeReceiverService EnvelopeReceiver => _envelopeReceiverService; @@ -55,4 +58,4 @@ public class CommandManager File.WriteAllBytes(path, document?.ByteData ?? Array.Empty()); } } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Terminal/Program.cs b/EnvelopeGenerator.Terminal/Program.cs index 09f61cbd..645f3dd0 100644 --- a/EnvelopeGenerator.Terminal/Program.cs +++ b/EnvelopeGenerator.Terminal/Program.cs @@ -15,7 +15,9 @@ public class Program var config = builder.Configuration; +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddCommandManagerRunner(config); +#pragma warning restore CS0618 // Type or member is obsolete var app = builder.Build(); From 6aeba4d1e727f36531a2f09204c9e564632fed75 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:11:56 +0200 Subject: [PATCH 09/15] Deprecate methods and streamline controller code Added [Obsolete("Use MediatR")] attribute to several methods across `DocumentController`, `HomeController`, `TestConfigController`, `TestDocumentReceiverElementController`, and `TestEnvelopeController` to indicate they should no longer be used. Refactored constructors in `TestConfigController` and `TestEnvelopeController` to remove unnecessary empty blocks. Improved formatting and structure of the `GetAll` method in `TestEnvelopeController` for better clarity while maintaining functionality. Updated `Program.cs` to suppress warnings about obsolete types/members during service registrations, indicating a transition to newer implementations. --- .../Controllers/DocumentController.cs | 2 + .../Controllers/HomeController.cs | 3 + .../Controllers/Test/TestConfigController.cs | 10 +-- .../TestDocumentReceiverElementController.cs | 1 + .../Test/TestEnvelopeController.cs | 76 +++++++++---------- EnvelopeGenerator.Web/Program.cs | 9 +++ 6 files changed, 58 insertions(+), 43 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/DocumentController.cs b/EnvelopeGenerator.Web/Controllers/DocumentController.cs index 704559a2..52fb384c 100644 --- a/EnvelopeGenerator.Web/Controllers/DocumentController.cs +++ b/EnvelopeGenerator.Web/Controllers/DocumentController.cs @@ -26,6 +26,7 @@ public class DocumentController : BaseController _envDocService = envDocService; } + [Obsolete("Use MediatR")] [NonAction] public async Task Get([FromRoute] string envelopeKey, [FromQuery] int index) { @@ -53,6 +54,7 @@ public class DocumentController : BaseController [Authorize(Roles = ReceiverRole.FullyAuth)] [HttpPost("{envelopeKey}")] + [Obsolete("Use MediatR")] public async Task Open(string envelopeKey) { try diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 20ebf021..cf6a2446 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -171,6 +171,7 @@ public class HomeController : ViewControllerBase } } + [Obsolete("Use MediatR")] private async Task CreateShowEnvelopeView(string envelopeReceiverId, EnvelopeReceiverDto er) { try @@ -259,6 +260,7 @@ public class HomeController : ViewControllerBase } } + [Obsolete("Use MediatR")] [NonAction] private async Task HandleAccessCodeAsync(Auth auth, EnvelopeReceiverSecretDto er_secret, string envelopeReceiverId) { @@ -331,6 +333,7 @@ public class HomeController : ViewControllerBase #endregion [HttpPost("EnvelopeKey/{envelopeReceiverId}/Locked")] + [Obsolete("Use MediatR")] public async Task LogInEnvelope([FromRoute] string envelopeReceiverId, [FromForm] Auth auth) { try diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs index e9b27a37..10ccd4b2 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs @@ -3,13 +3,13 @@ using EnvelopeGenerator.Domain.Entities; using DigitalData.Core.API; using EnvelopeGenerator.Application.Contracts.Services; -namespace EnvelopeGenerator.Web.Controllers.Test +namespace EnvelopeGenerator.Web.Controllers.Test; + +[Obsolete("Use MediatR")] +public class TestConfigController : ReadControllerBase { - public class TestConfigController : ReadControllerBase + public TestConfigController(ILogger logger, IConfigService service) : base(logger, service) { - public TestConfigController(ILogger logger, IConfigService service) : base(logger, service) - { - } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestDocumentReceiverElementController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestDocumentReceiverElementController.cs index 0dbe820d..0de8610d 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestDocumentReceiverElementController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestDocumentReceiverElementController.cs @@ -4,6 +4,7 @@ using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Web.Controllers.Test; +[Obsolete("Use MediatR")] public class TestDocumentReceiverElementController : TestControllerBase { public TestDocumentReceiverElementController(ILogger logger, IDocumentReceiverElementService service) : base(logger, service) diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeController.cs index 24118798..4a5394d1 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeController.cs @@ -4,53 +4,53 @@ using Microsoft.AspNetCore.Mvc; using EnvelopeGenerator.Extensions; using EnvelopeGenerator.Application.Contracts.Services; -namespace EnvelopeGenerator.Web.Controllers.Test +namespace EnvelopeGenerator.Web.Controllers.Test; + +[Obsolete("Use MediatR")] +public class TestEnvelopeController : TestControllerBase { - public class TestEnvelopeController : TestControllerBase + public TestEnvelopeController(ILogger logger, IEnvelopeService service) : base(logger, service) { - public TestEnvelopeController(ILogger logger, IEnvelopeService service) : base(logger, service) - { - } + } - [NonAction] - public override Task GetAll() => base.GetAll(); + [NonAction] + public override Task GetAll() => base.GetAll(); - [HttpGet] - public async Task GetAll([FromQuery] string? envelopeKey = default, [FromQuery] bool withDocuments = false, [FromQuery] bool withHistory = false, [FromQuery] bool withDocumentReceiverElement = false, [FromQuery] bool withUser = false, [FromQuery] bool withAll = true) + [HttpGet] + public async Task GetAll([FromQuery] string? envelopeKey = default, [FromQuery] bool withDocuments = false, [FromQuery] bool withHistory = false, [FromQuery] bool withDocumentReceiverElement = false, [FromQuery] bool withUser = false, [FromQuery] bool withAll = true) + { + if (envelopeKey is not null) { - if(envelopeKey is not null) - { - (var uuid, var signature) = envelopeKey.DecodeEnvelopeReceiverId(); - if (uuid is null) - return BadRequest("UUID is null"); - var envlopeServiceResult = await _service.ReadByUuidAsync( - uuid: uuid, - withDocuments: withDocuments, withHistory: withHistory, withDocumentReceiverElement:withDocumentReceiverElement, withUser:withUser, withAll:withAll); + (var uuid, var signature) = envelopeKey.DecodeEnvelopeReceiverId(); + if (uuid is null) + return BadRequest("UUID is null"); + var envlopeServiceResult = await _service.ReadByUuidAsync( + uuid: uuid, + withDocuments: withDocuments, withHistory: withHistory, withDocumentReceiverElement: withDocumentReceiverElement, withUser: withUser, withAll: withAll); - if (envlopeServiceResult.IsSuccess) - { - return Ok(envlopeServiceResult.Data); - } - return NotFound(); - } - - var result = await _service.ReadAllWithAsync(documents: withDocuments, history: withHistory); - if (result.IsSuccess) + if (envlopeServiceResult.IsSuccess) { - return Ok(result); + return Ok(envlopeServiceResult.Data); } - return NotFound(result); + return NotFound(); } - [HttpGet("decode")] - public IActionResult DecodeEnvelopeReceiverId(string envelopeReceiverId, int type = 0) + var result = await _service.ReadAllWithAsync(documents: withDocuments, history: withHistory); + if (result.IsSuccess) + { + return Ok(result); + } + return NotFound(result); + } + + [HttpGet("decode")] + public IActionResult DecodeEnvelopeReceiverId(string envelopeReceiverId, int type = 0) + { + return type switch { - return type switch - { - 1 => Ok(envelopeReceiverId.GetEnvelopeUuid()), - 2 => Ok(envelopeReceiverId.GetReceiverSignature()), - _ => Ok(envelopeReceiverId.DecodeEnvelopeReceiverId()), - }; - } - } + 1 => Ok(envelopeReceiverId.GetEnvelopeUuid()), + 2 => Ok(envelopeReceiverId.GetReceiverSignature()), + _ => Ok(envelopeReceiverId.DecodeEnvelopeReceiverId()), + }; + } } \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Program.cs b/EnvelopeGenerator.Web/Program.cs index 4ec51cf8..e6df2f8f 100644 --- a/EnvelopeGenerator.Web/Program.cs +++ b/EnvelopeGenerator.Web/Program.cs @@ -98,6 +98,7 @@ try }); // Add envelope generator services +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddEnvelopeGeneratorInfrastructureServices((provider, options) => { var logger = provider.GetRequiredService>(); @@ -106,8 +107,11 @@ try .EnableSensitiveDataLogging() .EnableDetailedErrors(); }); +#pragma warning restore CS0618 // Type or member is obsolete +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddEnvelopeGeneratorServices(config); +#pragma warning restore CS0618 // Type or member is obsolete builder.Services.Configure(options => { @@ -174,7 +178,10 @@ try builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); // Register mail services +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddScoped(); +#pragma warning restore CS0618 // Type or member is obsolete + builder.Services.AddDispatcher(); builder.Services.AddMemoryCache(); @@ -183,7 +190,9 @@ try builder.ConfigureBySection(); +#pragma warning disable CS0618 // Type or member is obsolete builder.Services.AddUserManager(); +#pragma warning restore CS0618 // Type or member is obsolete var app = builder.Build(); From 425d21084bf0d3b2e560cac497a7b6a5d7d696f4 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:13:36 +0200 Subject: [PATCH 10/15] Refactor TestSanitizeController for improved clarity - Updated namespace for consistency. - Changed constructor and method parameters to non-nullable strings. - Enhanced method signatures for `Sanitize` and `Encoder`. - Improved overall class structure and formatting for better readability. --- .../Test/TestSanitizeController.cs | 56 +++++++++---------- 1 file changed, 27 insertions(+), 29 deletions(-) diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestSanitizeController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestSanitizeController.cs index 5ea4e3be..43479724 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestSanitizeController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestSanitizeController.cs @@ -2,36 +2,34 @@ using Microsoft.AspNetCore.Mvc; using System.Text.Encodings.Web; -namespace EnvelopeGenerator.Web.Controllers.Test -{ - [ApiController] - [Route("api/test/[controller]")] - public class TestSanitizeController : ControllerBase - { - private readonly HtmlEncoder _htmlEncoder; - private readonly HtmlSanitizer _sanitizer; +namespace EnvelopeGenerator.Web.Controllers.Test; - public TestSanitizeController(HtmlEncoder htmlEncoder, HtmlSanitizer sanitizer) - { - _htmlEncoder = htmlEncoder; - _sanitizer = sanitizer; - } +[ApiController] +[Route("api/test/[controller]")] +public class TestSanitizeController : ControllerBase +{ + private readonly HtmlEncoder _htmlEncoder; + private readonly HtmlSanitizer _sanitizer; - [HttpGet("sanitize")] - public IActionResult Sanitize([FromQuery] string? input = null) => Ok(new - { - input, - Sanitized = _sanitizer.Sanitize(input), - SanitizedDocument = _sanitizer.SanitizeDocument(input), - SanitizedDom = _sanitizer.SanitizeDom(input) - }); + public TestSanitizeController(HtmlEncoder htmlEncoder, HtmlSanitizer sanitizer) + { + _htmlEncoder = htmlEncoder; + _sanitizer = sanitizer; + } + [HttpGet("sanitize")] + public IActionResult Sanitize([FromQuery] string input) => Ok(new + { + input, + Sanitized = _sanitizer.Sanitize(input), + SanitizedDocument = _sanitizer.SanitizeDocument(input), + SanitizedDom = _sanitizer.SanitizeDom(input) + }); - [HttpGet("encode")] - public IActionResult Encoder([FromQuery] string? input = null) => Ok(new - { - input, - Encoded = _htmlEncoder.Encode(input) - }); - } -} + [HttpGet("encode")] + public IActionResult Encoder([FromQuery] string input) => Ok(new + { + input, + Encoded = _htmlEncoder.Encode(input) + }); +} \ No newline at end of file From 35f46d3182c30ceaa7b36d5e43a1f0e78d6b967d Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:23:00 +0200 Subject: [PATCH 11/15] Remove UserReceiver repository and related entities This commit removes the `IUserReceiverRepository` service registration from `DIExtensions`, indicating it is no longer needed. The `UserReceiver` and `Config` DbSet properties have been eliminated from the `EGDbContext`, along with their initialization in the constructor. Additionally, the `UserReceiver` entity has been removed from the model builder configuration and the associated trigger has been deleted. These changes reflect a refactoring of the data model to simplify the architecture and improve maintainability. --- EnvelopeGenerator.Infrastructure/DependencyExtensions.cs | 1 - EnvelopeGenerator.Infrastructure/EGDbContext.cs | 5 ----- 2 files changed, 6 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs b/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs index aabeafa6..12033841 100644 --- a/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs +++ b/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs @@ -53,7 +53,6 @@ public static class DIExtensions services.TryAddScoped(); services.TryAddScoped(); services.TryAddScoped(); - services.TryAddScoped(); services.TryAddScoped(); services.AddDbRepository(context => context.Configs).UseAutoMapper(); diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index 89bf900f..177143d4 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -17,8 +17,6 @@ namespace EnvelopeGenerator.Infrastructure; //TODO: Adding EmailOut instead of EmailOut.Abst is not correct for the arch. Re-design EmailPut consedering this. IMailDbContext shoud move to Abstraction layer (hint: in this case using DBSet in abst. will be problem because entity framework will have to be added. public class EGDbContext : DbContext, IUserManagerDbContext, IMailDbContext { - public DbSet UserReceivers { get; set; } - public DbSet Configs { get; set; } public DbSet EnvelopeReceivers { get; set; } @@ -68,7 +66,6 @@ public class EGDbContext : DbContext, IUserManagerDbContext, IMailDbContext _triggers = triggerParamOptions.Value; _logger = logger; - UserReceivers = Set(); Configs = Set(); EnvelopeReceivers = Set(); Envelopes = Set(); @@ -106,7 +103,6 @@ public class EGDbContext : DbContext, IUserManagerDbContext, IMailDbContext modelBuilder.Entity(); modelBuilder.Entity(); modelBuilder.Entity(); - modelBuilder.Entity(); modelBuilder.Entity(); // Configure the one-to-many relationship of Envelope @@ -171,7 +167,6 @@ public class EGDbContext : DbContext, IUserManagerDbContext, IMailDbContext AddTrigger(); AddTrigger(); AddTrigger(); - AddTrigger(); AddTrigger(); //configure model builder for user manager tables From 47d190d9eac7b81275b1a4a3501ce20f719855ff Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:23:20 +0200 Subject: [PATCH 12/15] Remove UserReceiver repository registration --- EnvelopeGenerator.Infrastructure/DependencyExtensions.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs b/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs index 12033841..272400fa 100644 --- a/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs +++ b/EnvelopeGenerator.Infrastructure/DependencyExtensions.cs @@ -66,7 +66,6 @@ public static class DIExtensions services.AddDbRepository(context => context.EnvelopeReceivers).UseAutoMapper(); services.AddDbRepository(context => context.EnvelopeTypes).UseAutoMapper(); services.AddDbRepository(context => context.Receivers).UseAutoMapper(); - services.AddDbRepository(context => context.UserReceivers).UseAutoMapper(); services.AddDbRepository(context => context.EnvelopeReceiverReadOnlys).UseAutoMapper(); services.AddSQLExecutor(); From f5418499a74b244ec6fd3f1250855a0eca3bbe94 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:25:32 +0200 Subject: [PATCH 13/15] Refactor envelope generator service registration --- EnvelopeGenerator.Terminal/DependencyInjection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Terminal/DependencyInjection.cs b/EnvelopeGenerator.Terminal/DependencyInjection.cs index 60561ac3..be1e535d 100644 --- a/EnvelopeGenerator.Terminal/DependencyInjection.cs +++ b/EnvelopeGenerator.Terminal/DependencyInjection.cs @@ -28,7 +28,7 @@ public static class DependencyInjection }); // Add envelope generator services - services.AddEnvelopeGeneratorInfrastructureServices(options => options.UseSqlServer(connStr)); + services.AddEnvelopeGeneratorInfrastructureServices((provider, options) => options.UseSqlServer(connStr)); return services .AddSingleton() From 902848958d7f605481c9bd47c9a4286f2f6684d4 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:26:26 +0200 Subject: [PATCH 14/15] Refactor empty array initialization --- EnvelopeGenerator.GeneratorAPI/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index 53b83c20..fbc06fd9 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -93,7 +93,7 @@ try Id = "Bearer" } }, - new string[] {} + Array.Empty() } }); From 9158933333737fb363086307d536d541df1da3e1 Mon Sep 17 00:00:00 2001 From: TekH Date: Mon, 30 Jun 2025 14:36:55 +0200 Subject: [PATCH 15/15] Refactor security key handling and culture info setup Updated `IssuerSigningKeyResolver` to use array syntax for returning security keys. Changed supported culture names declaration to use square brackets and modified the creation of the `CultureInfo` list to utilize the spread operator. Adjusted exception handling to throw `InvalidOperationException` when no supported culture is found. --- EnvelopeGenerator.GeneratorAPI/Program.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Program.cs b/EnvelopeGenerator.GeneratorAPI/Program.cs index fbc06fd9..02390820 100644 --- a/EnvelopeGenerator.GeneratorAPI/Program.cs +++ b/EnvelopeGenerator.GeneratorAPI/Program.cs @@ -129,7 +129,7 @@ try { var clientParams = deferredProvider.GetOptions(); var publicKey = clientParams!.PublicKeys.Get(authTokenKeys.Issuer, authTokenKeys.Audience); - return new List() { publicKey.SecurityKey }; + return [publicKey.SecurityKey]; }, ValidateIssuer = true, ValidIssuer = authTokenKeys.Issuer, @@ -205,10 +205,10 @@ try app.UseCors("AllowSpecificOriginsPolicy"); // Localizer - string[] supportedCultureNames = { "de-DE", "en-US" }; - IList list = supportedCultureNames.Select((string cn) => new CultureInfo(cn)).ToList(); - CultureInfo cultureInfo = list.FirstOrDefault() ?? throw new ArgumentNullException("supportedCultureNames", "Supported cultures cannot be empty."); - RequestLocalizationOptions requestLocalizationOptions = new RequestLocalizationOptions + string[] supportedCultureNames = ["de-DE", "en-US"]; + IList list = [.. supportedCultureNames.Select(cn => new CultureInfo(cn))]; + var cultureInfo = list.FirstOrDefault() ?? throw new InvalidOperationException("There is no supported culture."); + var requestLocalizationOptions = new RequestLocalizationOptions { SupportedCultures = list, SupportedUICultures = list