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
18 changes: 16 additions & 2 deletions FIleProcessor.Models/FileProfile.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@
/// </value>
public Guid FileProfileId { get; init; }

public Guid FileProfileVersionId { get; init; }

public Int32 FileProfileVersion { get; init; }

/// <summary>
/// Gets or sets the name.
/// </summary>
Expand Down Expand Up @@ -85,9 +89,19 @@
/// <param name="requestType">Type of the request.</param>
/// <param name="operatorName">Name of the operator.</param>
/// <param name="lineTerminator">The line terminator.</param>
public FileProfile(Guid fileProfileId, String name, String listeningDirectory, String requestType, String operatorName, String lineTerminator, String fileFormatHandler)
public FileProfile(Guid fileProfileId,

Check warning on line 92 in FIleProcessor.Models/FileProfile.cs

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

FIleProcessor.Models/FileProfile.cs#L92

Method FileProfile::FileProfile has 9 parameters (limit is 8)
String name,
String listeningDirectory,
String requestType,
String operatorName,
String lineTerminator,
String fileFormatHandler,
Guid fileProfileVersionId = default,
Int32 fileProfileVersion = 0)
{
this.FileProfileId = fileProfileId;
this.FileProfileVersionId = fileProfileVersionId;
this.FileProfileVersion = fileProfileVersion;
this.Name = name;
this.ListeningDirectory = listeningDirectory;
this.ProcessedDirectory = $"{listeningDirectory}/processed";
Expand All @@ -98,4 +112,4 @@
this.FileFormatHandler = fileFormatHandler;
}
}
}
}
28 changes: 28 additions & 0 deletions FileProcessor.BusinessLogic/Managers/FileProfileManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,34 @@ public async Task<Result<FileProfileModel>> GetFileProfile(Guid fileProfileId, C
return Result.Success(fileProfile);
}

public async Task<Result<List<FileProfileModel>>> GetFileProfileVersions(Guid fileProfileId, CancellationToken cancellationToken)
{
Result<FileProfileAggregateRoot> aggregateResult = await this.LoadAggregate(cancellationToken);
if (aggregateResult.IsFailed)
return ResultHelpers.CreateFailure(aggregateResult);

List<FileProfileModel> versions = aggregateResult.Data.GetProfileVersions(fileProfileId);
if (versions.Count == 0)
return Result.NotFound($"No file profile found for File Profile Id {fileProfileId}");

return Result.Success(versions);
}

public async Task<Result<FileProfileModel>> GetFileProfileVersion(Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken)
{
Result<FileProfileAggregateRoot> aggregateResult = await this.LoadAggregate(cancellationToken);
if (aggregateResult.IsFailed)
return ResultHelpers.CreateFailure(aggregateResult);

FileProfileModel version = aggregateResult.Data.GetProfileVersion(fileProfileId, fileProfileVersionId);
if (version == null)
return Result.NotFound($"No file profile version found for File Profile Id {fileProfileId} and Version Id {fileProfileVersionId}");

return Result.Success(version);
}

public async Task<Result<FileProfileModel>> CreateFileProfile(CreateFileProfileRequest request, CancellationToken cancellationToken)
{
Result<FileProfileAggregateRoot> aggregateResult = await this.LoadAggregate(cancellationToken);
Expand Down
4 changes: 4 additions & 0 deletions FileProcessor.BusinessLogic/Managers/IFileProfileManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public interface IFileProfileManager

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

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

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

Task<Result<FileProfileModel>> CreateFileProfile(CreateFileProfileRequest request, CancellationToken cancellationToken);

Task<Result<FileProfileModel>> UpdateFileProfile(Guid fileProfileId, UpdateFileProfileRequest request, CancellationToken cancellationToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,20 @@ public record FileProfileCreatedEvent(Guid FileProfileCollectionId,
String RequestType,
String OperatorName,
String LineTerminator,
String FileFormatHandler) : DomainEvent(FileProfileCollectionId, Guid.NewGuid());
String FileFormatHandler,
Guid FileProfileVersionId = default,
Int32 FileProfileVersion = 1) : DomainEvent(FileProfileCollectionId, Guid.NewGuid());

public record FileProfileVersionCreatedEvent(Guid FileProfileCollectionId,
Guid FileProfileId,
Guid FileProfileVersionId,
Int32 FileProfileVersion,
String Name,
String ListeningDirectory,
String RequestType,
String OperatorName,
String LineTerminator,
String FileFormatHandler) : DomainEvent(FileProfileCollectionId, Guid.NewGuid());

public record FileProfileNameUpdatedEvent(Guid FileProfileCollectionId, Guid FileProfileId, String Name) : DomainEvent(FileProfileCollectionId, Guid.NewGuid());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -171,6 +171,95 @@ public void FileProfileAggregate_Update_ListeningDirectoryUpdatesDerivedDirector
updatedProfile.FailedDirectory.ShouldBe("/home/txnproc/bulkfiles/new-safaricom/failed");
}

