Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 2 additions & 0 deletions FIleProcessor.Models/FileDetails.cs
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,8 @@ public class FileDetails
/// </value>
public Guid FileProfileId { get; set; }

public Guid FileProfileVersionId { get; set; }

public DateTime FileReceivedDateTime { get; set; }

/// <summary>
Expand Down
4 changes: 3 additions & 1 deletion FIleProcessor.Models/ImportLogFile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@ public class ImportLogFile
/// </value>
public Guid FileProfileId { get; set; }

public Guid FileProfileVersionId { get; set; }

/// <summary>
/// Gets or sets the merchant identifier.
/// </summary>
Expand Down Expand Up @@ -80,4 +82,4 @@ public class ImportLogFile

#endregion
}
}
}
25 changes: 25 additions & 0 deletions FileProcessor.BusinessLogic.Tests/DomainEventHandlerTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -78,5 +78,30 @@ public void FileDomainEventHandler_FileAddedToImportLogEvent_EventIsHandled()
await eventHandler.Handle(fileAddedToImportLogEvent, CancellationToken.None);
});
}

[Fact]
public async Task FileDomainEventHandler_FileAddedToImportLogEvent_PropagatesFileProfileVersionId()
{
IMediatorImposter mediator = new IMediatorImposter();
mediator.Send(Arg<IRequest<Result>>.Any(), Arg<CancellationToken>.Any()).ReturnsAsync(Result.Success());
FileDomainEventHandler eventHandler = new FileDomainEventHandler(mediator.Instance());
FileAddedToImportLogEvent domainEvent = new(TestData.FileImportLogId,
TestData.FileId,
TestData.EstateId,
TestData.MerchantId,
TestData.UserId,
TestData.FileProfileId,
TestData.OriginalFileName,
TestData.FilePath,
TestData.FileUploadedDateTime,
TestData.FileProfileVersionId);

Result result = await eventHandler.Handle(domainEvent, CancellationToken.None);

result.IsSuccess.ShouldBeTrue();
mediator.Send(Arg<IRequest<Result>>.Is(request => request is FileCommands.ProcessUploadedFileCommand command &&
command.FileProfileVersionId == TestData.FileProfileVersionId),
Arg<CancellationToken>.Any()).Called(Count.Once());
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,12 @@ public async Task<Result<FileProfileModel>> GetFileProfile(Guid fileProfileId,
return Result.Success();
}

public async Task<Result<FileProfileModel>> GetFileProfileVersion(Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken) {
return Result.Success();
}

public async Task<Result<Models.FileImportLogQueryResult>> GetFileImportLogs(Guid estateId,
DateOnly startDate,
DateOnly endDate,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,9 @@ public FileProcessorDomainServiceTests()
Logger.Initialise(NullLogger.Instance);

this.FileProcessorManager = new IFileProcessorManagerImposter();
this.FileProcessorManager.GetFileProfileVersion(Arg<Guid>.Any(),
Arg<Guid>.Any(),
Arg<CancellationToken>.Any()).ReturnsAsync(TestData.FileProfileSafaricom);
this.FileImportLogAggregateRepository =
new IAggregateRepositoryImposter<FileImportLogAggregate, DomainEvent>();
this.FileAggregateRepository =
Expand Down Expand Up @@ -109,7 +112,10 @@ public async Task FileRequestHandler_UploadFileRequest_RequestIsHandled()
[Fact]
public async Task UploadFile_DoesNotRequireListeningDirectoryOrMoveTemporaryFile()
{
this.FileProcessorManager.GetFileProfile(Arg<Guid>.Any(), Arg<CancellationToken>.Any()).ReturnsAsync(TestData.FileProfileSafaricom);
this.FileProcessorManager.GetFileProfile(Arg<Guid>.Any(), Arg<CancellationToken>.Any()).ReturnsAsync(TestData.FileProfileSafaricom with
{
FileProfileVersionId = TestData.FileProfileVersionId
});

FileImportLogAggregate importLogAggregate = TestData.GetEmptyFileImportLogAggregate();
this.FileImportLogAggregateRepository.GetLatestVersion(Arg<Guid>.Any(), Arg<CancellationToken>.Any()).ReturnsAsync(Result.Success(importLogAggregate));
Expand All @@ -131,6 +137,7 @@ public async Task UploadFile_DoesNotRequireListeningDirectoryOrMoveTemporaryFile
this.FileSystem.File.Exists(TestData.FilePathWithName).ShouldBeTrue();
importLogAggregate.GetFileImportLog().Files.Single().FilePath.ShouldBe(TestData.FilePathWithName);
importLogAggregate.GetFileImportLog().Files.Single().OriginalFileName.ShouldBe("client-name.csv");
importLogAggregate.GetFileImportLog().Files.Single().FileProfileVersionId.ShouldBe(TestData.FileProfileVersionId);
}

[Fact]
Expand Down Expand Up @@ -816,6 +823,8 @@ public async Task FileRequestHandler_ProcessTransactionForFileLineRequest_FilePr
this.FileAggregateRepository.GetLatestVersion(Arg<Guid>.Any(), Arg<CancellationToken>.Any()).ReturnsAsync(Result.Success(TestData.GetFileAggregateWithLines()));
this.FileProcessorManager.GetFileProfile(Arg<Guid>.Any(), Arg<CancellationToken>.Any())
.ReturnsAsync(Result.NotFound());
this.FileProcessorManager.GetFileProfileVersion(Arg<Guid>.Any(), Arg<Guid>.Any(), Arg<CancellationToken>.Any())
.ReturnsAsync(Result.NotFound());
var result = await this.FileProcessorDomainService.ProcessTransactionForFileLine(
TestData.ProcessTransactionForFileLineCommand, CancellationToken.None);
result.IsFailed.ShouldBeTrue();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ public async Task RecoverInProgressFilesAsync_ReplaysFilesFoundInInProgressDirec
command.FileId == TestData.FileId &&
Path.GetFileName(command.FilePath) == Path.GetFileName(inProgressFilePath) &&
command.FileProfileId == TestData.FileProfileId &&
command.FileProfileVersionId == TestData.FileProfileVersionId &&
command.EstateId == TestData.EstateId),
Arg<CancellationToken>.Any()).Called(Count.Once());
}
Expand Down Expand Up @@ -106,6 +107,7 @@ public async Task RecoverInProgressFilesAsync_WhenFileAggregateIsMissing_Replays
EstateId = TestData.EstateId,
FileId = TestData.FileId,
FileProfileId = TestData.FileProfileId,
FileProfileVersionId = TestData.FileProfileVersionId,
MerchantId = TestData.MerchantId,
UserId = TestData.UserId,
UploadedDateTime = TestData.FileUploadedDateTime
Expand All @@ -130,6 +132,7 @@ public async Task RecoverInProgressFilesAsync_WhenFileAggregateIsMissing_Replays
command.FileId == TestData.FileId &&
command.FileImportLogId == TestData.FileImportLogId &&
command.FileProfileId == TestData.FileProfileId &&
command.FileProfileVersionId == TestData.FileProfileVersionId &&
command.EstateId == TestData.EstateId &&
command.MerchantId == TestData.MerchantId &&
command.UserId == TestData.UserId &&
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,8 @@ private async Task<Result> HandleSpecificDomainEvent(FileAddedToImportLogEvent d
domainEvent.UserId,
domainEvent.FilePath,
domainEvent.FileProfileId,
domainEvent.FileUploadedDateTime);
domainEvent.FileUploadedDateTime,
domainEvent.FileProfileVersionId);

