Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
50 commits
Select commit Hold shift + click to select a range
da15aec
Add DDD entity abstractions design spec
jasonmwebb-lv Mar 17, 2026
e0c7b46
Update DDD design spec with review feedback
jasonmwebb-lv Mar 17, 2026
042fae6
Address remaining spec review items
jasonmwebb-lv Mar 17, 2026
fd5e9bd
Add DDD entity abstractions implementation plan
jasonmwebb-lv Mar 17, 2026
4b8de96
feat: add IDomainEvent interface and DomainEvent base record
jasonmwebb-lv Mar 17, 2026
8cf8fa9
feat: add ValueObject abstract record
jasonmwebb-lv Mar 17, 2026
158c23f
feat: add DomainEntity<TKey> base class
jasonmwebb-lv Mar 17, 2026
fb47ebd
feat: add AggregateRoot<TKey> and IAggregateRoot interfaces
jasonmwebb-lv Mar 17, 2026
3620171
Remove EntityEquals override from AggregateRoot
jasonmwebb-lv Mar 17, 2026
7e11af6
Fix async issues: ConfigureAwait(false), CancellationToken propagatio…
jasonmwebb-lv Mar 17, 2026
4fda701
Add aggregate repository design spec
jasonmwebb-lv Mar 17, 2026
d753cdd
docs: expand DDD spec to cover event dispatch, read models, and sagas
jasonmwebb-lv Mar 17, 2026
ca932f0
Implemented DDD related persistence.
jasonmwebb-lv Mar 21, 2026
92f6cf8
Updated Masstransit to use non-commercial version. Removed Autmapper …
jasonmwebb-lv Mar 21, 2026
264a464
Updated specification pattern to be more comprehensive.
jasonmwebb-lv Mar 21, 2026
598541d
Enabled ValueObject for DDD
jasonmwebb-lv Mar 21, 2026
ef51930
Added state machine implementations for Stateless and MassTransit.
jasonmwebb-lv Mar 21, 2026
a1c2052
feat: add outbox core abstractions (IOutboxMessage, IOutboxStore, IOu…
jasonmwebb-lv Mar 21, 2026
d6e2ced
feat: add JsonOutboxSerializer with round-trip serialization and type…
jasonmwebb-lv Mar 21, 2026
d941867
feat: two-phase UnitOfWork commit with PersistEventsAsync and Cancell…
jasonmwebb-lv Mar 21, 2026
5c39fdc
feat: add OutboxEventRouter with buffer-persist-dispatch pattern
jasonmwebb-lv Mar 21, 2026
0b4d1d2
feat: add OutboxEntityEventTracker decorator for two-phase event pers…
jasonmwebb-lv Mar 21, 2026
78154e5
feat: add OutboxProcessingService background poller with retry and de…
jasonmwebb-lv Mar 21, 2026
798b51b
feat: add AddOutbox<T> builder extension, UnitOfWork integration, and…
jasonmwebb-lv Mar 21, 2026
b97ad69
feat: add EFCoreOutboxStore with IDataStoreFactory, RetryCount filter…
jasonmwebb-lv Mar 21, 2026
38cf6d4
feat: add DapperOutboxStore with IDataStoreFactory and RetryCount filter
jasonmwebb-lv Mar 22, 2026
123c369
feat: add Linq2DbOutboxStore with IDataStoreFactory and RetryCount fi…
jasonmwebb-lv Mar 22, 2026
b6c7e81
feat: add RCommon.MassTransit.Outbox wrapping native EF Core outbox
jasonmwebb-lv Mar 23, 2026
ea60734
feat: add RCommon.Wolverine.Outbox wrapping native durable messaging
jasonmwebb-lv Mar 23, 2026
8d9d785
chore: add outbox projects to solution file
jasonmwebb-lv Mar 23, 2026
7d89ad6
fix: throttle outbox cleanup and document EF Core client-side ordering
jasonmwebb-lv Mar 23, 2026
766310f
fix: ThenInclude chain was overwritten by RepositoryQuery getter
jasonmwebb-lv Mar 23, 2026
2fec5ac
docs: add Outbox V2 design spec
jasonmwebb-lv Mar 23, 2026
7abb073
docs: fix SQL Server ClaimAsync SQL and spec review issues
jasonmwebb-lv Mar 23, 2026
e8a57f9
docs: address spec review round 2 — OutboxEventRouter changes
jasonmwebb-lv Mar 23, 2026
4398df5
docs: fix spec review round 3 — router sketch and inbox ID clarity
jasonmwebb-lv Mar 23, 2026
a076e39
docs: add Outbox V2 implementation plan
jasonmwebb-lv Mar 23, 2026
6149f9c
feat: add IBackoffStrategy, ExponentialBackoffStrategy, and V2 Outbox…
jasonmwebb-lv Mar 23, 2026
ca11deb
feat: V2 interface changes — ClaimAsync, backoff, locking, dead lette…
jasonmwebb-lv Mar 23, 2026
14de25e
feat: add IInboxStore, IInboxMessage, and InboxMessage abstractions
jasonmwebb-lv Mar 23, 2026
ef9bf7f
feat: OutboxEventRouter V2 — retained-event dispatch, no store reads
jasonmwebb-lv Mar 23, 2026
a9bde8d
feat: OutboxProcessingService V2 — ClaimAsync, backoff, inbox auto-check
jasonmwebb-lv Mar 23, 2026
99e3d31
feat: EFCoreOutboxStore V2 — ClaimAsync, dead letter replay, backoff
jasonmwebb-lv Mar 23, 2026
0e4cae3
feat: EFCoreInboxStore — inbox/idempotency for EF Core
jasonmwebb-lv Mar 23, 2026
2a82386
feat: DapperOutboxStore V2 — ClaimAsync, dead letter replay, backoff
jasonmwebb-lv Mar 23, 2026
1863b42
feat: DapperInboxStore — inbox/idempotency for Dapper
jasonmwebb-lv Mar 23, 2026
781a7e2
feat: Linq2DbOutboxStore V2 — ClaimAsync, dead letter replay, backoff
jasonmwebb-lv Mar 23, 2026
9036e51
feat: Linq2DbInboxStore — inbox/idempotency for Linq2Db
jasonmwebb-lv Mar 23, 2026
11a2b5a
Added outbox implementations for the stack.
jasonmwebb-lv Mar 24, 2026
adf309f
Moved projects to appropriate solution folder.
jasonmwebb-lv Mar 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@
</PropertyGroup>

<ItemGroup>
<PackageReference Include="AutoMapper" Version="16.0.0" />
<PackageReference Include="Bogus" Version="35.6.5" />
<PackageReference Include="FluentAssertions" Version="8.8.0" />
<PackageReference Include="Microsoft.Extensions.Configuration" Version="10.0.2" />
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs.LeaveType;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveTypes.Handlers.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Handlers.Queries;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Queries;
using HR.LeaveManagement.Application.Profiles;
using HR.LeaveManagement.Application.Responses;
using HR.LeaveManagement.Domain;
using Moq;
Expand All @@ -26,21 +24,11 @@ namespace HR.LeaveManagement.Application.UnitTests.LeaveTypes.Commands
[TestFixture()]
public class CreateLeaveTypeCommandHandlerTests
{
private readonly IMapper _mapper;

private readonly CreateLeaveTypeDto _leaveTypeDto;
private readonly CreateLeaveTypeCommandHandler _handler;

public CreateLeaveTypeCommandHandlerTests()
{

var mapperConfig = new MapperConfiguration(c =>
{
c.AddProfile<MappingProfile>();
}, null);

_mapper = mapperConfig.CreateMapper();

var testData = new List<LeaveType>();
var mock = new Mock<IGraphRepository<LeaveType>>();
var validationMock = new Mock<IValidationService>();
Expand All @@ -56,7 +44,7 @@ public CreateLeaveTypeCommandHandlerTests()

validationMock.Setup(x => x.ValidateAsync(_leaveTypeDto, false, CancellationToken.None))
.Returns(() => Task.FromResult(new ValidationOutcome()));
_handler = new CreateLeaveTypeCommandHandler(_mapper, mock.Object, validationMock.Object);
_handler = new CreateLeaveTypeCommandHandler(mock.Object, validationMock.Object);
}

[Test]
Expand All @@ -77,7 +65,7 @@ public async Task InValid_LeaveType_Added()
//leaveTypes.Count.ShouldBe(3);

result.ShouldBeOfType<BaseCommandResponse>();

}
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs.LeaveType;
using HR.LeaveManagement.Application.Features.LeaveTypes.Handlers.Queries;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Queries;
using HR.LeaveManagement.Application.Profiles;
using HR.LeaveManagement.Domain;
using Moq;
using NUnit.Framework;
Expand All @@ -22,19 +20,6 @@ namespace HR.LeaveManagement.Application.UnitTests.LeaveTypes.Queries
[TestFixture()]
public class GetLeaveTypeListRequestHandlerTests
{
private readonly IMapper _mapper;
public GetLeaveTypeListRequestHandlerTests()
{
//_mockRepo = MockLeaveTypeRepository.GetLeaveTypeRepository();

var mapperConfig = new MapperConfiguration(c =>
{
c.AddProfile<MappingProfile>();
}, null);

_mapper = mapperConfig.CreateMapper();
}

[Test]
public async Task GetLeaveTypeListTest()
{
Expand All @@ -46,8 +31,8 @@ public async Task GetLeaveTypeListTest()
var mock = new Mock<IGraphRepository<LeaveType>>();
mock.Setup(x => x.FindAsync(x=>true, CancellationToken.None))
.Returns(() => Task.FromResult(testData as ICollection<LeaveType>));
var handler = new GetLeaveTypeListRequestHandler(mock.Object, _mapper);

var handler = new GetLeaveTypeListRequestHandler(mock.Object);
var result = await handler.HandleAsync(new GetLeaveTypeListRequest(), CancellationToken.None);

result.ShouldBeOfType<List<LeaveTypeDto>>();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using HR.LeaveManagement.Application.Profiles;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
Expand All @@ -11,8 +10,6 @@ public static class ApplicationServicesRegistration
{
public static IServiceCollection ConfigureApplicationServices(this IServiceCollection services)
{
services.AddAutoMapper(x => x.AddProfile(new MappingProfile()));

return services;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs.LeaveAllocation.Validators;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveAllocations.Requests.Commands;
Expand All @@ -25,21 +24,18 @@ public class CreateLeaveAllocationCommandHandler : IAppRequestHandler<CreateLeav
private readonly IGraphRepository<LeaveType> _leaveTypeRepository;
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
private readonly IUserService _userService;
private readonly IMapper _mapper;
private readonly IValidationService _validationService;

public CreateLeaveAllocationCommandHandler(IGraphRepository<LeaveType> leaveTypeRepository,
IGraphRepository<LeaveAllocation> leaveAllocationRepository,
IUserService userService,
IMapper mapper,
IValidationService validationService)
{
this._leaveTypeRepository = leaveTypeRepository;
this._leaveAllocationRepository = leaveAllocationRepository;
this._leaveAllocationRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
this._leaveTypeRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
this._userService = userService;
_mapper = mapper;
_validationService = validationService;
}

Expand Down Expand Up @@ -77,12 +73,11 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveAllocationCommand
{
await _leaveAllocationRepository.AddAsync(item);
}

response.Success = true;
response.Message = "Allocations Successful";
}


return response;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using AutoMapper;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveAllocations.Requests.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Commands;
Expand All @@ -17,13 +16,11 @@ namespace HR.LeaveManagement.Application.Features.LeaveAllocations.Handlers.Comm
public class DeleteLeaveAllocationCommandHandler : IAppRequestHandler<DeleteLeaveAllocationCommand>
{
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
private readonly IMapper _mapper;

public DeleteLeaveAllocationCommandHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository, IMapper mapper)
public DeleteLeaveAllocationCommandHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository)
{
this._leaveAllocationRepository = leaveAllocationRepository;
this._leaveAllocationRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
_mapper = mapper;
}

public async Task HandleAsync(DeleteLeaveAllocationCommand request, CancellationToken cancellationToken)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs.LeaveAllocation.Validators;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveAllocations.Requests.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Commands;
using HR.LeaveManagement.Application.Mappings;
using HR.LeaveManagement.Domain;
using RCommon.Mediator.Subscribers;
using System;
Expand All @@ -20,19 +20,16 @@ public class UpdateLeaveAllocationCommandHandler : IAppRequestHandler<UpdateLeav
{
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
private readonly IReadOnlyRepository<LeaveType> _leaveTypeRepository;
private readonly IMapper _mapper;
private readonly IValidationService _validationService;

public UpdateLeaveAllocationCommandHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository,
IReadOnlyRepository<LeaveType> leaveTypeRepository,
IMapper mapper,
IValidationService validationService)
{
this._leaveAllocationRepository = leaveAllocationRepository;
this._leaveTypeRepository = leaveTypeRepository;
this._leaveAllocationRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
this._leaveTypeRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
_mapper = mapper;
_validationService = validationService;
}

Expand All @@ -48,10 +45,9 @@ public async Task HandleAsync(UpdateLeaveAllocationCommand request, Cancellation
if (leaveAllocation is null)
throw new NotFoundException(nameof(leaveAllocation), request.LeaveAllocationDto.Id);

_mapper.Map(request.LeaveAllocationDto, leaveAllocation);
request.LeaveAllocationDto.ApplyTo(leaveAllocation);

await _leaveAllocationRepository.UpdateAsync(leaveAllocation);

}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs;
using HR.LeaveManagement.Application.DTOs.LeaveAllocation;
using HR.LeaveManagement.Application.Features.LeaveAllocations.Requests.Queries;
using HR.LeaveManagement.Application.Mappings;
using HR.LeaveManagement.Domain;
using RCommon.Mediator.Subscribers;
using RCommon.Persistence;
Expand All @@ -14,19 +14,18 @@ namespace HR.LeaveManagement.Application.Features.LeaveAllocations.Handlers.Quer
public class GetLeaveAllocationDetailRequestHandler : IAppRequestHandler<GetLeaveAllocationDetailRequest, LeaveAllocationDto>
{
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
private readonly IMapper _mapper;

public GetLeaveAllocationDetailRequestHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository, IMapper mapper)
public GetLeaveAllocationDetailRequestHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository)
{
_leaveAllocationRepository = leaveAllocationRepository;
this._leaveAllocationRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
_mapper = mapper;
}

public async Task<LeaveAllocationDto> HandleAsync(GetLeaveAllocationDetailRequest request, CancellationToken cancellationToken)
{
_leaveAllocationRepository.Include(x => x.LeaveType);
var leaveAllocation = await _leaveAllocationRepository.FindAsync(request.Id);
return _mapper.Map<LeaveAllocationDto>(leaveAllocation);
return leaveAllocation.ToLeaveAllocationDto();
}
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs;
using HR.LeaveManagement.Application.DTOs.LeaveAllocation;
using HR.LeaveManagement.Application.Features.LeaveAllocations.Requests.Queries;
using HR.LeaveManagement.Application.Mappings;
using RCommon.Mediator.Subscribers;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using HR.LeaveManagement.Application.Contracts.Identity;
Expand All @@ -19,18 +20,15 @@ namespace HR.LeaveManagement.Application.Features.LeaveAllocations.Handlers.Quer
public class GetLeaveAllocationListRequestHandler : IAppRequestHandler<GetLeaveAllocationListRequest, List<LeaveAllocationDto>>
{
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
private readonly IMapper _mapper;
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IUserService _userService;

public GetLeaveAllocationListRequestHandler(IGraphRepository<LeaveAllocation> leaveAllocationRepository,
IMapper mapper,
IHttpContextAccessor httpContextAccessor,
IUserService userService)
{
_leaveAllocationRepository = leaveAllocationRepository;
this._leaveAllocationRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
_mapper = mapper;
this._httpContextAccessor = httpContextAccessor;
this._userService = userService;
}
Expand All @@ -44,19 +42,19 @@ public async Task<List<LeaveAllocationDto>> HandleAsync(GetLeaveAllocationListRe
{
var userId = _httpContextAccessor.HttpContext.User.FindFirst(
q => q.Type == CustomClaimTypes.Uid)?.Value;
leaveAllocations = await _leaveAllocationRepository.FindAsync(x=>x.EmployeeId == userId) as List<LeaveAllocation>;
leaveAllocations = await _leaveAllocationRepository.FindAsync(x => x.EmployeeId == userId) as List<LeaveAllocation>;

var employee = await _userService.GetEmployee(userId);
allocations = _mapper.Map<List<LeaveAllocationDto>>(leaveAllocations);
allocations = leaveAllocations.Select(x => x.ToLeaveAllocationDto()).ToList();
foreach (var alloc in allocations)
{
alloc.Employee = employee;
}
}
else
{
leaveAllocations = await _leaveAllocationRepository.FindAsync(x=>true) as List<LeaveAllocation>;
allocations = _mapper.Map<List<LeaveAllocationDto>>(leaveAllocations);
leaveAllocations = await _leaveAllocationRepository.FindAsync(x => true) as List<LeaveAllocation>;
allocations = leaveAllocations.Select(x => x.ToLeaveAllocationDto()).ToList();
foreach (var req in allocations)
{
req.Employee = await _userService.GetEmployee(req.EmployeeId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
using AutoMapper;
using HR.LeaveManagement.Application.DTOs.LeaveRequest.Validators;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveRequests.Requests.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Commands;
using HR.LeaveManagement.Application.Mappings;
using HR.LeaveManagement.Application.Responses;
using HR.LeaveManagement.Domain;
using RCommon.Mediator.Subscribers;
Expand Down Expand Up @@ -32,7 +32,6 @@ public class CreateLeaveRequestCommandHandler : IAppRequestHandler<CreateLeaveRe
private readonly IEmailService _emailSender;
private readonly ICurrentUser _currentUser;
private readonly IOptions<SendGridEmailSettings> _emailSettings;
private readonly IMapper _mapper;
private readonly IValidationService _validationService;
private readonly IReadOnlyRepository<LeaveType> _leaveTypeRepository;
private readonly IGraphRepository<LeaveAllocation> _leaveAllocationRepository;
Expand All @@ -45,7 +44,6 @@ public CreateLeaveRequestCommandHandler(
IEmailService emailSender,
ICurrentUser currentUser,
IOptions<SendGridEmailSettings> emailSettings,
IMapper mapper,
IValidationService validationService)
{
_leaveTypeRepository = leaveTypeRepository;
Expand All @@ -56,8 +54,7 @@ public CreateLeaveRequestCommandHandler(
this._leaveRequestRepository.DataStoreName = DataStoreNamesConst.LeaveManagement;
_emailSender = emailSender;
this._currentUser = currentUser;
_emailSettings=emailSettings;
_mapper = mapper;
_emailSettings = emailSettings;
_validationService = validationService;
}

Expand All @@ -67,8 +64,8 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveRequestCommand req
var validationResult = await _validationService.ValidateAsync(request.LeaveRequestDto);
var userId = _currentUser.FindClaimValue(CustomClaimTypes.Uid);

var allocation = _leaveAllocationRepository.FirstOrDefault(x=>x.EmployeeId == userId && x.LeaveTypeId == request.LeaveRequestDto.LeaveTypeId);
if(allocation is null)
var allocation = _leaveAllocationRepository.FirstOrDefault(x => x.EmployeeId == userId && x.LeaveTypeId == request.LeaveRequestDto.LeaveTypeId);
if (allocation is null)
{
validationResult.Errors.Add(new ValidationFault(nameof(request.LeaveRequestDto.LeaveTypeId),
"You do not have any allocations for this leave type."));
Expand All @@ -82,7 +79,7 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveRequestCommand req
nameof(request.LeaveRequestDto.EndDate), "You do not have enough days for this request"));
}
}

if (validationResult.IsValid == false)
{
response.Success = false;
Expand All @@ -91,7 +88,7 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveRequestCommand req
}
else
{
var leaveRequest = _mapper.Map<LeaveRequest>(request.LeaveRequestDto);
var leaveRequest = request.LeaveRequestDto.ToLeaveRequest();
leaveRequest.RequestingEmployeeId = userId;
await _leaveRequestRepository.AddAsync(leaveRequest);
//TODO: May need to get Id out
Expand All @@ -104,7 +101,7 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveRequestCommand req
{
var emailAddress = _currentUser.FindClaimValue(ClaimTypes.Email);

var email = new MailMessage(new MailAddress(this._emailSettings.Value.FromEmailDefault, this._emailSettings.Value.FromNameDefault),
var email = new MailMessage(new MailAddress(this._emailSettings.Value.FromEmailDefault, this._emailSettings.Value.FromNameDefault),
new MailAddress(emailAddress))
{
Body = $"Your leave request for {request.LeaveRequestDto.StartDate:D} to {request.LeaveRequestDto.EndDate:D} " +
Expand All @@ -119,7 +116,7 @@ public async Task<BaseCommandResponse> HandleAsync(CreateLeaveRequestCommand req
//// Log or handle error, but don't throw...
}
}

return response;
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
using AutoMapper;
using HR.LeaveManagement.Application.Exceptions;
using HR.LeaveManagement.Application.Features.LeaveRequests.Requests.Commands;
using HR.LeaveManagement.Application.Features.LeaveTypes.Requests.Commands;
Expand Down
Loading
Loading