Skip to content

Commit 76cf503

Browse files
ZeegaanNikolaj Geisleelit0451
authored
v9: Move local xml package files to database instead (#11654)
* Move package to database * Added migration and implemented new repository * Updated migrations to use proper xml convert * Fixed save function and renamed createDate to update date * Updated dependencyInjection * Updated UmbracoPlan.cs * Apply suggestions from code review Co-authored-by: Elitsa Marinovska <[email protected]> * Added File check * Tried using same context as create table * Fix DTO * Fix GetById and local package saving * Fix images when migrating * Implement deletion of all local files * Only delete local repo file, not file snapshots * Remove static package path and use the one we save * Update package repo to export package and remove check for ids when exporting * Minor fixes * Fix so that you can download package after creating * Update savePackage method to export package afterwards Co-authored-by: Nikolaj Geisle <[email protected]> Co-authored-by: Elitsa Marinovska <[email protected]> Co-authored-by: Elitsa Marinovska <[email protected]>
1 parent 4abace7 commit 76cf503

File tree

11 files changed

+953
-12
lines changed

11 files changed

+953
-12
lines changed

src/Umbraco.Core/Extensions/ContentExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ public static IEnumerable<string> GetDirtyUserProperties(this IContentBase entit
367367
/// <param name="content"><see cref="IContent"/> to generate xml for</param>
368368
/// <param name="serializer"></param>
369369
/// <returns>Xml representation of the passed in <see cref="IContent"/></returns>
370-
internal static XElement ToDeepXml(this IContent content, IEntityXmlSerializer serializer)
370+
public static XElement ToDeepXml(this IContent content, IEntityXmlSerializer serializer)
371371
{
372372
return serializer.Serialize(content, false, true);
373373
}

src/Umbraco.Core/Packaging/PackagesRepository.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ namespace Umbraco.Cms.Core.Packaging
2121
/// <summary>
2222
/// Manages the storage of installed/created package definitions
2323
/// </summary>
24+
[Obsolete("Packages have now been moved to the database instead of local files, please use CreatedPackageSchemaRepository instead")]
2425
public class PackagesRepository : ICreatedPackagesRepository
2526
{
2627
private readonly IContentService _contentService;
@@ -744,5 +745,13 @@ private XDocument EnsureStorage(out string packagesFile)
744745
var packagesXml = XDocument.Load(packagesFile);
745746
return packagesXml;
746747
}
748+
749+
public void DeleteLocalRepositoryFiles()
750+
{
751+
var packagesFile = _hostingEnvironment.MapPathContentRoot(CreatedPackagesFile);
752+
File.Delete(packagesFile);
753+
var packagesFolder = _hostingEnvironment.MapPathContentRoot(_packagesFolderPath);
754+
Directory.Delete(packagesFolder);
755+
}
747756
}
748757
}

src/Umbraco.Core/Persistence/Constants-DatabaseSchema.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,8 @@ public static class Tables
8181
public const string UserLogin = TableNamePrefix + "UserLogin";
8282

8383
public const string LogViewerQuery = TableNamePrefix + "LogViewerQuery";
84+
85+
public const string CreatedPackageSchema = TableNamePrefix + "CreatedPackageSchema";
8486
}
8587
}
8688
}

src/Umbraco.Infrastructure/DependencyInjection/UmbracoBuilder.Services.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
using Umbraco.Cms.Core.Services;
1616
using Umbraco.Cms.Core.Services.Implement;
1717
using Umbraco.Cms.Infrastructure.Packaging;
18+
using Umbraco.Cms.Infrastructure.Persistence;
19+
using Umbraco.Cms.Infrastructure.Persistence.Repositories.Implement;
1820
using Umbraco.Cms.Infrastructure.Services.Implement;
1921
using Umbraco.Extensions;
2022

@@ -74,16 +76,14 @@ internal static IUmbracoBuilder AddServices(this IUmbracoBuilder builder)
7476

7577
builder.Services.AddUnique<ConflictingPackageData>();
7678
builder.Services.AddUnique<CompiledPackageXmlParser>();
77-
builder.Services.AddUnique<ICreatedPackagesRepository>(factory => CreatePackageRepository(factory, "createdPackages.config"));
79+
builder.Services.AddUnique(factory => CreatePackageRepository(factory, "createdPackages.config"));
80+
builder.Services.AddUnique<ICreatedPackagesRepository, CreatedPackageSchemaRepository>();
7881
builder.Services.AddUnique<PackageDataInstallation>();
7982
builder.Services.AddUnique<IPackageInstallation, PackageInstallation>();
8083

8184
return builder;
8285
}
8386

84-
/// <summary>
85-
/// Creates an instance of PackagesRepository for either the ICreatedPackagesRepository or the IInstalledPackagesRepository
86-
/// </summary>
8787
private static PackagesRepository CreatePackageRepository(IServiceProvider factory, string packageRepoFileName)
8888
=> new PackagesRepository(
8989
factory.GetRequiredService<IContentService>(),

src/Umbraco.Infrastructure/Migrations/Install/DatabaseSchemaCreator.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,8 @@ public class DatabaseSchemaCreator
7878
typeof(ContentScheduleDto),
7979
typeof(LogViewerQueryDto),
8080
typeof(ContentVersionCleanupPolicyDto),
81-
typeof(UserGroup2NodeDto)
81+
typeof(UserGroup2NodeDto),
82+
typeof(CreatedPackageSchemaDto)
8283
};
8384