return await this.Mediator.Send(command, cancellationToken);
}
Expand Down
9 changes: 9 additions & 0 deletions FileProcessor.BusinessLogic/Managers/FileProcessorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,15 @@ public async Task<Result<FileProfileModel>> GetFileProfile(Guid fileProfileId,
return await this.FileProfileManager.GetFileProfile(fileProfileId, cancellationToken);
}

public async Task<Result<FileProfileModel>> GetFileProfileVersion(Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken)
{
return await this.FileProfileManager.GetFileProfileVersion(fileProfileId,
fileProfileVersionId,
cancellationToken);
}

private async Task<EstateManagementContext> GetContext(Guid estateId)
{
ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
Expand Down
4 changes: 4 additions & 0 deletions FileProcessor.BusinessLogic/Managers/IFileProcessorManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@ public interface IFileProcessorManager

Task<Result<FileProfileModel>> GetFileProfile(Guid fileProfileId, CancellationToken cancellationToken);

Task<Result<FileProfileModel>> GetFileProfileVersion(Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken);

Task<Result<Models.FileImportLogQueryResult>> GetFileImportLogs(Guid estateId, DateOnly startDate, DateOnly endDate, Guid? merchantId, Int32 pageNumber, Int32 pageSize, Boolean descending, CancellationToken cancellationToken);

Task<Result<Models.FileImportLog>> GetFileImportLog(Guid fileImportLogId, Guid estateId, Guid? merchantId, CancellationToken cancellationToken);
Expand Down
3 changes: 2 additions & 1 deletion FileProcessor.BusinessLogic/Requests/FileCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ public record ProcessUploadedFileCommand(Guid EstateId,
Guid UserId,
String FilePath,
Guid FileProfileId,
DateTime FileUploadedDateTime) : IRequest<Result>;
DateTime FileUploadedDateTime,
Guid FileProfileVersionId = default) : IRequest<Result>;

