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