8485
private readonly IUmbracoDatabase _database;

src/Umbraco.Infrastructure/Migrations/Upgrade/UmbracoPlan.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -268,6 +268,7 @@ protected void DefinePlan()
268268
// TO 9.2.0
269269
To<AddUserGroup2NodeTable>("{0571C395-8F0B-44E9-8E3F-47BDD08D817B}");
270270
To<AddDefaultForNotificationsToggle>("{AD3D3B7F-8E74-45A4-85DB-7FFAD57F9243}");
271+
To<MovePackageXMLToDb>("{A2F22F17-5870-4179-8A8D-2362AA4A0A5F}");
271272
}
272273
}
273274
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Xml;
6+
using System.Xml.Linq;
7+
using Umbraco.Cms.Core.Packaging;
8+
using Umbraco.Cms.Infrastructure.Persistence;
9+
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
10+
using Umbraco.Extensions;
11+
12+
namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_9_2_0
13+
{
14+
public class MovePackageXMLToDb : MigrationBase
15+
{
16+
private readonly PackagesRepository _packagesRepository;
17+
private readonly PackageDefinitionXmlParser _xmlParser;
18+
19+
/// <summary>
20+
/// Initializes a new instance of the <see cref="MovePackageXMLToDb"/> class.
21+
/// </summary>
22+
public MovePackageXMLToDb(IMigrationContext context, PackagesRepository packagesRepository)
23+
: base(context)
24+
{
25+
_packagesRepository = packagesRepository;
26+
_xmlParser = new PackageDefinitionXmlParser();
27+
}
28+
29+
private void CreateDatabaseTable()
30+
{
31+
// Add CreatedPackage table in database if it doesn't exist
32+
IEnumerable<string> tables = SqlSyntax.GetTablesInSchema(Context.Database);
33+
if (!tables.InvariantContains(CreatedPackageSchemaDto.TableName))
34+
{
35+
Create.Table<CreatedPackageSchemaDto>().Do();
36+
}
37+
}
38+
39+
private void MigrateCreatedPackageFilesToDb()
40+
{
41+
// Load data from file
42+
IEnumerable<PackageDefinition> packages = _packagesRepository.GetAll();
43+
var createdPackageDtos = new List<CreatedPackageSchemaDto>();
44+
foreach (PackageDefinition package in packages)
45+
{
46+
// Create dto from xmlDocument
47+
var dto = new CreatedPackageSchemaDto()
48+
{
49+
Name = package.Name,
50+
Value = _xmlParser.ToXml(package).ToString(),
51+
UpdateDate = DateTime.Now,
52+
PackageId = Guid.NewGuid()
53+
};
54+
createdPackageDtos.Add(dto);
55+
}
56+
57+
_packagesRepository.DeleteLocalRepositoryFiles();
58+
if (createdPackageDtos.Any())
59+
{
60+
// Insert dto into CreatedPackage table
61+
Database.InsertBulk(createdPackageDtos);
62+
}
63+
}
64+
65+
/// <inheritdoc/>
66+
protected override void Migrate()
67+
{
68+
CreateDatabaseTable();
69+
MigrateCreatedPackageFilesToDb();
70+
}
71+
}
72+
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
using System;
2+
using NPoco;
3+
using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations;
4+
using Umbraco.Cms.Infrastructure.Persistence.DatabaseModelDefinitions;
5+
6+
namespace Umbraco.Cms.Infrastructure.Persistence.Dtos
7+
{
8+
[TableName(TableName)]
9+
[ExplicitColumns]
10+
[PrimaryKey("id")]
11+
public class CreatedPackageSchemaDto
12+
{
13+
public const string TableName = Cms.Core.Constants.DatabaseSchema.Tables.CreatedPackageSchema;
14+
15+
[Column("id")]
16+
[PrimaryKeyColumn]
17+
public int Id { get; set; }
18+
19+
[Column("name")]
20+
[Length(255)]
21+
[NullSetting(NullSetting = NullSettings.NotNull)]
22+
[Index(IndexTypes.UniqueNonClustered, ForColumns = "name", Name = "IX_" + TableName + "_Name")]
23+
public string Name { get; set; }
24+
25+
[Column("value")]
26+
[SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
27+
[NullSetting(NullSetting = NullSettings.NotNull)]
28+
public string Value { get; set; }
29+
30+
[Column("updateDate")]
31+
[Constraint(Default = SystemMethods.CurrentDateTime)]
32+
public DateTime UpdateDate { get; set; }
33+
34+
[Column("packageId")]
35+
[NullSetting(NullSetting = NullSettings.NotNull)]
36+
public Guid PackageId { get; set; }
37+
}
38+
}

0 commit comments

Comments
 (0)