public record UploadFileCommand(Guid FileId,
Guid EstateId,
Expand Down
54 changes: 46 additions & 8 deletions FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -187,6 +187,10 @@ public async Task<Result> UploadFile(FileCommands.UploadFileCommand command,
if (getFileProfileResult.Data == null)
return Result.NotFound($"No file profile found with Id {command.FileProfileId}");

Guid fileProfileVersionId = getFileProfileResult.Data.FileProfileVersionId == Guid.Empty
? getFileProfileResult.Data.FileProfileId
: getFileProfileResult.Data.FileProfileVersionId;

IFileInfo file = this.FileSystem.FileInfo.New(command.FilePath);
if (file.Exists == false) {
return Result.NotFound($"File {file.FullName} not found");
Expand All @@ -213,7 +217,14 @@ public async Task<Result> UploadFile(FileCommands.UploadFileCommand command,
}

// Update Import log aggregate
Result stateResult= fileImportLogAggregate.AddImportedFile(command.FileId, command.MerchantId, command.UserId, command.FileProfileId, originalName, command.FilePath, command.FileUploadedDateTime);
Result stateResult= fileImportLogAggregate.AddImportedFile(new AddImportedFileRequest(command.FileId,
command.MerchantId,
command.UserId,
command.FileProfileId,
originalName,
command.FilePath,
command.FileUploadedDateTime,
fileProfileVersionId));
if (stateResult.IsFailed)
return stateResult;

Expand Down Expand Up @@ -256,12 +267,15 @@ public async Task<Result> ProcessUploadedFile(FileCommands.ProcessUploadedFileCo
CancellationToken cancellationToken) {
Result result = await ApplyFileUpdates(async (FileAggregate fileAggregate) => {
Logger.LogWarning("In ProcessUploadedFile action");
Result<Guid> operatorIdResult = await GetOperatorIdForFileProfile(command.EstateId, command.FileProfileId, cancellationToken);
Result<Guid> operatorIdResult = await GetOperatorIdForFileProfile(command.EstateId,
command.FileProfileId,
command.FileProfileVersionId,
cancellationToken);
if (operatorIdResult.IsFailed)
return ResultHelpers.CreateFailure(operatorIdResult);

Logger.LogWarning("About to Create File");
FileAggregateExtensions.CreateFileRequest request = new(command.FileImportLogId, command.EstateId, command.MerchantId, command.UserId, command.FileProfileId, command.FilePath, command.FileUploadedDateTime, operatorIdResult.Data);
FileAggregateExtensions.CreateFileRequest request = new(command.FileImportLogId, command.EstateId, command.MerchantId, command.UserId, command.FileProfileId, command.FilePath, command.FileUploadedDateTime, operatorIdResult.Data, command.FileProfileVersionId);
Result stateResult = fileAggregate.CreateFile(request);
if (stateResult.IsFailed)
return stateResult;
Expand All @@ -276,7 +290,11 @@ public async Task<Result> ProcessUploadedFile(FileCommands.ProcessUploadedFileCo
return result;
}

Result processResult = await this.ProcessFile(command.FileId, command.FileProfileId, command.FilePath, cancellationToken);
Result processResult = await this.ProcessFile(command.FileId,
command.FileProfileId,
command.FileProfileVersionId,
command.FilePath,
cancellationToken);

return processResult;
}
Expand All @@ -299,9 +317,14 @@ private async Task MoveAcceptedFileToFailedDirectory(Guid fileProfileId,
file.MoveTo($"{fileProfileResult.Data.FailedDirectory}/{file.Name}", overwrite: true);
}

private async Task<Result<Guid>> GetOperatorIdForFileProfile(Guid estateId, Guid fileProfileId, CancellationToken cancellationToken){
private async Task<Result<Guid>> GetOperatorIdForFileProfile(Guid estateId,
Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken){

Result<FileProfileModel> fileProfileResult = await this.FileProcessorManager.GetFileProfile(fileProfileId, cancellationToken);
Result<FileProfileModel> fileProfileResult = await this.GetFileProfileForProcessing(fileProfileId,
fileProfileVersionId,
cancellationToken);

if (fileProfileResult.IsFailed){
Logger.LogInformation($"file profile {fileProfileId} not found");
Expand Down Expand Up @@ -411,7 +434,9 @@ public async Task<Result> ProcessTransactionForFileLine(FileCommands.ProcessTran
}

processingContext.Stage = FileLineProcessingStage.FileProfileLookup;
Result<FileProfileModel> fileProfileResult = await this.FileProcessorManager.GetFileProfile(fileDetails.FileProfileId, cancellationToken);
Result<FileProfileModel> fileProfileResult = await this.GetFileProfileForProcessing(fileDetails.FileProfileId,
fileDetails.FileProfileVersionId,
cancellationToken);
if (fileProfileResult.IsFailed)
return (ResultHelpers.CreateFailure(fileProfileResult), null);

Expand Down Expand Up @@ -724,13 +749,14 @@ private Result<String> ResolveMerchantDevice(MerchantResponse merchant,

private async Task<Result> ProcessFile(Guid fileId,
Guid fileProfileId,
Guid fileProfileVersionId,
String fileName,
CancellationToken cancellationToken) {
IFileInfo inProgressFile = null;
FileProfileModel fileProfile = null;

Result<FileProfileModel> fileProfileResult =
await this.FileProcessorManager.GetFileProfile(fileProfileId, cancellationToken);
await this.GetFileProfileForProcessing(fileProfileId, fileProfileVersionId, cancellationToken);

if (fileProfileResult.IsFailed)
return ResultHelpers.CreateFailure(fileProfileResult);
Expand Down Expand Up @@ -887,6 +913,18 @@ private async Task<Result> ProcessFile(Guid fileId,
return result;
}

private async Task<Result<FileProfileModel>> GetFileProfileForProcessing(Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken)
{
if (fileProfileVersionId == Guid.Empty)
return await this.FileProcessorManager.GetFileProfile(fileProfileId, cancellationToken);

return await this.FileProcessorManager.GetFileProfileVersion(fileProfileId,
fileProfileVersionId,
cancellationToken);
}

private static Int32 TransactionNumber = 0;

private Boolean FileLineCanBeIgnored(String domainEventFileLine,
Expand Down
Loading
Loading