Skip to content

Commit 728acbe

Browse files
renemadsenclaude
andauthored
fix(seed): remap seed LanguageId to real SDK ids for AreaRuleTranslations (#985)
New tenants stored placeholder-keyed (1/2/3) area-rule name translations that don't match the SDK Languages auto-increment ids, breaking calendar event titles. Mirror the #982 AreaTranslation fix: resolve the real SDK language id by LanguageCode before each areaRule.Create at all seed write paths (default rules x2, area-1 re-seed, Type7/Type8 build). Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 9e71db4 commit 728acbe

4 files changed

Lines changed: 123 additions & 15 deletions

File tree

Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using System.Threading.Tasks;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microting.eForm.Infrastructure;
6+
using Microting.EformBackendConfigurationBase.Infrastructure.Data.Entities;
7+
8+
namespace BackendConfiguration.Pn.Infrastructure.Helpers;
9+
10+
/// <summary>
11+
/// Seed data hardcodes AreaRuleTranslation.LanguageId as 1=da, 2=en-US, 3=de-DE, but the
12+
/// SDK Languages table uses environment-specific auto-increment ids. These helpers resolve the
13+
/// real SDK language id by code so area-rule name translations point at languages that actually
14+
/// exist (mirrors the AreaTranslation remap added in PR #982 for SeedEForms).
15+
/// </summary>
16+
public static class AreaRuleLanguageHelper
17+
{
18+
private static async Task<Dictionary<int, int>> BuildSeedLanguageIdToSdkIdAsync(
19+
MicrotingDbContext sdkDbContext)
20+
{
21+
var sdkLanguages = await sdkDbContext.Languages.ToListAsync().ConfigureAwait(false);
22+
var seedLanguageIdToCode = new Dictionary<int, string> { { 1, "da" }, { 2, "en-US" }, { 3, "de-DE" } };
23+
var seedLanguageIdToSdkId = new Dictionary<int, int>();
24+
foreach (var (seedLanguageId, code) in seedLanguageIdToCode)
25+
{
26+
var lang = sdkLanguages.FirstOrDefault(x => x.LanguageCode == code);
27+
if (lang != null)
28+
{
29+
seedLanguageIdToSdkId[seedLanguageId] = lang.Id;
30+
}
31+
}
32+
33+
return seedLanguageIdToSdkId;
34+
}
35+
36+
/// <summary>
37+
/// Remaps the hardcoded seed LanguageId (1/2/3) on each area rule's translations to the real
38+
/// SDK language id resolved by LanguageCode. In-place mutation is safe: each translation is
39+
/// visited once and remapped from its original seed id via the static {1->da,2->en-US,3->de-DE} map.
40+
/// </summary>
41+
public static async Task RemapSeedLanguageIdsAsync(
42+
IEnumerable<AreaRule> areaRules,
43+
MicrotingDbContext sdkDbContext)
44+
{
45+
var seedLanguageIdToSdkId = await BuildSeedLanguageIdToSdkIdAsync(sdkDbContext).ConfigureAwait(false);
46+
foreach (var areaRule in areaRules)
47+
{
48+
RemapTranslations(areaRule.AreaRuleTranslations, seedLanguageIdToSdkId);
49+
}
50+
}
51+
52+
/// <summary>
53+
/// Single-area-rule overload of <see cref="RemapSeedLanguageIdsAsync(IEnumerable{AreaRule}, MicrotingDbContext)"/>.
54+
/// </summary>
55+
public static async Task RemapSeedLanguageIdsAsync(
56+
AreaRule areaRule,
57+
MicrotingDbContext sdkDbContext)
58+
{
59+
var seedLanguageIdToSdkId = await BuildSeedLanguageIdToSdkIdAsync(sdkDbContext).ConfigureAwait(false);
60+
RemapTranslations(areaRule.AreaRuleTranslations, seedLanguageIdToSdkId);
61+
}
62+
63+
/// <summary>
64+
/// Remaps the hardcoded seed LanguageId (1/2/3) on a freshly built list of translations to the
65+
/// real SDK language id resolved by LanguageCode (used by the Type7/Type8 build path).
66+
/// </summary>
67+
public static async Task RemapSeedLanguageIdsAsync(
68+
IEnumerable<AreaRuleTranslation> translations,
69+
MicrotingDbContext sdkDbContext)
70+
{
71+
var seedLanguageIdToSdkId = await BuildSeedLanguageIdToSdkIdAsync(sdkDbContext).ConfigureAwait(false);
72+
RemapTranslations(translations, seedLanguageIdToSdkId);
73+
}
74+
75+
private static void RemapTranslations(
76+
IEnumerable<AreaRuleTranslation> translations,
77+
IReadOnlyDictionary<int, int> seedLanguageIdToSdkId)
78+
{
79+
if (translations == null)
80+
{
81+
return;
82+
}
83+
84+
foreach (var translation in translations)
85+
{
86+
if (seedLanguageIdToSdkId.TryGetValue(translation.LanguageId, out var sdkId))
87+
{
88+
translation.LanguageId = sdkId;
89+
}
90+
}
91+
}
92+
}

eFormAPI/Plugins/BackendConfiguration.Pn/BackendConfiguration.Pn/Infrastructure/Helpers/BackendConfigurationAreaRulesServiceHelper.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,8 @@ public static async Task<OperationResult> Create(AreaRulesCreateModel createMode
204204
CreatedByUserId = userId,
205205
UpdatedByUserId = userId
206206
}).ToList();
207+
await AreaRuleLanguageHelper
208+
.RemapSeedLanguageIdsAsync(translations, sdkDbContext).ConfigureAwait(false);
207209
}
208210

