From a0a5568d9394060e86a32b34b0e98b5cdafcdf7b Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 29 Aug 2024 16:04:19 +0200 Subject: [PATCH 01/46] =?UTF-8?q?feat(repository):=20Methode=20ReadLastByR?= =?UTF-8?q?eceiver=20zu=20IEnvelopeReceiverRepository=20und=20EnvelopeRece?= =?UTF-8?q?iverRepository=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Methode `ReadLastByReceiver` zum Interface `IEnvelopeReceiverRepository` hinzugefügt. - Methode `ReadLastByReceiver` in `EnvelopeReceiverRepository` implementiert, um den letzten `EnvelopeReceiver` anhand der E-Mail-Adresse abzurufen. --- .../Contracts/IEnvelopeReceiverRepository.cs | 2 ++ .../Repositories/EnvlopeReceiverRepository.cs | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs index 219e64eb..8bcd8dd1 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs @@ -20,5 +20,7 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task ReadAccessCodeByIdAsync(int envelopeId, int receiverId); Task> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); + + Task ReadLastByReceiver(string email); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index 10b7012b..6f3e82f2 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; @@ -76,5 +75,10 @@ namespace EnvelopeGenerator.Infrastructure.Repositories return await query.Include(er => er.Envelope).Include(er => er.Receiver).ToListAsync(); } + + public async Task ReadLastByReceiver(string email) + { + return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).LastOrDefaultAsync(); + } } } \ No newline at end of file From 1ededc1f6421dba60ceb21dc342557ff6c427716 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 29 Aug 2024 16:57:45 +0200 Subject: [PATCH 02/46] feat(service): add ReadLastUsedReceiverNameByMail method to IEnvelopeReceiverService and EnvelopeReceiverService - Added `ReadLastUsedReceiverNameByMail` method to `IEnvelopeReceiverService` interface. - Implemented `ReadLastUsedReceiverNameByMail` method in `EnvelopeReceiverService` to retrieve the last used receiver's name by email and handle results with `DataResult`. --- .../Contracts/IEnvelopeReceiverService.cs | 2 ++ .../EnvelopeGenerator.Application.csproj | 2 +- .../Services/EnvelopeReceiverService.cs | 6 ++++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index 6403d207..38c8f2b6 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -25,5 +25,7 @@ namespace EnvelopeGenerator.Application.Contracts Task> IsExisting(string envelopeReceiverId); Task>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); + + Task> ReadLastUsedReceiverNameByMail(string mail); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index 1704c760..2d9f8fd7 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -14,7 +14,7 @@ - + diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index a244c19a..11baafc0 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -122,5 +122,11 @@ namespace EnvelopeGenerator.Application.Services var dto_list = _mapper.MapOrThrow>(er_list); return Result.Success(dto_list); } + + public async Task> ReadLastUsedReceiverNameByMail(string mail) + { + var er = await _repository.ReadLastByReceiver(mail); + return er is null ? Result.Fail().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name); + } } } \ No newline at end of file From 88314368097bd0f5e46d38fa1519759130162202 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 29 Aug 2024 17:15:00 +0200 Subject: [PATCH 03/46] feat(controller): add endpoint to retrieve last used receiver name by email - Implemented `Get` endpoint in `EnvelopeReceiverController` to fetch the last used receiver's name by email. - Added handling for successful and failed responses, including proper status codes and logging. --- .../Controllers/EnvelopeReceiverController.cs | 27 +++++++++++++++++-- .../Repositories/EnvlopeReceiverRepository.cs | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index bf8e2cb2..faa85852 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -6,6 +6,7 @@ using Microsoft.AspNetCore.Mvc; namespace EnvelopeGenerator.GeneratorAPI.Controllers { [Route("api/[controller]")] + [Authorize] [ApiController] public class EnvelopeReceiverController : ControllerBase { @@ -17,8 +18,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers _logger = logger; _erService = envelopeReceiverService; } - - [Authorize] + [HttpGet] public async Task GetEnvelopeReceiver([FromQuery] int? min_status = null, [FromQuery] int? max_status = null, [FromQuery] int[]? ignore_status = null) { @@ -49,5 +49,28 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers return new StatusCodeResult(StatusCodes.Status500InternalServerError); } } + + [HttpGet("receiver-name/{mail}")] + public async Task GetReceiverName([FromRoute] string mail) + { + try + { + return await _erService.ReadLastUsedReceiverNameByMail(mail).ThenAsync( + Success: res => res is null ? Ok(string.Empty) : Ok(res), + Fail: IActionResult (msg, ntc) => + { + if (ntc.HasFlag(Flag.NotFound)) + return NotFound(); + + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + } + catch(Exception ex) + { + _logger.LogError(ex, "{message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index 6f3e82f2..e7ca8393 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -78,7 +78,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories public async Task ReadLastByReceiver(string email) { - return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).LastOrDefaultAsync(); + return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); } } } \ No newline at end of file From a011b677ea70e56a50d1cd546ceb90c0c20fd93b Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 30 Aug 2024 11:27:36 +0200 Subject: [PATCH 04/46] refactor: `EnvelopeReceiver`-Klasse refaktoriert, um eine Endlosschleife zu verhindern und die Datenabfrage zu verbessern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `EnvelopeReceiver` in `EnvelopeReceiver` und `EnvelopeReceiverBase` aufgeteilt, um zirkuläre Abhängigkeiten zu vermeiden. - `EnvelopeReceiverBasicDto` für vereinfachte Datenübertragungsobjekte erstellt. - `ReceiverRepository` aktualisiert, um den zuletzt verwendeten Empfängernamen durch das Laden aktueller `EnvelopeReceiver`-Daten einzubeziehen. - `ReceiverReadDto` angepasst, um `LastUsedName` zu erhalten und `EnvelopeReceivers` für die JSON-Serialisierung zu ignorieren. --- .../Contracts/IEnvelopeMailService.cs | 2 +- .../Contracts/IEnvelopeReceiverService.cs | 2 +- .../EnvelopeReceiverBasicDto.cs | 26 +++++++++++ .../EnvelopeReceiver/EnvelopeReceiverDto.cs | 11 +++++ .../DTOs/EnvelopeReceiverDto.cs | 31 ------------- .../DTOs/Receiver/ReceiverReadDto.cs | 12 +++++- .../MappingProfiles/BasicDtoMappingProfile.cs | 2 + .../Services/EnvelopeMailService.cs | 4 +- .../Services/EnvelopeReceiverService.cs | 2 +- .../Entities/EnvelopeReceiver.cs | 39 +---------------- .../Entities/EnvelopeReceiverBase.cs | 43 +++++++++++++++++++ EnvelopeGenerator.Domain/Entities/Receiver.cs | 2 + .../Repositories/ReceiverRepository.cs | 8 +++- .../Controllers/HomeController.cs | 2 +- .../Test/TestEnvelopeMailController.cs | 4 +- .../Test/TestEnvelopeReceiverController.cs | 2 +- .../Views/Home/EnvelopeRejected.cshtml | 8 ++-- .../Views/Home/ShowEnvelope.cshtml | 8 ++-- 18 files changed, 120 insertions(+), 88 deletions(-) create mode 100644 EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs create mode 100644 EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs delete mode 100644 EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs create mode 100644 EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs index f4b00369..f57967f2 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeMailService.cs @@ -1,6 +1,6 @@ using DigitalData.Core.DTO; using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Common; namespace EnvelopeGenerator.Application.Contracts diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index 38c8f2b6..d565d39a 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -1,6 +1,6 @@ using DigitalData.Core.Abstractions.Application; using DigitalData.Core.DTO; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.Contracts diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs new file mode 100644 index 00000000..7590df6e --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs @@ -0,0 +1,26 @@ +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +{ + public record EnvelopeReceiverBasicDto() + { + public int EnvelopeId { get; init; } + + public int ReceiverId { get; init; } + + public int Sequence { get; init; } + + [TemplatePlaceholder("[NAME_RECEIVER]")] + public string? Name { get; init; } + + public string? JobTitle { get; init; } + + public string? CompanyName { get; init; } + + public string? PrivateMessage { get; init; } + + public DateTime AddedWhen { get; init; } + + public DateTime? ChangedWhen { get; init; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs new file mode 100644 index 00000000..49625eee --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverDto.cs @@ -0,0 +1,11 @@ +using EnvelopeGenerator.Application.DTOs.Receiver; + +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +{ + public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto() + { + public EnvelopeDto? Envelope { get; set; } + + public ReceiverReadDto? Receiver { get; set; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs deleted file mode 100644 index e2fbcdca..00000000 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiverDto.cs +++ /dev/null @@ -1,31 +0,0 @@ -using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; -using EnvelopeGenerator.Application.DTOs.Receiver; - -namespace EnvelopeGenerator.Application.DTOs -{ - public record EnvelopeReceiverDto() - { - public int EnvelopeId { get; set; } - - public int ReceiverId { get; set; } - - public int Sequence { get; set; } - - [TemplatePlaceholder("[NAME_RECEIVER]")] - public string? Name { get; set; } - - public string? JobTitle { get; set; } - - public string? CompanyName { get; set; } - - public string? PrivateMessage { get; set; } - - public DateTime AddedWhen { get; set; } - - public DateTime? ChangedWhen { get; set; } - - public EnvelopeDto? Envelope { get; set; } - - public ReceiverReadDto? Receiver { get; set; } - } -} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs index 4c5d5c69..ec6e5b76 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverReadDto.cs @@ -1,4 +1,6 @@ using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using System.Text.Json.Serialization; namespace EnvelopeGenerator.Application.DTOs.Receiver { @@ -6,6 +8,12 @@ namespace EnvelopeGenerator.Application.DTOs.Receiver int Id, string EmailAddress, string Signature, - DateTime AddedWhen - ) : BaseDTO(Id); + DateTime AddedWhen + ) : BaseDTO(Id) + { + [JsonIgnore] + public IEnumerable? EnvelopeReceivers { get; init; } + + public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name; + }; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs index df3637da..59c89c0b 100644 --- a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs +++ b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs @@ -1,6 +1,7 @@ using AutoMapper; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; @@ -43,6 +44,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs index 59f83118..296ad932 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeMailService.cs @@ -5,7 +5,7 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.DTOs.EmailOut; using DigitalData.EmailProfilerDispatcher.Abstraction.Services; using DigitalData.UserManager.Application; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Common; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; @@ -14,7 +14,7 @@ using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.Services { - public class EnvelopeMailService : EmailOutService, IEnvelopeMailService + public class EnvelopeMailService : EmailOutService, IEnvelopeMailService { private readonly IEmailTemplateService _tempService; private readonly IEnvelopeReceiverService _envRcvService; diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index 11baafc0..e57a1729 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -2,7 +2,7 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs index beef339d..e1374b3e 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiver.cs @@ -1,45 +1,10 @@ -using System.ComponentModel.DataAnnotations; -using System.ComponentModel.DataAnnotations.Schema; +using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] - public class EnvelopeReceiver + public class EnvelopeReceiver : EnvelopeReceiverBase { - [Key] - [Column("ENVELOPE_ID")] - public int EnvelopeId { get; set; } - - [Key] - [Column("RECEIVER_ID")] - public int ReceiverId { get; set; } - - [Required] - [Column("SEQUENCE")] - public int Sequence { get; set; } - - [Column("NAME", TypeName = "nvarchar(128)")] - public string? Name { get; set; } - - [Column("JOB_TITLE", TypeName = "nvarchar(128)")] - public string? JobTitle { get; set; } - - [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] - public string? CompanyName { get; set; } - - [Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")] - public string? PrivateMessage { get; set; } - - [Column("ACCESS_CODE", TypeName = "nvarchar(64)")] - public string? AccessCode { get; set; } - - [Required] - [Column("ADDED_WHEN", TypeName = "datetime")] - public DateTime AddedWhen { get; set; } - - [Column("CHANGED_WHEN", TypeName = "datetime")] - public DateTime? ChangedWhen { get; set; } - [ForeignKey("EnvelopeId")] public Envelope? Envelope { get; set; } diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs new file mode 100644 index 00000000..7669389d --- /dev/null +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs @@ -0,0 +1,43 @@ +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; + +namespace EnvelopeGenerator.Domain.Entities +{ + [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] + public class EnvelopeReceiverBase + { + [Key] + [Column("ENVELOPE_ID")] + public int EnvelopeId { get; set; } + + [Key] + [Column("RECEIVER_ID")] + public int ReceiverId { get; set; } + + [Required] + [Column("SEQUENCE")] + public int Sequence { get; set; } + + [Column("NAME", TypeName = "nvarchar(128)")] + public string? Name { get; set; } + + [Column("JOB_TITLE", TypeName = "nvarchar(128)")] + public string? JobTitle { get; set; } + + [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] + public string? CompanyName { get; set; } + + [Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")] + public string? PrivateMessage { get; set; } + + [Column("ACCESS_CODE", TypeName = "nvarchar(64)")] + public string? AccessCode { get; set; } + + [Required] + [Column("ADDED_WHEN", TypeName = "datetime")] + public DateTime AddedWhen { get; set; } + + [Column("CHANGED_WHEN", TypeName = "datetime")] + public DateTime? ChangedWhen { get; set; } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/Receiver.cs b/EnvelopeGenerator.Domain/Entities/Receiver.cs index bfb91c9c..ce354483 100644 --- a/EnvelopeGenerator.Domain/Entities/Receiver.cs +++ b/EnvelopeGenerator.Domain/Entities/Receiver.cs @@ -22,5 +22,7 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("ADDED_WHEN", TypeName = "datetime")] public DateTime AddedWhen { get; set; } + + public IEnumerable? EnvelopeReceivers { get; init; } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs index 53ffb2ba..1d8f626d 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs @@ -11,7 +11,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { } - protected IQueryable ReadBy(string? emailAddress = null, string? signature = null) + protected IQueryable ReadBy(string? emailAddress = null, string? signature = null, bool withLastUsedName = true) { IQueryable query = _dbSet.AsNoTracking(); @@ -21,6 +21,12 @@ namespace EnvelopeGenerator.Infrastructure.Repositories if(signature is not null) query = query.Where(r => r.Signature == signature); + // envelope receivers are ignored (with '[JsonIgnore]' attribute). The reson to add them is to get the las used receiver name + if (withLastUsedName) + { + query = query.Include(r => r.EnvelopeReceivers!.OrderByDescending(er => er.EnvelopeId).Take(1)); + } + return query; } diff --git a/EnvelopeGenerator.Web/Controllers/HomeController.cs b/EnvelopeGenerator.Web/Controllers/HomeController.cs index 98c5b69a..46f12d7f 100644 --- a/EnvelopeGenerator.Web/Controllers/HomeController.cs +++ b/EnvelopeGenerator.Web/Controllers/HomeController.cs @@ -10,11 +10,11 @@ using DigitalData.Core.API; using EnvelopeGenerator.Application; using Microsoft.Extensions.Localization; using DigitalData.Core.DTO; -using EnvelopeGenerator.Application.DTOs; using Microsoft.AspNetCore.Localization; using System.Text.Encodings.Web; using EnvelopeGenerator.Web.Models; using EnvelopeGenerator.Application.Resources; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; namespace EnvelopeGenerator.Web.Controllers { diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs index 2840c53f..47f958b2 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeMailController.cs @@ -1,12 +1,12 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; using Microsoft.AspNetCore.Mvc; using System.Net; namespace EnvelopeGenerator.Web.Controllers.Test { - [ApiController] + [ApiController] [Route("api/test/[controller]")] public class TestEnvelopeMailController : ControllerBase { diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs index c4a09eb7..a88a8887 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs @@ -1,10 +1,10 @@ using DigitalData.Core.API; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; -using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application; using EnvelopeGenerator.Domain.Entities; using Microsoft.AspNetCore.Mvc; +using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; namespace EnvelopeGenerator.Web.Controllers.Test { diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml index c007d932..d927d11d 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml @@ -4,10 +4,10 @@ @{ var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@using DigitalData.Core.DTO; -@using EnvelopeGenerator.Application.DTOs; -@using Newtonsoft.Json -@using Newtonsoft.Json.Serialization +@ using DigitalData.Core.DTO; +@ using EnvelopeGenerator.Application.DTOs; +@ using Newtonsoft.Json +@ using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; @{ diff --git a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml index d1d9ad58..fd46d857 100644 --- a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml @@ -1,10 +1,10 @@ @{ var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@using DigitalData.Core.DTO; -@using EnvelopeGenerator.Application.DTOs; -@using Newtonsoft.Json -@using Newtonsoft.Json.Serialization +@ using DigitalData.Core.DTO; +@ using EnvelopeGenerator.Application.DTOs; +@ using Newtonsoft.Json +@ using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; @{ ViewData["Title"] = _localizer[WebKey.SignDoc]; From d347ec420cbd4f9a4a82e637c0e2d13c402db457 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 30 Aug 2024 11:58:00 +0200 Subject: [PATCH 05/46] =?UTF-8?q?feat:=20`ReadAllAsync`-Methode=20zur=20`R?= =?UTF-8?q?eceiverRepository`=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `ReadAllAsync`-Methode hinzugefügt, um alle `Receiver`-Entitäten asynchron zurückzugeben. - Stellt sicher, dass alle Empfänger abgerufen werden, während die vorhandene Abfragelogik mit `ReadBy` erhalten bleibt. --- .../Repositories/ReceiverRepository.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs index 1d8f626d..91d6e812 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs @@ -31,5 +31,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories } public async Task ReadByAsync(string? emailAddress = null, string? signature = null) => await ReadBy(emailAddress, signature).FirstOrDefaultAsync(); + + public async override Task> ReadAllAsync() => await ReadBy().ToListAsync(); } } \ No newline at end of file From 6e3bb6c3a070c0df841c88fda3299517eefa833d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 30 Aug 2024 22:25:13 +0200 Subject: [PATCH 06/46] feat: Enhance receiver input and table components - Updated `ReceiverInputComponent` to support optional index parameter in the `filter` function to manage email input logic more effectively. - Added `last_used_name` functionality in `ReceiverTableComponent` to auto-fill names based on the last used email name. - Implemented email duplication prevention logic in `ReceiverTableComponent` to ensure unique email inputs. - Refactored component lifecycle methods and data handling for improved performance and user experience. --- .../receiver-input.component.ts | 6 ++-- .../receiver-table.component.html | 4 +-- .../receiver-table.component.ts | 32 ++++++++++++++----- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-input/receiver-input.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-input/receiver-input.component.ts index e01eb995..376cb002 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-input/receiver-input.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-input/receiver-input.component.ts @@ -37,19 +37,19 @@ export class ReceiverInputComponent implements OnInit, OnChanges { private setupFiltering(): void { this.filteredOptions = this.control.valueChanges.pipe( startWith(''), - map(value => this.filter(value || '', this.options)), + map(value => this.filter(value || '', this.options, this.index)), ); } control = new FormControl(''); filteredOptions!: Observable; - @Input() options: string[] = []; - @Input() filter: (value: string, options: string[]) => string[] = value => { + @Input() filter: (value: string, options: string[], index?: number) => string[] = value => { const filterValue = value.toLowerCase(); return this.options.filter(option => option.toLowerCase().includes(filterValue)); } + @Input() index?: number; public get text(): string { return this.control.value || ''; diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html index a7b69ac5..b439f39e 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html @@ -1,8 +1,8 @@ - diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts index b45d343c..d637f715 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts @@ -34,24 +34,39 @@ export class ReceiverTableComponent implements OnInit { constructor(private receiverService: ReceiverService) { } async ngOnInit() { - this.receiver_mails = await this.receiverService.getReceiverAsync().then((receivers: any[]) => receivers.map(r => r.emailAddress)); + const receivers = await this.receiverService.getReceiverAsync(); + this.receiver_mails = receivers.map((r: any) => r.emailAddress); + this.last_used_name = receivers.reduce((acc: any, r: any) => { + acc[r.emailAddress] = r.lastUsedName; + return acc; + }, {} as { [key: string]: string | null }); } - receiver_filter: (value: string, options: string[]) => string[] = (value, options) => { + receiver_filter: (value: string, options: string[], index?: number) => string[] = (value, options, index) => { const filterValue = value.toLowerCase(); + // set the name if it is used befor + const name = this.last_used_name[value]; + if (name && index) + this.receiverData.at(index)!.name = name + + // !!! do not allow email duplication !!! + var similarMails = this.receiver_mails.filter(m => m.toLocaleLowerCase() === value.toLocaleLowerCase() && m !== value) + if (similarMails.length > 0 && index != undefined) { + this.receiverInputs[index].text = similarMails[0]; + } + console.log(this.receiverInputs.length + " - " + index) // if added into last row if (value.length > 0 && (this.receiverInputs.at(-1)?.lenght ?? 0) > 0) { this.receiverData.at(-1)!.accessCode = generateAccessCode(); this.receiverData.push({ email: "", name: "", accessCode: "" }); this.update(); } - else if (value.length == 0) { - for (var i = 0; i < this.receiverInputs.length - 1; i++) { - if (this.receiverInputs[i].lenght === 0) { - this.receiverData.splice(i, 1); - this.update(); - } + // delete the row with out mail + else if (value.length === 0 && this.receiverInputs.length - 1 !== index) { + if ( this.receiverInputs.length > 1 && this.receiverInputs[index!]?.lenght === 0) { + this.receiverData.splice(index!, 1); + this.update(); } } @@ -59,6 +74,7 @@ export class ReceiverTableComponent implements OnInit { } receiver_mails: string[] = []; + last_used_name: { [key: string]: string | null } = {}; @ViewChildren(ReceiverInputComponent) receiverInputsQueryList!: QueryList; get receiverInputs(): ReceiverInputComponent[] { From d5de868eb9566202dfc67995e333e0e8378d9734 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 30 Aug 2024 23:25:22 +0200 Subject: [PATCH 07/46] feat: added filter and paginator --- .../envelope-table.component.html | 10 ++++- .../envelope-table.component.scss | 41 +++++-------------- .../envelope-table.component.ts | 41 ++++++++++++++----- 3 files changed, 49 insertions(+), 43 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html index f2d68c2d..af46cd56 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html @@ -1,4 +1,9 @@ -
Email - + +
+ + Filter + + + +
@for (colId of displayedColumns; track colId) { @@ -45,4 +50,5 @@ (click)="expandedElement = expandedElement === element ? null : element"> -
\ No newline at end of file + + \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss index 19d1304d..25f0e5a8 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss @@ -1,31 +1,10 @@ -.example-element-row td { - border-bottom-width: 0; - } - - .example-element-detail { - overflow: hidden; - display: flex; - } - - .example-element-diagram { - min-width: 80px; - border: 2px solid black; - padding: 8px; - font-weight: lighter; - margin: 8px 0; - height: 104px; - } - - .example-element-symbol { - font-weight: bold; - font-size: 40px; - line-height: normal; - } - - .example-element-description { - padding: 16px; - } - - .example-element-description-attribution { - opacity: 0.5; - } \ No newline at end of file +/* Structure */ +table { + width: 100%; +} + +.mat-mdc-form-field { + font-size: 14px; + width: 100%; + margin-top: 10px; +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts index 57c147a7..f48de529 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts @@ -1,15 +1,19 @@ -import { Component, Input, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, Input, ViewChild } from '@angular/core'; import { EnvelopeReceiverService } from '../../services/envelope-receiver.service'; -import { MatTable, MatTableModule } from '@angular/material/table'; +import { MatTable, MatTableModule, MatTableDataSource } from '@angular/material/table'; import { CommonModule } from '@angular/common' import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { animate, state, style, transition, trigger } from '@angular/animations'; +import { MatInputModule } from '@angular/material/input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import {MatPaginator, MatPaginatorModule} from '@angular/material/paginator'; + @Component({ selector: 'app-envelope-table', standalone: true, - imports: [MatTableModule, CommonModule, MatTableModule, MatButtonModule, MatIconModule], + imports: [MatTableModule, CommonModule, MatTableModule, MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, MatTableModule, MatPaginator, MatPaginatorModule], templateUrl: './envelope-table.component.html', animations: [ trigger('detailExpand', [ @@ -20,9 +24,7 @@ import { animate, state, style, transition, trigger } from '@angular/animations' ], styleUrl: './envelope-table.component.scss' }) -export class EnvelopeTableComponent { - - @Input() data: Array = [] +export class EnvelopeTableComponent implements AfterViewInit { @Input() options?: { min_status?: number; max_status?: number; ignore_status?: number[] } @@ -57,13 +59,24 @@ export class EnvelopeTableComponent { @ViewChild(MatTable) table!: MatTable; - constructor(private erService: EnvelopeReceiverService) { } + @ViewChild(MatPaginator) paginator!: MatPaginator; - async ngOnInit() { - if (this.data.length === 0) - this.data = await this.erService.getEnvelopeReceiverAsync(this.options); + dataSource = new MatTableDataSource(); + + constructor(private erService: EnvelopeReceiverService) { + this.dataSource.filterPredicate = (data: any, filter: string): boolean => { + const dataStr = Object.values(data as { [key: string]: any }).reduce((currentTerm, key) => { + return currentTerm + (key ? key.toString().toLowerCase() : ''); + }, '').trim().toLowerCase(); + return dataStr.indexOf(filter) !== -1; + }; } + async ngAfterViewInit() { + this.dataSource.paginator = this.paginator; + this.dataSource.data = await this.erService.getEnvelopeReceiverAsync(this.options); + } + public updateTable() { this.table.renderRows(); } @@ -71,4 +84,12 @@ export class EnvelopeTableComponent { isExpandedRow(index: number, row: any): boolean { return (row?.envelopeId === this.expandedElement?.envelopeId) && (row?.receiverId === this.expandedElement?.receiverId); } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + + this.dataSource.filter = "test82"; + + console.log(this.dataSource.filteredData) + } } \ No newline at end of file From 939ba1bb470e96ab88b5792816239ebe12cc8cf4 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 30 Aug 2024 23:38:02 +0200 Subject: [PATCH 08/46] =?UTF-8?q?feat:=20Sortierung=20der=20Tabelle=20hinz?= =?UTF-8?q?ugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelope-table.component.html | 21 +++---------------- .../envelope-table.component.ts | 14 ++++++++----- 2 files changed, 12 insertions(+), 23 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html index af46cd56..f3e30cc5 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html @@ -3,11 +3,11 @@ - +
@for (colId of displayedColumns; track colId) { - + } @@ -27,22 +27,7 @@ - - - + Date: Mon, 2 Sep 2024 10:48:24 +0200 Subject: [PATCH 09/46] =?UTF-8?q?fix(receiver-table):=20Problem=20mit=20au?= =?UTF-8?q?tomatischer=20Anredezuweisung=20f=C3=BCr=20den=20ersten=20hinzu?= =?UTF-8?q?gef=C3=BCgten=20Empf=C3=A4nger=20behoben?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Bedingung in der Funktion `receiver_filter` aktualisiert, um den Indexwert korrekt zu überprüfen. --- .../receiver-table/receiver-table.component.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts index d637f715..2a7671ec 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts @@ -1,4 +1,4 @@ -import { Component, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; +import { Component, OnInit, QueryList, ViewChildren } from '@angular/core'; import { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { MatTableModule } from '@angular/material/table'; @@ -45,17 +45,19 @@ export class ReceiverTableComponent implements OnInit { receiver_filter: (value: string, options: string[], index?: number) => string[] = (value, options, index) => { const filterValue = value.toLowerCase(); - // set the name if it is used befor + // set the name if it is used before const name = this.last_used_name[value]; - if (name && index) + + if (name && index != null && index != undefined) { this.receiverData.at(index)!.name = name + } // !!! do not allow email duplication !!! var similarMails = this.receiver_mails.filter(m => m.toLocaleLowerCase() === value.toLocaleLowerCase() && m !== value) if (similarMails.length > 0 && index != undefined) { this.receiverInputs[index].text = similarMails[0]; } - console.log(this.receiverInputs.length + " - " + index) + // if added into last row if (value.length > 0 && (this.receiverInputs.at(-1)?.lenght ?? 0) > 0) { this.receiverData.at(-1)!.accessCode = generateAccessCode(); @@ -64,7 +66,7 @@ export class ReceiverTableComponent implements OnInit { } // delete the row with out mail else if (value.length === 0 && this.receiverInputs.length - 1 !== index) { - if ( this.receiverInputs.length > 1 && this.receiverInputs[index!]?.lenght === 0) { + if (this.receiverInputs.length > 1 && this.receiverInputs[index!]?.lenght === 0) { this.receiverData.splice(index!, 1); this.update(); } From 7444eeba2a88aba200fea3b742081f0ca1e241aa Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 2 Sep 2024 14:48:20 +0200 Subject: [PATCH 10/46] feat(envelope): Envelopes-Datenquelle und Initialisierung angepasst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `EnvelopeTypeService` und `EnvelopeTypeController` hinzugefügt, um Envelope-Typen im Cache zu speichern und bereitzustellen. - `ConfigurationService` erstellt und mit `APP_INITIALIZER` konfiguriert, um Envelope-Typen bei der Anwendungserstellung zu laden. - `EnvelopeTableComponent` aktualisiert, um Envelope-Typen aus der Konfiguration zu verwenden, anstatt hartkodierte Werte zu nutzen. --- .../Services/EnvelopeTypeService.cs | 18 ++++++-- .../src/app/app.config.ts | 9 +++- .../envelope-table.component.ts | 5 ++- .../services/configuration.service.spec.ts | 16 +++++++ .../src/app/services/configuration.service.ts | 37 ++++++++++++++++ .../Controllers/EnvelopeTypeController.cs | 43 +++++++++++++++++++ 6 files changed, 122 insertions(+), 6 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs diff --git a/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs index d8b00ebc..5402ba05 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs @@ -1,19 +1,31 @@ using AutoMapper; using DigitalData.Core.Application; -using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using EnvelopeGenerator.Application.Resources; +using Microsoft.Extensions.Caching.Memory; +using DigitalData.Core.DTO; +using System.Collections.Generic; +using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services { public class EnvelopeTypeService : BasicCRUDService, IEnvelopeTypeService { - public EnvelopeTypeService(IEnvelopeTypeRepository repository, IMapper mapper) + private static readonly Guid CacheKey = Guid.NewGuid(); + + private readonly IMemoryCache _cache; + + public EnvelopeTypeService(IEnvelopeTypeRepository repository, IMapper mapper, IMemoryCache cache) : base(repository, mapper) { + _cache = cache; } + + public override async Task>> ReadAllAsync() + => await _cache.GetOrCreateAsync(CacheKey, async entry => await base.ReadAllAsync()) + ?? Result.Fail>().Notice(LogLevel.Error, Flag.NotFound, "No cached envelope types are available in the database. If you have added any envelope types after the server started, please restart the server."); + } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/app.config.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/app.config.ts index 869ce43e..c23f1870 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/app.config.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/app.config.ts @@ -1,4 +1,4 @@ -import { ApplicationConfig } from '@angular/core'; +import { ApplicationConfig, APP_INITIALIZER } from '@angular/core'; import { provideRouter } from '@angular/router'; import { routes } from './app.routes'; import { provideClientHydration } from '@angular/platform-browser'; @@ -8,6 +8,7 @@ import { UrlService } from './services/url.service'; import { API_URL } from './tokens/index' import { HTTP_INTERCEPTORS, provideHttpClient, withFetch } from '@angular/common/http'; import { HttpRequestInterceptor } from './http.interceptor'; +import { ConfigurationService } from './services/configuration.service'; export const appConfig: ApplicationConfig = { providers: [ @@ -29,6 +30,12 @@ export const appConfig: ApplicationConfig = { provide: HTTP_INTERCEPTORS, useClass: HttpRequestInterceptor, multi: true + }, + { + provide: APP_INITIALIZER, + useFactory: (configService: ConfigurationService) => async () => await configService.ngOnInit(), + deps: [ConfigurationService], + multi: true } ] }; \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts index b0e1ef84..43a8d6bf 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts @@ -9,6 +9,7 @@ import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import {MatPaginator, MatPaginatorModule} from '@angular/material/paginator'; import {MatSort, MatSortModule} from '@angular/material/sort'; +import { ConfigurationService } from '../../services/configuration.service'; @Component({ selector: 'app-envelope-table', @@ -41,7 +42,7 @@ export class EnvelopeTableComponent implements AfterViewInit { }, 'type': { header: 'Type', - field: (element: any) => element.envelope.contractType + field: (element: any) => this.config.envelopeTypeTitles[element.envelope.contractType - 1] }, 'privateMessage': { header: 'Private Message', @@ -65,7 +66,7 @@ export class EnvelopeTableComponent implements AfterViewInit { dataSource = new MatTableDataSource(); - constructor(private erService: EnvelopeReceiverService) { + constructor(private erService: EnvelopeReceiverService, private config: ConfigurationService) { this.dataSource.filterPredicate = (data: any, filter: string): boolean => { const dataStr = Object.values(data as { [key: string]: any }).reduce((currentTerm, key) => { return currentTerm + (key ? key.toString().toLowerCase() : ''); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.spec.ts new file mode 100644 index 00000000..ec51dfa5 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ConfigurationService } from './configuration.service'; + +describe('ConfigurationService', () => { + let service: ConfigurationService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ConfigurationService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts new file mode 100644 index 00000000..1f2b41e5 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts @@ -0,0 +1,37 @@ +import { Injectable, OnInit, inject } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable, firstValueFrom } from 'rxjs'; +import { API_URL } from '../tokens/index'; + +@Injectable({ + providedIn: 'root' +}) +export class ConfigurationService implements OnInit { + + protected url: string; + + private _envelopeTypes! : any[]; + + private _envelopeTypeTitles! : any[]; + + constructor(private http: HttpClient) { + const api_url = inject(API_URL); + this.url = `${api_url}`; + } + + async ngOnInit(): Promise { + const envelopeTypes$: Observable = this.http.get(`${this.url}/EnvelopeType`) + envelopeTypes$.subscribe({next: res => { + this._envelopeTypes = res; + this._envelopeTypeTitles = res.map(e => e.title); + }}); + } + + public get envelopeTypes() { + return this._envelopeTypes; + } + + public get envelopeTypeTitles() { + return this._envelopeTypeTitles; + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs new file mode 100644 index 00000000..daacd703 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeTypeController.cs @@ -0,0 +1,43 @@ +using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.Contracts; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using System.Net.Mail; +using System.Security.Cryptography.Xml; + +namespace EnvelopeGenerator.GeneratorAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class EnvelopeTypeController : ControllerBase + { + private readonly ILogger _logger; + private readonly IEnvelopeTypeService _service; + + public EnvelopeTypeController(ILogger logger, IEnvelopeTypeService service) + { + _logger = logger; + _service = service; + } + + [HttpGet] + public async Task GetAllAsync() + { + try + { + return await _service.ReadAllAsync().ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return ntc.HasFlag(Flag.NotFound) ? NotFound() : StatusCode(StatusCodes.Status500InternalServerError); + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "{Message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } + } +} \ No newline at end of file From 363358aaa10945cd5a66d268f105aeaddd25330d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 14:58:48 +0200 Subject: [PATCH 11/46] feat: Implementieren und integrieren von wiederverwendbaren Angular Material-Tabellenkomponenten MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Erstellen der `DDTable`-Komponente für dynamische Angular Material-Tabellen mit Unterstützung für erweiterbare Zeilen, Filterung, Sortierung und Pagination. - Ersetzen der bestehenden Tabellenimplementierung in `EnvelopeTableComponent` durch die `DDTable`-Komponente für verbesserte Funktionalität und Wartbarkeit. - Aktualisieren der `EnvelopeTableComponent`, um `DDTable` für die Anzeige von Umschlagdaten zu verwenden, einschließlich Filter- und Paginierungsoptionen. - Implementieren von `ClearableInputComponent` für eine verbesserte Filtererfahrung. - Anpassen des Datenabrufs und -handlings, um die Integration von `DDTable` zu berücksichtigen. - Verbessern der `EnvelopeTableComponent` mit ordnungsgemäßen Animationstriggern für erweiterbare Zeilen. --- .../dd-table/dd-table.component.html | 59 ++++++++++ .../dd-table/dd-table.component.scss | 52 +++++++++ .../dd-table/dd-table.component.spec.ts | 23 ++++ .../components/dd-table/dd-table.component.ts | 103 ++++++++++++++++++ .../envelope-table.component.html | 43 +------- .../envelope-table.component.scss | 49 +++++++++ .../envelope-table.component.ts | 64 +++-------- 7 files changed, 304 insertions(+), 89 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html new file mode 100644 index 00000000..6bdca454 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html @@ -0,0 +1,59 @@ +@if(isFilterable) { + + {{filter.label}} + + +} + +
{{schema[colId].header}} {{schema[colId].header}} {{schema[colId].field(element)}} -
-
-
{{"element.position"}}
-
{{"element.symbol"}}
-
{{"element.name"}}
-
{{"element.weight"}}
-
-
- {{"element.description"}} - -- Wikipedia -
-
-
+ @for (column of __columnsToDisplay; track column) { + + @if(isSortable) { + + } + @else { + + } + + + } + + + @if(isExpandable) { + + + + + + + + } + @if(isExpandable) { + + + + + } + @else { + + + } +
{{schema[column].header}} {{schema[column].header}} {{schema[column].field(element)}}   + + +
+ @if(__expandedElement === element){ + + } +
+
+@if(paginatorSizeOptions && paginatorSizeOptions.length > 0) { + +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss new file mode 100644 index 00000000..155617b3 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss @@ -0,0 +1,52 @@ +table { + width: 100%; +} + +tr.example-detail-row { + height: 0; +} + +tr.example-element-row:not(.example-expanded-row):hover { + background: whitesmoke; +} + +tr.example-element-row:not(.example-expanded-row):active { + background: #efefef; +} + +.example-element-row td { + border-bottom-width: 0; +} + +.example-element-detail { + overflow: hidden; + display: flex; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; +} + +.mat-mdc-form-field { + font-size: 14px; + width: 100%; +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts new file mode 100644 index 00000000..0c704ba9 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DDTable } from './dd-table.component'; + +describe('TableExpandableRowsExampleComponent', () => { + let component: DDTable; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [DDTable] + }) + .compileComponents(); + + fixture = TestBed.createComponent(DDTable); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts new file mode 100644 index 00000000..7e2fa4fc --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts @@ -0,0 +1,103 @@ +import { AfterViewInit, Component, Input, ViewChild, inject } from '@angular/core'; +import { animate, state, style, transition, trigger } from '@angular/animations'; +import { MatIconModule } from '@angular/material/icon'; +import { MatButtonModule } from '@angular/material/button'; +import { MatTable, MatTableDataSource, MatTableModule } from '@angular/material/table'; +import { ConfigurationService } from '../../services/configuration.service'; +import { MatInputModule } from '@angular/material/input'; +import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator'; + +/** + * @title Table with expandable rows + */ +@Component({ + selector: 'dd-table', + styleUrl: 'dd-table.component.scss', + templateUrl: 'dd-table.component.html', + animations: [ + trigger('detailExpand', [ + state('collapsed,void', style({ height: '0px', minHeight: '0' })), + state('expanded', style({ height: '*' })), + transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), + ]), + ], + standalone: true, + imports: [ + MatTableModule, + MatButtonModule, + MatIconModule, + MatFormFieldModule, + MatInputModule, + MatTableModule, + MatSort, + MatSortModule, + MatPaginator, + MatPaginatorModule + ], +}) +export class DDTable implements AfterViewInit { + public readonly dataSource: any = new MatTableDataSource(); + @Input() public set columnsToDisplay(value: string[]) { + this.__columnsToDisplay = value; + this.__columnsToDisplayWithExpand = [...value, 'expand']; + } + @Input() public set data(value: any[]) { + this.dataSource.data = value; + } + @Input() schema: Record any; }> = {} + + @Input() paginatorSizeOptions?: number[]; + + @Input() filter: { label: string, placeholder: string } = { label: '', placeholder: '' } + + @Input() isFilterable: boolean = false; + + @Input() isExpandable: boolean = false; + + @Input() isSortable: boolean = false; + + @Input() onToggleExpandedRow: (element: any, event: Event) => void = (element: any, event: Event) => { } + + public get data(): any[] { + return this.dataSource.data; + } + __columnsToDisplay: string[] = []; + __columnsToDisplayWithExpand: string[] = []; + __expandedElement!: any; + + config: ConfigurationService = inject(ConfigurationService); + + @ViewChild(MatSort) sort!: MatSort; + @ViewChild(MatPaginator) paginator!: MatPaginator; + @ViewChild(MatTable) table!: MatTable; + + ngAfterViewInit(): void { + if (this.isSortable) + this.dataSource.sort = this.sort; + if (this.paginatorSizeOptions && this.paginatorSizeOptions.length > 0) + this.dataSource.paginator = this.paginator; + } + + applyFilter(event: Event) { + const filterValue = (event.target as HTMLInputElement).value; + this.dataSource.filter = filterValue.trim().toLowerCase(); + } + + update() { + this.table.renderRows(); + } + + toggleExpandedRow(element: any, event: Event): void { + // first determine the new expanded element, thus it would be possible to use up-to-date + const newExpandedElement = this.__expandedElement === element ? null : element; + + // before update the expanded element call the call-back method to show up-to-date component + this.onToggleExpandedRow(newExpandedElement, event); + + // assign expanded element + this.__expandedElement = newExpandedElement; + event.stopPropagation(); + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html index f3e30cc5..331a5270 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html @@ -1,39 +1,4 @@ - - Filter - - - - - - @for (colId of displayedColumns; track colId) { - - - - - } - - - - - - - - - - - - - -
{{schema[colId].header}} {{schema[colId].field(element)}}   - -
- \ No newline at end of file + + \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss index 25f0e5a8..1272cd53 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss @@ -7,4 +7,53 @@ table { font-size: 14px; width: 100%; margin-top: 10px; +} + +/* For expanding table */ +table { + width: 100%; +} + +tr.example-detail-row { + height: 0; +} + +tr.example-element-row:not(.example-expanded-row):hover { + background: whitesmoke; +} + +tr.example-element-row:not(.example-expanded-row):active { + background: #efefef; +} + +.example-element-row td { + border-bottom-width: 0; +} + +.example-element-detail { + overflow: hidden; + display: flex; +} + +.example-element-diagram { + min-width: 80px; + border: 2px solid black; + padding: 8px; + font-weight: lighter; + margin: 8px 0; + height: 104px; +} + +.example-element-symbol { + font-weight: bold; + font-size: 40px; + line-height: normal; +} + +.example-element-description { + padding: 16px; +} + +.example-element-description-attribution { + opacity: 0.5; } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts index 43a8d6bf..f32a0455 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts @@ -1,20 +1,14 @@ -import { AfterViewInit, Component, Input, ViewChild } from '@angular/core'; +import { AfterViewInit, Component, Input, ViewChild, inject, viewChild } from '@angular/core'; import { EnvelopeReceiverService } from '../../services/envelope-receiver.service'; -import { MatTable, MatTableModule, MatTableDataSource } from '@angular/material/table'; -import { CommonModule } from '@angular/common' -import { MatIconModule } from '@angular/material/icon'; -import { MatButtonModule } from '@angular/material/button'; import { animate, state, style, transition, trigger } from '@angular/animations'; -import { MatInputModule } from '@angular/material/input'; -import { MatFormFieldModule } from '@angular/material/form-field'; -import {MatPaginator, MatPaginatorModule} from '@angular/material/paginator'; -import {MatSort, MatSortModule} from '@angular/material/sort'; import { ConfigurationService } from '../../services/configuration.service'; +import { DDTable } from "../dd-table/dd-table.component"; +import { ClearableInputComponent } from '../clearable-input/clearable-input.component' @Component({ selector: 'app-envelope-table', standalone: true, - imports: [MatTableModule, CommonModule, MatTableModule, MatButtonModule, MatIconModule, MatFormFieldModule, MatInputModule, MatTableModule, MatPaginator, MatPaginatorModule, MatSort, MatSortModule], + imports: [DDTable, ClearableInputComponent], templateUrl: './envelope-table.component.html', animations: [ trigger('detailExpand', [ @@ -25,13 +19,13 @@ import { ConfigurationService } from '../../services/configuration.service'; ], styleUrl: './envelope-table.component.scss' }) -export class EnvelopeTableComponent implements AfterViewInit { +export class EnvelopeTableComponent implements AfterViewInit { @Input() options?: { min_status?: number; max_status?: number; ignore_status?: number[] } - @Input() displayedColumns: string[] = ['title', 'status', 'type', 'privateMessage', 'addedWhen']; + displayedColumns: string[] = ['title', 'status', 'type', 'privateMessage', 'addedWhen']; - @Input() schema: Record any; }> = { + schema: Record any; }> = { 'title': { header: 'Title', field: (element: any) => element.envelope.title @@ -51,50 +45,20 @@ export class EnvelopeTableComponent implements AfterViewInit { 'addedWhen': { header: 'Added When', field: (element: any) => element.addedWhen - }, + } } - columnsToDisplayWithExpand = [...this.displayedColumns, 'expand']; - - expandedElement: any | null; + data: any[] = []; - @ViewChild(MatTable) table!: MatTable; + @ViewChild(ClearableInputComponent) input!: ClearableInputComponent - @ViewChild(MatPaginator) paginator!: MatPaginator; + onToggleExpandedRow(element: any, event: Event) { } - @ViewChild(MatSort) sort!: MatSort; + private erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); - dataSource = new MatTableDataSource(); - - constructor(private erService: EnvelopeReceiverService, private config: ConfigurationService) { - this.dataSource.filterPredicate = (data: any, filter: string): boolean => { - const dataStr = Object.values(data as { [key: string]: any }).reduce((currentTerm, key) => { - return currentTerm + (key ? key.toString().toLowerCase() : ''); - }, '').trim().toLowerCase(); - return dataStr.indexOf(filter) !== -1; - }; - } + private config: ConfigurationService = inject(ConfigurationService); async ngAfterViewInit() { - this.dataSource.paginator = this.paginator; - this.dataSource.data = await this.erService.getEnvelopeReceiverAsync(this.options); - this.dataSource.sort = this.sort; - } - - public updateTable() { - this.table.renderRows(); - } - - isExpandedRow(index: number, row: any): boolean { - return (row?.envelopeId === this.expandedElement?.envelopeId) && (row?.receiverId === this.expandedElement?.receiverId); - } - - applyFilter(event: Event) { - const filterValue = (event.target as HTMLInputElement).value; - this.dataSource.filter = filterValue.trim().toLowerCase(); - - if (this.dataSource.paginator) { - this.dataSource.paginator.firstPage(); - } + this.data = await this.erService.getEnvelopeReceiverAsync(this.options); } } \ No newline at end of file From f88b5d2733dc7e92bec4b852a4a4cab3617eca38 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 15:14:10 +0200 Subject: [PATCH 12/46] feat: Erweiterbare Zeilen in `EnvelopeTableComponent` aktiviert und `mat-tab`-Komponente integriert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Aktiviert die Unterstützung für erweiterbare Zeilen in der `EnvelopeTableComponent` durch Setzen der `isExpandable`-Option auf `true`. - Integriert die `mat-tab-group`-Komponente innerhalb der erweiterten Zeilen für eine bessere Darstellung von Tab-Inhalten. - Hinzugefügt: Zwei Tabs ("Emfänger" und "History") für die Anzeige von zusätzlichen Informationen in den erweiterten Zeilen. --- .../envelope-table/envelope-table.component.html | 8 +++++++- .../components/envelope-table/envelope-table.component.ts | 3 ++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html index 331a5270..ecf6e2a2 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html @@ -1,4 +1,10 @@ + [onToggleExpandedRow]="onToggleExpandedRow" [isSortable]="true" [isExpandable]="true" [isFilterable]="true"> + + + + + + \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts index f32a0455..42bc19d9 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts @@ -4,11 +4,12 @@ import { animate, state, style, transition, trigger } from '@angular/animations' import { ConfigurationService } from '../../services/configuration.service'; import { DDTable } from "../dd-table/dd-table.component"; import { ClearableInputComponent } from '../clearable-input/clearable-input.component' +import { MatTabsModule } from '@angular/material/tabs'; @Component({ selector: 'app-envelope-table', standalone: true, - imports: [DDTable, ClearableInputComponent], + imports: [DDTable, ClearableInputComponent, MatTabsModule], templateUrl: './envelope-table.component.html', animations: [ trigger('detailExpand', [ From 2fbfbb4eb695deb988bfa0b78b0f8c793083bea6 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 16:16:50 +0200 Subject: [PATCH 13/46] feat: `ReceiverStatusTable` erstellt und Tabellen unter `/tables` organisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neue `ReceiverStatusTable`-Komponente zur Anzeige von Empfängerstatus-Daten erstellt. - Alle bestehenden Tabellenkomponenten unter das Verzeichnis `/tables` verschoben, um die Projektstruktur zu verbessern und die Wartbarkeit zu erhöhen. --- .../dd-table/dd-table.component.html | 0 .../dd-table/dd-table.component.scss | 0 .../dd-table/dd-table.component.spec.ts | 0 .../dd-table/dd-table.component.ts | 0 .../envelope-table.component.html | 0 .../envelope-table.component.scss | 0 .../envelope-table.component.spec.ts | 0 .../envelope-table.component.ts | 0 .../receiver-status-table.component.html | 1 + .../receiver-status-table.component.scss} | 0 .../receiver-status-table.component.spec.ts | 23 +++++++++++++++++++ .../receiver-status-table.component.ts | 12 ++++++++++ .../receiver-table.component.html | 0 .../receiver-table.component.scss | 0 .../receiver-table.component.spec.ts | 0 .../receiver-table.component.ts | 6 ++--- .../envelope-creation.component.ts | 2 +- .../app/pages/envelope/envelope.component.ts | 2 +- 18 files changed, 41 insertions(+), 5 deletions(-) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/dd-table/dd-table.component.html (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/dd-table/dd-table.component.scss (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/dd-table/dd-table.component.spec.ts (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/dd-table/dd-table.component.ts (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/envelope-table/envelope-table.component.html (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/envelope-table/envelope-table.component.scss (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/envelope-table/envelope-table.component.spec.ts (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/envelope-table/envelope-table.component.ts (100%) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{receiver-table/receiver-table.component.scss => tables/receiver-status-table/receiver-status-table.component.scss} (100%) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/receiver-table/receiver-table.component.html (100%) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.scss rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/receiver-table/receiver-table.component.spec.ts (100%) rename EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/{ => tables}/receiver-table/receiver-table.component.ts (93%) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.html similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.html rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.html diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.scss similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.scss rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.scss diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.spec.ts similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.spec.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.spec.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/dd-table/dd-table.component.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.html rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.scss similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.scss rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.scss diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.spec.ts similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.spec.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.spec.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/envelope-table/envelope-table.component.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html new file mode 100644 index 00000000..5c161b1a --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html @@ -0,0 +1 @@ +

receiver-status-table works!

diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.scss similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.scss rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.scss diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.spec.ts new file mode 100644 index 00000000..98748987 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { ReceiverStatusTableComponent } from './receiver-status-table.component'; + +describe('ReceiverStatusTableComponent', () => { + let component: ReceiverStatusTableComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [ReceiverStatusTableComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(ReceiverStatusTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts new file mode 100644 index 00000000..394acdca --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'receiver-status-table', + standalone: true, + imports: [], + templateUrl: './receiver-status-table.component.html', + styleUrl: './receiver-status-table.component.scss' +}) +export class ReceiverStatusTableComponent { + +} diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.html similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.html diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.spec.ts similarity index 100% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.spec.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.spec.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts similarity index 93% rename from EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts rename to EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts index 2a7671ec..63689eb7 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts @@ -5,11 +5,11 @@ import { MatTableModule } from '@angular/material/table'; import { AsyncPipe } from '@angular/common'; import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatFormFieldModule } from '@angular/material/form-field'; -import { ReceiverService } from '../../services/receiver.service' -import { ReceiverInputComponent } from '../receiver-input/receiver-input.component'; +import { ReceiverService } from '../../../services/receiver.service' +import { ReceiverInputComponent } from '../../receiver-input/receiver-input.component'; import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; -import { ClearableInputComponent } from '../clearable-input/clearable-input.component' +import { ClearableInputComponent } from '../../clearable-input/clearable-input.component' import { v4 as uuidv4 } from 'uuid'; @Component({ diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope-creation/envelope-creation.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope-creation/envelope-creation.component.ts index 9b617390..32b38270 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope-creation/envelope-creation.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope-creation/envelope-creation.component.ts @@ -5,7 +5,7 @@ import { MatFormFieldModule } from '@angular/material/form-field'; import { MatStepperModule } from '@angular/material/stepper'; import { MatButtonModule } from '@angular/material/button'; import { MatSelectModule } from '@angular/material/select'; -import { ReceiverTableComponent } from "../../components/receiver-table/receiver-table.component"; +import { ReceiverTableComponent } from "../../components/tables/receiver-table/receiver-table.component"; import { MatIconModule } from '@angular/material/icon'; @Component({ diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts index ee5f93e6..fd2ff694 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core'; -import { EnvelopeTableComponent } from "../../components/envelope-table/envelope-table.component"; +import { EnvelopeTableComponent } from "../../components/tables/envelope-table/envelope-table.component"; import { MatTabsModule } from '@angular/material/tabs'; import { LocalizationService } from '../../services/localization.service'; import { Status } from '../../enums/envelope-const' From 6a7a3dcb902e873dbc8615cf4f6d9b202a2dd18c Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 16:20:06 +0200 Subject: [PATCH 14/46] refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Referenzen für einige Bibliotheken angepasst, um die neue Verzeichnisstruktur unter `/tables` zu unterstützen. - Importpfade entsprechend der Verschiebung der Tabellenkomponenten aktualisiert. --- .../app/components/tables/dd-table/dd-table.component.ts | 2 +- .../tables/envelope-table/envelope-table.component.ts | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts index 7e2fa4fc..9f369dc3 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts @@ -3,7 +3,7 @@ import { animate, state, style, transition, trigger } from '@angular/animations' import { MatIconModule } from '@angular/material/icon'; import { MatButtonModule } from '@angular/material/button'; import { MatTable, MatTableDataSource, MatTableModule } from '@angular/material/table'; -import { ConfigurationService } from '../../services/configuration.service'; +import { ConfigurationService } from '../../../services/configuration.service'; import { MatInputModule } from '@angular/material/input'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSort, MatSortModule } from '@angular/material/sort'; diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index 42bc19d9..0e8c15db 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -1,9 +1,9 @@ import { AfterViewInit, Component, Input, ViewChild, inject, viewChild } from '@angular/core'; -import { EnvelopeReceiverService } from '../../services/envelope-receiver.service'; +import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service'; import { animate, state, style, transition, trigger } from '@angular/animations'; -import { ConfigurationService } from '../../services/configuration.service'; +import { ConfigurationService } from '../../../services/configuration.service'; import { DDTable } from "../dd-table/dd-table.component"; -import { ClearableInputComponent } from '../clearable-input/clearable-input.component' +import { ClearableInputComponent } from '../../clearable-input/clearable-input.component' import { MatTabsModule } from '@angular/material/tabs'; @Component({ From 01247f73f4874f6840681c27dceadb6dfb7dff59 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 16:34:39 +0200 Subject: [PATCH 15/46] refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert --- .../tables/receiver-table/receiver-table.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts index 63689eb7..c1219a2b 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-table/receiver-table.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit, QueryList, ViewChildren } from '@angular/core'; -import { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatInputModule } from '@angular/material/input'; import { MatTableModule } from '@angular/material/table'; import { AsyncPipe } from '@angular/common'; From 8d680992b75363e12c99b97328f9f9c795465f5d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Wed, 4 Sep 2024 16:55:58 +0200 Subject: [PATCH 16/46] refactor: Selector von `EnvelopeTableComponent` umbenannt und `ReceiverStatusTable` integriert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Selector von `EnvelopeTableComponent` von `app-envelope-table` auf `envelope-table` umbenannt für Konsistenz. - `` in die `EnvelopeTableComponent` integriert, um Empfängerstatusdaten anzuzeigen. --- .../tables/envelope-table/envelope-table.component.html | 1 + .../tables/envelope-table/envelope-table.component.ts | 9 ++++++--- .../src/app/pages/envelope/envelope.component.html | 4 ++-- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html index ecf6e2a2..01582673 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html @@ -3,6 +3,7 @@ [onToggleExpandedRow]="onToggleExpandedRow" [isSortable]="true" [isExpandable]="true" [isFilterable]="true"> + diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index 0e8c15db..c26129b6 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -5,11 +5,12 @@ import { ConfigurationService } from '../../../services/configuration.service'; import { DDTable } from "../dd-table/dd-table.component"; import { ClearableInputComponent } from '../../clearable-input/clearable-input.component' import { MatTabsModule } from '@angular/material/tabs'; +import { ReceiverStatusTableComponent } from "../receiver-status-table/receiver-status-table.component"; @Component({ - selector: 'app-envelope-table', + selector: 'envelope-table', standalone: true, - imports: [DDTable, ClearableInputComponent, MatTabsModule], + imports: [DDTable, ClearableInputComponent, MatTabsModule, ReceiverStatusTableComponent], templateUrl: './envelope-table.component.html', animations: [ trigger('detailExpand', [ @@ -53,7 +54,9 @@ export class EnvelopeTableComponent implements AfterViewInit { @ViewChild(ClearableInputComponent) input!: ClearableInputComponent - onToggleExpandedRow(element: any, event: Event) { } + onToggleExpandedRow(element: any, event: Event) { + console.log(element) + } private erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.html index b131b165..34ed812e 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/pages/envelope/envelope.component.html @@ -1,10 +1,10 @@
- + - +
\ No newline at end of file From e3fbf4fc774bcd0f30c8e20a98b273ff9976efcd Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 5 Sep 2024 10:15:36 +0200 Subject: [PATCH 17/46] =?UTF-8?q?feat(api):=20Hinzuf=C3=BCgen=20des=20Enve?= =?UTF-8?q?lopeControllers=20mit=20GetCurrentAsync-Methode=20zur=20Umschla?= =?UTF-8?q?gabfrage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementierung des `EnvelopeController` in der Route `api/envelope` mit der Methode `GetCurrentAsync`, um Umschläge basierend auf der Benutzer-ID abzurufen. - Fehlerbehandlung hinzugefügt, wenn die Benutzer-ID keine Ganzzahl ist, mit einem möglichen Problem bei der Erstellung der Claims-Liste. --- .../Controllers/EnvelopeController.cs | 50 +++++++++++++++++++ .../Controllers/ReceiverController.cs | 2 - 2 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs new file mode 100644 index 00000000..1c3dcd14 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -0,0 +1,50 @@ +using DigitalData.Core.DTO; +using EnvelopeGenerator.Application.Contracts; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.GeneratorAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class EnvelopeController : ControllerBase + { + private ILogger _logger; + private readonly IEnvelopeService _envelopeService; + + public EnvelopeController(ILogger logger, IEnvelopeService envelopeService) + { + _logger = logger; + _envelopeService = envelopeService; + } + + [Authorize] + public async Task GetCurrentAsync(bool current_user) + { + try + { + var id = this.GetId(); + + if (id is int intId) + return await _envelopeService.ReadByIdAsync(intId).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + else + { + _logger.LogError("Despite successful authorization, the 'api/envelope' route encountered an issue: the user ID is not recognized as an integer. This may be due to the removal of the ID during the creation of the claims list."); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } + catch (Exception ex) + { + _logger.LogError(ex, "{Message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs index 9fbeea1c..4c057b92 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ReceiverController.cs @@ -17,8 +17,6 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { } - - [HttpGet] public async Task Get([FromQuery] string? emailAddress = null, [FromQuery] string? signature = null) { From 5b8d8b9e552440b5534c8a727979038fc17cc7d9 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 5 Sep 2024 10:24:00 +0200 Subject: [PATCH 18/46] refactor(api): Aktualisierung von ControllerExtensions zur Nutzung von ClaimsPrincipal anstelle von ControllerBase MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Refactoring der Erweiterungsmethoden, sodass sie auf `ClaimsPrincipal` anstatt auf `ControllerBase` basieren. - Alle Verweise und Verwendungen dieser Erweiterungsmethoden im gesamten Code aktualisiert. - Dies verbessert die Flexibilität und entkoppelt das Abrufen von Benutzeransprüchen von den Controllern. --- .../Controllers/ControllerExtensions.cs | 20 +++++++++---------- .../Controllers/EnvelopeController.cs | 2 +- .../Controllers/EnvelopeReceiverController.cs | 4 ++-- 3 files changed, 13 insertions(+), 13 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/ControllerExtensions.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/ControllerExtensions.cs index a897824b..1121a9b8 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/ControllerExtensions.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/ControllerExtensions.cs @@ -5,20 +5,20 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { public static class ControllerExtensions { - public static int? GetId(this ControllerBase controller) - => int.TryParse(controller.User.FindFirst(ClaimTypes.NameIdentifier)?.Value, out int result) + public static int? GetId(this ClaimsPrincipal user) + => int.TryParse(user.FindFirst(ClaimTypes.NameIdentifier)?.Value, out int result) ? result : null; - public static string? GetUsername(this ControllerBase controller) - => controller.User.FindFirst(ClaimTypes.Name)?.Value; + public static string? GetUsername(this ClaimsPrincipal user) + => user.FindFirst(ClaimTypes.Name)?.Value; - public static string? GetName(this ControllerBase controller) - => controller.User.FindFirst(ClaimTypes.Surname)?.Value; + public static string? GetName(this ClaimsPrincipal user) + => user.FindFirst(ClaimTypes.Surname)?.Value; - public static string? GetPrename(this ControllerBase controller) - => controller.User.FindFirst(ClaimTypes.GivenName)?.Value; + public static string? GetPrename(this ClaimsPrincipal user) + => user.FindFirst(ClaimTypes.GivenName)?.Value; - public static string? GetEmail(this ControllerBase controller) - => controller.User.FindFirst(ClaimTypes.Email)?.Value; + public static string? GetEmail(this ClaimsPrincipal user) + => user.FindFirst(ClaimTypes.Email)?.Value; } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 1c3dcd14..652f7f08 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -24,7 +24,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { try { - var id = this.GetId(); + var id = User.GetId(); if (id is int intId) return await _envelopeService.ReadByIdAsync(intId).ThenAsync( diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index faa85852..d10194d9 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -24,12 +24,12 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { try { - var username = this.GetUsername(); + var username = User.GetUsername(); if (username is null) { _logger.LogError(@"Envelope Receiver dto cannot be sent because username claim is null. Potential authentication and authorization error. The value of other claims are [id: {id}], [username: {username}], [name: {name}], [prename: {prename}], [email: {email}].", - this.GetId(), this.GetUsername(), this.GetName(), this.GetPrename(), this.GetEmail()); + User.GetId(), User.GetUsername(), User.GetName(), User.GetPrename(), User.GetEmail()); return StatusCode(StatusCodes.Status500InternalServerError); } From b8b09ded5d54880b197880c3249967a71bb7e763 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 5 Sep 2024 10:35:35 +0200 Subject: [PATCH 19/46] refactor(api): Vereinfachung der GetCurrentAsync-Methode im EnvelopeController --- .../Controllers/EnvelopeController.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 652f7f08..a1440d8f 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -24,9 +24,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers { try { - var id = User.GetId(); - - if (id is int intId) + if (User.GetId() is int intId) return await _envelopeService.ReadByIdAsync(intId).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => From 3692aa80a48c164274ebfa2f059f070a175b81f8 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 5 Sep 2024 11:53:22 +0200 Subject: [PATCH 20/46] =?UTF-8?q?feat(services):=20Hinzuf=C3=BCgen=20des?= =?UTF-8?q?=20EnvelopeService=20zur=20Verarbeitung=20von=20API-Anfragen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Services/EnvelopeService.cs | 3 --- .../envelope-table.component.ts | 4 ++++ .../app/services/envelope-receiver.service.ts | 1 - .../src/app/services/envelope.service.spec.ts | 16 +++++++++++++ .../src/app/services/envelope.service.ts | 24 +++++++++++++++++++ .../Controllers/EnvelopeController.cs | 5 ++-- 6 files changed, 47 insertions(+), 6 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts diff --git a/EnvelopeGenerator.Application/Services/EnvelopeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeService.cs index 2c394713..c7e373d8 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeService.cs @@ -6,18 +6,15 @@ using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services { public class EnvelopeService : BasicCRUDService, IEnvelopeService { - private readonly ILogger _logger; public EnvelopeService(IEnvelopeRepository repository, IMapper mapper, ILogger logger) : base(repository, mapper) { - _logger = logger; } public async Task>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index c26129b6..e79219ff 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -1,5 +1,6 @@ import { AfterViewInit, Component, Input, ViewChild, inject, viewChild } from '@angular/core'; import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service'; +import { EnvelopeService } from '../../../services/envelope.service'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { ConfigurationService } from '../../../services/configuration.service'; import { DDTable } from "../dd-table/dd-table.component"; @@ -60,9 +61,12 @@ export class EnvelopeTableComponent implements AfterViewInit { private erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); + private envService: EnvelopeService = inject(EnvelopeService); + private config: ConfigurationService = inject(ConfigurationService); async ngAfterViewInit() { this.data = await this.erService.getEnvelopeReceiverAsync(this.options); + await this.envService.getEnvelopeAsync().then(console.log) } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts index 3a1a3766..526439f1 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts @@ -27,7 +27,6 @@ export class EnvelopeReceiverService { return this.http.get(this.url, { params }); } - getEnvelopeReceiverAsync(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Promise { return firstValueFrom(this.getEnvelopeReceiver(options)); } diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.spec.ts new file mode 100644 index 00000000..25fa59b3 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { EnvelopeService } from './envelope.service'; + +describe('EnvelopeService', () => { + let service: EnvelopeService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(EnvelopeService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts new file mode 100644 index 00000000..903d215e --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts @@ -0,0 +1,24 @@ +import { Injectable, inject } from '@angular/core'; +import { HttpClient, HttpParams } from '@angular/common/http'; +import { Observable, firstValueFrom } from 'rxjs'; +import { API_URL } from '../tokens/index'; + +@Injectable({ + providedIn: 'root' +}) +export class EnvelopeService { + protected url: string; + + constructor(private http: HttpClient) { + const api_url = inject(API_URL); + this.url = `${api_url}/envelope`; + } + + public getEnvelope(): Observable { + return this.http.get(this.url); + } + + public async getEnvelopeAsync(): Promise { + return await firstValueFrom(this.getEnvelope()); + } +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index a1440d8f..0ebe72d6 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -10,7 +10,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers [Authorize] public class EnvelopeController : ControllerBase { - private ILogger _logger; + private readonly ILogger _logger; private readonly IEnvelopeService _envelopeService; public EnvelopeController(ILogger logger, IEnvelopeService envelopeService) @@ -20,7 +20,8 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } [Authorize] - public async Task GetCurrentAsync(bool current_user) + [HttpGet] + public async Task GetCurrentAsync() { try { From 8753875d93e2c2c8af12cf30dcb70091ea51e2d3 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 11:26:58 +0200 Subject: [PATCH 21/46] chore(envelope): ReceiverStatusTableComponent entfernt --- .../receiver-status-table/receiver-status-table.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts index 394acdca..361e9c79 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts @@ -9,4 +9,4 @@ import { Component } from '@angular/core'; }) export class ReceiverStatusTableComponent { -} +} \ No newline at end of file From 97f07bc72d04289591ac77d8c3f62f1fb1b9282a Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 11:32:39 +0200 Subject: [PATCH 22/46] =?UTF-8?q?feat(envelope):=20ReceiverStatusTable-Kom?= =?UTF-8?q?ponente=20unter=20Envelope-Tabelle=20hinzugef=C3=BCgt=20und=20B?= =?UTF-8?q?ackend-Unterst=C3=BCtzung=20integriert?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ReceiverStatusTableComponent als Unterkomponente der EnvelopeTable erstellt, um Empfängerstatus anzuzeigen. - ReceiverStatusTable in EnvelopeTable mit Tabs und dynamischem Datenladen integriert. - EnvelopeTable angepasst, um Empfängerdaten über den EnvelopeReceiverService abzurufen und in ReceiverStatusTable anzuzeigen. - Backend aktualisiert, um das Abrufen von Umschlägen nach Benutzer zu unterstützen: - `ReadByUserAsync`-Methode im Envelope-Repository hinzugefügt, um Umschläge für einen bestimmten Benutzer abzufragen. - Servicemethode implementiert, um die abgefragten Umschläge in DTOs zu konvertieren und das Ergebnis zurückzugeben. --- .../Contracts/IEnvelopeService.cs | 3 ++- .../Services/EnvelopeService.cs | 11 +++++--- .../envelope-table.component.ts | 27 ++++++++----------- .../receiver-status-table.component.html | 2 +- .../receiver-status-table.component.ts | 9 +++++-- .../Controllers/EnvelopeController.cs | 2 +- .../Contracts/IEnvelopeRepository.cs | 2 ++ .../Repositories/EnvelopeRepository.cs | 8 +++--- 8 files changed, 37 insertions(+), 27 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs index 4a01e53d..ab3d69af 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs @@ -2,7 +2,6 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; -using EnvelopeGenerator.Infrastructure.Contracts; namespace EnvelopeGenerator.Application.Contracts { @@ -11,5 +10,7 @@ namespace EnvelopeGenerator.Application.Contracts Task>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false); Task> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); + + Task>> ReadByUserAsync(int userId); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeService.cs index c7e373d8..eed74207 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeService.cs @@ -3,16 +3,14 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services { public class EnvelopeService : BasicCRUDService, IEnvelopeService { - public EnvelopeService(IEnvelopeRepository repository, IMapper mapper, ILogger logger) + public EnvelopeService(IEnvelopeRepository repository, IMapper mapper) : base(repository, mapper) { } @@ -34,5 +32,12 @@ namespace EnvelopeGenerator.Application.Services var readDto = _mapper.MapOrThrow(envelope); return Result.Success(readDto); } + + public async Task>> ReadByUserAsync(int userId) + { + var users = await _repository.ReadByUserAsync(userId: userId); + var readDto = _mapper.MapOrThrow>(users); + return Result.Success(readDto); + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index e79219ff..cde803d6 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -1,5 +1,4 @@ import { AfterViewInit, Component, Input, ViewChild, inject, viewChild } from '@angular/core'; -import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service'; import { EnvelopeService } from '../../../services/envelope.service'; import { animate, state, style, transition, trigger } from '@angular/animations'; import { ConfigurationService } from '../../../services/configuration.service'; @@ -7,6 +6,7 @@ import { DDTable } from "../dd-table/dd-table.component"; import { ClearableInputComponent } from '../../clearable-input/clearable-input.component' import { MatTabsModule } from '@angular/material/tabs'; import { ReceiverStatusTableComponent } from "../receiver-status-table/receiver-status-table.component"; +import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service'; @Component({ selector: 'envelope-table', @@ -26,24 +26,20 @@ export class EnvelopeTableComponent implements AfterViewInit { @Input() options?: { min_status?: number; max_status?: number; ignore_status?: number[] } - displayedColumns: string[] = ['title', 'status', 'type', 'privateMessage', 'addedWhen']; + displayedColumns: string[] = ['title', 'status', 'type', 'addedWhen']; schema: Record any; }> = { 'title': { header: 'Title', - field: (element: any) => element.envelope.title + field: (element: any) => element.title }, 'status': { header: 'Status', - field: (element: any) => element.envelope.statusName + field: (element: any) => element.statusName }, 'type': { header: 'Type', - field: (element: any) => this.config.envelopeTypeTitles[element.envelope.contractType - 1] - }, - 'privateMessage': { - header: 'Private Message', - field: (element: any) => element.privateMessage + field: (element: any) => this.config.envelopeTypeTitles[element.contractType - 1] }, 'addedWhen': { header: 'Added When', @@ -53,20 +49,19 @@ export class EnvelopeTableComponent implements AfterViewInit { data: any[] = []; - @ViewChild(ClearableInputComponent) input!: ClearableInputComponent + @ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent onToggleExpandedRow(element: any, event: Event) { - console.log(element) } - private erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); - - private envService: EnvelopeService = inject(EnvelopeService); + private eService: EnvelopeService = inject(EnvelopeService); private config: ConfigurationService = inject(ConfigurationService); + private readonly erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); + async ngAfterViewInit() { - this.data = await this.erService.getEnvelopeReceiverAsync(this.options); - await this.envService.getEnvelopeAsync().then(console.log) + this.data = await this.eService.getEnvelopeAsync(); + this.rsTable.data = await this.erService.getEnvelopeReceiverAsync(); } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html index 5c161b1a..73206709 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.html @@ -1 +1 @@ -

receiver-status-table works!

+ \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts index 361e9c79..860f3aaa 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts @@ -1,12 +1,17 @@ -import { Component } from '@angular/core'; +import { Component, inject } from '@angular/core'; +import { DDTable } from '../dd-table/dd-table.component' @Component({ selector: 'receiver-status-table', standalone: true, - imports: [], + imports: [DDTable], templateUrl: './receiver-status-table.component.html', styleUrl: './receiver-status-table.component.scss' }) export class ReceiverStatusTableComponent { + data: any[] = []; + schema = {}; + + columnsToDisplay: string[] = []; } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 0ebe72d6..16edc7f3 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -26,7 +26,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers try { if (User.GetId() is int intId) - return await _envelopeService.ReadByIdAsync(intId).ThenAsync( + return await _envelopeService.ReadByUserAsync(intId).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs index d2d1377f..4eaddd94 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs @@ -8,5 +8,7 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false); Task ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); + + Task> ReadByUserAsync(int userId); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs index 73ac63a0..ae645c2b 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; @@ -14,7 +13,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories public async Task> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false) { - var query = _dbSet.AsQueryable(); + var query = _dbSet.AsNoTracking(); if (documents) if (documentReceiverElement) @@ -30,7 +29,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories public async Task ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false) { - var query = _dbSet.Where(e => e.Uuid == uuid); + var query = _dbSet.AsNoTracking().Where(e => e.Uuid == uuid); if (withAll || withDocuments) if (withAll || withDocumentReceiverElement) @@ -46,5 +45,8 @@ namespace EnvelopeGenerator.Infrastructure.Repositories return await query.FirstOrDefaultAsync(); } + + public async Task> ReadByUserAsync(int userId) => await _dbSet.AsNoTracking() + .Where(e => e.UserId == userId).ToListAsync(); } } \ No newline at end of file From a9ca1b71eb5e482edf32c2541f01947d6c085b84 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 12:08:42 +0200 Subject: [PATCH 23/46] =?UTF-8?q?feat(repository):=20ReadReceiverByEnvelop?= =?UTF-8?q?e=20Methode=20zum=20EnvelopeReceiverRepository=20hinzugef=C3=BC?= =?UTF-8?q?gt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neue Methode ReadReceiverByEnvelope hinzugefügt, um Empfänger zu ermitteln, die mit einem bestimmten Umschlag (identifiziert durch UUID) verknüpft sind. --- .../tables/envelope-table/envelope-table.component.ts | 1 + .../Contracts/IEnvelopeReceiverRepository.cs | 2 ++ .../Repositories/EnvlopeReceiverRepository.cs | 5 +++++ 3 files changed, 8 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index cde803d6..bc7e3032 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -52,6 +52,7 @@ export class EnvelopeTableComponent implements AfterViewInit { @ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent onToggleExpandedRow(element: any, event: Event) { + console.log(element) } private eService: EnvelopeService = inject(EnvelopeService); diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs index 8bcd8dd1..57d14929 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs @@ -22,5 +22,7 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task ReadLastByReceiver(string email); + + Task> ReadReceiverByEnvelope(string uuid); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index e7ca8393..ac66662b 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -80,5 +80,10 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); } + + public async Task> ReadReceiverByEnvelope(string uuid) + => await ReadWhere(uuid: uuid, withEnvelope: false, withReceiver: true) + .Select(er => er.Receiver!) + .ToListAsync(); } } \ No newline at end of file From c7b6e5bf24638f3d21ca234699e33062255e9b59 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 12:45:03 +0200 Subject: [PATCH 24/46] =?UTF-8?q?feat(EnvelopeReceiverService):=20f=C3=BCg?= =?UTF-8?q?e=20Methode=20ReadReceiverByEnvelopeAsync=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Neue Methode `ReadReceiverByEnvelopeAsync` zur `EnvelopeReceiverService`-Klasse hinzugefügt, um Empfänger anhand der Umschlag-UUID abzurufen. - Die `EnvelopeReceiverService`-Klasse wurde angepasst, um das Mapping auf `ReceiverReadDto` für die neue Methode zu ermöglichen. - Die Using-Anweisungen wurden aktualisiert, um das erforderliche DTO (`EnvelopeGenerator.Application.DTOs.Receiver`) für die neue Funktionalität einzubinden. --- .../Contracts/IEnvelopeReceiverService.cs | 3 +++ .../Services/EnvelopeReceiverService.cs | 10 +++++++++- .../Contracts/IEnvelopeReceiverRepository.cs | 2 +- .../Repositories/EnvlopeReceiverRepository.cs | 2 +- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index d565d39a..0d5f476a 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -1,6 +1,7 @@ using DigitalData.Core.Abstractions.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.Contracts @@ -27,5 +28,7 @@ namespace EnvelopeGenerator.Application.Contracts Task>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task> ReadLastUsedReceiverNameByMail(string mail); + + Task>> ReadReceiverByEnvelopeAsync(string uuid); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index e57a1729..9eecce1c 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -3,6 +3,7 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; +using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; @@ -127,6 +128,13 @@ namespace EnvelopeGenerator.Application.Services { var er = await _repository.ReadLastByReceiver(mail); return er is null ? Result.Fail().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name); - } + } + + public async Task>> ReadReceiverByEnvelopeAsync(string uuid) + { + var receivers = await _repository.ReadReceiverByEnvelopeAsync(uuid); + var receiverDtos = _mapper.MapOrThrow>(receivers); + return Result.Success(receiverDtos); + } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs index 57d14929..a12e816b 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs @@ -23,6 +23,6 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task ReadLastByReceiver(string email); - Task> ReadReceiverByEnvelope(string uuid); + Task> ReadReceiverByEnvelopeAsync(string uuid); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index ac66662b..2d207afa 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -81,7 +81,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); } - public async Task> ReadReceiverByEnvelope(string uuid) + public async Task> ReadReceiverByEnvelopeAsync(string uuid) => await ReadWhere(uuid: uuid, withEnvelope: false, withReceiver: true) .Select(er => er.Receiver!) .ToListAsync(); From cb0a45bc17536ef2de614401a9a4d05f220f92d6 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 13:00:13 +0200 Subject: [PATCH 25/46] =?UTF-8?q?feat(EnvelopeReceiverController):=20f?= =?UTF-8?q?=C3=BCge=20Methode=20GetReceiverByEnvelopeAsync=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/EnvelopeReceiverController.cs | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index d10194d9..55653c27 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -1,5 +1,6 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; +using EnvelopeGenerator.Common.My.Resources; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; @@ -72,5 +73,25 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers return StatusCode(StatusCodes.Status500InternalServerError); } } + + [HttpGet("receiver")] + public async Task GetReceiverByEnvelopeAsync([FromQuery] string uuid) + { + try + { + return await _erService.ReadReceiverByEnvelopeAsync(uuid: uuid).ThenAsync( + Success: Ok, + Fail: IActionResult (msg, ntc) => + { + _logger.LogNotice(ntc); + return StatusCode(StatusCodes.Status500InternalServerError); + }); + } + catch (Exception ex) + { + _logger.LogError(ex, "{message}", ex.Message); + return StatusCode(StatusCodes.Status500InternalServerError); + } + } } } \ No newline at end of file From cfa40e640bf678e4dbc72db92785497a6a65bfb9 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 13:11:53 +0200 Subject: [PATCH 26/46] =?UTF-8?q?feat(EnvelopeReceiverService):=20Methode?= =?UTF-8?q?=20getReceiverByEnvelope=20hinzugef=C3=BCgt,=20um=20Empf=C3=A4n?= =?UTF-8?q?ger=20nach=20Umschlag-UUID=20abzurufen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/app/services/envelope-receiver.service.ts | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts index 526439f1..98f6da27 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts @@ -30,4 +30,15 @@ export class EnvelopeReceiverService { getEnvelopeReceiverAsync(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Promise { return firstValueFrom(this.getEnvelopeReceiver(options)); } + + getReceiverByEnvelope(uuid: string): Observable { + let params = new HttpParams(); + params = params.set('uuid', uuid); + + return this.http.get(`${this.url}/receiver`, { params }); + } + + getReceiverByEnvelopAsync(uuid: string): Promise { + return firstValueFrom(this.getReceiverByEnvelope(uuid)); + } } \ No newline at end of file From e1d7d0e14107b49d4296c108cd2f529851c0c934 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 13:52:47 +0200 Subject: [PATCH 27/46] =?UTF-8?q?feat(EnvelopeTableComponent):=20Methode?= =?UTF-8?q?=20onToggleExpandedRow=20hinzugef=C3=BCgt,=20um=20Empf=C3=A4nge?= =?UTF-8?q?r=20anhand=20der=20Umschlag-UUID=20abzurufen=20und=20anzuzeigen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelope-table/envelope-table.component.ts | 14 +++++++++++--- .../src/app/services/envelope-receiver.service.ts | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index bc7e3032..54e13c5b 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -51,8 +51,17 @@ export class EnvelopeTableComponent implements AfterViewInit { @ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent - onToggleExpandedRow(element: any, event: Event) { - console.log(element) + onToggleExpandedRow: (envelope: any, event: Event) => void = (envelope, event) => { + if (envelope === null || envelope === undefined) + return; + + var uuid: string = envelope.uuid; + this.erService.getReceiverByEnvelope(uuid).subscribe({ + next: rcv => { + console.log(rcv); + this.rsTable.data = rcv; + } + }); } private eService: EnvelopeService = inject(EnvelopeService); @@ -63,6 +72,5 @@ export class EnvelopeTableComponent implements AfterViewInit { async ngAfterViewInit() { this.data = await this.eService.getEnvelopeAsync(); - this.rsTable.data = await this.erService.getEnvelopeReceiverAsync(); } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts index 98f6da27..8f887dee 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts @@ -38,7 +38,7 @@ export class EnvelopeReceiverService { return this.http.get(`${this.url}/receiver`, { params }); } - getReceiverByEnvelopAsync(uuid: string): Promise { + getReceiverByEnvelopeAsync(uuid: string): Promise { return firstValueFrom(this.getReceiverByEnvelope(uuid)); } } \ No newline at end of file From 18e21b0a8e8d6e20815d094dff92dcc4d7fb0edf Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 14:06:03 +0200 Subject: [PATCH 28/46] =?UTF-8?q?feat:=20F=C3=BCge=20EnvelopeReceiverSecre?= =?UTF-8?q?tDto=20zur=20Handhabung=20von=20Zugangscodes=20hinzu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs | 4 ++++ .../MappingProfiles/BasicDtoMappingProfile.cs | 1 + 2 files changed, 5 insertions(+) create mode 100644 EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs new file mode 100644 index 00000000..511c6d42 --- /dev/null +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverSecretDto.cs @@ -0,0 +1,4 @@ +namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +{ + public record EnvelopeReceiverSecretDto(string? AccessCode) : EnvelopeReceiverDto; +} \ No newline at end of file diff --git a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs index 59c89c0b..820ddbc1 100644 --- a/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs +++ b/EnvelopeGenerator.Application/MappingProfiles/BasicDtoMappingProfile.cs @@ -22,6 +22,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles CreateMap(); CreateMap(); CreateMap(); + CreateMap(); CreateMap(); CreateMap(); CreateMap(); From 9adb49df78b9485ddd9ed7d9349290ec499f82bc Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 15:19:18 +0200 Subject: [PATCH 29/46] Refaktorisierung von EnvelopeReceiverService und EnvelopeReceiverController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Methode `ReadSecretByUuidAsync` zu `EnvelopeReceiverService` hinzugefügt, um Geheimnisse anhand der UUID abzurufen. - Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverService` verbessert, einschließlich besserer Handhabung von Sicherheitsvorfällen und Datenintegritätsproblemen. - `VerifyAccessCodeAsync` aktualisiert, um explizite Nachrichten für Sicherheitsvorfälle und Datenintegritätsprobleme zu enthalten. - `EnvelopeReceiverController` aktualisiert, um einen neuen Endpunkt `GetSecretAsync` zum Abrufen von Geheimnissen anhand der UUID einzuführen. - Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverController` verbessert. - Endpunkte angepasst, um die neue Methode `ReadSecretByUuidAsync` in der Servicelogik zu nutzen. --- .../Contracts/IEnvelopeReceiverService.cs | 4 ++-- .../Services/EnvelopeReceiverService.cs | 14 ++++++-------- .../Controllers/EnvelopeReceiverController.cs | 7 ++++--- .../Contracts/IEnvelopeReceiverRepository.cs | 2 -- .../Repositories/EnvlopeReceiverRepository.cs | 7 +------ 5 files changed, 13 insertions(+), 21 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index 0d5f476a..285ed11d 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -11,6 +11,8 @@ namespace EnvelopeGenerator.Application.Contracts Task>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false); + Task>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true); + Task>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true); Task> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true); @@ -28,7 +30,5 @@ namespace EnvelopeGenerator.Application.Contracts Task>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task> ReadLastUsedReceiverNameByMail(string mail); - - Task>> ReadReceiverByEnvelopeAsync(string uuid); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index 9eecce1c..f995941e 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -3,7 +3,6 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; -using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; @@ -34,6 +33,12 @@ namespace EnvelopeGenerator.Application.Services return Result.Success(_mapper.MapOrThrow>(env_rcvs)); } + public async Task>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true) + { + var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver); + return Result.Success(_mapper.MapOrThrow>(env_rcvs)); + } + public async Task> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true) { var env_rcv = await _repository.ReadByUuidSignatureAsync(uuid: uuid, signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver); @@ -129,12 +134,5 @@ namespace EnvelopeGenerator.Application.Services var er = await _repository.ReadLastByReceiver(mail); return er is null ? Result.Fail().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name); } - - public async Task>> ReadReceiverByEnvelopeAsync(string uuid) - { - var receivers = await _repository.ReadReceiverByEnvelopeAsync(uuid); - var receiverDtos = _mapper.MapOrThrow>(receivers); - return Result.Success(receiverDtos); - } } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs index 55653c27..b5a9c989 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeReceiverController.cs @@ -74,12 +74,13 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers } } - [HttpGet("receiver")] - public async Task GetReceiverByEnvelopeAsync([FromQuery] string uuid) + [HttpGet("secret")] + [Authorize] + public async Task GetSecretAsync([FromQuery] string uuid) { try { - return await _erService.ReadReceiverByEnvelopeAsync(uuid: uuid).ThenAsync( + return await _erService.ReadSecretByUuidAsync(uuid: uuid).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs index a12e816b..8bcd8dd1 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs @@ -22,7 +22,5 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task ReadLastByReceiver(string email); - - Task> ReadReceiverByEnvelopeAsync(string uuid); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index 2d207afa..6b6f6bbd 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -79,11 +79,6 @@ namespace EnvelopeGenerator.Infrastructure.Repositories public async Task ReadLastByReceiver(string email) { return await _dbSet.Where(er => er.Receiver!.EmailAddress == email).OrderBy(er => er.EnvelopeId).LastOrDefaultAsync(); - } - - public async Task> ReadReceiverByEnvelopeAsync(string uuid) - => await ReadWhere(uuid: uuid, withEnvelope: false, withReceiver: true) - .Select(er => er.Receiver!) - .ToListAsync(); + } } } \ No newline at end of file From 2e325591324e71c558489e2fba917be68dbc1a30 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 15:42:03 +0200 Subject: [PATCH 30/46] =?UTF-8?q?feat(ReceiverStatusTableComponent):=20Sch?= =?UTF-8?q?ema=20f=C3=BCr=20die=20Tabellenansicht=20hinzugef=C3=BCgt,=20ei?= =?UTF-8?q?nschlie=C3=9Flich=20Name,=20Email=20und=20Zugangscode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../envelope-table/envelope-table.component.ts | 7 +++---- .../receiver-status-table.component.ts | 17 +++++++++++++++-- .../app/services/envelope-receiver.service.ts | 8 ++++---- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index 54e13c5b..eb9ad870 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -56,10 +56,9 @@ export class EnvelopeTableComponent implements AfterViewInit { return; var uuid: string = envelope.uuid; - this.erService.getReceiverByEnvelope(uuid).subscribe({ - next: rcv => { - console.log(rcv); - this.rsTable.data = rcv; + this.erService.getSecret(uuid).subscribe({ + next: (er: any[]) => { + this.rsTable.data = er; } }); } diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts index 860f3aaa..0a82494c 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts @@ -11,7 +11,20 @@ import { DDTable } from '../dd-table/dd-table.component' export class ReceiverStatusTableComponent { data: any[] = []; - schema = {}; + schema: Record any; }> = { + "name": { + "header": "Email Anrede", + "field": (er) => er.name + }, + "email": { + "header": "Email", + "field": (er) => er.receiver.emailAddress + }, + "access_code": { + "header": "Email", + "field": (er) => er.accessCode + }, + } - columnsToDisplay: string[] = []; + columnsToDisplay: string[] = ["name", "email", "access_code"]; } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts index 8f887dee..c919798d 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope-receiver.service.ts @@ -31,14 +31,14 @@ export class EnvelopeReceiverService { return firstValueFrom(this.getEnvelopeReceiver(options)); } - getReceiverByEnvelope(uuid: string): Observable { + getSecret(uuid: string): Observable { let params = new HttpParams(); params = params.set('uuid', uuid); - return this.http.get(`${this.url}/receiver`, { params }); + return this.http.get(`${this.url}/secret`, { params }); } - getReceiverByEnvelopeAsync(uuid: string): Promise { - return firstValueFrom(this.getReceiverByEnvelope(uuid)); + getSecretAsync(uuid: string): Promise { + return firstValueFrom(this.getSecret(uuid)); } } \ No newline at end of file From 01856b61ef24ca8bb9cc89f4ff9354d310542dac Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 16:31:49 +0200 Subject: [PATCH 31/46] =?UTF-8?q?feat(EnvelopeReceiverService):=20Status-F?= =?UTF-8?q?ilteroption=20zu=20ReadByUserAsync=20hinzugef=C3=BCgt,=20um=20d?= =?UTF-8?q?ie=20Ergebnisse=20nach=20Status=20zu=20filtern?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Contracts/IEnvelopeService.cs | 2 +- .../Services/EnvelopeService.cs | 4 ++-- .../envelope-table/envelope-table.component.ts | 2 +- .../src/app/services/envelope.service.ts | 17 +++++++++++++---- .../Controllers/EnvelopeController.cs | 7 +++++-- .../Contracts/IEnvelopeRepository.cs | 2 +- .../Repositories/EnvelopeRepository.cs | 17 +++++++++++++++-- 7 files changed, 38 insertions(+), 13 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs index ab3d69af..a8cfbab1 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeService.cs @@ -11,6 +11,6 @@ namespace EnvelopeGenerator.Application.Contracts Task> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); - Task>> ReadByUserAsync(int userId); + Task>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[]ignore_statuses); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeService.cs index eed74207..7f76b64e 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeService.cs @@ -33,9 +33,9 @@ namespace EnvelopeGenerator.Application.Services return Result.Success(readDto); } - public async Task>> ReadByUserAsync(int userId) + public async Task>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses) { - var users = await _repository.ReadByUserAsync(userId: userId); + var users = await _repository.ReadByUserAsync(userId: userId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses); var readDto = _mapper.MapOrThrow>(users); return Result.Success(readDto); } diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index eb9ad870..f3a6bf81 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -70,6 +70,6 @@ export class EnvelopeTableComponent implements AfterViewInit { private readonly erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); async ngAfterViewInit() { - this.data = await this.eService.getEnvelopeAsync(); + this.data = await this.eService.getEnvelopeAsync(this.options); } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts index 903d215e..228f2677 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/envelope.service.ts @@ -14,11 +14,20 @@ export class EnvelopeService { this.url = `${api_url}/envelope`; } - public getEnvelope(): Observable { - return this.http.get(this.url); + public getEnvelope(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Observable { + let params = new HttpParams(); + if (options) { + if (options.min_status) + params = params.set('min_status', options.min_status.toString()); + if (options.max_status) + params = params.set('max_status', options.max_status.toString()); + if (options.ignore_status) + params = params.set('ignore_status', options.ignore_status.join(',')); + } + return this.http.get(this.url, { params }); } - public async getEnvelopeAsync(): Promise { - return await firstValueFrom(this.getEnvelope()); + public async getEnvelopeAsync(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Promise { + return await firstValueFrom(this.getEnvelope(options)); } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs index 16edc7f3..a7306a36 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/EnvelopeController.cs @@ -21,12 +21,15 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers [Authorize] [HttpGet] - public async Task GetCurrentAsync() + public async Task GetCurrentAsync( + [FromQuery] int? min_status = null, + [FromQuery] int? max_status = null, + [FromQuery] params int[] ignore_statuses) { try { if (User.GetId() is int intId) - return await _envelopeService.ReadByUserAsync(intId).ThenAsync( + return await _envelopeService.ReadByUserAsync(intId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses).ThenAsync( Success: Ok, Fail: IActionResult (msg, ntc) => { diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs index 4eaddd94..5b78658e 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeRepository.cs @@ -9,6 +9,6 @@ namespace EnvelopeGenerator.Infrastructure.Contracts Task ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); - Task> ReadByUserAsync(int userId); + Task> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs index ae645c2b..d0c09cd0 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs @@ -46,7 +46,20 @@ namespace EnvelopeGenerator.Infrastructure.Repositories return await query.FirstOrDefaultAsync(); } - public async Task> ReadByUserAsync(int userId) => await _dbSet.AsNoTracking() - .Where(e => e.UserId == userId).ToListAsync(); + public async Task> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses) + { + var query = _dbSet.AsNoTracking().Where(e => e.UserId == userId); + + if (min_status is not null) + query = query.Where(e => e.Status >= min_status); + + if (max_status is not null) + query = query.Where(e => e.Status <= max_status); + + foreach (var ignore_status in ignore_statuses) + query = query.Where(e => e.Status != ignore_status); + + return await query.ToListAsync(); + } } } \ No newline at end of file From 4172df4d78409262ed1d6327667b5574bc8038e7 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 16:38:15 +0200 Subject: [PATCH 32/46] refactor(EnvelopeTableComponent): onToggleExpandedRow Methode asynchron gemacht, um die Daten mit async/await zu handhaben --- .../app/components/tables/dd-table/dd-table.component.ts | 6 +++--- .../tables/envelope-table/envelope-table.component.ts | 8 ++------ 2 files changed, 5 insertions(+), 9 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts index 9f369dc3..4493ff6c 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/dd-table/dd-table.component.ts @@ -58,7 +58,7 @@ export class DDTable implements AfterViewInit { @Input() isSortable: boolean = false; - @Input() onToggleExpandedRow: (element: any, event: Event) => void = (element: any, event: Event) => { } + @Input() onToggleExpandedRow: (element: any, event: Event) => Promise = async (element: any, event: Event) => { } public get data(): any[] { return this.dataSource.data; @@ -89,12 +89,12 @@ export class DDTable implements AfterViewInit { this.table.renderRows(); } - toggleExpandedRow(element: any, event: Event): void { + async toggleExpandedRow(element: any, event: Event): Promise { // first determine the new expanded element, thus it would be possible to use up-to-date const newExpandedElement = this.__expandedElement === element ? null : element; // before update the expanded element call the call-back method to show up-to-date component - this.onToggleExpandedRow(newExpandedElement, event); + await this.onToggleExpandedRow(newExpandedElement, event); // assign expanded element this.__expandedElement = newExpandedElement; diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index f3a6bf81..5d7267b4 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -51,16 +51,12 @@ export class EnvelopeTableComponent implements AfterViewInit { @ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent - onToggleExpandedRow: (envelope: any, event: Event) => void = (envelope, event) => { + onToggleExpandedRow: (envelope: any, event: Event) => Promise = async (envelope, event) => { if (envelope === null || envelope === undefined) return; var uuid: string = envelope.uuid; - this.erService.getSecret(uuid).subscribe({ - next: (er: any[]) => { - this.rsTable.data = er; - } - }); + this.rsTable.data = await this.erService.getSecretAsync(uuid); } private eService: EnvelopeService = inject(EnvelopeService); From 75fff426bc9cd03da22ecc59e9d5c4e79034e3cf Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 6 Sep 2024 16:43:42 +0200 Subject: [PATCH 33/46] =?UTF-8?q?feat(HistoryController):=20HistoryControl?= =?UTF-8?q?ler=20mit=20Logging=20und=20Envelope=20History=20Service=20Inte?= =?UTF-8?q?gration=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/HistoryController.cs | 22 +++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs new file mode 100644 index 00000000..e5426598 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -0,0 +1,22 @@ +using EnvelopeGenerator.Application.Contracts; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace EnvelopeGenerator.GeneratorAPI.Controllers +{ + [Route("api/[controller]")] + [ApiController] + [Authorize] + public class HistoryController : ControllerBase + { + private readonly ILogger _logger; + + private readonly IEnvelopeHistoryService _service; + + public HistoryController(ILogger logger, IEnvelopeHistoryService service) + { + _logger = logger; + _service = service; + } + } +} From 7bc2695da4391c9e919b4f773103fd5a2fda9b9a Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 00:08:55 +0200 Subject: [PATCH 34/46] feat(controller): add GetAllAsync endpoint to HistoryController - Added a new `GetAllAsync` method to HistoryController to retrieve envelope histories. - Included query parameters for filtering by envelopeId, userReference, referenceType, status, and boolean flags for sender and receiver. - Implemented validation of `referenceType` with `ReferenceType` enum, throwing an error for invalid values. --- .../Entities/EnvelopeHistory.cs | 2 +- .../Controllers/HistoryController.cs | 28 ++++++++++++++++++- 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs index 5c0f0cd1..55313e36 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs @@ -19,7 +19,7 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("USER_REFERENCE", TypeName = "nvarchar(128)")] - public string UserReference { get; set; } + public required string UserReference { get; init; } [Required] [Column("STATUS")] diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index e5426598..02516ecb 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -1,6 +1,8 @@ using EnvelopeGenerator.Application.Contracts; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; +using System; +using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.GeneratorAPI.Controllers { @@ -18,5 +20,29 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers _logger = logger; _service = service; } + + [HttpGet] + public async Task GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] int? status = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) + { + ReferenceType? refTypEnum = null; + + if (referenceType is int refTypInt) + { + if (Enum.IsDefined(typeof(ReferenceType), refTypInt)) + refTypEnum = (ReferenceType)refTypInt; + } + else + throw new ArgumentException($"The provided referenceType '{referenceType}' is not valid. It must correspond to a valid value in the {nameof(ReferenceType)} enum."); + + var histories = await _service.ReadAsync( + envelopeId: envelopeId, + userReference: userReference, + referenceType: refTypEnum, + status: status, + withSender: withSender, + withReceiver: withReceiver); + + return Ok(histories); + } } -} +} \ No newline at end of file From eb775da7d4c428a374e956f6e63cb42273255a74 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 00:37:54 +0200 Subject: [PATCH 35/46] =?UTF-8?q?feat(service):=20HistoryService=20f=C3=BC?= =?UTF-8?q?r=20API-Interaktionen=20erstellen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- EnvelopeGenerator.Common/Constants.vb | 1 + .../src/app/services/history.service.spec.ts | 16 ++++++++++++++++ .../src/app/services/history.service.ts | 17 +++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts diff --git a/EnvelopeGenerator.Common/Constants.vb b/EnvelopeGenerator.Common/Constants.vb index 2d7c26e5..16a19e08 100644 --- a/EnvelopeGenerator.Common/Constants.vb +++ b/EnvelopeGenerator.Common/Constants.vb @@ -26,6 +26,7 @@ MessageCompletionSent = 3005 End Enum + 'TODO: standardize in xwiki Public Enum ReferenceType Receiver Sender diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.spec.ts new file mode 100644 index 00000000..65de5db7 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { HistoryService } from './history.service'; + +describe('HistoryService', () => { + let service: HistoryService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(HistoryService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts new file mode 100644 index 00000000..9fd3c763 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts @@ -0,0 +1,17 @@ +import { Injectable, inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { Observable, firstValueFrom } from 'rxjs'; +import { API_URL } from '../tokens/index'; + + +@Injectable({ + providedIn: 'root' +}) +export class HistoryService { + protected url: string; + + constructor(private http: HttpClient) { + const api_url = inject(API_URL); + this.url = `${api_url}/history`; + } +} \ No newline at end of file From ab41e250715a297e3e2360f8ecc38c60323a66d0 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 01:12:50 +0200 Subject: [PATCH 36/46] feat: Referenztypen zwischen Backend und Frontend standardisieren MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `GetReferenceTypes`-Endpunkt im `HistoryController` hinzugefügt, um Key-Value-Paare des `ReferenceType`-Enums im camelCase-Format bereitzustellen. - `ConfigurationService` in Angular erweitert, um die `ReferenceType`-Werte vom neuen API-Endpunkt abzurufen und zu speichern. --- .../src/app/services/configuration.service.ts | 8 +++++++- .../Controllers/HistoryController.cs | 18 ++++++++++++++++++ 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts index 1f2b41e5..e27fa9aa 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts @@ -14,6 +14,8 @@ export class ConfigurationService implements OnInit { private _envelopeTypeTitles! : any[]; + private referenceType!: any; + constructor(private http: HttpClient) { const api_url = inject(API_URL); this.url = `${api_url}`; @@ -25,6 +27,10 @@ export class ConfigurationService implements OnInit { this._envelopeTypes = res; this._envelopeTypeTitles = res.map(e => e.title); }}); + + this.http.get(`${this.url}/History/reference-type`).subscribe({ + next: res => this.referenceType = res + }) } public get envelopeTypes() { @@ -34,4 +40,4 @@ export class ConfigurationService implements OnInit { public get envelopeTypeTitles() { return this._envelopeTypeTitles; } -} \ No newline at end of file +} diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 02516ecb..17431ca8 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -21,7 +21,25 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers _service = service; } + [HttpGet("reference-type")] + [Authorize] + public IActionResult GetReferenceTypes() + { + // Enum to Key-Value pair + var referenceTypes = Enum.GetValues(typeof(ReferenceType)) + .Cast() + .ToDictionary(rt => + { + var key = rt.ToString(); + var keyAsCamelCase = char.ToLower(key[0]) + key[1..]; + return keyAsCamelCase; + }, rt => (int)rt); + + return Ok(referenceTypes); + } + [HttpGet] + [Authorize] public async Task GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] int? status = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) { ReferenceType? refTypEnum = null; From cd88f5c8336632d8e09e8a93a43a835926f70925 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 01:32:09 +0200 Subject: [PATCH 37/46] refactor(controller): Optimierung der Handhabung von Referenztypen im HistoryController MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `GetAllAsync`-Methode angepasst, um `withSender` oder `withReceiver` automatisch basierend auf dem `ReferenceType` zu setzen. - Unnötigen `status`-Query-Parameter entfernt, um die API zu vereinfachen. --- .../Controllers/HistoryController.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index 17431ca8..b6670838 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -40,7 +40,7 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers [HttpGet] [Authorize] - public async Task GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] int? status = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) + public async Task GetAllAsync([FromQuery] int? envelopeId = null, [FromQuery] string? userReference = null, [FromQuery] int? referenceType = null, [FromQuery] bool withSender = false, [FromQuery] bool withReceiver = false) { ReferenceType? refTypEnum = null; @@ -52,11 +52,20 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers else throw new ArgumentException($"The provided referenceType '{referenceType}' is not valid. It must correspond to a valid value in the {nameof(ReferenceType)} enum."); + switch(referenceType) + { + case (int)ReferenceType.Receiver: + withReceiver = true; + break; + case (int)ReferenceType.Sender: + withSender = true; + break; + } + var histories = await _service.ReadAsync( envelopeId: envelopeId, userReference: userReference, referenceType: refTypEnum, - status: status, withSender: withSender, withReceiver: withReceiver); From 5d2bf5649368cbcb7c928b1c2e79b696b6c4a1ce Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 01:41:19 +0200 Subject: [PATCH 38/46] =?UTF-8?q?feat(service):=20Unterst=C3=BCtzung=20von?= =?UTF-8?q?=20Query-Parametern=20im=20HistoryService=20hinzugef=C3=BCgt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Methode `getHistory` hinzugefügt, um das Abrufen von History-Daten mit optionalen Query-Parametern wie `envelopeId`, `referenceType`, `userReference`, `withSender` und `withReceiver` zu ermöglichen. - Methode `getHistoryAsync` implementiert, um History-Daten mit async/await abzurufen. - `Options`-Interface eingeführt, um optionale Query-Parameter für History-Anfragen zu definieren. --- .../src/app/services/history.service.ts | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts index 9fd3c763..cfb508f3 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts @@ -1,5 +1,5 @@ import { Injectable, inject } from '@angular/core'; -import { HttpClient } from '@angular/common/http'; +import { HttpClient, HttpParams } from '@angular/common/http'; import { Observable, firstValueFrom } from 'rxjs'; import { API_URL } from '../tokens/index'; @@ -14,4 +14,33 @@ export class HistoryService { const api_url = inject(API_URL); this.url = `${api_url}/history`; } + + public getHistory(options?: Options): Observable { + let params = new HttpParams(); + if (options) { + if (options.envelopeId) + params = params.set('envelopeId', options.envelopeId.toString()); + if (options.referenceType) + params = params.set('referenceType', options.referenceType.toString()); + if (options.userReference) + params = params.set('userReference', options.userReference.toString()); + if (options.withReceiver) + params = params.set('withReceiver', options.withReceiver.toString()); + if (options.withSender) + params = params.set('withSender', options.withSender.toString()); + } + return this.http.get(this.url, { params }); + } + + public async getHistoryAsync(options?: Options): Promise { + return firstValueFrom(this.getHistory(options)); + } +} + +interface Options { + envelopeId?: number; + userReference?: string; + referenceType?: number; + withSender?: boolean; + withReceiver?: boolean; } \ No newline at end of file From d084a4cd815af9bb3806e54e299deed73ebe873d Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Sat, 7 Sep 2024 01:48:04 +0200 Subject: [PATCH 39/46] feat(component): initialisieren des HistoryTableComponent --- .../history-table.component.html | 1 + .../history-table.component.scss | 0 .../history-table.component.spec.ts | 23 +++++++++++++++++++ .../history-table/history-table.component.ts | 12 ++++++++++ 4 files changed, 36 insertions(+) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.scss create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.spec.ts create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html new file mode 100644 index 00000000..2f5cd4e6 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html @@ -0,0 +1 @@ +

history-table works!

diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.scss b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.spec.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.spec.ts new file mode 100644 index 00000000..4156b756 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.spec.ts @@ -0,0 +1,23 @@ +import { ComponentFixture, TestBed } from '@angular/core/testing'; + +import { HistoryTableComponent } from './history-table.component'; + +describe('HistoryTableComponent', () => { + let component: HistoryTableComponent; + let fixture: ComponentFixture; + + beforeEach(async () => { + await TestBed.configureTestingModule({ + imports: [HistoryTableComponent] + }) + .compileComponents(); + + fixture = TestBed.createComponent(HistoryTableComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts new file mode 100644 index 00000000..d8181354 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts @@ -0,0 +1,12 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'history-table', + standalone: true, + imports: [], + templateUrl: './history-table.component.html', + styleUrl: './history-table.component.scss' +}) +export class HistoryTableComponent { + +} From b66c2f67daacb1f00baf5a67f30392a7724d8239 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Mon, 9 Sep 2024 17:30:36 +0200 Subject: [PATCH 40/46] =?UTF-8?q?feat:=20Hinzuf=C3=BCgen=20einer=20erweite?= =?UTF-8?q?rten=20Ansicht=20f=C3=BCr=20die=20Tabelle=20im=20Envelope=20Gen?= =?UTF-8?q?erator?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - In der Tabelle für Umschläge wurde ein versteckter Abschnitt unter den Zeilen hinzugefügt. - Beim Klicken auf eine Zeile wird nun ein Detailbereich angezeigt, der Informationen zu Empfänger und Historie des Umschlags zeigt. --- .../EnvelopeHistory/EnvelopeHistoryDto.cs | 1 + .../Entities/EnvelopeHistory.cs | 8 ++++++- .../receiver-table.component.html | 23 +++++++++++++++++++ .../envelope-table.component.html | 1 + .../envelope-table.component.ts | 13 ++++++++++- .../history-table.component.html | 2 +- .../history-table/history-table.component.ts | 22 ++++++++++++++++-- .../receiver-status-table.component.ts | 2 +- .../src/app/services/configuration.service.ts | 10 +++++--- .../src/app/services/history.service.ts | 16 ++++++------- .../Controllers/HistoryController.cs | 6 ++--- 11 files changed, 83 insertions(+), 21 deletions(-) create mode 100644 EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs index 7967ac3c..54e0b1d6 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs @@ -10,6 +10,7 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory int EnvelopeId, string UserReference, int Status, + string? StatusName, DateTime AddedWhen, DateTime? ActionDate, UserCreateDto? Sender, diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs index 55313e36..d03922fd 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs @@ -43,11 +43,17 @@ namespace EnvelopeGenerator.Domain.Entities public virtual Receiver? Receiver { get; set; } [NotMapped] - public ReferenceType ReferenceType => (Status / 3) switch + public ReferenceType ReferenceType => (Status / 1000) switch { 1 => ReferenceType.Sender, 2 or 3 => ReferenceType.Receiver, _ => ReferenceType.Unknown, }; + + [NotMapped] + public string? StatusName + => (Enum.IsDefined(typeof(EnvelopeStatus), Status)) + ? Enum.GetName(typeof(EnvelopeStatus), Status) + : null; } } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html new file mode 100644 index 00000000..744d5711 --- /dev/null +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/receiver-table/receiver-table.component.html @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + +
Email + + Anrede Email + + Zugriffscode {{element.accessCode}}
\ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html index 01582673..77a6daf9 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.html @@ -6,6 +6,7 @@ +
\ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts index 5d7267b4..79adf50a 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/envelope-table/envelope-table.component.ts @@ -6,12 +6,14 @@ import { DDTable } from "../dd-table/dd-table.component"; import { ClearableInputComponent } from '../../clearable-input/clearable-input.component' import { MatTabsModule } from '@angular/material/tabs'; import { ReceiverStatusTableComponent } from "../receiver-status-table/receiver-status-table.component"; +import { HistoryTableComponent } from "../history-table/history-table.component"; import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service'; +import { HistoryService } from '../../../services/history.service'; @Component({ selector: 'envelope-table', standalone: true, - imports: [DDTable, ClearableInputComponent, MatTabsModule, ReceiverStatusTableComponent], + imports: [DDTable, ClearableInputComponent, MatTabsModule, ReceiverStatusTableComponent, HistoryTableComponent], templateUrl: './envelope-table.component.html', animations: [ trigger('detailExpand', [ @@ -51,12 +53,19 @@ export class EnvelopeTableComponent implements AfterViewInit { @ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent + @ViewChild(HistoryTableComponent) histTable!: HistoryTableComponent + onToggleExpandedRow: (envelope: any, event: Event) => Promise = async (envelope, event) => { if (envelope === null || envelope === undefined) return; var uuid: string = envelope.uuid; this.rsTable.data = await this.erService.getSecretAsync(uuid); + + var id: number = envelope.id; + var refType: number = this.config.referenceType.receiver; + const histories = await this.histService.getHistoryAsync({ envelopeId: id, referenceType: refType, withReceiver: true }) + this.histTable.data = histories; } private eService: EnvelopeService = inject(EnvelopeService); @@ -65,6 +74,8 @@ export class EnvelopeTableComponent implements AfterViewInit { private readonly erService: EnvelopeReceiverService = inject(EnvelopeReceiverService); + private readonly histService: HistoryService = inject(HistoryService); + async ngAfterViewInit() { this.data = await this.eService.getEnvelopeAsync(this.options); } diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html index 2f5cd4e6..73206709 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.html @@ -1 +1 @@ -

history-table works!

+ \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts index d8181354..1d2cd2fd 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/history-table/history-table.component.ts @@ -1,12 +1,30 @@ import { Component } from '@angular/core'; +import { DDTable } from '../dd-table/dd-table.component' @Component({ selector: 'history-table', standalone: true, - imports: [], + imports: [DDTable], templateUrl: './history-table.component.html', styleUrl: './history-table.component.scss' }) export class HistoryTableComponent { + data: any[] = []; -} + schema: Record any; }> = { + "status": { + "header": "Status", + "field": hist => hist.statusName + }, + "user": { + "header": "Benutzer", + "field": hist => hist.userReference + }, + "date": { + "header": "Datum", + "field": hist => hist.actionDate + } + } + + columnsToDisplay: string[] = ["status", "user", "date"]; +} \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts index 0a82494c..b4a17350 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/components/tables/receiver-status-table/receiver-status-table.component.ts @@ -1,4 +1,4 @@ -import { Component, inject } from '@angular/core'; +import { Component } from '@angular/core'; import { DDTable } from '../dd-table/dd-table.component' @Component({ diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts index e27fa9aa..2b56191e 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/configuration.service.ts @@ -14,7 +14,7 @@ export class ConfigurationService implements OnInit { private _envelopeTypeTitles! : any[]; - private referenceType!: any; + private _referenceType!: any; constructor(private http: HttpClient) { const api_url = inject(API_URL); @@ -29,7 +29,7 @@ export class ConfigurationService implements OnInit { }}); this.http.get(`${this.url}/History/reference-type`).subscribe({ - next: res => this.referenceType = res + next: res => this._referenceType = res }) } @@ -39,5 +39,9 @@ export class ConfigurationService implements OnInit { public get envelopeTypeTitles() { return this._envelopeTypeTitles; - } + } + + public get referenceType() { + return this._referenceType; + } } diff --git a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts index cfb508f3..b458943f 100644 --- a/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts +++ b/EnvelopeGenerator.GeneratorAPI/ClientApp/envelope-generator-ui/src/app/services/history.service.ts @@ -19,15 +19,15 @@ export class HistoryService { let params = new HttpParams(); if (options) { if (options.envelopeId) - params = params.set('envelopeId', options.envelopeId.toString()); - if (options.referenceType) - params = params.set('referenceType', options.referenceType.toString()); + params = params.set('envelopeId', options.envelopeId); + if (options.referenceType != null) + params = params.set('referenceType', options.referenceType); if (options.userReference) - params = params.set('userReference', options.userReference.toString()); + params = params.set('userReference', options.userReference); if (options.withReceiver) - params = params.set('withReceiver', options.withReceiver.toString()); + params = params.set('withReceiver', options.withReceiver); if (options.withSender) - params = params.set('withSender', options.withSender.toString()); + params = params.set('withSender', options.withSender); } return this.http.get(this.url, { params }); } @@ -37,10 +37,10 @@ export class HistoryService { } } -interface Options { +class Options { envelopeId?: number; userReference?: string; - referenceType?: number; + referenceType: number | null = null; withSender?: boolean; withReceiver?: boolean; } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs index b6670838..8b24cc9d 100644 --- a/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs +++ b/EnvelopeGenerator.GeneratorAPI/Controllers/HistoryController.cs @@ -45,12 +45,10 @@ namespace EnvelopeGenerator.GeneratorAPI.Controllers ReferenceType? refTypEnum = null; if (referenceType is int refTypInt) - { if (Enum.IsDefined(typeof(ReferenceType), refTypInt)) refTypEnum = (ReferenceType)refTypInt; - } - else - throw new ArgumentException($"The provided referenceType '{referenceType}' is not valid. It must correspond to a valid value in the {nameof(ReferenceType)} enum."); + else + throw new ArgumentException($"The provided referenceType '{referenceType}' is not valid. It must correspond to a valid value in the {nameof(ReferenceType)} enum."); switch(referenceType) { From 316b62083c4a4488a5edefc7a5eb3b997084a0d4 Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 19 Sep 2024 14:48:34 +0200 Subject: [PATCH 41/46] =?UTF-8?q?feat(core):=20IUnique-Schnittstelle=20hin?= =?UTF-8?q?zuf=C3=BCgen=20und=20Core.Infrastructure=20aktualisieren?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `IUnique`-Schnittstelle zu allen Entitäten im Domain-Projekt hinzugefügt. - `Core.Infrastructure` auf Version 2.0.0.0 im Infrastructure-Layer aktualisiert. - Domain-Projekt mit `Core.Abstraction` für verbesserte Abstraktion erweitert. --- EnvelopeGenerator.Domain/Entities/Config.cs | 28 +++++++++---------- .../Entities/DocumentReceiverElement.cs | 5 ++-- .../Entities/DocumentStatus.cs | 9 +++--- .../Entities/EmailTemplate.cs | 11 ++++---- EnvelopeGenerator.Domain/Entities/Envelope.cs | 14 +++++----- .../Entities/EnvelopeCertificate.cs | 13 +++++---- .../Entities/EnvelopeDocument.cs | 13 +++++---- .../Entities/EnvelopeHistory.cs | 5 ++-- .../Entities/EnvelopeReceiverBase.cs | 7 +++-- .../Entities/EnvelopeType.cs | 9 +++--- EnvelopeGenerator.Domain/Entities/Receiver.cs | 5 ++-- .../Entities/UserReceiver.cs | 13 +++++---- .../EnvelopeGenerator.Domain.csproj | 1 + .../EnvelopeGenerator.Infrastructure.csproj | 4 +-- .../Repositories/UserReceiverRepository.cs | 1 - 15 files changed, 73 insertions(+), 65 deletions(-) diff --git a/EnvelopeGenerator.Domain/Entities/Config.cs b/EnvelopeGenerator.Domain/Entities/Config.cs index 6c91262c..6621beb5 100644 --- a/EnvelopeGenerator.Domain/Entities/Config.cs +++ b/EnvelopeGenerator.Domain/Entities/Config.cs @@ -1,43 +1,41 @@ -using System.ComponentModel; +using DigitalData.Core.Abstractions; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_CONFIG", Schema = "dbo")] - public class Config + public class Config : IUnique { [Column("DOCUMENT_PATH", TypeName = "nvarchar(256)")] - public string DocumentPath { get; set; } + public string? DocumentPath { get; init; } [Column("SENDING_PROFILE", TypeName = "int")] [Required] - [DatabaseGenerated(DatabaseGeneratedOption.None)] // Assuming SENDING_PROFILE is manually entered or controlled by the application logic - [DefaultValue(0)] // This sets the default value for SENDING_PROFILE - public int SendingProfile { get; set; } + public required int SendingProfile { get; init; } [Column("SIGNATURE_HOST", TypeName = "nvarchar(128)")] - public string SignatureHost { get; set; } + public string? SignatureHost { get; init; } [Column("EXTERNAL_PROGRAM_NAME", TypeName = "nvarchar(30)")] - public string ExternalProgramName { get; set; } + public string? ExternalProgramName { get; init; } [Column("EXPORT_PATH", TypeName = "nvarchar(256)")] - public string ExportPath { get; set; } + public string? ExportPath { get; init; } [Column("DOCUMENT_PATH_DMZ", TypeName = "nvarchar(512)")] [Required] - [DefaultValue("")] // This sets the default value for DOCUMENT_PATH_DMZ - public string DocumentPathDmz { get; set; } + public string? DocumentPathDmz { get; init; } [Column("EXPORT_PATH_DMZ", TypeName = "nvarchar(512)")] [Required] - [DefaultValue("")] // This sets the default value for EXPORT_PATH_DMZ - public string ExportPathDmz { get; set; } + public required string ExportPathDmz { get; init; } [Column("DOCUMENT_PATH_MOVE_AFTSEND", TypeName = "nvarchar(512)")] [Required] - [DefaultValue("")] // This sets the default value for DOCUMENT_PATH_MOVE_AFTSEND - public string DocumentPathMoveAftsend { get; set; } + public required string DocumentPathMoveAftsend { get; init; } + + [Obsolete("Configuration does not have an ID; it represents a single table in the database.")] + public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single table in the database."); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/DocumentReceiverElement.cs b/EnvelopeGenerator.Domain/Entities/DocumentReceiverElement.cs index 381b268d..6d165028 100644 --- a/EnvelopeGenerator.Domain/Entities/DocumentReceiverElement.cs +++ b/EnvelopeGenerator.Domain/Entities/DocumentReceiverElement.cs @@ -1,11 +1,12 @@ -using System.ComponentModel; +using DigitalData.Core.Abstractions; +using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_DOCUMENT_RECEIVER_ELEMENT", Schema = "dbo")] - public class DocumentReceiverElement + public class DocumentReceiverElement : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] diff --git a/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs b/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs index 7ee87a27..dd243b76 100644 --- a/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs +++ b/EnvelopeGenerator.Domain/Entities/DocumentStatus.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_DOCUMENT_STATUS", Schema = "dbo")] - public class DocumentStatus + public class DocumentStatus : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -27,7 +28,7 @@ namespace EnvelopeGenerator.Domain.Entities public DateTime? StatusChangedWhen { get; set; } [Column("VALUE", TypeName = "nvarchar(max)")] - public string Value { get; set; } + public string? Value { get; set; } [Required] [Column("ADDED_WHEN", TypeName = "datetime")] @@ -42,4 +43,4 @@ namespace EnvelopeGenerator.Domain.Entities [ForeignKey("ReceiverId")] public virtual Receiver? Receiver { get; set; } } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/EmailTemplate.cs b/EnvelopeGenerator.Domain/Entities/EmailTemplate.cs index c82f3d4e..aef2df9d 100644 --- a/EnvelopeGenerator.Domain/Entities/EmailTemplate.cs +++ b/EnvelopeGenerator.Domain/Entities/EmailTemplate.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_EMAIL_TEMPLATE", Schema = "dbo")] - public class EmailTemplate + public class EmailTemplate : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -12,12 +13,12 @@ namespace EnvelopeGenerator.Domain.Entities public int Id { get; set; } [Column("NAME", TypeName = "nvarchar(64)")] - public string Name { get; set; } + public string? Name { get; set; } [Column("BODY", TypeName = "nvarchar(max)")] - public string Body { get; set; } + public string? Body { get; set; } [Column("SUBJECT", TypeName = "nvarchar(512)")] - public string Subject { get; set; } + public string? Subject { get; set; } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/Envelope.cs b/EnvelopeGenerator.Domain/Entities/Envelope.cs index b1ab8438..62f8dfd2 100644 --- a/EnvelopeGenerator.Domain/Entities/Envelope.cs +++ b/EnvelopeGenerator.Domain/Entities/Envelope.cs @@ -1,12 +1,12 @@ -using EnvelopeGenerator.Common; -using EnvelopeGenerator.Common.My.Resources; +using DigitalData.Core.Abstractions; +using EnvelopeGenerator.Common; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE", Schema = "dbo")] - public class Envelope + public class Envelope : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -26,11 +26,11 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")] - public string Uuid { get; set; } + public required string Uuid { get; init; } [Required] [Column("MESSAGE", TypeName = "nvarchar(max)")] - public string Message { get; set; } + public string? Message { get; set; } [Column("EXPIRES_WHEN", TypeName = "datetime")] public DateTime? ExpiresWhen { get; set; } @@ -46,13 +46,13 @@ namespace EnvelopeGenerator.Domain.Entities public DateTime? ChangedWhen { get; set; } [Column("TITLE", TypeName = "nvarchar(128)")] - public string Title { get; set; } + public string? Title { get; set; } [Column("CONTRACT_TYPE")] public int? ContractType { get; set; } [Column("LANGUAGE", TypeName = "nvarchar(5)")] - public string Language { get; set; } + public required string Language { get; set; } [Column("SEND_REMINDER_EMAILS")] public bool? SendReminderEmails { get; set; } diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeCertificate.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeCertificate.cs index c8bd8c6e..f6450954 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeCertificate.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeCertificate.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_CERTIFICATE", Schema = "dbo")] - public class EnvelopeCertificate + public class EnvelopeCertificate : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -17,11 +18,11 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")] - public string EnvelopeUuid { get; set; } + public required string EnvelopeUuid { get; set; } [Required] [Column("ENVELOPE_SUBJECT", TypeName = "nvarchar(512)")] - public string EnvelopeSubject { get; set; } + public required string EnvelopeSubject { get; set; } [Required] [Column("CREATOR_ID")] @@ -29,11 +30,11 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("CREATOR_NAME", TypeName = "nvarchar(128)")] - public string CreatorName { get; set; } + public required string CreatorName { get; set; } [Required] [Column("CREATOR_EMAIL", TypeName = "nvarchar(128)")] - public string CreatorEmail { get; set; } + public required string CreatorEmail { get; set; } [Required] [Column("ENVELOPE_STATUS")] diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeDocument.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeDocument.cs index b5e64977..f90ddce2 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeDocument.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeDocument.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_DOCUMENT", Schema = "dbo")] - public class EnvelopeDocument + public class EnvelopeDocument : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -17,18 +18,18 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("FILENAME", TypeName = "nvarchar(256)")] - public string Filename { get; set; } + public required string Filename { get; set; } [Required] [Column("FILEPATH", TypeName = "nvarchar(256)")] - public string Filepath { get; set; } + public required string Filepath { get; set; } [Required] [Column("ADDED_WHEN", TypeName = "datetime")] - public DateTime AddedWhen { get; set; } + public required DateTime AddedWhen { get; set; } [Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")] - public string FilenameOriginal { get; set; } + public required string FilenameOriginal { get; set; } public IEnumerable? Elements { get; set; } } diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs index d03922fd..ef9f33be 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeHistory.cs @@ -1,4 +1,5 @@ -using DigitalData.UserManager.Domain.Entities; +using DigitalData.Core.Abstractions; +using DigitalData.UserManager.Domain.Entities; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using static EnvelopeGenerator.Common.Constants; @@ -6,7 +7,7 @@ using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_HISTORY", Schema = "dbo")] - public class EnvelopeHistory + public class EnvelopeHistory : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs index 7669389d..ef934a19 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeReceiverBase.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] - public class EnvelopeReceiverBase + public class EnvelopeReceiverBase : IUnique<(int Envelope, int Receiver)> { [Key] [Column("ENVELOPE_ID")] @@ -39,5 +40,7 @@ namespace EnvelopeGenerator.Domain.Entities [Column("CHANGED_WHEN", TypeName = "datetime")] public DateTime? ChangedWhen { get; set; } + + public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); } } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/Entities/EnvelopeType.cs b/EnvelopeGenerator.Domain/Entities/EnvelopeType.cs index c1684672..bd837e81 100644 --- a/EnvelopeGenerator.Domain/Entities/EnvelopeType.cs +++ b/EnvelopeGenerator.Domain/Entities/EnvelopeType.cs @@ -1,12 +1,11 @@ -using System; +using DigitalData.Core.Abstractions; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_ENVELOPE_TYPE", Schema = "dbo")] - public class EnvelopeType + public class EnvelopeType : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -15,10 +14,10 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("TITLE", TypeName = "nvarchar(128)")] - public string Title { get; set; } + public required string Title { get; set; } [Column("LANGUAGE", TypeName = "nvarchar(5)")] - public string Language { get; set; } + public string? Language { get; set; } [Column("EXPIRES_DAYS")] public int? ExpiresDays { get; set; } diff --git a/EnvelopeGenerator.Domain/Entities/Receiver.cs b/EnvelopeGenerator.Domain/Entities/Receiver.cs index ce354483..ae39daf4 100644 --- a/EnvelopeGenerator.Domain/Entities/Receiver.cs +++ b/EnvelopeGenerator.Domain/Entities/Receiver.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_RECEIVER", Schema = "dbo")] - public class Receiver + public class Receiver : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] diff --git a/EnvelopeGenerator.Domain/Entities/UserReceiver.cs b/EnvelopeGenerator.Domain/Entities/UserReceiver.cs index 9b221297..c2fc7c0c 100644 --- a/EnvelopeGenerator.Domain/Entities/UserReceiver.cs +++ b/EnvelopeGenerator.Domain/Entities/UserReceiver.cs @@ -1,10 +1,11 @@ -using System.ComponentModel.DataAnnotations; +using DigitalData.Core.Abstractions; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace EnvelopeGenerator.Domain.Entities { [Table("TBSIG_USER_RECEIVER", Schema = "dbo")] - public class UserReceiver + public class UserReceiver : IUnique { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] @@ -21,16 +22,16 @@ namespace EnvelopeGenerator.Domain.Entities [Required] [Column("NAME", TypeName = "nvarchar(128)")] - public string Name { get; set; } + public required string Name { get; set; } [Column("COMPANY_NAME", TypeName = "nvarchar(128)")] - public string CompanyName { get; set; } + public string? CompanyName { get; set; } [Column("JOB_TITLE", TypeName = "nvarchar(128)")] - public string JobTitle { get; set; } + public string? JobTitle { get; set; } [Required] [Column("ADDED_WHEN", TypeName = "datetime")] - public DateTime AddedWhen { get; set; } + public required DateTime AddedWhen { get; init; } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj index 40acf713..3480802f 100644 --- a/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj +++ b/EnvelopeGenerator.Domain/EnvelopeGenerator.Domain.csproj @@ -7,6 +7,7 @@ + diff --git a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj index f81afd68..42b215a8 100644 --- a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj +++ b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj @@ -7,8 +7,8 @@ - - + + all diff --git a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs index 2c5800ec..fbbb575d 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; From f95f3c7b1ba7d20fa0bf781dc04559962ef2de3c Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Thu, 19 Sep 2024 15:06:33 +0200 Subject: [PATCH 42/46] =?UTF-8?q?refactor(dbcontext):=20DbSet-Erstellung?= =?UTF-8?q?=20in=20DbContext=20verschieben=20und=20DbSet-Eigenschaften=20h?= =?UTF-8?q?inzuf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Ersetzt die Erstellung von DbSet pro Entität durch DbSet-Eigenschaften in `EGDbContext`. - Hinzugefügt DbSet-Eigenschaften für `UserReceiver`, `Config`, `EnvelopeReceiver` und `Envelope`. - Aktualisierter `EGDbContext`-Konstruktor zur Initialisierung der DbSet-Eigenschaften mittels der `Set`-Methode. --- .../Contracts/IEnvelopeReceiverRepository.cs | 2 +- EnvelopeGenerator.Infrastructure/EGDbContext.cs | 12 ++++++++++++ .../Repositories/ConfigRepository.cs | 3 +-- .../Repositories/EnvelopeRepository.cs | 2 +- .../Repositories/EnvlopeReceiverRepository.cs | 4 ++-- .../Repositories/UserReceiverRepository.cs | 2 +- 6 files changed, 18 insertions(+), 7 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs index 8bcd8dd1..e471ddf7 100644 --- a/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Contracts/IEnvelopeReceiverRepository.cs @@ -3,7 +3,7 @@ using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Infrastructure.Contracts { - public interface IEnvelopeReceiverRepository : ICRUDRepository + public interface IEnvelopeReceiverRepository : ICRUDRepository { Task> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false); diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index a367bf47..c0f13aa8 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -7,8 +7,20 @@ namespace EnvelopeGenerator.Infrastructure { public class EGDbContext : DbContext { + public DbSet UserReceivers { get; set; } + + public DbSet Configs { get; set; } + + public DbSet EnvelopeReceivers { get; set; } + + public DbSet Envelopes { get; set; } + public EGDbContext(DbContextOptions options) : base(options) { + UserReceivers = Set(); + Configs = Set(); + EnvelopeReceivers = Set(); + Envelopes = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs index 6dc89ebb..bae012ae 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ConfigRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; @@ -8,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class ConfigRepository : CRUDRepository, IConfigRepository { - public ConfigRepository(EGDbContext dbContext) : base(dbContext) + public ConfigRepository(EGDbContext dbContext) : base(dbContext, dbContext.Configs) { } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs index d0c09cd0..40783bf2 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class EnvelopeRepository : CRUDRepository, IEnvelopeRepository { - public EnvelopeRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeRepository(EGDbContext dbContext) : base(dbContext, dbContext.Envelopes) { } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs index 6b6f6bbd..7b72f29e 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvlopeReceiverRepository.cs @@ -5,9 +5,9 @@ using Microsoft.EntityFrameworkCore; namespace EnvelopeGenerator.Infrastructure.Repositories { - public class EnvelopeReceiverRepository : CRUDRepository, IEnvelopeReceiverRepository + public class EnvelopeReceiverRepository : CRUDRepository, IEnvelopeReceiverRepository { - public EnvelopeReceiverRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeReceivers) { } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs index fbbb575d..04bb30fa 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/UserReceiverRepository.cs @@ -6,7 +6,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class UserReceiverRepository : CRUDRepository, IUserReceiverRepository { - public UserReceiverRepository(EGDbContext dbContext) : base(dbContext) + public UserReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.UserReceivers) { } } From 6b3e6cd6f5823f235904f049beb841dff74f96cc Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 20 Sep 2024 01:16:47 +0200 Subject: [PATCH 43/46] chore(infrastructure): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Core-Bibliotheken und UserManager.Infrastructure im Infrastructure-Layer auf Version 2.0.0.0 erhöht. - DbSet-Eigenschaften aus DbContext injiziert. --- .../EGDbContext.cs | 23 +++++++++++++++++++ .../EnvelopeGenerator.Infrastructure.csproj | 2 +- .../DocumentReceiverElementRepository.cs | 2 +- .../Repositories/DocumentStatusRepository.cs | 2 +- .../Repositories/EmailTemplateRepository.cs | 2 +- .../EnvelopeCertificateRepository.cs | 2 +- .../EnvelopeDocumentRepository.cs | 2 +- .../Repositories/EnvelopeHistoryRepository.cs | 2 +- .../Repositories/EnvelopeTypeRepository.cs | 2 +- .../Repositories/ReceiverRepository.cs | 2 +- 10 files changed, 32 insertions(+), 9 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index c0f13aa8..82051684 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -15,12 +15,35 @@ namespace EnvelopeGenerator.Infrastructure public DbSet Envelopes { get; set; } + public DbSet DocumentReceiverElements { get; set; } + + public DbSet DocumentStatus { get; set; } + + public DbSet EmailTemplate { get; set; } + + public DbSet EnvelopeCertificates { get; set; } + + public DbSet EnvelopeDocument { get; set; } + + public DbSet EnvelopeHistories { get; set; } + + public DbSet EnvelopeTypes { get; set; } + + public DbSet Receivers { get; set; } + public EGDbContext(DbContextOptions options) : base(options) { UserReceivers = Set(); Configs = Set(); EnvelopeReceivers = Set(); Envelopes = Set(); + DocumentReceiverElements = Set(); + DocumentStatus = Set(); + EnvelopeCertificates = Set(); + EnvelopeDocument = Set(); + EnvelopeHistories = Set(); + EnvelopeTypes = Set(); + Receivers = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj index 42b215a8..399d3269 100644 --- a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj +++ b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj @@ -15,7 +15,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs index 0c7c5b55..5b410f98 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class DocumentReceiverElementRepository : CRUDRepository, IDocumentReceiverElementRepository { - public DocumentReceiverElementRepository(EGDbContext dbContext) : base(dbContext) + public DocumentReceiverElementRepository(EGDbContext dbContext) : base(dbContext, dbContext.DocumentReceiverElements) { } } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs index 0bb95c99..e27e56a6 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/DocumentStatusRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class DocumentStatusRepository : CRUDRepository, IDocumentStatusRepository { - public DocumentStatusRepository(EGDbContext dbContext) : base(dbContext) + public DocumentStatusRepository(EGDbContext dbContext) : base(dbContext, dbContext.DocumentStatus) { } } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs index dc80e97b..ac257a48 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs @@ -12,7 +12,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { private readonly IMemoryCache _cache; - public EmailTemplateRepository(EGDbContext dbContext, IMemoryCache cache) : base(dbContext) + public EmailTemplateRepository(EGDbContext dbContext, IMemoryCache cache) : base(dbContext, dbContext.EmailTemplate) { _cache = cache; } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs index 5cc4195e..0c91e5f4 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class EnvelopeCertificateRepository : CRUDRepository, IEnvelopeCertificateRepository { - public EnvelopeCertificateRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeCertificateRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeCertificates) { } } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs index 57fa4eee..25ff8949 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeDocumentRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class EnvelopeDocumentRepository : CRUDRepository, IEnvelopeDocumentRepository { - public EnvelopeDocumentRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeDocumentRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeDocument) { } } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs index 2c3c64c3..2c7a5b41 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs @@ -8,7 +8,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class EnvelopeHistoryRepository : CRUDRepository, IEnvelopeHistoryRepository { - public EnvelopeHistoryRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeHistoryRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeHistories) { } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs index 9b7533e3..57308ea4 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class EnvelopeTypeRepository : CRUDRepository, IEnvelopeTypeRepository { - public EnvelopeTypeRepository(EGDbContext dbContext) : base(dbContext) + public EnvelopeTypeRepository(EGDbContext dbContext) : base(dbContext, dbContext.EnvelopeTypes) { } } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs index 91d6e812..bccb6c1b 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/ReceiverRepository.cs @@ -7,7 +7,7 @@ namespace EnvelopeGenerator.Infrastructure.Repositories { public class ReceiverRepository : CRUDRepository, IReceiverRepository { - public ReceiverRepository(EGDbContext dbContext) : base(dbContext) + public ReceiverRepository(EGDbContext dbContext) : base(dbContext, dbContext.Receivers) { } From 5f5180d937b7c71a366c15d0d0990867b1e1870e Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 20 Sep 2024 09:39:14 +0200 Subject: [PATCH 44/46] chore(application): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Core-Bibliotheken und `UserManager.Infrastructure` in der Application-Schicht auf Version 2.0.0.0 erhöht. - DbSet-Eigenschaften aus dem DbContext injiziert. --- .../Contracts/IConfigService.cs | 2 +- .../Contracts/IEnvelopeHistoryService.cs | 1 - .../Contracts/IEnvelopeReceiverService.cs | 2 +- .../Contracts/IUserReceiverService.cs | 1 - .../DTOs/DocumentReceiverElementDto.cs | 6 ++++-- .../DTOs/DocumentStatusDto.cs | 6 ++++-- .../DTOs/EmailTemplateDto.cs | 6 ++++-- .../DTOs/EnvelopeCertificateDto.cs | 6 ++++-- .../DTOs/EnvelopeDocumentDto.cs | 6 ++++-- EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs | 5 +++-- .../DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs | 5 +++-- .../EnvelopeReceiver/EnvelopeReceiverBasicDto.cs | 7 +++++-- .../DTOs/EnvelopeTypeDto.cs | 6 ++++-- .../DTOs/Receiver/ReceiverUpdateDto.cs | 6 ++++-- .../DTOs/UserReceiverDto.cs | 6 ++++-- .../EnvelopeGenerator.Application.csproj | 12 ++++++------ .../Services/ConfigService.cs | 6 ++---- .../Services/DocumentReceiverElementService.cs | 2 -- .../Services/DocumentStatusService.cs | 2 -- .../Services/EmailTemplateService.cs | 4 +--- .../Services/EnvelopeHistoryService.cs | 6 ++---- .../Services/EnvelopeReceiverService.cs | 12 ++++++------ .../Services/EnvelopeService.cs | 6 +++--- .../Services/EnvelopeTypeService.cs | 1 - .../Services/ReceiverService.cs | 6 ++---- .../Services/UserReceiverService.cs | 4 +--- .../DocumentReceiverElementRepository.cs | 1 - .../Repositories/EmailTemplateRepository.cs | 1 - .../Repositories/EnvelopeCertificateRepository.cs | 1 - .../Repositories/EnvelopeHistoryRepository.cs | 1 - .../Repositories/EnvelopeTypeRepository.cs | 1 - 31 files changed, 68 insertions(+), 69 deletions(-) diff --git a/EnvelopeGenerator.Application/Contracts/IConfigService.cs b/EnvelopeGenerator.Application/Contracts/IConfigService.cs index d53f0bdd..80702fac 100644 --- a/EnvelopeGenerator.Application/Contracts/IConfigService.cs +++ b/EnvelopeGenerator.Application/Contracts/IConfigService.cs @@ -5,7 +5,7 @@ using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.Contracts { - public interface IConfigService : IBasicCRUDService + public interface IConfigService : IReadService { Task> ReadFirstAsync(); diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs index d6c5e671..b72bdec2 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeHistoryService.cs @@ -3,7 +3,6 @@ using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Domain.Entities; -using EnvelopeGenerator.Infrastructure.Contracts; using static EnvelopeGenerator.Common.Constants; namespace EnvelopeGenerator.Application.Contracts diff --git a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs index 285ed11d..75a897a2 100644 --- a/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IEnvelopeReceiverService.cs @@ -6,7 +6,7 @@ using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.Contracts { - public interface IEnvelopeReceiverService : IBasicCRUDService + public interface IEnvelopeReceiverService : IBasicCRUDService { Task>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false); diff --git a/EnvelopeGenerator.Application/Contracts/IUserReceiverService.cs b/EnvelopeGenerator.Application/Contracts/IUserReceiverService.cs index 17ae83c8..9c6f19fa 100644 --- a/EnvelopeGenerator.Application/Contracts/IUserReceiverService.cs +++ b/EnvelopeGenerator.Application/Contracts/IUserReceiverService.cs @@ -1,7 +1,6 @@ using DigitalData.Core.Abstractions.Application; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; -using EnvelopeGenerator.Infrastructure.Contracts; namespace EnvelopeGenerator.Application.Contracts { diff --git a/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs b/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs index 6e109e68..aff23a33 100644 --- a/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs +++ b/EnvelopeGenerator.Application/DTOs/DocumentReceiverElementDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record DocumentReceiverElementDto( int Id, @@ -18,5 +20,5 @@ DateTime? ChangedWhen, double Top, double Left - ); + ): IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs b/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs index 4037c064..2decac1f 100644 --- a/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs +++ b/EnvelopeGenerator.Application/DTOs/DocumentStatusDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record DocumentStatusDto( int Id, @@ -8,5 +10,5 @@ DateTime? StatusChangedWhen, string Value, DateTime AddedWhen, - DateTime? ChangedWhen); + DateTime? ChangedWhen) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs b/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs index 5ec688ab..8eaa798f 100644 --- a/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EmailTemplateDto.cs @@ -1,8 +1,10 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record EmailTemplateDto( int Id, string Name, string Body, - string Subject); + string Subject) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs index 44547d1e..34d38990 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeCertificateDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record EnvelopeCertificateDto( int Id, @@ -8,5 +10,5 @@ int CreatorId, string CreatorName, string CreatorEmail, - int EnvelopeStatus); + int EnvelopeStatus) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs index caa9c335..340b3a88 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeDocumentDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record EnvelopeDocumentDto ( @@ -6,5 +8,5 @@ int EnvelopeId, DateTime AddedWhen, IEnumerable? Elements - ); + ) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs index 0413453a..02db9593 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeDto.cs @@ -1,10 +1,11 @@ -using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; +using DigitalData.Core.Abstractions; +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; using DigitalData.UserManager.Application.DTOs.User; using EnvelopeGenerator.Domain.Entities; namespace EnvelopeGenerator.Application.DTOs { - public record EnvelopeDto() + public record EnvelopeDto() : IUnique { public int Id { get; set; } diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs index 54e0b1d6..0de3f3fb 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeHistory/EnvelopeHistoryDto.cs @@ -1,4 +1,5 @@ -using DigitalData.Core.DTO; +using DigitalData.Core.Abstractions; +using DigitalData.Core.DTO; using DigitalData.UserManager.Application.DTOs.User; using EnvelopeGenerator.Application.DTOs.Receiver; using static EnvelopeGenerator.Common.Constants; @@ -16,5 +17,5 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory UserCreateDto? Sender, ReceiverReadDto? Receiver, ReferenceType ReferenceType, - string? Comment = null) : BaseDTO(Id); + string? Comment = null) : BaseDTO(Id), IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs index 7590df6e..4dfdf6a8 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeReceiver/EnvelopeReceiverBasicDto.cs @@ -1,9 +1,12 @@ -using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; +using DigitalData.Core.Abstractions; +using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver { - public record EnvelopeReceiverBasicDto() + public record EnvelopeReceiverBasicDto() : IUnique<(int Envelope, int Receiver)> { + public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId); + public int EnvelopeId { get; init; } public int ReceiverId { get; init; } diff --git a/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs b/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs index 2342784d..f7f55ac3 100644 --- a/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs +++ b/EnvelopeGenerator.Application/DTOs/EnvelopeTypeDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record EnvelopeTypeDto( int Id, @@ -15,5 +17,5 @@ bool? SendReminderEmails, int? FirstReminderDays, int? ReminderIntervalDays, - int? ContractType); + int? ContractType) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs index a6818b3a..8f765667 100644 --- a/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs +++ b/EnvelopeGenerator.Application/DTOs/Receiver/ReceiverUpdateDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs.Receiver +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs.Receiver { - public record ReceiverUpdateDto(); + public record ReceiverUpdateDto(int Id) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs index 8c80ecd8..8630838a 100644 --- a/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs +++ b/EnvelopeGenerator.Application/DTOs/UserReceiverDto.cs @@ -1,4 +1,6 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; + +namespace EnvelopeGenerator.Application.DTOs { public record UserReceiverDto( int Id, @@ -7,5 +9,5 @@ string Name, string CompanyName, string JobTitle, - DateTime AddedWhen); + DateTime AddedWhen) : IUnique; } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj index 2d9f8fd7..5ca8bdf4 100644 --- a/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj +++ b/EnvelopeGenerator.Application/EnvelopeGenerator.Application.csproj @@ -12,13 +12,13 @@ - - - - + + + + - - + + diff --git a/EnvelopeGenerator.Application/Services/ConfigService.cs b/EnvelopeGenerator.Application/Services/ConfigService.cs index 57317fc1..1d164d4f 100644 --- a/EnvelopeGenerator.Application/Services/ConfigService.cs +++ b/EnvelopeGenerator.Application/Services/ConfigService.cs @@ -3,15 +3,13 @@ using DigitalData.Core.Application; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.Extensions.Caching.Memory; -using Microsoft.Extensions.Localization; using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services { - public class ConfigService : BasicCRUDService, IConfigService + public class ConfigService : ReadService, IConfigService { private static readonly Guid DefaultConfigCacheId = Guid.NewGuid(); @@ -28,7 +26,7 @@ namespace EnvelopeGenerator.Application.Services var config = await _repository.ReadFirstAsync(); return config is null ? Result.Fail().Notice(LogLevel.Error, Flag.DataIntegrityIssue, "There is no configuration in DB.") - : Result.Success(_mapper.MapOrThrow(config)); + : Result.Success(_mapper.Map(config)); } /// diff --git a/EnvelopeGenerator.Application/Services/DocumentReceiverElementService.cs b/EnvelopeGenerator.Application/Services/DocumentReceiverElementService.cs index 0c8e0c3d..24c25a25 100644 --- a/EnvelopeGenerator.Application/Services/DocumentReceiverElementService.cs +++ b/EnvelopeGenerator.Application/Services/DocumentReceiverElementService.cs @@ -2,10 +2,8 @@ using DigitalData.Core.Application; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using Microsoft.Extensions.Localization; namespace EnvelopeGenerator.Application.Services { diff --git a/EnvelopeGenerator.Application/Services/DocumentStatusService.cs b/EnvelopeGenerator.Application/Services/DocumentStatusService.cs index 019197ff..2a47922d 100644 --- a/EnvelopeGenerator.Application/Services/DocumentStatusService.cs +++ b/EnvelopeGenerator.Application/Services/DocumentStatusService.cs @@ -2,10 +2,8 @@ using DigitalData.Core.Application; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; -using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using Microsoft.Extensions.Localization; namespace EnvelopeGenerator.Application.Services { diff --git a/EnvelopeGenerator.Application/Services/EmailTemplateService.cs b/EnvelopeGenerator.Application/Services/EmailTemplateService.cs index d31e1430..2f9947f4 100644 --- a/EnvelopeGenerator.Application/Services/EmailTemplateService.cs +++ b/EnvelopeGenerator.Application/Services/EmailTemplateService.cs @@ -1,11 +1,9 @@ using AutoMapper; using DigitalData.Core.Application; -using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using EnvelopeGenerator.Application.Resources; using static EnvelopeGenerator.Common.Constants; using DigitalData.Core.DTO; using Microsoft.Extensions.Logging; @@ -26,7 +24,7 @@ namespace EnvelopeGenerator.Application.Services ? Result.Fail() .Message(Key.InnerServiceError) .Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"EmailTemplateType '{type}' is not found in DB. Please, define required e-mail template.") - : Result.Success(_mapper.MapOrThrow(temp)); + : Result.Success(_mapper.Map(temp)); } } } \ No newline at end of file diff --git a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs index d7a4a26a..db72280a 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeHistoryService.cs @@ -1,11 +1,9 @@ using AutoMapper; using DigitalData.Core.Application; -using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using static EnvelopeGenerator.Common.Constants; -using EnvelopeGenerator.Application.Resources; using DigitalData.Core.DTO; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.Receiver; @@ -14,7 +12,7 @@ namespace EnvelopeGenerator.Application.Services { public class EnvelopeHistoryService : CRUDService, IEnvelopeHistoryService { - public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IStringLocalizer localizer, IMapper mapper) + public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IMapper mapper) : base(repository, mapper) { } @@ -53,7 +51,7 @@ namespace EnvelopeGenerator.Application.Services public async Task> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false) { - var histDTOs = _mapper.MapOrThrow>( + var histDTOs = _mapper.Map>( await _repository.ReadAsync( envelopeId: envelopeId, userReference: userReference, diff --git a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs index f995941e..bd09cac4 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeReceiverService.cs @@ -11,7 +11,7 @@ using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services { - public class EnvelopeReceiverService : BasicCRUDService, IEnvelopeReceiverService + public class EnvelopeReceiverService : BasicCRUDService, IEnvelopeReceiverService { private readonly IStringLocalizer _localizer; @@ -24,19 +24,19 @@ namespace EnvelopeGenerator.Application.Services public async Task>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true) { var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver); - return Result.Success(_mapper.MapOrThrow>(env_rcvs)); + return Result.Success(_mapper.Map>(env_rcvs)); } public async Task>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false) { var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver); - return Result.Success(_mapper.MapOrThrow>(env_rcvs)); + return Result.Success(_mapper.Map>(env_rcvs)); } public async Task>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true) { var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver); - return Result.Success(_mapper.MapOrThrow>(env_rcvs)); + return Result.Success(_mapper.Map>(env_rcvs)); } public async Task> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true) @@ -46,7 +46,7 @@ namespace EnvelopeGenerator.Application.Services return Result.Fail() .Message(Key.EnvelopeReceiverNotFound); - return Result.Success(_mapper.MapOrThrow(env_rcv)); + return Result.Success(_mapper.Map(env_rcv)); } public async Task> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true) @@ -125,7 +125,7 @@ namespace EnvelopeGenerator.Application.Services public async Task>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses) { var er_list = await _repository.ReadByUsernameAsync(username: username, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses); - var dto_list = _mapper.MapOrThrow>(er_list); + var dto_list = _mapper.Map>(er_list); return Result.Success(dto_list); } diff --git a/EnvelopeGenerator.Application/Services/EnvelopeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeService.cs index 7f76b64e..fc84d2f6 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeService.cs @@ -18,7 +18,7 @@ namespace EnvelopeGenerator.Application.Services public async Task>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false) { var envelopes = await _repository.ReadAllWithAsync(documents: documents, history: history, documentReceiverElement: documentReceiverElement); - var readDto = _mapper.MapOrThrow>(envelopes); + var readDto = _mapper.Map>(envelopes); return Result.Success(readDto); } @@ -29,14 +29,14 @@ namespace EnvelopeGenerator.Application.Services if (envelope is null) return Result.Fail(); - var readDto = _mapper.MapOrThrow(envelope); + var readDto = _mapper.Map(envelope); return Result.Success(readDto); } public async Task>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses) { var users = await _repository.ReadByUserAsync(userId: userId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses); - var readDto = _mapper.MapOrThrow>(users); + var readDto = _mapper.Map>(users); return Result.Success(readDto); } } diff --git a/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs b/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs index 5402ba05..2bc3cc75 100644 --- a/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs +++ b/EnvelopeGenerator.Application/Services/EnvelopeTypeService.cs @@ -6,7 +6,6 @@ using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.Extensions.Caching.Memory; using DigitalData.Core.DTO; -using System.Collections.Generic; using Microsoft.Extensions.Logging; namespace EnvelopeGenerator.Application.Services diff --git a/EnvelopeGenerator.Application/Services/ReceiverService.cs b/EnvelopeGenerator.Application/Services/ReceiverService.cs index edbe3d62..422f5c0f 100644 --- a/EnvelopeGenerator.Application/Services/ReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/ReceiverService.cs @@ -1,10 +1,8 @@ using AutoMapper; using DigitalData.Core.Application; -using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.DTOs.Receiver; using DigitalData.Core.DTO; @@ -12,7 +10,7 @@ namespace EnvelopeGenerator.Application.Services { public class ReceiverService : CRUDService, IReceiverService { - public ReceiverService(IReceiverRepository repository, IStringLocalizer localizer, IMapper mapper) + public ReceiverService(IReceiverRepository repository, IMapper mapper) : base(repository, mapper) { } @@ -24,7 +22,7 @@ namespace EnvelopeGenerator.Application.Services if (rcv is null) return Result.Fail(); - return Result.Success(_mapper.MapOrThrow(rcv)); + return Result.Success(_mapper.Map(rcv)); } public async Task DeleteByAsync(string? emailAddress = null, string? signature = null) diff --git a/EnvelopeGenerator.Application/Services/UserReceiverService.cs b/EnvelopeGenerator.Application/Services/UserReceiverService.cs index d241d5bf..08da1906 100644 --- a/EnvelopeGenerator.Application/Services/UserReceiverService.cs +++ b/EnvelopeGenerator.Application/Services/UserReceiverService.cs @@ -1,17 +1,15 @@ using AutoMapper; using DigitalData.Core.Application; -using Microsoft.Extensions.Localization; using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; -using EnvelopeGenerator.Application.Resources; namespace EnvelopeGenerator.Application.Services { public class UserReceiverService : BasicCRUDService, IUserReceiverService { - public UserReceiverService(IUserReceiverRepository repository, IStringLocalizer localizer, IMapper mapper) + public UserReceiverService(IUserReceiverRepository repository, IMapper mapper) : base(repository, mapper) { } diff --git a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs index 5b410f98..a57bde74 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/DocumentReceiverElementRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs index ac257a48..47772341 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EmailTemplateRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs index 0c91e5f4..6bc3c4a9 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeCertificateRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs index 2c7a5b41..97dcfc37 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeHistoryRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; using Microsoft.EntityFrameworkCore; diff --git a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs index 57308ea4..5bc9f6c5 100644 --- a/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs +++ b/EnvelopeGenerator.Infrastructure/Repositories/EnvelopeTypeRepository.cs @@ -1,5 +1,4 @@ using DigitalData.Core.Infrastructure; -using DigitalData.UserManager.Infrastructure.Repositories; using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Infrastructure.Contracts; From 017d03713b163f79f470da456bd1573cf4132fea Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 20 Sep 2024 09:46:21 +0200 Subject: [PATCH 45/46] =?UTF-8?q?refactor(dbcontext):=20DbContext=20aktual?= =?UTF-8?q?isiert,=20um=20IUserManagerDbContext=20zu=20implementieren=20un?= =?UTF-8?q?d=20neue=20DbSets=20hinzuzuf=C3=BCgen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Implementierung des `IUserManagerDbContext` Interface in `EGDbContext`. - Neue `DbSet`-Eigenschaften für `GroupOfUser`, `Group`, `ModuleOfUser`, `Module`, `User` und `UserRep` hinzugefügt. - Neue DbSets im Konstruktor injiziert. - Namespace-Importe aktualisiert, um zusätzliche Entitäten für die neuen DbSets einzubeziehen. --- .../EGDbContext.cs | 25 ++++++++++++++++++- .../EnvelopeGenerator.Web.csproj | 8 +++--- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index 82051684..877dfec9 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -1,11 +1,15 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.Entities; +using DigitalData.UserManager.Domain.Entities; using DigitalData.UserManager.Infrastructure; +using DigitalData.UserManager.Infrastructure.Contracts; using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; +using Group = DigitalData.UserManager.Domain.Entities.Group; +using Module = DigitalData.UserManager.Domain.Entities.Module; namespace EnvelopeGenerator.Infrastructure { - public class EGDbContext : DbContext + public class EGDbContext : DbContext, IUserManagerDbContext { public DbSet UserReceivers { get; set; } @@ -31,6 +35,18 @@ namespace EnvelopeGenerator.Infrastructure public DbSet Receivers { get; set; } + public DbSet GroupOfUsers { get; set; } + + public DbSet Groups { get; set; } + + public DbSet ModuleOfUsers { get; set; } + + public DbSet Modules { get; set; } + + public DbSet Users { get; set; } + + public DbSet UserReps { get; set; } + public EGDbContext(DbContextOptions options) : base(options) { UserReceivers = Set(); @@ -44,6 +60,13 @@ namespace EnvelopeGenerator.Infrastructure EnvelopeHistories = Set(); EnvelopeTypes = Set(); Receivers = Set(); + + GroupOfUsers = Set(); + Groups = Set(); + ModuleOfUsers = Set(); + Modules = Set(); + Users = Set(); + UserReps = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj index 8bed176f..53958473 100644 --- a/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj +++ b/EnvelopeGenerator.Web/EnvelopeGenerator.Web.csproj @@ -38,9 +38,9 @@ - - - + + + @@ -64,7 +64,7 @@ - + From 2fb8af9a4ff2d2e9bc82fab8a045a6389e233fee Mon Sep 17 00:00:00 2001 From: Developer 02 Date: Fri, 20 Sep 2024 11:05:00 +0200 Subject: [PATCH 46/46] chore(api): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Core-Bibliotheken und UserManager.Infrastructure in den API-Schichten auf Version 2.0.0.0 erhöht. --- .../DTOs/ConfigDto.cs | 12 ++- .../EnvelopeGenerator.GeneratorAPI.csproj | 6 +- .../EGDbContext.cs | 7 +- .../EnvelopeGenerator.Infrastructure.csproj | 1 + .../Controllers/Test/TestConfigController.cs | 3 +- .../Controllers/Test/TestControllerBase.cs | 5 +- .../Test/TestEnvelopeReceiverController.cs | 2 +- .../Views/Home/EnvelopeRejected.cshtml | 10 +- .../Views/Home/ShowEnvelope.cshtml | 92 ++++++++++--------- 9 files changed, 78 insertions(+), 60 deletions(-) diff --git a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs index 751ab329..f96f131d 100644 --- a/EnvelopeGenerator.Application/DTOs/ConfigDto.cs +++ b/EnvelopeGenerator.Application/DTOs/ConfigDto.cs @@ -1,4 +1,7 @@ -namespace EnvelopeGenerator.Application.DTOs +using DigitalData.Core.Abstractions; +using System.Text.Json.Serialization; + +namespace EnvelopeGenerator.Application.DTOs { public record ConfigDto( string DocumentPath, @@ -8,5 +11,10 @@ string ExportPath, string DocumentPathDmz, string ExportPathDmz, - string DocumentPathMoveAftsend); + string DocumentPathMoveAftsend) : IUnique + { + [JsonIgnore] + [Obsolete("Configuration does not have an ID; it represents a single table in the database.")] + public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single row in the database."); + }; } \ No newline at end of file diff --git a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj index d42159a2..2684ed2c 100644 --- a/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj +++ b/EnvelopeGenerator.GeneratorAPI/EnvelopeGenerator.GeneratorAPI.csproj @@ -1,4 +1,4 @@ - + net7.0 @@ -7,8 +7,8 @@ - - + + diff --git a/EnvelopeGenerator.Infrastructure/EGDbContext.cs b/EnvelopeGenerator.Infrastructure/EGDbContext.cs index 877dfec9..449bd55e 100644 --- a/EnvelopeGenerator.Infrastructure/EGDbContext.cs +++ b/EnvelopeGenerator.Infrastructure/EGDbContext.cs @@ -6,10 +6,12 @@ using EnvelopeGenerator.Domain.Entities; using Microsoft.EntityFrameworkCore; using Group = DigitalData.UserManager.Domain.Entities.Group; using Module = DigitalData.UserManager.Domain.Entities.Module; +using DigitalData.EmailProfilerDispatcher; namespace EnvelopeGenerator.Infrastructure { - public class EGDbContext : DbContext, IUserManagerDbContext + //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; } @@ -47,6 +49,8 @@ namespace EnvelopeGenerator.Infrastructure public DbSet UserReps { get; set; } + public DbSet EMailOuts { get; set; } + public EGDbContext(DbContextOptions options) : base(options) { UserReceivers = Set(); @@ -67,6 +71,7 @@ namespace EnvelopeGenerator.Infrastructure Modules = Set(); Users = Set(); UserReps = Set(); + EMailOuts = Set(); } protected override void OnModelCreating(ModelBuilder modelBuilder) diff --git a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj index 399d3269..f295ff69 100644 --- a/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj +++ b/EnvelopeGenerator.Infrastructure/EnvelopeGenerator.Infrastructure.csproj @@ -9,6 +9,7 @@ + all diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs index ad7e0ec3..0117f542 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestConfigController.cs @@ -1,10 +1,11 @@ using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Domain.Entities; +using DigitalData.Core.API; namespace EnvelopeGenerator.Web.Controllers.Test { - public class TestConfigController : TestControllerBase + public class TestConfigController : ReadControllerBase { public TestConfigController(ILogger logger, IConfigService service) : base(logger, service) { diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestControllerBase.cs b/EnvelopeGenerator.Web/Controllers/Test/TestControllerBase.cs index e39b0ed8..b92ae934 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestControllerBase.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestControllerBase.cs @@ -1,6 +1,7 @@ using DigitalData.Core.API; using DigitalData.Core.Abstractions.Application; using Microsoft.AspNetCore.Mvc; +using DigitalData.Core.Abstractions; namespace EnvelopeGenerator.Web.Controllers.Test { @@ -8,10 +9,10 @@ namespace EnvelopeGenerator.Web.Controllers.Test [Route("api/test/[controller]")] public class TestControllerBase : BasicCRUDControllerBase where TCRUDService : ICRUDService - where TDto : class where TEntity : class + where TDto : class, IUnique where TEntity : class, IUnique { public TestControllerBase(ILogger logger, TCRUDService service) : base(logger, service) { } } -} +} \ No newline at end of file diff --git a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs index a88a8887..592688de 100644 --- a/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs +++ b/EnvelopeGenerator.Web/Controllers/Test/TestEnvelopeReceiverController.cs @@ -8,7 +8,7 @@ using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver; namespace EnvelopeGenerator.Web.Controllers.Test { - public class TestEnvelopeReceiverController : TestControllerBase + public class TestEnvelopeReceiverController : ReadControllerBase { public TestEnvelopeReceiverController(ILogger logger, IEnvelopeReceiverService service) : base(logger, service) { diff --git a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml index d927d11d..7e7999ba 100644 --- a/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/EnvelopeRejected.cshtml @@ -2,12 +2,12 @@ ViewData["Title"] = _localizer[WebKey.DocRejected]; } @{ - var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; + var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@ using DigitalData.Core.DTO; -@ using EnvelopeGenerator.Application.DTOs; -@ using Newtonsoft.Json -@ using Newtonsoft.Json.Serialization +@using DigitalData.Core.DTO; +@using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +@using Newtonsoft.Json +@using Newtonsoft.Json.Serialization @model EnvelopeReceiverDto; @{ diff --git a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml index fd46d857..8494d850 100644 --- a/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml +++ b/EnvelopeGenerator.Web/Views/Home/ShowEnvelope.cshtml @@ -1,11 +1,10 @@ @{ var nonce = _accessor.HttpContext?.Items["csp-nonce"] as string; } -@ using DigitalData.Core.DTO; -@ using EnvelopeGenerator.Application.DTOs; -@ using Newtonsoft.Json -@ using Newtonsoft.Json.Serialization -@model EnvelopeReceiverDto; +@using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver +@using Newtonsoft.Json +@using Newtonsoft.Json.Serialization +@model EnvelopeReceiverDto @{ ViewData["Title"] = _localizer[WebKey.SignDoc]; } @@ -21,40 +20,43 @@ }
-