[Fact]
public void FileProfileAggregate_Create_CreatesInitialImmutableVersion()
{
FileProfileAggregateRoot aggregate = FileProfileAggregateRoot.Create();

Result createResult = aggregate.CreateProfile(this.CreateProfile(
TestData.FileProfileId,
TestData.SafaricomProfileName,
TestData.SafaricomListeningDirectory,
TestData.SafaricomRequestType,
TestData.SafaricomOperatorIdentifier,
LineTerminatorType.LineFeed,
TestData.SafaricomFileFormatHandler));

FileProcessor.Models.FileProfile profile = aggregate.GetProfile(TestData.FileProfileId);
List<FileProcessor.Models.FileProfile> versions = aggregate.GetProfileVersions(TestData.FileProfileId);

createResult.IsSuccess.ShouldBeTrue();
profile.FileProfileVersionId.ShouldNotBe(Guid.Empty);
profile.FileProfileVersion.ShouldBe(1);
versions.Count.ShouldBe(1);
versions[0].FileProfileVersionId.ShouldBe(profile.FileProfileVersionId);
}

[Fact]
public void FileProfileAggregate_Update_CreatesNewVersionAndPreservesPreviousVersion()
{
FileProfileAggregateRoot aggregate = FileProfileAggregateRoot.Create();
aggregate.CreateProfile(this.CreateProfile(
TestData.FileProfileId,
TestData.SafaricomProfileName,
TestData.SafaricomListeningDirectory,
TestData.SafaricomRequestType,
TestData.SafaricomOperatorIdentifier,
LineTerminatorType.LineFeed,
TestData.SafaricomFileFormatHandler));

FileProcessor.Models.FileProfile originalProfile = aggregate.GetProfile(TestData.FileProfileId);

Result updateResult = aggregate.UpdateProfile(TestData.FileProfileId, new UpdateFileProfileRequest
{
FileFormatHandler = "UpdatedHandler"
});

FileProcessor.Models.FileProfile updatedProfile = aggregate.GetProfile(TestData.FileProfileId);
FileProcessor.Models.FileProfile historicalProfile = aggregate.GetProfileVersion(
TestData.FileProfileId,
originalProfile.FileProfileVersionId);
List<FileProcessor.Models.FileProfile> versions = aggregate.GetProfileVersions(TestData.FileProfileId);

updateResult.IsSuccess.ShouldBeTrue();
updatedProfile.FileProfileVersionId.ShouldNotBe(originalProfile.FileProfileVersionId);
updatedProfile.FileProfileVersion.ShouldBe(2);
updatedProfile.FileFormatHandler.ShouldBe("UpdatedHandler");
historicalProfile.FileProfileVersionId.ShouldBe(originalProfile.FileProfileVersionId);
historicalProfile.FileProfileVersion.ShouldBe(1);
historicalProfile.FileFormatHandler.ShouldBe(TestData.SafaricomFileFormatHandler);
versions.Count.ShouldBe(2);
}

[Fact]
public void FileProfileAggregate_ReplayingLegacyUpdateEvents_UpdatesInitialVersionSnapshot()
{
FileProfileAggregateRoot aggregate = FileProfileAggregateRoot.Create();
Guid versionId = Guid.Parse("aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa");

aggregate.PlayEvent(new FileProcessor.FileProfile.DomainEvents.FileProfileCreatedEvent(
FileProfileAggregateRoot.FileProfileCollectionId,
TestData.FileProfileId,
TestData.SafaricomProfileName,
TestData.SafaricomListeningDirectory,
TestData.SafaricomRequestType,
TestData.SafaricomOperatorIdentifier,
"\n",
TestData.SafaricomFileFormatHandler,
versionId,
1));
aggregate.PlayEvent(new FileProcessor.FileProfile.DomainEvents.FileProfileFileFormatHandlerUpdatedEvent(
FileProfileAggregateRoot.FileProfileCollectionId,
TestData.FileProfileId,
"LegacyUpdatedHandler"));

FileProcessor.Models.FileProfile profile = aggregate.GetProfile(TestData.FileProfileId);
FileProcessor.Models.FileProfile version = aggregate.GetProfileVersion(TestData.FileProfileId, versionId);

profile.FileFormatHandler.ShouldBe("LegacyUpdatedHandler");
version.FileFormatHandler.ShouldBe("LegacyUpdatedHandler");
}

[Fact]
public void FileProfileAggregate_Create_WithDuplicateName_IsRejected()
{
Expand Down
Loading
Loading