diff --git a/ModernKeePass.Application/Application.csproj b/ModernKeePass.Application/Application.csproj index b3864be..c56f2d0 100644 --- a/ModernKeePass.Application/Application.csproj +++ b/ModernKeePass.Application/Application.csproj @@ -81,7 +81,6 @@ - @@ -105,6 +104,8 @@ + + @@ -119,7 +120,7 @@ - + diff --git a/ModernKeePass.Application/Common/Interfaces/IImportFormat.cs b/ModernKeePass.Application/Common/Interfaces/IImportFormat.cs deleted file mode 100644 index 8044f55..0000000 --- a/ModernKeePass.Application/Common/Interfaces/IImportFormat.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace ModernKeePass.Application.Common.Interfaces -{ - public interface IImportFormat - { - List> Import(IList fileContents); - } -} \ No newline at end of file diff --git a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseQueryValidator.cs b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommandValidator.cs similarity index 79% rename from ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseQueryValidator.cs rename to ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommandValidator.cs index 5c4ead4..611aa0e 100644 --- a/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseQueryValidator.cs +++ b/ModernKeePass.Application/Database/Commands/CreateDatabase/CreateDatabaseCommandValidator.cs @@ -2,9 +2,9 @@ namespace ModernKeePass.Application.Database.Commands.CreateDatabase { - public class CreateDatabaseQueryValidator : AbstractValidator + public class CreateDatabaseCommandValidator : AbstractValidator { - public CreateDatabaseQueryValidator() + public CreateDatabaseCommandValidator() { RuleFor(v => v.FilePath) .NotNull() diff --git a/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommand.cs b/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommand.cs new file mode 100644 index 0000000..76f964c --- /dev/null +++ b/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommand.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Threading.Tasks; +using MediatR; +using ModernKeePass.Application.Common.Interfaces; +using ModernKeePass.Domain.Enums; +using ModernKeePass.Domain.Exceptions; + +namespace ModernKeePass.Application.Import.Commands.ImportFromCsv +{ + public class ImportFromCsvCommand : IRequest + { + public string FilePath { get; set; } + public string DestinationGroupId { get; set; } + public bool HasHeaderRow { get; set; } + public char Delimiter { get; set; } = ';'; + public Dictionary FieldMappings { get; set; } + + public class CreateDatabaseCommandHandler : IAsyncRequestHandler + { + private readonly IDatabaseProxy _database; + private readonly IFileProxy _file; + + public CreateDatabaseCommandHandler(IDatabaseProxy database, IFileProxy file) + { + _database = database; + _file = file; + } + + public async Task Handle(ImportFromCsvCommand message) + { + if (!_database.IsOpen) throw new DatabaseClosedException(); + + var fileContents = await _file.ReadTextFile(message.FilePath); + + for (var index = message.HasHeaderRow ? 1 : 0; index < fileContents.Count; index++) + { + var line = fileContents[index]; + var fields = line.Split(message.Delimiter); + + var entry = _database.CreateEntry(message.DestinationGroupId); + for (var i = 0; i < fields.Length; i++) + { + var fieldMapping = message.FieldMappings[i]; + await _database.UpdateEntry(entry.Id, fieldMapping, fields[i], fieldMapping == EntryFieldName.Password); + } + } + } + } + } +} \ No newline at end of file diff --git a/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommandValidator.cs b/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommandValidator.cs new file mode 100644 index 0000000..f0593a3 --- /dev/null +++ b/ModernKeePass.Application/Import/Commands/ImportFromCsv/ImportFromCsvCommandValidator.cs @@ -0,0 +1,17 @@ +using FluentValidation; + +namespace ModernKeePass.Application.Import.Commands.ImportFromCsv +{ + public class ImportFromCsvCommandValidator : AbstractValidator + { + public ImportFromCsvCommandValidator() + { + RuleFor(v => v.FilePath) + .NotNull() + .NotEmpty(); + RuleFor(v => v.DestinationGroupId) + .NotNull() + .NotEmpty(); + } + } +} \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/File/CsvImportFormat.cs b/ModernKeePass.Infrastructure/File/CsvImportFormat.cs deleted file mode 100644 index 94195de..0000000 --- a/ModernKeePass.Infrastructure/File/CsvImportFormat.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; -using ModernKeePass.Application.Common.Interfaces; - -namespace ModernKeePass.Infrastructure.File -{ - public class CsvImportFormat: IImportFormat - { - private const bool HasHeaderRow = true; - private const char Delimiter = ';'; - private const char LineDelimiter = '\n'; - - public List> Import(IList fileContents) - { - var parsedResult = new List>(); - foreach (var line in fileContents) - { - var fields = line.Split(Delimiter); - var recordItem = new Dictionary(); - var i = 0; - foreach (var field in fields) - { - recordItem.Add(i.ToString(), field); - i++; - } - parsedResult.Add(recordItem); - } - - return parsedResult; - } - } -} \ No newline at end of file diff --git a/ModernKeePass.Infrastructure/Infrastructure.csproj b/ModernKeePass.Infrastructure/Infrastructure.csproj index a50fba2..fe31681 100644 --- a/ModernKeePass.Infrastructure/Infrastructure.csproj +++ b/ModernKeePass.Infrastructure/Infrastructure.csproj @@ -78,7 +78,6 @@ - diff --git a/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml b/ModernKeePass/Views/MainPageFrames/ImportPage.xaml similarity index 97% rename from ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml rename to ModernKeePass/Views/MainPageFrames/ImportPage.xaml index e5897ef..85c8ebc 100644 --- a/ModernKeePass/Views/MainPageFrames/ImportExportPage.xaml +++ b/ModernKeePass/Views/MainPageFrames/ImportPage.xaml @@ -1,5 +1,5 @@  /// The import/export page. /// - public sealed partial class ImportExportPage + public sealed partial class ImportPage { - public ImportExportPage() + public ImportPage() { InitializeComponent(); } diff --git a/ModernKeePass/Win81App.csproj b/ModernKeePass/Win81App.csproj index afd2ea5..5a1ba23 100644 --- a/ModernKeePass/Win81App.csproj +++ b/ModernKeePass/Win81App.csproj @@ -100,8 +100,8 @@ DonatePage.xaml - - ImportExportPage.xaml + + ImportPage.xaml SettingsHistoryPage.xaml @@ -203,7 +203,7 @@ MSBuild:Compile PreserveNewest - + Designer MSBuild:Compile