Skip to content

Commit

Permalink
LNK-3357: add validation and transactions to Census
Browse files Browse the repository at this point in the history
  • Loading branch information
edward-miller-lcg committed Jan 31, 2025
1 parent fad909d commit 0601514
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,4 @@ public interface ICensusSchedulingRepository : IDisposable
IJobDetail CreateJob(CensusConfigEntity facility);

ITrigger CreateTrigger(string ScheduledTrigger, JobKey jobKey);

void GetAllJobs(IScheduler scheduler);
}
11 changes: 11 additions & 0 deletions DotNet/Census/Controllers/CensusConfigController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using Link.Authorization.Policies;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Quartz;

namespace Census.Controllers;

Expand Down Expand Up @@ -47,6 +48,11 @@ public async Task<IActionResult> Create(CensusConfigModel censusConfig)
return BadRequest("ScheduledTrigger is required.");
}

if (!CronExpression.IsValidExpression(censusConfig.ScheduledTrigger))
{
return BadRequest("ScheduledTrigger is not a valid cron expression.");
}

try
{
var entity = await _censusConfigManager.AddOrUpdateCensusConfig(censusConfig);
Expand Down Expand Up @@ -135,6 +141,11 @@ public async Task<ActionResult<CensusConfigModel>> Put(CensusConfigModel censusC
return BadRequest($"FacilityID in request path does not match facility in request body.");
}

if (!CronExpression.IsValidExpression(censusConfig.ScheduledTrigger))
{
return BadRequest("ScheduledTrigger is not a valid cron expression.");
}

try
{
var existingEntity = await _censusConfigManager.GetCensusConfigByFacilityId(censusConfig.FacilityId);
Expand Down
14 changes: 12 additions & 2 deletions DotNet/Census/Domain/Managers/CensusConfigManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -69,14 +69,19 @@ await _censusConfigRepository.SingleOrDefaultAsync(c => c.FacilityID == entity.F

try
{
await _censusConfigRepository.StartTransactionAsync(cancellationToken);

await _censusConfigRepository.UpdateAsync(existingEntity, cancellationToken);

await _censusSchedulingRepo.UpdateJobsForFacility(existingEntity,
await _schedulerFactory.GetScheduler(cancellationToken));
await _schedulerFactory.GetScheduler(cancellationToken));

await _censusConfigRepository.CommitTransactionAsync(cancellationToken);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception in CensusConfigManager.AddOrUpdateCensusConfig");
await _censusConfigRepository.RollbackTransactionAsync(cancellationToken);
throw;
}
}
Expand All @@ -93,14 +98,19 @@ await _censusSchedulingRepo.UpdateJobsForFacility(existingEntity,

try
{
await _censusConfigRepository.StartTransactionAsync(cancellationToken);

await _censusConfigRepository.AddAsync(existingEntity, cancellationToken);

await _censusSchedulingRepo.AddJobForFacility(existingEntity,
await _schedulerFactory.GetScheduler(cancellationToken));
await _schedulerFactory.GetScheduler(cancellationToken));

await _censusConfigRepository.CommitTransactionAsync(cancellationToken);
}
catch (Exception ex)
{
_logger.LogError(ex, "Exception in CensusConfigManager.AddOrUpdateCensusConfig");
await _censusConfigRepository.RollbackTransactionAsync(cancellationToken);
throw;
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -183,6 +183,36 @@ public async Task<T> SingleAsync(Expression<Func<T, bool>> predicate, Cancellati
return result;
}

public virtual void StartTransaction()
{
_dbContext.Database.BeginTransaction();
}

public virtual async Task StartTransactionAsync(CancellationToken cancellationToken = default)
{
await _dbContext.Database.BeginTransactionAsync();
}

public virtual void CommitTransaction()
{
_dbContext.Database.CommitTransaction();
}

public virtual async Task CommitTransactionAsync(CancellationToken cancellationToken = default)
{
await _dbContext.Database.CommitTransactionAsync();
}

public virtual void RollbackTransaction()
{
_dbContext.Database.RollbackTransaction();
}

public virtual async Task RollbackTransactionAsync(CancellationToken cancellationToken = default)
{
await _dbContext.Database.RollbackTransactionAsync();
}

private Expression<Func<T, object>> SetSortBy<T>(string? sortBy)
{
var sortKey = sortBy?.ToLower() ?? "";
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
using MongoDB.Driver;
using System.Linq.Expressions;
using System.Reflection;
using System.Runtime.InteropServices.Marshalling;

namespace LantanaGroup.Link.Shared.Application.Repositories.Implementations;

Expand Down Expand Up @@ -200,4 +201,34 @@ public async Task<HealthCheckResult> HealthCheck(int eventId)
{
throw new NotImplementedException();
}

public virtual void StartTransaction()
{
throw new NotImplementedException();
}

public virtual void CommitTransaction()
{
throw new NotImplementedException();
}

public virtual void RollbackTransaction()
{
throw new NotImplementedException();
}

public virtual Task StartTransactionAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}

public virtual Task CommitTransactionAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}

public virtual Task RollbackTransactionAsync(CancellationToken cancellationToken = default)
{
throw new NotImplementedException();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -28,5 +28,10 @@ public interface IEntityRepository<T>
Task DeleteAsync(string id, CancellationToken cancellationToken = default);
Task<(List<T>, PaginationMetadata)> SearchAsync(Expression<Func<T, bool>> predicate, string? sortBy, SortOrder? sortOrder, int pageSize, int pageNumber, CancellationToken cancellationToken = default);
Task<HealthCheckResult> HealthCheck(int eventId);

void StartTransaction();
void CommitTransaction();
void RollbackTransaction();
Task StartTransactionAsync(CancellationToken cancellationToken = default);
Task CommitTransactionAsync(CancellationToken cancellationToken = default);
Task RollbackTransactionAsync(CancellationToken cancellationToken = default);
}

0 comments on commit 0601514

Please sign in to comment.