diff --git a/Commands.Test/Commands.Test.csproj b/Commands.Test/Commands.Test.csproj index f1ef6a1b..edabc2a0 100644 --- a/Commands.Test/Commands.Test.csproj +++ b/Commands.Test/Commands.Test.csproj @@ -1,29 +1,24 @@ - false - - - - - - - - + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/Commands/Commands.csproj b/Commands/Commands.csproj index 74e851d2..4eb3920d 100644 --- a/Commands/Commands.csproj +++ b/Commands/Commands.csproj @@ -1,16 +1,11 @@ - - + - - - - - + + - - + \ No newline at end of file diff --git a/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountCommand.cs b/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountCommand.cs index 7652adb9..80fe1fa1 100644 --- a/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountCommand.cs +++ b/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountCommand.cs @@ -4,7 +4,8 @@ namespace Commands.Handlers.BankAccount.AddBankAccount; public record AddBankAccountCommand( string Name, - string AccountNumber + string AccountNumber, + string PerformingUser ) : IRequest; public class AddAccountCommandValidator : AbstractValidator @@ -18,5 +19,7 @@ public AddAccountCommandValidator() RuleFor(x => x.Name) .NotEmpty(); + RuleFor(x => x.PerformingUser) + .NotEmpty(); } } diff --git a/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountHandler.cs b/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountHandler.cs index 7dabc9ee..72689463 100644 --- a/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountHandler.cs +++ b/Commands/Handlers/BankAccount/AddBankAccount/AddBankAccountHandler.cs @@ -1,6 +1,3 @@ -using Commands.Extensions; -using Commands.Services; - using Domain.Interfaces; namespace Commands.Handlers.BankAccount.AddBankAccount; @@ -8,18 +5,15 @@ namespace Commands.Handlers.BankAccount.AddBankAccount; public class AddBankAccountHandler : IRequestHandler { private readonly IBankAccountRepository _bankAccountRepository; - private readonly IUserAccessor _userAccessor; - public AddBankAccountHandler(IBankAccountRepository bankAccountRepository, IUserAccessor userAccessor) + public AddBankAccountHandler(IBankAccountRepository bankAccountRepository) { _bankAccountRepository = bankAccountRepository; - _userAccessor = userAccessor; } public async Task Handle(AddBankAccountCommand request, CancellationToken ct) { - var performingUser = _userAccessor.User.GetName()!; - var newAccount = new Domain.BankAccount(request.Name, request.AccountNumber, performingUser); + var newAccount = new Domain.BankAccount(request.Name, request.AccountNumber, request.PerformingUser); _bankAccountRepository.Add(newAccount); await _bankAccountRepository.SaveAsync(ct); diff --git a/Commands/Handlers/EditBankAccount/EditBankAccountCommand.cs b/Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountCommand.cs similarity index 81% rename from Commands/Handlers/EditBankAccount/EditBankAccountCommand.cs rename to Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountCommand.cs index 8612f890..070afbce 100644 --- a/Commands/Handlers/EditBankAccount/EditBankAccountCommand.cs +++ b/Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountCommand.cs @@ -5,7 +5,8 @@ namespace Commands.Handlers.BankAccount.EditBankAccount; public record EditBankAccountCommand( Guid Id, string Name, - string AccountNumber + string AccountNumber, + string PerformingUser ) : IRequest; public class EditBankAccountValidator : AbstractValidator @@ -22,5 +23,7 @@ public EditBankAccountValidator() .NotEmpty() .MinimumLength(5) .MaximumLength(34); + RuleFor(x => x.PerformingUser) + .NotEmpty(); } } \ No newline at end of file diff --git a/Commands/Handlers/EditBankAccount/EditBankAccountHandler.cs b/Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountHandler.cs similarity index 66% rename from Commands/Handlers/EditBankAccount/EditBankAccountHandler.cs rename to Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountHandler.cs index a2366733..5f2e3739 100644 --- a/Commands/Handlers/EditBankAccount/EditBankAccountHandler.cs +++ b/Commands/Handlers/BankAccount/EditBankAccount/EditBankAccountHandler.cs @@ -1,6 +1,3 @@ -using Commands.Extensions; -using Commands.Services; - using Domain.Interfaces; namespace Commands.Handlers.BankAccount.EditBankAccount; @@ -8,12 +5,10 @@ namespace Commands.Handlers.BankAccount.EditBankAccount; public class EditBankAccountHandler : IRequestHandler { private readonly IBankAccountRepository _repository; - private readonly IUserAccessor _userAccessor; - public EditBankAccountHandler(IBankAccountRepository repository, IUserAccessor userAccessor) + public EditBankAccountHandler(IBankAccountRepository repository) { _repository = repository; - _userAccessor = userAccessor; } public async Task Handle(EditBankAccountCommand request, CancellationToken cancellationToken) @@ -21,10 +16,8 @@ public async Task Handle(EditBankAccountCommand request, CancellationToken var bankAccount = await _repository.GetByIdAsync(request.Id, cancellationToken) ?? throw new ArgumentException($"No bankaccount found for Id {request.Id}", nameof(request.Id)); - var performingUser = _userAccessor.User.GetName()!; - - bankAccount.ChangeName(request.Name, performingUser); - bankAccount.ChangeAccountNumber(request.AccountNumber, performingUser); + bankAccount.ChangeName(request.Name, request.PerformingUser); + bankAccount.ChangeAccountNumber(request.AccountNumber, request.PerformingUser); await _repository.SaveAsync(cancellationToken); return bankAccount.Id; diff --git a/Commands/Handlers/Member/AddMember/AddMemberCommand.cs b/Commands/Handlers/Member/AddMember/AddMemberCommand.cs index cb83a214..07213a19 100644 --- a/Commands/Handlers/Member/AddMember/AddMemberCommand.cs +++ b/Commands/Handlers/Member/AddMember/AddMemberCommand.cs @@ -11,7 +11,8 @@ public record AddMemberCommand( string Email, string PhoneNumber, double MembershipFee, - DateTimeOffset MembershipExpiryDate + DateTimeOffset MembershipExpiryDate, + string PerformingUser ) : IRequest; public class AddMemberCommandValidator : AbstractValidator @@ -40,6 +41,9 @@ public AddMemberCommandValidator() RuleFor(x => x.MembershipFee) .GreaterThanOrEqualTo(0); + + RuleFor(x => x.PerformingUser) + .NotEmpty(); } public class AddMemberCommandAddressValidator : AbstractValidator
diff --git a/Commands/Handlers/Member/AddMember/AddMemberHandler.cs b/Commands/Handlers/Member/AddMember/AddMemberHandler.cs index 5e85dfb3..417f74f0 100644 --- a/Commands/Handlers/Member/AddMember/AddMemberHandler.cs +++ b/Commands/Handlers/Member/AddMember/AddMemberHandler.cs @@ -1,6 +1,3 @@ -using Commands.Extensions; -using Commands.Services; - using Domain.Interfaces; using Microsoft.EntityFrameworkCore; @@ -12,13 +9,11 @@ namespace Commands.Handlers.Member.AddMember; public class AddMemberHandler : IRequestHandler { private readonly IMemberRepository _memberRepository; - private readonly IUserAccessor _userAccessor; private readonly HaSpManContext _dbContext; - public AddMemberHandler(IMemberRepository memberRepository, IUserAccessor userAccessor, HaSpManContext dbContext) + public AddMemberHandler(IMemberRepository memberRepository, HaSpManContext dbContext) { _memberRepository = memberRepository; - _userAccessor = userAccessor; _dbContext = dbContext; } @@ -31,7 +26,7 @@ public async Task Handle(AddMemberCommand request, CancellationToken cance lastName: request.LastName, address: request.Address, membershipFee: request.MembershipFee, - performedBy: _userAccessor.User.GetName() ?? throw new Exception("Command performed by user with no name"), + performedBy: request.PerformingUser, membershipExpiryDate: request.MembershipExpiryDate, email: request.Email, phoneNumber: request.PhoneNumber diff --git a/Commands/Handlers/Member/EditMember/EditMemberCommand.cs b/Commands/Handlers/Member/EditMember/EditMemberCommand.cs index 5e4353c2..3000d94e 100644 --- a/Commands/Handlers/Member/EditMember/EditMemberCommand.cs +++ b/Commands/Handlers/Member/EditMember/EditMemberCommand.cs @@ -12,7 +12,8 @@ public record EditMemberCommand( string Email, string PhoneNumber, double MembershipFee, - DateTimeOffset? MembershipExpiryDate + DateTimeOffset? MembershipExpiryDate, + string PerformingUser ) : IRequest; public class EditMemberCommandValidator : AbstractValidator @@ -41,6 +42,9 @@ public EditMemberCommandValidator() RuleFor(x => x.MembershipFee) .GreaterThanOrEqualTo(0); + + RuleFor(x => x.PerformingUser) + .NotEmpty(); } public class EditMemberCommandAddressValidator : AbstractValidator
diff --git a/Commands/Handlers/Member/EditMember/EditMemberHandler.cs b/Commands/Handlers/Member/EditMember/EditMemberHandler.cs index 11125334..d5e296a3 100644 --- a/Commands/Handlers/Member/EditMember/EditMemberHandler.cs +++ b/Commands/Handlers/Member/EditMember/EditMemberHandler.cs @@ -1,6 +1,3 @@ -using Commands.Extensions; -using Commands.Services; - using Domain.Interfaces; using Microsoft.EntityFrameworkCore; @@ -12,13 +9,11 @@ namespace Commands.Handlers.Member.EditMember; public class EditMemberHandler : IRequestHandler { private readonly IMemberRepository _memberRepository; - private readonly IUserAccessor _userAccessor; private readonly HaSpManContext _dbContext; - public EditMemberHandler(IMemberRepository memberRepository, IUserAccessor userAccessor, HaSpManContext dbContext) + public EditMemberHandler(IMemberRepository memberRepository, HaSpManContext dbContext) { _memberRepository = memberRepository; - _userAccessor = userAccessor; _dbContext = dbContext; } @@ -29,7 +24,7 @@ public async Task Handle(EditMemberCommand request, CancellationToken cancellati await EnsureMemberIsNotBecomeDuplicate(request, cancellationToken); - var performingUser = _userAccessor.User.GetName()!; + var performingUser = request.PerformingUser; member.ChangeAddress(request.Address, performingUser); member.ChangeEmail(request.Email, performingUser); member.ChangeMembershipExpiryDate(request.MembershipExpiryDate, performingUser); diff --git a/Commands/Handlers/Member/ExtendMembership/ExtendMembershipCommand.cs b/Commands/Handlers/Member/ExtendMembership/ExtendMembershipCommand.cs index f87ee189..c340a93e 100644 --- a/Commands/Handlers/Member/ExtendMembership/ExtendMembershipCommand.cs +++ b/Commands/Handlers/Member/ExtendMembership/ExtendMembershipCommand.cs @@ -2,7 +2,7 @@ namespace Commands.Handlers.Member.ExtendMembership; -public record ExtendMembershipCommand(Guid Id, DateTime NewMembershipExpirationDate) : IRequest; +public record ExtendMembershipCommand(Guid Id, DateTime NewMembershipExpirationDate, string PerformingUser) : IRequest; public class ExtendMembershipCommandValidator : AbstractValidator { @@ -12,5 +12,7 @@ public ExtendMembershipCommandValidator() .NotEmpty(); RuleFor(x => x.NewMembershipExpirationDate) .NotEmpty(); + RuleFor(x => x.PerformingUser) + .NotEmpty(); } } \ No newline at end of file diff --git a/Commands/Handlers/Member/ExtendMembership/ExtendMembershipHandler.cs b/Commands/Handlers/Member/ExtendMembership/ExtendMembershipHandler.cs index 5ae4f804..1e459909 100644 --- a/Commands/Handlers/Member/ExtendMembership/ExtendMembershipHandler.cs +++ b/Commands/Handlers/Member/ExtendMembership/ExtendMembershipHandler.cs @@ -1,29 +1,22 @@ -using Commands.Extensions; -using Commands.Services; - -using Domain.Interfaces; +using Domain.Interfaces; namespace Commands.Handlers.Member.ExtendMembership; public class ExtendMembershipHandler : IRequestHandler { private readonly IMemberRepository _repository; - private readonly IUserAccessor _userAccessor; - public ExtendMembershipHandler(IMemberRepository repository, IUserAccessor userAccessor) + public ExtendMembershipHandler(IMemberRepository repository) { _repository = repository; - _userAccessor = userAccessor; } public async Task Handle(ExtendMembershipCommand request, CancellationToken cancellationToken) { var member = await _repository.GetById(request.Id) ?? throw new ArgumentException($"No member found by Id {request.Id}", nameof(request.Id)); - - var performingUser = _userAccessor.User.GetName()!; - - member.ChangeMembershipExpiryDate(request.NewMembershipExpirationDate, performingUser); + + member.ChangeMembershipExpiryDate(request.NewMembershipExpirationDate, request.PerformingUser); await _repository.Save(cancellationToken); } diff --git a/Commands/Properties/launchSettings.json b/Commands/Properties/launchSettings.json new file mode 100644 index 00000000..9a4c51bb --- /dev/null +++ b/Commands/Properties/launchSettings.json @@ -0,0 +1,12 @@ +{ + "profiles": { + "Commands": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:63966;http://localhost:63977" + } + } +} \ No newline at end of file diff --git a/Directory.Build.props b/Directory.Build.props index 011b9b49..58948047 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,6 +1,6 @@ - net8.0 + net10.0 enable enable true diff --git a/Directory.Packages.props b/Directory.Packages.props new file mode 100644 index 00000000..356676d7 --- /dev/null +++ b/Directory.Packages.props @@ -0,0 +1,33 @@ + + + true + true + $(NoWarn);NU1507 + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Domain.Test/Domain.Test.csproj b/Domain.Test/Domain.Test.csproj index 21c86826..52f15798 100644 --- a/Domain.Test/Domain.Test.csproj +++ b/Domain.Test/Domain.Test.csproj @@ -1,22 +1,19 @@ - - - - - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/Domain/Domain.csproj b/Domain/Domain.csproj index e172b2b5..400c1bd2 100644 --- a/Domain/Domain.csproj +++ b/Domain/Domain.csproj @@ -1,10 +1,9 @@ - - - + + - + \ No newline at end of file diff --git a/HaSpMan.Web.Dockerfile b/HaSpMan.Web.Dockerfile index 97f4ae68..d7921c9a 100644 --- a/HaSpMan.Web.Dockerfile +++ b/HaSpMan.Web.Dockerfile @@ -1,8 +1,9 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build WORKDIR /src COPY ./*.sln ./ COPY ./Directory.Build.props ./ +COPY ./Directory.Packages.props ./ COPY */*.csproj ./ RUN for file in $(ls *.csproj); do mkdir -p ${file%.*} && mv $file ${file%.*}; done @@ -12,7 +13,7 @@ COPY . ./ WORKDIR /src/Web RUN dotnet publish -c Release -o /app -FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app COPY --from=build /app . diff --git a/HaSpMan.sln b/HaSpMan.sln index a8769153..ebd23fc9 100644 --- a/HaSpMan.sln +++ b/HaSpMan.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 17 -VisualStudioVersion = 17.1.32210.238 +# Visual Studio Version 18 +VisualStudioVersion = 18.7.11925.98 stable MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Web", "Web\Web.csproj", "{A7B0F294-7FFA-40EC-AADF-F8B7FE74B555}" EndProject @@ -24,6 +24,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{FF2A0D78-2030-4F77-9284-88A9F85327CA}" ProjectSection(SolutionItems) = preProject .editorconfig = .editorconfig + Directory.Packages.props = Directory.Packages.props docker-compose.dev.yaml = docker-compose.dev.yaml HaSpMan.Web.Dockerfile = HaSpMan.Web.Dockerfile .github\workflows\publish.yml = .github\workflows\publish.yml diff --git a/Persistence/Migrations/20250905205952_DiscriminatorHasMaxLength.cs b/Persistence/Migrations/20250905205952_DiscriminatorHasMaxLength.cs index 272d6a58..59733ec2 100644 --- a/Persistence/Migrations/20250905205952_DiscriminatorHasMaxLength.cs +++ b/Persistence/Migrations/20250905205952_DiscriminatorHasMaxLength.cs @@ -2,27 +2,27 @@ #nullable disable -namespace Persistence.Migrations +namespace Persistence.Migrations; + +/// +public partial class DiscriminatorHasMaxLength : Migration { /// - public partial class DiscriminatorHasMaxLength : Migration + protected override void Up(MigrationBuilder migrationBuilder) { - /// - protected override void Up(MigrationBuilder migrationBuilder) - { - migrationBuilder.Sql($@"DROP VIEW IF EXISTS HaSpMan.vwBankAccountTotals"); + migrationBuilder.Sql($@"DROP VIEW IF EXISTS HaSpMan.vwBankAccountTotals"); - migrationBuilder.AlterColumn( - name: "Discriminator", - schema: "HaSpMan", - table: "Transactions", - type: "nvarchar(21)", - maxLength: 21, - nullable: false, - oldClrType: typeof(string), - oldType: "nvarchar(max)"); + migrationBuilder.AlterColumn( + name: "Discriminator", + schema: "HaSpMan", + table: "Transactions", + type: "nvarchar(21)", + maxLength: 21, + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(max)"); - migrationBuilder.Sql($@"CREATE OR ALTER VIEW HaSpMan.vwBankAccountTotals + migrationBuilder.Sql($@"CREATE OR ALTER VIEW HaSpMan.vwBankAccountTotals WITH SCHEMABINDING AS SELECT @@ -37,20 +37,19 @@ ELSE t.Amount FROM HaSpMan.Transactions t GROUP BY t.BankAccountId"); - } + } - /// - protected override void Down(MigrationBuilder migrationBuilder) - { - migrationBuilder.AlterColumn( - name: "Discriminator", - schema: "HaSpMan", - table: "Transactions", - type: "nvarchar(max)", - nullable: false, - oldClrType: typeof(string), - oldType: "nvarchar(21)", - oldMaxLength: 21); - } + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.AlterColumn( + name: "Discriminator", + schema: "HaSpMan", + table: "Transactions", + type: "nvarchar(max)", + nullable: false, + oldClrType: typeof(string), + oldType: "nvarchar(21)", + oldMaxLength: 21); } -} +} \ No newline at end of file diff --git a/Persistence/Persistence.csproj b/Persistence/Persistence.csproj index f3ddeaa8..047f524d 100644 --- a/Persistence/Persistence.csproj +++ b/Persistence/Persistence.csproj @@ -1,16 +1,13 @@  - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/Queries.Test/Queries.Test.csproj b/Queries.Test/Queries.Test.csproj index 7e89b022..d973cb40 100644 --- a/Queries.Test/Queries.Test.csproj +++ b/Queries.Test/Queries.Test.csproj @@ -1,26 +1,21 @@ - - + false - - - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/Queries/Queries.csproj b/Queries/Queries.csproj index 78cc0f39..364d484a 100644 --- a/Queries/Queries.csproj +++ b/Queries/Queries.csproj @@ -1,13 +1,10 @@ - - - - + + + - - - + \ No newline at end of file diff --git a/Web.Test/Web.Test.csproj b/Web.Test/Web.Test.csproj index a20dce25..9619ae34 100644 --- a/Web.Test/Web.Test.csproj +++ b/Web.Test/Web.Test.csproj @@ -1,25 +1,20 @@ - - + false - - - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + \ No newline at end of file diff --git a/Commands/Extensions/ClaimsPrincipalExtensions.cs b/Web/Extensions/ClaimsPrincipalExtensions.cs similarity index 89% rename from Commands/Extensions/ClaimsPrincipalExtensions.cs rename to Web/Extensions/ClaimsPrincipalExtensions.cs index 7bf84f9e..96410dd9 100644 --- a/Commands/Extensions/ClaimsPrincipalExtensions.cs +++ b/Web/Extensions/ClaimsPrincipalExtensions.cs @@ -1,6 +1,6 @@ using System.Security.Claims; -namespace Commands.Extensions; +namespace Web.Extensions; public static class ClaimsPrincipalExtensions { diff --git a/Commands/Extensions/CustomClaimTypes.cs b/Web/Extensions/CustomClaimTypes.cs similarity index 73% rename from Commands/Extensions/CustomClaimTypes.cs rename to Web/Extensions/CustomClaimTypes.cs index 336548cf..5d0c95b8 100644 --- a/Commands/Extensions/CustomClaimTypes.cs +++ b/Web/Extensions/CustomClaimTypes.cs @@ -1,4 +1,4 @@ -namespace Commands.Extensions; +namespace Web.Extensions; public static class CustomClaimTypes { diff --git a/Web/MapperProfiles/BankAccountProfile.cs b/Web/MapperProfiles/BankAccountProfile.cs index da2dfa1f..a22b2aa5 100644 --- a/Web/MapperProfiles/BankAccountProfile.cs +++ b/Web/MapperProfiles/BankAccountProfile.cs @@ -14,10 +14,7 @@ public class BankAccountProfile : Profile { public BankAccountProfile() { - CreateMap() - .ForCtorParam(nameof(AddBankAccountCommand.Name), o => o.MapFrom(src => src.Name)) - .ForCtorParam(nameof(AddBankAccountCommand.AccountNumber), o => o.MapFrom(src => src.AccountNumber)); - + CreateMap(); CreateMap() diff --git a/Web/MapperProfiles/MemberProfile.cs b/Web/MapperProfiles/MemberProfile.cs index 0325963d..f7dd32ac 100644 --- a/Web/MapperProfiles/MemberProfile.cs +++ b/Web/MapperProfiles/MemberProfile.cs @@ -15,10 +15,6 @@ public class MemberProfile : Profile { public MemberProfile() { - CreateMap() - .ForCtorParam(nameof(AddMemberCommand.Address), o => o.MapFrom(src => src)) - .ForMember(m => m.Address, o => o.MapFrom(src => src)); - CreateMap(); CreateMap() diff --git a/Web/Pages/BankAccounts/EditBankAccount.razor b/Web/Pages/BankAccounts/EditBankAccount.razor index 1613f847..c2ae2ecc 100644 --- a/Web/Pages/BankAccounts/EditBankAccount.razor +++ b/Web/Pages/BankAccounts/EditBankAccount.razor @@ -1,12 +1,14 @@ @page "/bankaccounts/{BankAccountId:guid}/edit" @attribute [Authorize] -@using Commands.Handlers.BankAccount.AddBankAccount -@using Commands.Handlers.BankAccount.EditBankAccount; +@using Commands.Handlers.BankAccount.EditBankAccount @using Queries.BankAccounts +@using Web.Extensions +@using Web.Services @inject IMediator _mediator @inject IMapper _mapper @inject ISnackbar Snackbar @inject NavigationManager NavManager +@inject IUserAccessor UserAccessor

Edit bankaccount

@@ -46,10 +48,13 @@ private async Task SubmitBankAccount() { + var username = UserAccessor.User.GetName()!; + var command = new EditBankAccountCommand( Id: BankAccountId, Name: _bankAccount.Name, - AccountNumber: _bankAccount.AccountNumber + AccountNumber: _bankAccount.AccountNumber, + PerformingUser: username ); var response = await _mediator.Send(command); Snackbar.Clear(); diff --git a/Web/Pages/BankAccounts/NewBankAccount.razor b/Web/Pages/BankAccounts/NewBankAccount.razor index d7fad3e7..ef8110e3 100644 --- a/Web/Pages/BankAccounts/NewBankAccount.razor +++ b/Web/Pages/BankAccounts/NewBankAccount.razor @@ -2,10 +2,13 @@ @attribute [Authorize] @using Commands.Handlers.BankAccount.AddBankAccount +@using Web.Extensions +@using Web.Services @inject IMediator _mediator @inject IMapper _mapper @inject ISnackbar Snackbar @inject NavigationManager NavManager +@inject IUserAccessor UserAccessor

Add new bankaccount

@@ -33,7 +36,9 @@ private async Task AddBankAccount() { - var command = _mapper.Map(_newBankAccount); + var performingUser = UserAccessor.User.GetName()!; + + var command = new AddBankAccountCommand(_newBankAccount.Name, _newBankAccount.AccountNumber, performingUser); var response = await _mediator.Send(command); Snackbar.Clear(); Snackbar.Add($"Bankaccount {_newBankAccount.Name} added successfully!", Severity.Success); diff --git a/Web/Pages/Members/EditMember.razor b/Web/Pages/Members/EditMember.razor index 82699957..dbbb7c5f 100644 --- a/Web/Pages/Members/EditMember.razor +++ b/Web/Pages/Members/EditMember.razor @@ -6,10 +6,13 @@ @using Queries.Members.Handlers.GetMemberById @using Queries.Members; @using MapperProfiles; +@using Web.Extensions +@using Web.Services @inject IMediator _mediator @inject IMapper _mapper @inject ISnackbar Snackbar @inject NavigationManager NavManager +@inject IUserAccessor UserAccessor

Edit member

@@ -45,6 +48,8 @@ if (await EnsureMemberDoesNotBecomeDuplicate()) return; + var username = UserAccessor.User.GetName()!; + var command = new EditMemberCommand( Id: MemberId, FirstName: member.FirstName!, @@ -60,7 +65,8 @@ MembershipFee: member.MembershipFee, MembershipExpiryDate: member.MembershipExpiryDate == null ? (DateTimeOffset?)null - : new DateTimeOffset(member.MembershipExpiryDate!.Value)); + : new DateTimeOffset(member.MembershipExpiryDate!.Value), + PerformingUser: username); await _mediator.Send(command); Snackbar.Clear(); diff --git a/Web/Pages/Members/NewMember.razor b/Web/Pages/Members/NewMember.razor index b81788c7..74d885f6 100644 --- a/Web/Pages/Members/NewMember.razor +++ b/Web/Pages/Members/NewMember.razor @@ -4,12 +4,16 @@ @using Commands.Handlers.Member.AddMember @using Queries.Members; +@using Types +@using Web.Extensions @using Web.MapperProfiles; +@using Web.Services @inject IMediator _mediator @inject IMapper _mapper @inject ISnackbar Snackbar @inject NavigationManager NavManager +@inject IUserAccessor UserAccessor

Add new member

@@ -38,7 +42,14 @@ if (await EnsureMemberIsNotDuplicate()) return; - var command = _mapper.Map(_newMember); + var performingUser = UserAccessor.User?.GetName()!; + + var command = new AddMemberCommand(_newMember.FirstName!, _newMember.LastName!, + new Address(_newMember.Street!, _newMember.City!, + _newMember.Country!, _newMember.ZipCode!, _newMember.HouseNumber!), + _newMember.Email!, _newMember.PhoneNumber!, + _newMember.MembershipFee, _newMember.MembershipExpiryDate!.Value, performingUser); + var response = await _mediator.Send(command); Snackbar.Clear(); Snackbar.Add($"Member {_newMember.FirstName} {_newMember.LastName} added successfully!", Severity.Success); diff --git a/Web/Pages/Transactions/AddBankAccountDialog.razor b/Web/Pages/Transactions/AddBankAccountDialog.razor index 563ecd9f..f9b67c5e 100644 --- a/Web/Pages/Transactions/AddBankAccountDialog.razor +++ b/Web/Pages/Transactions/AddBankAccountDialog.razor @@ -1,9 +1,11 @@ @using Web.Models @using Commands.Handlers.BankAccount.AddBankAccount @using MediatR +@using Web.Extensions +@using Web.Services @inject IMediator mediator; - +@inject IUserAccessor UserAccessor Edit transaction @@ -62,6 +64,8 @@ private async Task SubmitTransaction() { + var username = UserAccessor.User.GetName()!; + var memberId = Transaction.Counterparty.MemberId; var expirationDate = Transaction.NewMembershipExpirationDate; var applyCalculation = Transaction.ApplyMembershipCalculation; @@ -81,9 +85,10 @@ FinancialYearId: Transaction.FinancialYearId!.Value); await Mediator.Send(command); + if (memberId.HasValue && expirationDate.HasValue && applyCalculation) { - await Mediator.Send(new ExtendMembershipCommand(memberId.Value, expirationDate.Value)); + await Mediator.Send(new ExtendMembershipCommand(memberId.Value, expirationDate.Value, username)); } Snackbar.Clear(); Snackbar.Add("Transaction edited successfully!", Severity.Success); diff --git a/Web/Pages/Transactions/NewTransaction.razor b/Web/Pages/Transactions/NewTransaction.razor index 5699e5bc..f913decb 100644 --- a/Web/Pages/Transactions/NewTransaction.razor +++ b/Web/Pages/Transactions/NewTransaction.razor @@ -3,10 +3,13 @@ @using Commands.Handlers.Member.ExtendMembership @using Commands.Handlers.Transaction.AddCreditTransaction @using Commands.Handlers.Transaction.AddDebitTransaction +@using Web.Extensions +@using Web.Services @inject IMediator Mediator @inject IMapper Mapper @inject ISnackbar Snackbar @inject NavigationManager NavManager +@inject IUserAccessor UserAccessor

Create transaction

@@ -39,6 +42,7 @@ private async Task AddTransaction() { + var username = UserAccessor.User.GetName()!; var memberId = _newTransaction.Counterparty.MemberId; var expirationDate = _newTransaction.NewMembershipExpirationDate; var newTransactionApplyMembershipCalculation = _newTransaction.ApplyMembershipCalculation; @@ -59,7 +63,7 @@ } if (memberId.HasValue && expirationDate.HasValue && newTransactionApplyMembershipCalculation) { - await Mediator.Send(new ExtendMembershipCommand(memberId.Value, expirationDate.Value)); + await Mediator.Send(new ExtendMembershipCommand(memberId.Value, expirationDate.Value, username)); } Snackbar.Clear(); Snackbar.Add($"Transaction for {_newTransaction.Counterparty.Name} added successfully!", Severity.Success); diff --git a/Web/Pages/Transactions/TransactionForm.razor.cs b/Web/Pages/Transactions/TransactionForm.razor.cs index 935b32ae..c17c1899 100644 --- a/Web/Pages/Transactions/TransactionForm.razor.cs +++ b/Web/Pages/Transactions/TransactionForm.razor.cs @@ -217,7 +217,7 @@ private async Task CalculateMembershipExpirationDate() .SingleOrDefault(x => x.TransactionType == TransactionType.DebitMemberFee); if (transactionTypeForMembershipFee != null && - transactionTypeForMembershipFee.Amount is not null or 0 && + transactionTypeForMembershipFee.Amount is not null && SelectedMember.MembershipExpiryDate.HasValue && SelectedMember.MembershipFee != 0) { AmountOfMonths = (int)Math.Floor((double)transactionTypeForMembershipFee.Amount / SelectedMember.MembershipFee); diff --git a/Commands/Services/UserAccessor.cs b/Web/Services/UserAccessor.cs similarity index 75% rename from Commands/Services/UserAccessor.cs rename to Web/Services/UserAccessor.cs index 1b69eabc..ca9a41ea 100644 --- a/Commands/Services/UserAccessor.cs +++ b/Web/Services/UserAccessor.cs @@ -1,8 +1,6 @@ using System.Security.Claims; -using Microsoft.AspNetCore.Http; - -namespace Commands.Services; +namespace Web.Services; public class UserAccessor : IUserAccessor { @@ -12,7 +10,7 @@ public UserAccessor(IHttpContextAccessor accessor) _accessor = accessor ?? throw new ArgumentException("Valid IHttpContextAccessor is needed", nameof(accessor)); } - public ClaimsPrincipal User => _accessor.HttpContext.User; + public ClaimsPrincipal User => _accessor.HttpContext?.User!; } public interface IUserAccessor diff --git a/Web/Startup.cs b/Web/Startup.cs index 37fd83b0..54f08fa2 100644 --- a/Web/Startup.cs +++ b/Web/Startup.cs @@ -20,6 +20,7 @@ using Queries.Members.Handlers.SearchMembers; using Web.Extensions; +using Web.Services; namespace Web; @@ -43,7 +44,7 @@ public void ConfigureServices(IServiceCollection services) services.Configure(options => { options.ForwardedHeaders = ForwardedHeaders.All; - options.KnownNetworks.Clear(); + options.KnownIPNetworks.Clear(); options.KnownProxies.Clear(); }); diff --git a/Web/Web.csproj b/Web/Web.csproj index 2a3b9f8f..27efb742 100644 --- a/Web/Web.csproj +++ b/Web/Web.csproj @@ -1,30 +1,30 @@  - - - + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - - - + + + + + + + - 4e1008b4-c62b-4bfa-b6fa-7e997015f850 - \ No newline at end of file