209211
if (areaProperty.Area.Type is AreaTypesEnum.Type8)
@@ -217,6 +219,8 @@ public static async Task<OperationResult> Create(AreaRulesCreateModel createMode
217219
CreatedByUserId = userId,
218220
UpdatedByUserId = userId
219221
}).ToList();
222+
await AreaRuleLanguageHelper
223+
.RemapSeedLanguageIdsAsync(translations, sdkDbContext).ConfigureAwait(false);
220224
}
221225

222226
// if (areaProperty.Area.Type is AreaTypesEnum.Type10)

eFormAPI/Plugins/BackendConfiguration.Pn/BackendConfiguration.Pn/Infrastructure/Helpers/BackendConfigurationPropertyAreasServiceHelper.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -393,6 +393,8 @@ await SeedTailBite(property.Name, core, sdkDbContext, groupCreate.MicrotingUid)
393393
areaRule.EformId = eformId;
394394
}
395395

396+
await AreaRuleLanguageHelper
397+
.RemapSeedLanguageIdsAsync(areaRule, sdkDbContext).ConfigureAwait(false);
396398
await areaRule.Create(backendConfigurationPnDbContext).ConfigureAwait(false);
397399
}
398400

@@ -432,6 +434,8 @@ await SeedTailBite(property.Name, core, sdkDbContext, groupCreate.MicrotingUid)
432434
areaRule.EformId = eformId;
433435
}
434436

437+
await AreaRuleLanguageHelper
438+
.RemapSeedLanguageIdsAsync(areaRule, sdkDbContext).ConfigureAwait(false);
435439
await areaRule.Create(backendConfigurationPnDbContext).ConfigureAwait(false);
436440
}
437441

eFormAPI/Plugins/BackendConfiguration.Pn/BackendConfiguration.Pn/Services/BackendConfigurationAreaRulesService/BackendConfigurationAreaRulesService.cs

Lines changed: 23 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -267,24 +267,30 @@ await Parallel.ForEachAsync(chemicals, options, async (chemical, token) =>
267267
areaRule.FolderName = "00. Morgenrundtur";
268268

269269
await areaRule.Create(_backendConfigurationPnDbContext).ConfigureAwait(false);
270-
var areaRuleTranslation = new AreaRuleTranslation
270+
var areaRuleTranslations = new List<AreaRuleTranslation>
271271
{
272-
AreaRuleId = areaRule.Id,
273-
LanguageId = 1,
274-
Name = "Morgenrundtur",
275-
CreatedByUserId = _userService.UserId,
276-
UpdatedByUserId = _userService.UserId
272+
new()
273+
{
274+
AreaRuleId = areaRule.Id,
275+
LanguageId = 1, // da
276+
Name = "Morgenrundtur",
277+
CreatedByUserId = _userService.UserId,
278+
UpdatedByUserId = _userService.UserId
279+
},
280+
new()
281+
{
282+
AreaRuleId = areaRule.Id,
283+
LanguageId = 2, // en-US
284+
Name = "Morning tour",
285+
CreatedByUserId = _userService.UserId,
286+
UpdatedByUserId = _userService.UserId
287+
}
277288
};
278-
await areaRuleTranslation.Create(_backendConfigurationPnDbContext);
279-
areaRuleTranslation = new AreaRuleTranslation
289+
await AreaRuleLanguageHelper.RemapSeedLanguageIdsAsync(areaRuleTranslations, sdkDbContext).ConfigureAwait(false);
290+
foreach (var areaRuleTranslation in areaRuleTranslations)
280291
{
281-
AreaRuleId = areaRule.Id,
282-
LanguageId = 2,
283-
Name = "Morning tour",
284-
CreatedByUserId = _userService.UserId,
285-
UpdatedByUserId = _userService.UserId
286-
};
287-
await areaRuleTranslation.Create(_backendConfigurationPnDbContext);
292+
await areaRuleTranslation.Create(_backendConfigurationPnDbContext).ConfigureAwait(false);
293+
}
288294
}
289295
}
290296

@@ -336,6 +342,8 @@ await Parallel.ForEachAsync(chemicals, options, async (chemical, token) =>
336342
areaRule.ComplianceModifiable = true;
337343
areaRule.NotificationsModifiable = true;
338344
areaRule.EformId = eformId;
345+
await AreaRuleLanguageHelper
346+
.RemapSeedLanguageIdsAsync(areaRule, sdkDbContext).ConfigureAwait(false);
339347
await areaRule.Create(_backendConfigurationPnDbContext).ConfigureAwait(false);
340348
}
341349
}

0 commit comments

Comments
 (0)