Skip to content

Commit 9fc083f

Browse files
V14: Migrate notify action from char to string (#16142)
* Migrate nofication chars to strings * Add a length to the UserGroup2PermissionDto.Permission * Remove StripWhitespace It was only nececary when it was nchar * Better name for migration * Reuse dictionary in migrations --------- Co-authored-by: Bjarke Berg <mail@bergmania.dk>
1 parent 7a39314 commit 9fc083f

6 files changed

Lines changed: 91 additions & 5 deletions

File tree

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,5 +78,7 @@ protected virtual void DefinePlan()
7878
To<V_14_0_0.DeleteMacroTables>("{0D82C836-96DD-480D-A924-7964E458BD34}");
7979
To<V_14_0_0.MoveDocumentBlueprintsToFolders>("{1A0FBC8A-6FC6-456C-805C-B94816B2E570}");
8080
To<V_14_0_0.MigrateTours>("{302DE171-6D83-4B6B-B3C0-AC8808A16CA1}");
81+
To<V_14_0_0.MigrateUserGroup2PermissionPermissionColumnType>("{8184E61D-ECBA-4AAA-B61B-D7A82EB82EB7}");
82+
To<V_14_0_0.MigrateNotificationCharsToStrings>("{E261BF01-2C7F-4544-BAE7-49D545B21D68}");
8183
}
8284
}

src/Umbraco.Infrastructure/Migrations/Upgrade/V_14_0_0/MigrateCharPermissionsToStrings.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal class MigrateCharPermissionsToStrings : MigrationBase
1414
{
1515
private readonly IIdKeyMap _idKeyMap;
1616

17-
private static Dictionary<char, IEnumerable<string>> _charToStringPermissionDictionary =
17+
internal static Dictionary<char, IEnumerable<string>> CharToStringPermissionDictionary { get; } =
1818
new()
1919
{
2020
['I'] = new []{ActionAssignDomain.ActionLetter},
@@ -110,5 +110,5 @@ protected override void Migrate()
110110
Delete.Table(Constants.DatabaseSchema.Tables.UserGroup2Node).Do();
111111
}
112112

113-
private IEnumerable<string> ReplacePermissionValue(char oldPermission) => _charToStringPermissionDictionary.TryGetValue(oldPermission, out IEnumerable<string>? newPermission) ? newPermission : oldPermission.ToString().Yield();
113+
private IEnumerable<string> ReplacePermissionValue(char oldPermission) => CharToStringPermissionDictionary.TryGetValue(oldPermission, out IEnumerable<string>? newPermission) ? newPermission : oldPermission.ToString().Yield();
114114
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
using NPoco;
2+
using Umbraco.Cms.Core;
3+
using Umbraco.Cms.Core.Actions;
4+
using Umbraco.Cms.Infrastructure.Persistence.DatabaseAnnotations;
5+
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
6+
using Umbraco.Extensions;
7+
8+
namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_14_0_0;
9+
10+
[Obsolete("Remove in Umbraco 18.")]
11+
public class MigrateNotificationCharsToStrings : MigrationBase
12+
{
13+
public MigrateNotificationCharsToStrings(IMigrationContext context) : base(context)
14+
{
15+
}
16+
17+
protected override void Migrate()
18+
{
19+
List<LegacyUser2NodeNotifyDto>? legacyNotifyDtos = Database.Fetch<LegacyUser2NodeNotifyDto>();
20+
Delete.Table(Constants.DatabaseSchema.Tables.User2NodeNotify).Do();
21+
22+
Create.Table<User2NodeNotifyDto>().Do();
23+
var notifyDtos = legacyNotifyDtos.Select(ReplaceAction).ToList();
24+
Database.InsertBulk(notifyDtos);
25+
}
26+
27+
private User2NodeNotifyDto ReplaceAction(LegacyUser2NodeNotifyDto dto)
28+
{
29+
// Action is non-nullable
30+
dto.Action = MigrateCharPermissionsToStrings.CharToStringPermissionDictionary.TryGetValue(dto.Action!.ToCharArray().First(), out var action) ? string.Join(string.Empty, action) : dto.Action;
31+
32+
return new User2NodeNotifyDto
33+
{
34+
UserId = dto.UserId,
35+
NodeId = dto.NodeId,
36+
Action = dto.Action
37+
};
38+
}
39+
40+
41+
[TableName(Constants.DatabaseSchema.Tables.User2NodeNotify)]
42+
[PrimaryKey("userId", AutoIncrement = false)]
43+
[ExplicitColumns]
44+
private class LegacyUser2NodeNotifyDto
45+
{
46+
[Column("userId")]
47+
[PrimaryKeyColumn(AutoIncrement = false, Name = "PK_umbracoUser2NodeNotify", OnColumns = "userId, nodeId, action")]
48+
[ForeignKey(typeof(UserDto))]
49+
public int UserId { get; set; }
50+
51+
[Column("nodeId")]
52+
[ForeignKey(typeof(NodeDto))]
53+
public int NodeId { get; set; }
54+
[Column("action")]
55+
[SpecialDbType(SpecialDbTypes.NCHAR)]
56+
[Length(1)]
57+
58+
public string? Action { get; set; }
59+
}
60+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using NPoco;
2+
using Umbraco.Cms.Core;
3+
using Umbraco.Cms.Infrastructure.Persistence.Dtos;
4+
5+
namespace Umbraco.Cms.Infrastructure.Migrations.Upgrade.V_14_0_0;
6+
7+
[Obsolete("Remove in Umbraco 18.")]
8+
public class MigrateUserGroup2PermissionPermissionColumnType : MigrationBase
9+
{
10+
public MigrateUserGroup2PermissionPermissionColumnType(IMigrationContext context) : base(context)
11+
{
12+
}
13+
14+
protected override void Migrate()
15+
{
16+
// We don't need to update the column for SQLite since it just uses TEXT.
17+
if (DatabaseType == DatabaseType.SQLite)
18+
{
19+
return;
20+
}
21+
22+
// The action column is part of the primary key, so we must drop the constraint before we can alter the column.
23+
AlterColumn<UserGroup2PermissionDto>(Constants.DatabaseSchema.Tables.UserGroup2Permission, "permission");
24+
}
25+
}

src/Umbraco.Infrastructure/Persistence/Dtos/User2NodeNotifyDto.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ internal class User2NodeNotifyDto
1919
public int NodeId { get; set; }
2020

2121
[Column("action")]
22-
[SpecialDbType(SpecialDbTypes.NCHAR)]
23-
[Length(1)]
22+
[Length(255)]
2423
public string? Action { get; set; }
2524
}

src/Umbraco.Infrastructure/Persistence/Dtos/UserGroup2PermissionDto.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,6 @@ public class UserGroup2PermissionDto
1818
public Guid UserGroupKey { get; set; }
1919

2020
[Column("permission")]
21-
[SpecialDbType(SpecialDbTypes.NVARCHARMAX)]
21+
[Length(255)]
2222
public required string Permission { get; set; }
2323
}

0 commit comments

Comments
 (0)