2024-03-04 13:09:42 -07:00

65 lines
2.8 KiB
C#

using CsvHelper;
using FabApprovalWorkerService.Models;
using System.Collections.Concurrent;
using System.Diagnostics.CodeAnalysis;
namespace FabApprovalWorkerService.Services;
public interface ITrainingRecordService {
IEnumerable<TrainingRecord> ScrapeRecordsFromCsvFile(CsvReader csvReader);
ConcurrentDictionary<(string, string), TrainingRecord> SortAndFilterTrainingRecordsByCompletionDate(IEnumerable<TrainingRecord> trainingRecords);
}
public class TrainingRecordService {
private readonly ILogger<TrainingRecordService> _logger;
public TrainingRecordService(ILogger<TrainingRecordService> logger) {
_logger = logger;
if (_logger is null) throw new ArgumentNullException("ILogger not injected");
}
public IEnumerable<TrainingRecord> ScrapeTrainingRecordsFromCsvFile([DisallowNull] CsvReader csvReader) {
if (csvReader is null) throw new ArgumentNullException("csvReader cannot be null");
try {
_logger.LogInformation("Attempting to scrape training records from CSV file");
using (csvReader) {
return csvReader.GetRecords<TrainingRecord>();
}
} catch (Exception ex) {
_logger.LogError("An exception occurred when attempting to scrape training records from CSV file. Exception: {ex}",
ex.Message);
throw;
}
}
public ConcurrentDictionary<(string, string), TrainingRecord> SortAndFilterTrainingRecordsByCompletionDate([DisallowNull] IEnumerable<TrainingRecord> trainingRecords) {
if (trainingRecords is null) throw new ArgumentNullException("trainingRecords cannot be null");
ConcurrentDictionary<(string, string), TrainingRecord> recordsMap = new();
try {
_logger.LogInformation("Attempting to sort and filter training records");
IOrderedEnumerable<TrainingRecord> sortedRecords = trainingRecords.OrderByDescending(t => t.UserId)
.ThenBy(t => t.ItemId)
.ThenByDescending(t => t.CompletionDate);
foreach (TrainingRecord trainingRecord in sortedRecords) {
if (!recordsMap.TryGetValue((trainingRecord.FirstName + trainingRecord.LastName, trainingRecord.ItemId), out TrainingRecord? existingRecord)) {
recordsMap[(trainingRecord.FirstName + trainingRecord.LastName, trainingRecord.ItemId)] = trainingRecord;
}
}
return recordsMap;
} catch (Exception ex) {
_logger.LogError("An exception occurred when attempting to sort and filter training records. Exception: {ex}", ex.Message);
return recordsMap;
}
}
}