PCRB follow up endpoints
This commit is contained in:
@ -1,4 +1,5 @@
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
|
||||
using Dapper;
|
||||
|
||||
@ -6,7 +7,9 @@ namespace MesaFabApproval.API.Services;
|
||||
|
||||
public interface IDalService {
|
||||
Task<IEnumerable<T>> QueryAsync<T>(string sql);
|
||||
Task<IEnumerable<T>> QueryAsync<T>(string sql, object paramaters);
|
||||
Task<int> ExecuteAsync(string sql);
|
||||
Task<int> ExecuteAsync<T>(string sql, T paramaters);
|
||||
}
|
||||
|
||||
public class DalService : IDalService {
|
||||
@ -55,6 +58,45 @@ public class DalService : IDalService {
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<T>> QueryAsync<T>(string sql, object parameters) {
|
||||
if (sql is null) throw new ArgumentNullException("sql cannot be null");
|
||||
if (parameters is null) throw new ArgumentNullException("parameters cannot be null");
|
||||
|
||||
StringBuilder logBuilder = new();
|
||||
|
||||
int remainingRetries = RETRIES;
|
||||
bool queryWasSuccessful = false;
|
||||
Exception exception = null;
|
||||
IEnumerable<T> result = new List<T>();
|
||||
while (!queryWasSuccessful && remainingRetries > 0) {
|
||||
int backoffSeconds = (RETRIES - remainingRetries--) * BACKOFF_SECONDS_INTERVAL;
|
||||
Task.Delay(backoffSeconds * 1000).Wait();
|
||||
|
||||
try {
|
||||
logBuilder.Clear();
|
||||
logBuilder.Append($"Attempting to perform query with {sql} ");
|
||||
logBuilder.Append($"and parameters {parameters.ToString()}. ");
|
||||
logBuilder.Append($"Remaining retries: {remainingRetries}");
|
||||
_logger.LogInformation(logBuilder.ToString());
|
||||
|
||||
using (IDbConnection conn = _dbConnectionService.GetConnection()) {
|
||||
result = await conn.QueryAsync<T>(sql, parameters);
|
||||
}
|
||||
|
||||
queryWasSuccessful = true;
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"An exception occurred while attempting to perform a query. Exception: {ex.Message}");
|
||||
exception = ex;
|
||||
}
|
||||
}
|
||||
|
||||
if (!queryWasSuccessful && exception is not null) {
|
||||
throw exception;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public async Task<int> ExecuteAsync(string sql) {
|
||||
if (sql is null) throw new ArgumentNullException("sql cannot be null");
|
||||
|
||||
@ -86,4 +128,36 @@ public class DalService : IDalService {
|
||||
|
||||
return rowsAffected;
|
||||
}
|
||||
|
||||
public async Task<int> ExecuteAsync<T>(string sql, T parameters) {
|
||||
if (sql is null) throw new ArgumentNullException("sql cannot be null");
|
||||
|
||||
int remainingRetries = RETRIES;
|
||||
bool queryWasSuccessful = false;
|
||||
Exception exception = null;
|
||||
int rowsAffected = 0;
|
||||
while (!queryWasSuccessful && remainingRetries > 0) {
|
||||
int backoffSeconds = (RETRIES - remainingRetries--) * BACKOFF_SECONDS_INTERVAL;
|
||||
Task.Delay(backoffSeconds * 1000).Wait();
|
||||
|
||||
try {
|
||||
_logger.LogInformation($"Attempting to execute {sql} with parameters. Remaining retries: {remainingRetries}");
|
||||
|
||||
using (IDbConnection conn = _dbConnectionService.GetConnection()) {
|
||||
rowsAffected = await conn.ExecuteAsync(sql, parameters);
|
||||
}
|
||||
|
||||
queryWasSuccessful = true;
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"An exception occurred while attempting to execute a query. Exception: {ex.Message}");
|
||||
exception = ex;
|
||||
}
|
||||
}
|
||||
|
||||
if (!queryWasSuccessful && exception is not null) {
|
||||
throw exception;
|
||||
}
|
||||
|
||||
return rowsAffected;
|
||||
}
|
||||
}
|
@ -37,6 +37,10 @@ public interface IPCRBService {
|
||||
Task NotifyApprovers(PCRBNotification notification);
|
||||
Task NotifyOriginator(PCRBNotification notification);
|
||||
Task NotifyResponsiblePerson(PCRBActionItemNotification notification);
|
||||
Task CreateFollowUp(PCRBFollowUp followUp);
|
||||
Task<IEnumerable<PCRBFollowUp>> GetFollowUpsByPlanNumber(int planNumber, bool bypassCache);
|
||||
Task UpdateFollowUp(PCRBFollowUp followUp);
|
||||
Task DeleteFollowUp(int id);
|
||||
}
|
||||
|
||||
public class PCRBService : IPCRBService {
|
||||
@ -755,6 +759,90 @@ public class PCRBService : IPCRBService {
|
||||
}
|
||||
}
|
||||
|
||||
public async Task CreateFollowUp(PCRBFollowUp followUp) {
|
||||
try {
|
||||
_logger.LogInformation("Attempting to create PCRB follow up");
|
||||
|
||||
if (followUp is null) throw new ArgumentNullException("follow up cannot be null");
|
||||
|
||||
StringBuilder queryBuilder = new();
|
||||
queryBuilder.Append("insert into CCPCRBFollowUp (PlanNumber, Step, FollowUpDate, CompletedDate) ");
|
||||
queryBuilder.Append("values (@PlanNumber, @Step, @FollowUpDate, @CompletedDate)");
|
||||
|
||||
int rowsReturned = await _dalService.ExecuteAsync<PCRBFollowUp>(queryBuilder.ToString(), followUp);
|
||||
|
||||
if (rowsReturned <= 0) throw new Exception("unable to insert new follow up in the database");
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"Unable to create new follow up, because {ex.Message}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<IEnumerable<PCRBFollowUp>> GetFollowUpsByPlanNumber(int planNumber, bool bypassCache) {
|
||||
try {
|
||||
_logger.LogInformation($"Attempting to fetch follow ups for PCRB {planNumber}");
|
||||
|
||||
if (planNumber <= 0) throw new ArgumentException($"{planNumber} is not a valid PCRB Plan#");
|
||||
|
||||
IEnumerable<PCRBFollowUp>? followUps = new List<PCRBFollowUp>();
|
||||
|
||||
if (!bypassCache)
|
||||
followUps = _cache.Get<IEnumerable<PCRBFollowUp>>($"pcrbFollowUps{planNumber}");
|
||||
|
||||
if (followUps is null || followUps.Count() == 0) {
|
||||
string sql = "select * from CCPCRBFollowUp where PlanNumber=@PlanNumber";
|
||||
|
||||
followUps = await _dalService.QueryAsync<PCRBFollowUp>(sql, new { PlanNumber = planNumber });
|
||||
|
||||
if (followUps is not null)
|
||||
_cache.Set($"pcrbFollowUps{planNumber}", followUps, DateTimeOffset.Now.AddMinutes(15));
|
||||
}
|
||||
|
||||
return followUps ?? new List<PCRBFollowUp>();
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"Unable to fetch follow ups for PCRB {planNumber}, because {ex.Message}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task UpdateFollowUp(PCRBFollowUp followUp) {
|
||||
try {
|
||||
_logger.LogInformation("Attempting to update a follow up");
|
||||
|
||||
if (followUp is null)
|
||||
throw new ArgumentNullException("follow up cannot be null");
|
||||
|
||||
StringBuilder queryBuilder = new();
|
||||
queryBuilder.Append("update CCPCRBFollowUp set Step=@Step, FollowUpDate=@FollowUpDate, IsComplete=@IsComplete, ");
|
||||
queryBuilder.Append("IsDeleted=@IsDeleted, CompletedDate=@CompletedDate, Comments=@Comments ");
|
||||
queryBuilder.Append("where ID=@ID");
|
||||
|
||||
int rowsAffected = await _dalService.ExecuteAsync<PCRBFollowUp>(queryBuilder.ToString(), followUp);
|
||||
|
||||
if (rowsAffected <= 0) throw new Exception("update failed in database");
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"Unable to update follow up, because {ex.Message}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
public async Task DeleteFollowUp(int id) {
|
||||
try {
|
||||
_logger.LogInformation($"Attempting to delete follow up {id}");
|
||||
|
||||
if (id <= 0) throw new ArgumentException($"{id} is not a valid follow up ID");
|
||||
|
||||
string sql = "delete from CCPCRBFollowUp where ID=@ID";
|
||||
|
||||
int rowsAffected = await _dalService.ExecuteAsync(sql, new { ID = id });
|
||||
|
||||
if (rowsAffected <= 0) throw new Exception("delete operation failed in database");
|
||||
} catch (Exception ex) {
|
||||
_logger.LogError($"Unable to delete follow up {id}, because {ex.Message}");
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
private async Task SaveAttachmentInDb(IFormFile file, PCRBAttachment attachment) {
|
||||
try {
|
||||
_logger.LogInformation($"Attempting to save attachment to database");
|
||||
|
Reference in New Issue
Block a user