ride reconcilation with driver profile update

This commit is contained in:
Kalana B. Thilakarathna
2026-08-31 12:14:30 +05:30
parent 75b5035354
commit 76ca9f874d
24 changed files with 3912 additions and 112 deletions
@@ -1,4 +1,3 @@
using Distribution.Features.DriverComplianceConfig;
using Distribution.Infra.Authorization;
using Microsoft.AspNetCore.Mvc;
@@ -8,7 +7,6 @@ namespace Distribution.Features.DriverProfile;
[Route("api/driver-profiles")]
public class DriverProfileController(
DriverProfileService service,
DriverComplianceConfigService complianceService,
ICurrentUserService currentUser) : ControllerBase
{
[HttpGet]
@@ -60,7 +58,7 @@ public class DriverProfileController(
[HttpGet("compliance")]
public async Task<IActionResult> GetCompliance()
{
var result = await complianceService.GetAsync();
var result = await service.GetComplianceConfigAsync();
return result is null ? NoContent() : Ok(result);
}
@@ -68,7 +66,7 @@ public class DriverProfileController(
public async Task<IActionResult> UpsertCompliance(UpdateDriverComplianceConfigRequest request, CancellationToken ct)
{
var userId = currentUser.UserId ?? throw new UnauthorizedAccessException();
var result = await complianceService.UpsertAsync(request, userId, ct);
var result = await service.UpsertComplianceConfigAsync(request, userId, ct);
return Ok(result);
}
}
@@ -20,3 +20,14 @@ public record UpdateDriverProfileRequest(
string LicenseNumber,
DateTime LicenseExpiry,
DateTime MedicalClearanceExpiry);
public record DriverComplianceConfigResponse(
Guid Id,
bool EnforceLicenseExpiry,
bool EnforceMedicalClearance,
DateTime UpdatedAt,
Guid UpdatedBy);
public record UpdateDriverComplianceConfigRequest(
bool EnforceLicenseExpiry,
bool EnforceMedicalClearance);
@@ -37,4 +37,13 @@ public class DriverProfileRepository(AppDBContext context) : IDriverProfileRepos
profile.IsActive = false;
context.DriverProfiles.Update(profile);
}
public async Task<global::Distribution.Models.DriverComplianceConfig?> GetComplianceConfigAsync() =>
await context.DriverComplianceConfigs.FirstOrDefaultAsync();
public async Task AddComplianceConfigAsync(global::Distribution.Models.DriverComplianceConfig config) =>
await context.DriverComplianceConfigs.AddAsync(config);
public void UpdateComplianceConfig(global::Distribution.Models.DriverComplianceConfig config) =>
context.DriverComplianceConfigs.Update(config);
}
@@ -98,6 +98,56 @@ public class DriverProfileService(IDriverProfileRepository repo, IUnitOfWork uow
return true;
}
public async Task<DriverComplianceConfigResponse?> GetComplianceConfigAsync()
{
var config = await repo.GetComplianceConfigAsync();
return config is null ? null
: new DriverComplianceConfigResponse(
config.Id, config.EnforceLicenseExpiry, config.EnforceMedicalClearance,
config.UpdatedAt, config.UpdatedBy);
}
public async Task<DriverComplianceConfigResponse> UpsertComplianceConfigAsync(
UpdateDriverComplianceConfigRequest request, Guid updatedBy, CancellationToken ct = default)
{
var config = await repo.GetComplianceConfigAsync();
await uow.BeginAsync(ct);
try
{
if (config is null)
{
config = new global::Distribution.Models.DriverComplianceConfig
{
EnforceLicenseExpiry = request.EnforceLicenseExpiry,
EnforceMedicalClearance = request.EnforceMedicalClearance,
UpdatedBy = updatedBy,
UpdatedAt = DateTime.Now
};
await repo.AddComplianceConfigAsync(config);
}
else
{
config.EnforceLicenseExpiry = request.EnforceLicenseExpiry;
config.EnforceMedicalClearance = request.EnforceMedicalClearance;
config.UpdatedBy = updatedBy;
config.UpdatedAt = DateTime.Now;
repo.UpdateComplianceConfig(config);
}
await uow.CommitAsync(ct);
}
catch
{
await uow.RollbackAsync(ct);
throw;
}
return new DriverComplianceConfigResponse(
config.Id, config.EnforceLicenseExpiry, config.EnforceMedicalClearance,
config.UpdatedAt, config.UpdatedBy);
}
private static DriverProfileResponse ToResponse(global::Distribution.Models.DriverProfile p) =>
new(p.Id, p.FK_UserId, p.User?.FullName ?? string.Empty,
p.LicenseNumber, p.LicenseExpiry, p.MedicalClearanceExpiry,
@@ -9,4 +9,8 @@ public interface IDriverProfileRepository
Task AddAsync(global::Distribution.Models.DriverProfile profile);
void Update(global::Distribution.Models.DriverProfile profile);
void Deactivate(global::Distribution.Models.DriverProfile profile);
Task<global::Distribution.Models.DriverComplianceConfig?> GetComplianceConfigAsync();
Task AddComplianceConfigAsync(global::Distribution.Models.DriverComplianceConfig config);
void UpdateComplianceConfig(global::Distribution.Models.DriverComplianceConfig config);
}