@@ -15,6 +15,7 @@ namespace FileProcessor.BusinessLogic.RequestHandlers
1515 using EventHandling ;
1616 using FileAggregate ;
1717 using FileFormatHandlers ;
18+ using FileImportLogAggregate ;
1819 using FIleProcessor . Models ;
1920 using Managers ;
2021 using Newtonsoft . Json ;
@@ -32,10 +33,11 @@ namespace FileProcessor.BusinessLogic.RequestHandlers
3233 /// <summary>
3334 ///
3435 /// </summary>
35- /// <seealso cref="MediatR.IRequestHandler{FileProcessor.BusinessLogic.Requests. UploadFileRequest} " />
36- /// <seealso cref="MediatR.IRequestHandler{FileProcessor.BusinessLogic.Requests. SafaricomTopupRequest} " />
37- /// <seealso cref="MediatR.IRequestHandler{FileProcessor.BusinessLogic.Requests. ProcessTransactionForFileLineRequest} " />
36+ /// <seealso cref="UploadFileRequest" />
37+ /// <seealso cref="SafaricomTopupRequest" />
38+ /// <seealso cref="ProcessTransactionForFileLineRequest" />
3839 public class FileRequestHandler : IRequestHandler < UploadFileRequest > ,
40+ IRequestHandler < ProcessUploadedFileRequest > ,
3941 IRequestHandler < SafaricomTopupRequest > ,
4042 IRequestHandler < ProcessTransactionForFileLineRequest >
4143 {
@@ -44,6 +46,8 @@ public class FileRequestHandler : IRequestHandler<UploadFileRequest>,
4446 /// </summary>
4547 private readonly IFileProcessorManager FileProcessorManager ;
4648
49+ private readonly IAggregateRepository < FileImportLogAggregate , DomainEventRecord . DomainEvent > FileImportLogAggregateRepository ;
50+
4751 /// <summary>
4852 /// The file aggregate repository
4953 /// </summary>
@@ -85,6 +89,7 @@ public class FileRequestHandler : IRequestHandler<UploadFileRequest>,
8589 /// <param name="fileFormatHandlerResolver">The file format handler resolver.</param>
8690 /// <param name="fileSystem">The file system.</param>
8791 public FileRequestHandler ( IFileProcessorManager fileProcessorManager ,
92+ IAggregateRepository < FileImportLogAggregate , DomainEventRecord . DomainEvent > fileImportLogAggregateRepository ,
8893 IAggregateRepository < FileAggregate , DomainEventRecord . DomainEvent > fileAggregateRepository ,
8994 ITransactionProcessorClient transactionProcessorClient ,
9095 IEstateClient estateClient ,
@@ -93,6 +98,7 @@ public FileRequestHandler(IFileProcessorManager fileProcessorManager,
9398 IFileSystem fileSystem )
9499 {
95100 this . FileProcessorManager = fileProcessorManager ;
101+ this . FileImportLogAggregateRepository = fileImportLogAggregateRepository ;
96102 this . FileAggregateRepository = fileAggregateRepository ;
97103 this . TransactionProcessorClient = transactionProcessorClient ;
98104 this . EstateClient = estateClient ;
@@ -115,8 +121,21 @@ public FileRequestHandler(IFileProcessorManager fileProcessorManager,
115121 public async Task < Unit > Handle ( UploadFileRequest request ,
116122 CancellationToken cancellationToken )
117123 {
118- // TODO: Should the file id be generated from the file uploaded to protect against duplicate files???
119- // Find the file profile
124+ DateTime importLogDateTime = DateTime . Now ;
125+
126+ // This will now create the import log and add an event for the file being uploaded
127+ Guid importLogId = this . CreateGuidFromDateTime ( importLogDateTime . Date ) ;
128+
129+ // Get the import log
130+ FileImportLogAggregate fileImportLogAggregate = await this . FileImportLogAggregateRepository . GetLatestVersion ( importLogId , cancellationToken ) ;
131+
132+ if ( fileImportLogAggregate . IsCreated == false )
133+ {
134+ // First file of the day so create
135+ fileImportLogAggregate . CreateImportLog ( request . EstateId , importLogDateTime ) ;
136+ }
137+
138+ // Move the file
120139 FileProfile fileProfile = await this . FileProcessorManager . GetFileProfile ( request . FileProfileId , cancellationToken ) ;
121140
122141 if ( fileProfile == null )
@@ -137,14 +156,35 @@ public async Task<Unit> Handle(UploadFileRequest request,
137156 throw new DirectoryNotFoundException ( $ "Directory { fileProfile . ListeningDirectory } not found") ;
138157 }
139158
140- file . MoveTo ( $ "{ fileProfile . ListeningDirectory } \\ { request . EstateId : N} -{ request . FileId : N} ", overwrite : true ) ;
159+ String fileDestination = $ "{ fileProfile . ListeningDirectory } \\ { request . EstateId : N} -{ request . FileId : N} ";
160+ file . MoveTo ( fileDestination , overwrite : true ) ; ;
161+
162+ // Update Import log aggregate
163+ fileImportLogAggregate . AddImportedFile ( request . FileId , request . MerchantId , request . UserId , request . FileProfileId , originalName , fileDestination ) ;
164+
165+ // Save changes
166+ await this . FileImportLogAggregateRepository . SaveChanges ( fileImportLogAggregate , cancellationToken ) ;
141167
142- // Write file to import log
143- // TODO:
168+ return new Unit ( ) ;
169+ }
144170
171+ private Guid CreateGuidFromDateTime ( DateTime dateTime )
172+ {
173+ var bytes = BitConverter . GetBytes ( dateTime . Ticks ) ;
174+
175+ Array . Resize ( ref bytes , 16 ) ;
176+
177+ var guid = new Guid ( bytes ) ;
178+
179+ return guid ;
180+ }
181+
182+ public async Task < Unit > Handle ( ProcessUploadedFileRequest request , CancellationToken cancellationToken )
183+ {
184+ // TODO: Should the file id be generated from the file uploaded to protect against duplicate files???
145185 FileAggregate fileAggregate = await this . FileAggregateRepository . GetLatestVersion ( request . FileId , cancellationToken ) ;
146186
147- fileAggregate . UploadFile ( request . EstateId , request . MerchantId , request . UserId , request . FileProfileId , originalName ) ;
187+ fileAggregate . CreateFile ( request . FileImportLogId , request . EstateId , request . MerchantId , request . UserId , request . FileProfileId , request . FilePath ) ;
148188
149189 await this . FileAggregateRepository . SaveChanges ( fileAggregate , cancellationToken ) ;
150190
@@ -169,6 +209,11 @@ public async Task<Unit> Handle(UploadFileRequest request,
169209 public async Task < Unit > Handle ( SafaricomTopupRequest request ,
170210 CancellationToken cancellationToken )
171211 {
212+ FileAggregate fileAggregate = await this . FileAggregateRepository . GetLatestVersion ( request . FileId , cancellationToken ) ;
213+
214+ if ( fileAggregate . IsCreated == false )
215+ return new Unit ( ) ;
216+
172217 IFileInfo file = this . FileSystem . FileInfo . FromFileName ( request . FileName ) ;
173218
174219 if ( file . Exists == false )
@@ -217,8 +262,6 @@ public async Task<Unit> Handle(SafaricomTopupRequest request,
217262
218263 if ( String . IsNullOrEmpty ( fileContent ) == false )
219264 {
220- FileAggregate fileAggregate = await this . FileAggregateRepository . GetLatestVersion ( request . FileId , cancellationToken ) ;
221-
222265 String [ ] fileLines = fileContent . Split ( Environment . NewLine ) ;
223266
224267 foreach ( String fileLine in fileLines )
0 commit comments