From 034a6535e46e2bca222ca84cc74e9e92027d0d21 Mon Sep 17 00:00:00 2001 From: Dmitry Grishin Date: Thu, 7 May 2026 13:38:48 +0400 Subject: [PATCH 1/2] VCST-5026: Add Backup and Restore feature --- README.md | 17 +- .../ExportImport/SqlQueriesExportImport.cs | 177 ++++++++++++++++++ .../ExportImport/SqlQueriesExportSqlQuery.cs | 21 +++ .../de.VirtoCommerce.SqlQueries.json | 5 + .../en.VirtoCommerce.SqlQueries.json | 7 +- .../es.VirtoCommerce.SqlQueries.json | 5 + .../fi.VirtoCommerce.SqlQueries.json | 7 +- .../fr.VirtoCommerce.SqlQueries.json | 5 + .../it.VirtoCommerce.SqlQueries.json | 5 + .../ja.VirtoCommerce.SqlQueries.json | 5 + .../no.VirtoCommerce.SqlQueries.json | 7 +- .../pl.VirtoCommerce.SqlQueries.json | 5 + .../pt.VirtoCommerce.SqlQueries.json | 5 + .../ru.VirtoCommerce.SqlQueries.json | 5 + .../sv.VirtoCommerce.SqlQueries.json | 7 +- .../zh.VirtoCommerce.SqlQueries.json | 5 + src/VirtoCommerce.SqlQueries.Web/Module.cs | 26 ++- 17 files changed, 308 insertions(+), 6 deletions(-) create mode 100644 src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs create mode 100644 src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs diff --git a/README.md b/README.md index ffa7a5c..36c09d0 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,22 @@ This module is designed to empower administrators and developers by providing a * Return results in user-friendly formats for reporting and analysis: HTML, PDF, CSV, XLSX. * Supports query parameters: Short Text, Dare Time, Boolean, Integer, Deceimal. * Supports multiple database providers: SQL Server (default), MySQL, and PostgreSQL. -* Supports multiple connection strings. +* Supports multiple connection strings. +* Platform Backup & Restore support. + +## Backup & Restore + +SQL queries are included in the platform-wide backup and restore process. + +When you run a platform export, all SQL queries (Name, Description, Query text, Connection string name and Parameters) are serialized into the backup archive. + +On import, the queries are recreated or updated, preserving their identifiers, metadata and parameter definitions. + +To run backup/restore: +1. Open Virto Commerce Admin UI. +1. Navigate to **Settings → Platform → Export** (or **Import**). +1. Ensure **Sql Queries** module is selected in the module list. +1. Run the export/import process. ## Screenshots ### No SQL queries yet diff --git a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs new file mode 100644 index 0000000..8d2c5a8 --- /dev/null +++ b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs @@ -0,0 +1,177 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using Newtonsoft.Json; +using VirtoCommerce.Platform.Core.Common; +using VirtoCommerce.Platform.Core.ExportImport; +using VirtoCommerce.SqlQueries.Core.Models; +using VirtoCommerce.SqlQueries.Core.Services; + +namespace VirtoCommerce.SqlQueries.Data.ExportImport; + +public sealed class SqlQueriesExportImport( + ISqlQueryService sqlQueryService, + ISqlQuerySearchService sqlQuerySearchService, + JsonSerializer jsonSerializer) +{ + private const int BatchSize = 50; + + public async Task DoExportAsync(Stream outStream, Action progressCallback, ICancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + var progressInfo = new ExportImportProgressInfo { Description = "SQL queries are loading" }; + progressCallback(progressInfo); + + using var sw = new StreamWriter(outStream, leaveOpen: true); + using var writer = new JsonTextWriter(sw); + + await writer.WriteStartObjectAsync(); + + progressInfo.Description = "SQL queries are started to export"; + progressCallback(progressInfo); + + await writer.WritePropertyNameAsync("SqlQueries"); + await writer.WriteStartArrayAsync(); + + var criteria = AbstractTypeFactory.TryCreateInstance(); + criteria.Take = BatchSize; + + var processedCount = 0; + + for (criteria.Skip = 0; ; criteria.Skip += BatchSize) + { + var searchResult = await sqlQuerySearchService.SearchAsync(criteria); + + foreach (var query in searchResult.Results) + { + cancellationToken.ThrowIfCancellationRequested(); + + var exportSqlQuery = ConvertToExportSqlQuery(query); + jsonSerializer.Serialize(writer, exportSqlQuery); + processedCount++; + } + + await writer.FlushAsync(); + + progressInfo.Description = $"{processedCount} of {searchResult.TotalCount} SQL queries have been exported"; + progressInfo.ProcessedCount = processedCount; + progressInfo.TotalCount = searchResult.TotalCount; + progressCallback(progressInfo); + + if (criteria.Skip + BatchSize >= searchResult.TotalCount) + { + break; + } + } + + await writer.WriteEndArrayAsync(); + await writer.WriteEndObjectAsync(); + await writer.FlushAsync(); + } + + public async Task DoImportAsync(Stream inputStream, Action progressCallback, ICancellationToken cancellationToken) + { + cancellationToken.ThrowIfCancellationRequested(); + + var progressInfo = new ExportImportProgressInfo(); + + using var streamReader = new StreamReader(inputStream, leaveOpen: true); + using var reader = new JsonTextReader(streamReader); + + while (await reader.ReadAsync()) + { + if (reader.TokenType == JsonToken.PropertyName && reader.Value?.ToString() == "SqlQueries") + { + await ImportSqlQueriesArrayAsync(reader, progressInfo, progressCallback, cancellationToken); + } + } + } + + private async Task ImportSqlQueriesArrayAsync(JsonTextReader reader, ExportImportProgressInfo progressInfo, Action progressCallback, ICancellationToken cancellationToken) + { + if (!await reader.ReadAsync() || reader.TokenType != JsonToken.StartArray) + { + return; + } + + var processedCount = 0; + var batch = new List(BatchSize); + + while (await reader.ReadAsync() && reader.TokenType != JsonToken.EndArray) + { + cancellationToken.ThrowIfCancellationRequested(); + + var exportSqlQuery = jsonSerializer.Deserialize(reader); + if (exportSqlQuery == null) + { + continue; + } + + batch.Add(ConvertToSqlQuery(exportSqlQuery)); + + if (batch.Count >= BatchSize) + { + await sqlQueryService.SaveChangesAsync(batch); + processedCount += batch.Count; + batch.Clear(); + + progressInfo.Description = $"{processedCount} SQL queries have been imported"; + progressInfo.ProcessedCount = processedCount; + progressCallback(progressInfo); + } + } + + if (batch.Count > 0) + { + await sqlQueryService.SaveChangesAsync(batch); + processedCount += batch.Count; + + progressInfo.Description = $"{processedCount} SQL queries have been imported"; + progressInfo.ProcessedCount = processedCount; + progressCallback(progressInfo); + } + } + + private static SqlQueriesExportSqlQuery ConvertToExportSqlQuery(SqlQuery query) + { + return new SqlQueriesExportSqlQuery + { + Id = query.Id, + Name = query.Name, + Description = query.Description, + Query = query.Query, + ConnectionStringName = query.ConnectionStringName, + Parameters = query.Parameters?.Select(p => new SqlQueriesExportSqlQueryParameter + { + Id = p.Id, + Name = p.Name, + Value = p.Value, + Type = p.Type, + }).ToList() ?? [], + }; + } + + private static SqlQuery ConvertToSqlQuery(SqlQueriesExportSqlQuery exportSqlQuery) + { + var query = AbstractTypeFactory.TryCreateInstance(); + query.Id = exportSqlQuery.Id; + query.Name = exportSqlQuery.Name; + query.Description = exportSqlQuery.Description; + query.Query = exportSqlQuery.Query; + query.ConnectionStringName = exportSqlQuery.ConnectionStringName; + query.Parameters = exportSqlQuery.Parameters?.Select(p => + { + var parameter = AbstractTypeFactory.TryCreateInstance(); + parameter.Id = p.Id; + parameter.Name = p.Name; + parameter.Value = p.Value; + parameter.Type = p.Type; + return parameter; + }).ToList() ?? []; + + return query; + } +} diff --git a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs new file mode 100644 index 0000000..bdd0e09 --- /dev/null +++ b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs @@ -0,0 +1,21 @@ +using System.Collections.Generic; + +namespace VirtoCommerce.SqlQueries.Data.ExportImport; + +public class SqlQueriesExportSqlQuery +{ + public string Id { get; set; } + public string Name { get; set; } + public string Description { get; set; } + public string Query { get; set; } + public string ConnectionStringName { get; set; } + public IList Parameters { get; set; } = []; +} + +public class SqlQueriesExportSqlQueryParameter +{ + public string Id { get; set; } + public string Name { get; set; } + public object Value { get; set; } + public string Type { get; set; } +} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json index 95489e2..dbfee28 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Export/Import von SQL-Abfragen" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json index d66ab6d..35b4b72 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Export/Import of SQL queries" + } + }, "sql-queries": { "title": "SQL Queries", "blades": { @@ -106,4 +111,4 @@ "sql-queries:delete": "Delete SQL Queries related data", "sql-queries:reports": "Execute and access reports" } -} \ No newline at end of file +} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json index a3c9be7..1b5a22a 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Exportación/Importación de consultas SQL" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json index 4d43ca5..17fa608 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "SQL-kyselyiden vienti/tuonti" + } + }, "sql-queries": { "title": "SQL-kyselyt", "blades": { @@ -105,4 +110,4 @@ "sql-queries:delete": "Poista SQL-kyselyihin liittyviä tietoja", "sql-queries:reports": "Suorita ja käytä raportteja" } -} \ No newline at end of file +} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json index 0427a4c..1641f43 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Exportation/Importation de requêtes SQL" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json index af12b93..6ec3e84 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Esportazione/Importazione di query SQL" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json index ab7b4e8..917eba4 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "SQLクエリのエクスポート/インポート" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json index eef015e..97b63f5 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Eksport/import av SQL-spørringer" + } + }, "sql-queries": { "title": "SQL-spørringer", "blades": { @@ -105,4 +110,4 @@ "sql-queries:delete": "Slette SQL-spørringer-relaterte data", "sql-queries:reports": "Kjøre og få tilgang til rapporter" } -} \ No newline at end of file +} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json index e7b7399..7c85a6b 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Eksport/Import zapytań SQL" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json index 04eadf1..e1815a7 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Exportação/Importação de consultas SQL" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json index 912abb7..f8e8cee 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Экспорт/Импорт SQL-запросов" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json index bc58e73..625c14d 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "Export/Import av SQL-frågor" + } + }, "sql-queries": { "title": "SQL-frågor", "blades": { @@ -105,4 +110,4 @@ "sql-queries:delete": "Ta bort SQL-frågerelaterad data", "sql-queries:reports": "Kör och få tillgång till rapporter" } -} \ No newline at end of file +} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json index 6f60392..70281db 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json @@ -1,4 +1,9 @@ { + "module": { + "VirtoCommerce.SqlQueries": { + "description": "SQL 查询的导出/导入" + } + }, "sql-queries": { "blades": { "sql-query-list": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Module.cs b/src/VirtoCommerce.SqlQueries.Web/Module.cs index a1eee83..cdf02a3 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Module.cs +++ b/src/VirtoCommerce.SqlQueries.Web/Module.cs @@ -1,10 +1,14 @@ using System; +using System.IO; +using System.Threading.Tasks; using DinkToPdf; using DinkToPdf.Contracts; using Microsoft.AspNetCore.Builder; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using VirtoCommerce.Platform.Core.Common; +using VirtoCommerce.Platform.Core.ExportImport; using VirtoCommerce.Platform.Core.Modularity; using VirtoCommerce.Platform.Core.Security; using VirtoCommerce.Platform.Core.Settings; @@ -13,6 +17,7 @@ using VirtoCommerce.Platform.Data.SqlServer.Extensions; using VirtoCommerce.SqlQueries.Core; using VirtoCommerce.SqlQueries.Core.Services; +using VirtoCommerce.SqlQueries.Data.ExportImport; using VirtoCommerce.SqlQueries.Data.MySql; using VirtoCommerce.SqlQueries.Data.PostgreSql; using VirtoCommerce.SqlQueries.Data.Repositories; @@ -21,8 +26,10 @@ namespace VirtoCommerce.SqlQueries.Web; -public class Module : IModule, IHasConfiguration +public class Module : IModule, IExportSupport, IImportSupport, IHasConfiguration { + private IApplicationBuilder _appBuilder; + public ManifestModuleInfo ModuleInfo { get; set; } public IConfiguration Configuration { get; set; } @@ -59,11 +66,14 @@ public void Initialize(IServiceCollection serviceCollection) serviceCollection.AddTransient(); serviceCollection.AddTransient(); + serviceCollection.AddTransient(); + serviceCollection.AddSingleton(typeof(IConverter), new SynchronizedConverter(new PdfTools())); } public void PostInitialize(IApplicationBuilder appBuilder) { + _appBuilder = appBuilder; var serviceProvider = appBuilder.ApplicationServices; // Register permissions @@ -80,4 +90,18 @@ public void Uninstall() { // Nothing to do here } + + public Task ExportAsync(Stream outStream, ExportImportOptions options, Action progressCallback, + ICancellationToken cancellationToken) + { + return _appBuilder.ApplicationServices.GetRequiredService().DoExportAsync(outStream, + progressCallback, cancellationToken); + } + + public Task ImportAsync(Stream inputStream, ExportImportOptions options, Action progressCallback, + ICancellationToken cancellationToken) + { + return _appBuilder.ApplicationServices.GetRequiredService().DoImportAsync(inputStream, + progressCallback, cancellationToken); + } } From 8cb92973a1f0bee747130d1e88056ba3faf981c1 Mon Sep 17 00:00:00 2001 From: Dmitry Grishin Date: Tue, 12 May 2026 12:50:12 +0400 Subject: [PATCH 2/2] VCST-5026: Removed extra file, fix translations --- .../ExportImport/SqlQueriesExportImport.cs | 50 ++----------------- .../ExportImport/SqlQueriesExportSqlQuery.cs | 21 -------- .../de.VirtoCommerce.SqlQueries.json | 2 +- .../en.VirtoCommerce.SqlQueries.json | 2 +- .../es.VirtoCommerce.SqlQueries.json | 2 +- .../fi.VirtoCommerce.SqlQueries.json | 2 +- .../fr.VirtoCommerce.SqlQueries.json | 2 +- .../it.VirtoCommerce.SqlQueries.json | 2 +- .../ja.VirtoCommerce.SqlQueries.json | 2 +- .../no.VirtoCommerce.SqlQueries.json | 2 +- .../pl.VirtoCommerce.SqlQueries.json | 2 +- .../pt.VirtoCommerce.SqlQueries.json | 2 +- .../ru.VirtoCommerce.SqlQueries.json | 2 +- .../sv.VirtoCommerce.SqlQueries.json | 2 +- .../zh.VirtoCommerce.SqlQueries.json | 2 +- src/VirtoCommerce.SqlQueries.Web/Module.cs | 12 ++--- 16 files changed, 21 insertions(+), 88 deletions(-) delete mode 100644 src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs diff --git a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs index 8d2c5a8..482d066 100644 --- a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs +++ b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportImport.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading.Tasks; using Newtonsoft.Json; using VirtoCommerce.Platform.Core.Common; @@ -49,8 +48,7 @@ public async Task DoExportAsync(Stream outStream, Action(reader); - if (exportSqlQuery == null) + var query = jsonSerializer.Deserialize(reader); + if (query == null) { continue; } - batch.Add(ConvertToSqlQuery(exportSqlQuery)); + batch.Add(query); if (batch.Count >= BatchSize) { @@ -134,44 +132,4 @@ private async Task ImportSqlQueriesArrayAsync(JsonTextReader reader, ExportImpor progressCallback(progressInfo); } } - - private static SqlQueriesExportSqlQuery ConvertToExportSqlQuery(SqlQuery query) - { - return new SqlQueriesExportSqlQuery - { - Id = query.Id, - Name = query.Name, - Description = query.Description, - Query = query.Query, - ConnectionStringName = query.ConnectionStringName, - Parameters = query.Parameters?.Select(p => new SqlQueriesExportSqlQueryParameter - { - Id = p.Id, - Name = p.Name, - Value = p.Value, - Type = p.Type, - }).ToList() ?? [], - }; - } - - private static SqlQuery ConvertToSqlQuery(SqlQueriesExportSqlQuery exportSqlQuery) - { - var query = AbstractTypeFactory.TryCreateInstance(); - query.Id = exportSqlQuery.Id; - query.Name = exportSqlQuery.Name; - query.Description = exportSqlQuery.Description; - query.Query = exportSqlQuery.Query; - query.ConnectionStringName = exportSqlQuery.ConnectionStringName; - query.Parameters = exportSqlQuery.Parameters?.Select(p => - { - var parameter = AbstractTypeFactory.TryCreateInstance(); - parameter.Id = p.Id; - parameter.Name = p.Name; - parameter.Value = p.Value; - parameter.Type = p.Type; - return parameter; - }).ToList() ?? []; - - return query; - } } diff --git a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs b/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs deleted file mode 100644 index bdd0e09..0000000 --- a/src/VirtoCommerce.SqlQueries.Data/ExportImport/SqlQueriesExportSqlQuery.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System.Collections.Generic; - -namespace VirtoCommerce.SqlQueries.Data.ExportImport; - -public class SqlQueriesExportSqlQuery -{ - public string Id { get; set; } - public string Name { get; set; } - public string Description { get; set; } - public string Query { get; set; } - public string ConnectionStringName { get; set; } - public IList Parameters { get; set; } = []; -} - -public class SqlQueriesExportSqlQueryParameter -{ - public string Id { get; set; } - public string Name { get; set; } - public object Value { get; set; } - public string Type { get; set; } -} diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json index dbfee28..1a6a6d3 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/de.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Export/Import von SQL-Abfragen" + "description": "Sicherung/Wiederherstellung von SQL-Abfragen" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json index 35b4b72..8de3594 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/en.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Export/Import of SQL queries" + "description": "Backup/Restore of SQL queries" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json index 1b5a22a..ef824f2 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/es.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Exportación/Importación de consultas SQL" + "description": "Copia de seguridad/Restauración de consultas SQL" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json index 17fa608..b64597d 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/fi.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "SQL-kyselyiden vienti/tuonti" + "description": "SQL-kyselyiden varmuuskopiointi/palautus" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json index 1641f43..6c0729a 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/fr.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Exportation/Importation de requêtes SQL" + "description": "Sauvegarde/Restauration de requêtes SQL" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json index 6ec3e84..c57e564 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/it.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Esportazione/Importazione di query SQL" + "description": "Backup/Ripristino di query SQL" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json index 917eba4..96ec505 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/ja.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "SQLクエリのエクスポート/インポート" + "description": "SQLクエリのバックアップ/復元" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json index 97b63f5..a5d76cb 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/no.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Eksport/import av SQL-spørringer" + "description": "Sikkerhetskopiering/gjenoppretting av SQL-spørringer" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json index 7c85a6b..3ecb18e 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/pl.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Eksport/Import zapytań SQL" + "description": "Kopia zapasowa/Przywracanie zapytań SQL" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json index e1815a7..324c05d 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/pt.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Exportação/Importação de consultas SQL" + "description": "Backup/Restauração de consultas SQL" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json index f8e8cee..733c0aa 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/ru.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Экспорт/Импорт SQL-запросов" + "description": "Резервное копирование/Восстановление SQL-запросов" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json index 625c14d..a7ddf05 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/sv.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "Export/Import av SQL-frågor" + "description": "Säkerhetskopiering/Återställning av SQL-frågor" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json b/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json index 70281db..10ce83a 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json +++ b/src/VirtoCommerce.SqlQueries.Web/Localizations/zh.VirtoCommerce.SqlQueries.json @@ -1,7 +1,7 @@ { "module": { "VirtoCommerce.SqlQueries": { - "description": "SQL 查询的导出/导入" + "description": "SQL 查询的备份/恢复" } }, "sql-queries": { diff --git a/src/VirtoCommerce.SqlQueries.Web/Module.cs b/src/VirtoCommerce.SqlQueries.Web/Module.cs index cdf02a3..45839bf 100644 --- a/src/VirtoCommerce.SqlQueries.Web/Module.cs +++ b/src/VirtoCommerce.SqlQueries.Web/Module.cs @@ -91,17 +91,13 @@ public void Uninstall() // Nothing to do here } - public Task ExportAsync(Stream outStream, ExportImportOptions options, Action progressCallback, - ICancellationToken cancellationToken) + public Task ExportAsync(Stream outStream, ExportImportOptions options, Action progressCallback, ICancellationToken cancellationToken) { - return _appBuilder.ApplicationServices.GetRequiredService().DoExportAsync(outStream, - progressCallback, cancellationToken); + return _appBuilder.ApplicationServices.GetRequiredService().DoExportAsync(outStream, progressCallback, cancellationToken); } - public Task ImportAsync(Stream inputStream, ExportImportOptions options, Action progressCallback, - ICancellationToken cancellationToken) + public Task ImportAsync(Stream inputStream, ExportImportOptions options, Action progressCallback, ICancellationToken cancellationToken) { - return _appBuilder.ApplicationServices.GetRequiredService().DoImportAsync(inputStream, - progressCallback, cancellationToken); + return _appBuilder.ApplicationServices.GetRequiredService().DoImportAsync(inputStream, progressCallback, cancellationToken); } }