Skip to content

Commit 870ccd3

Browse files
oskogstadknuhauMagnusSandgren
authored
chore(yt01): Large data set generator (#1626)
<!--- Provide a general summary of your changes in the Title above --> ## Description <!--- Describe your changes in detail --> ## Related Issue(s) - #1646 ## Verification - [ ] **Your** code builds clean without any errors or warnings - [ ] Manual testing done (required) - [ ] Relevant automated test added (if you find this hard, leave it and we'll help out) ## Documentation - [ ] Documentation is updated (either in `docs`-directory, Altinnpedia or a separate linked PR in [altinn-studio-docs.](https://github.com/Altinn/altinn-studio-docs), if applicable) Co-authored-by: Knut Haug <knut.espen.haug@digdir.no> Co-authored-by: Magnus Sandgren <5285192+MagnusSandgren@users.noreply.github.com>
1 parent c6cba3c commit 870ccd3

30 files changed

+1092
-0
lines changed

Digdir.Domain.Dialogporten.sln

+7
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Digdir.Domain.Dialogporten.
6363
EndProject
6464
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Digdir.Library.Utils.AspNet", "src\Digdir.Library.Utils.AspNet\Digdir.Library.Utils.AspNet.csproj", "{6A485C65-3613-4A49-A16F-2789119F6F38}"
6565
EndProject
66+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Digdir.Tool.Dialogporten.LargeDataSetGenerator", "src\Digdir.Tool.Dialogporten.LargeDataSetGenerator\Digdir.Tool.Dialogporten.LargeDataSetGenerator.csproj", "{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671}"
67+
EndProject
6668
Global
6769
GlobalSection(SolutionConfigurationPlatforms) = preSolution
6870
Debug|Any CPU = Debug|Any CPU
@@ -153,6 +155,10 @@ Global
153155
{6A485C65-3613-4A49-A16F-2789119F6F38}.Debug|Any CPU.Build.0 = Debug|Any CPU
154156
{6A485C65-3613-4A49-A16F-2789119F6F38}.Release|Any CPU.ActiveCfg = Release|Any CPU
155157
{6A485C65-3613-4A49-A16F-2789119F6F38}.Release|Any CPU.Build.0 = Release|Any CPU
158+
{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
159+
{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671}.Debug|Any CPU.Build.0 = Debug|Any CPU
160+
{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671}.Release|Any CPU.ActiveCfg = Release|Any CPU
161+
{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671}.Release|Any CPU.Build.0 = Release|Any CPU
156162
EndGlobalSection
157163
GlobalSection(SolutionProperties) = preSolution
158164
HideSolutionNode = FALSE
@@ -182,6 +188,7 @@ Global
182188
{0900E3CF-F9D8-4B29-957F-484B3B028D6D} = {320B47A0-5EB8-4B6E-8C84-90633A1849CA}
183189
{E389C7C8-9610-40AC-86DC-769B1B7DC78E} = {CADB8189-4AA1-4732-844A-C41DBF3EC8B7}
184190
{6A485C65-3613-4A49-A16F-2789119F6F38} = {096E9B69-6783-4446-A895-0B6D7729A0D9}
191+
{B0E0E9EE-AFBE-4013-908C-5F8DF66AB671} = {3C2C775D-F2D1-42A2-B53F-CC6D5FF59633}
185192
EndGlobalSection
186193
GlobalSection(ExtensibilityGlobals) = postSolution
187194
SolutionGuid = {B2FE67FF-7622-4AFB-AD8E-961B6A39D888}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[*.cs]
2+
dotnet_diagnostic.CA1305.severity = none
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
parties
2+
wordlist_en
3+
wordlist_no
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator;
2+
3+
public record struct CopyTaskDto(
4+
Func<DialogTimestamp, string> Generator,
5+
string EntityName,
6+
string CopyCommand,
7+
bool SingleLinePerTimestamp = false,
8+
int NumberOfTasks = 1);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
using UUIDNext;
2+
3+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator;
4+
5+
public static class DeterministicUuidV7
6+
{
7+
public static Guid Generate(DateTimeOffset timestamp, string tableName, int tiebreaker = 0)
8+
{
9+
var timeBasedEmpty = Guid.Empty.ToVersion7(timestamp);
10+
var nameBasedUuid = Uuid.NewNameBased(timeBasedEmpty, $"{tableName}{tiebreaker}");
11+
return nameBasedUuid.ToVersion7(timestamp);
12+
}
13+
14+
private static Guid ToVersion7(this Guid guid, DateTimeOffset timestamp)
15+
{
16+
// Create a buffer for the UUID (16 bytes)
17+
Span<byte> uuidBytes = stackalloc byte[16];
18+
// Copy data from the input GUID into the buffer
19+
guid.TryWriteBytes(uuidBytes, bigEndian: true, out _);
20+
// Get the timestamp in milliseconds since Unix epoch
21+
var unixTimestampMillis = timestamp.ToUnixTimeMilliseconds();
22+
23+
// Write the timestamp (48 bits) into the UUID buffer
24+
uuidBytes[0] = (byte)((unixTimestampMillis >> 40) & 0xFF);
25+
uuidBytes[1] = (byte)((unixTimestampMillis >> 32) & 0xFF);
26+
uuidBytes[2] = (byte)((unixTimestampMillis >> 24) & 0xFF);
27+
uuidBytes[3] = (byte)((unixTimestampMillis >> 16) & 0xFF);
28+
uuidBytes[4] = (byte)((unixTimestampMillis >> 8) & 0xFF);
29+
uuidBytes[5] = (byte)(unixTimestampMillis & 0xFF);
30+
31+
// Set the version to 7 (4 high bits of the 7th byte)
32+
uuidBytes[6] = (byte)((uuidBytes[6] & 0x0F) | 0x70);
33+
34+
// Set the variant to RFC 4122 (2 most significant bits of the 9th byte to 10)
35+
uuidBytes[8] = (byte)((uuidBytes[8] & 0x3F) | 0x80);
36+
37+
// Construct and return the UUID
38+
return new Guid(uuidBytes, bigEndian: true);
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<OutputType>Exe</OutputType>
5+
<PublishAot>true</PublishAot>
6+
</PropertyGroup>
7+
8+
<ItemGroup>
9+
<PackageReference Include="Npgsql" Version="9.0.2" />
10+
<PackageReference Include="UUIDNext" Version="4.0.0" />
11+
</ItemGroup>
12+
13+
<ItemGroup>
14+
<None Update="service_resources">
15+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
16+
</None>
17+
<None Update="wordlist_en">
18+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
19+
</None>
20+
<None Update="wordlist_no">
21+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
22+
</None>
23+
<None Update="parties">
24+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
25+
</None>
26+
</ItemGroup>
27+
28+
<ItemGroup>
29+
<ProjectReference Include="..\Digdir.Domain.Dialogporten.Domain\Digdir.Domain.Dialogporten.Domain.csproj" />
30+
<ProjectReference Include="..\Digdir.Library.Entity.Abstractions\Digdir.Library.Entity.Abstractions.csproj" />
31+
</ItemGroup>
32+
33+
</Project>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Activities;
3+
4+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
5+
6+
internal static class Activity
7+
{
8+
public const string CopyCommand = """COPY "DialogActivity" ("Id", "CreatedAt", "ExtendedType", "TypeId", "TransmissionId", "DialogId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
9+
10+
public const int DialogCreatedType = 1;
11+
public const int InformationType = 2;
12+
13+
public static string Generate(DialogTimestamp dto)
14+
{
15+
var activityCsvData = new StringBuilder();
16+
17+
var activityId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), DialogCreatedType);
18+
var activityId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), InformationType);
19+
20+
activityCsvData.AppendLine($"{activityId1},{dto.FormattedTimestamp},,1,,{dto.DialogId}"); // Type DialogCreated
21+
activityCsvData.AppendLine($"{activityId2},{dto.FormattedTimestamp},,3,,{dto.DialogId}"); // Type Information
22+
23+
return activityCsvData.ToString();
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Activities;
3+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;
4+
5+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
6+
7+
internal static class Actor
8+
{
9+
public const string CopyCommand = """COPY "Actor" ("Id", "ActorId", "ActorTypeId", "ActorName", "Discriminator", "ActivityId", "DialogSeenLogId", "TransmissionId", "CreatedAt", "UpdatedAt", "LabelAssignmentLogId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
10+
11+
public static string Generate(DialogTimestamp dto)
12+
{
13+
var actorCsvData = new StringBuilder();
14+
15+
// DialogActivity
16+
var activityId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), Activity.DialogCreatedType);
17+
actorCsvData.AppendLine($"{activityId1},,1,ActorName,DialogActivityPerformedByActor,{activityId1},,,{dto.FormattedTimestamp},{dto.FormattedTimestamp},");
18+
var activityId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), Activity.InformationType);
19+
actorCsvData.AppendLine($"{activityId2},,1,ActorName,DialogActivityPerformedByActor,{activityId2},,,{dto.FormattedTimestamp},{dto.FormattedTimestamp},");
20+
21+
// DialogSeenLog
22+
var rng = new Random(dto.DialogId.GetHashCode());
23+
var partyIndex = rng.Next(0, Parties.List.Length);
24+
var party = Parties.List[partyIndex];
25+
26+
actorCsvData.AppendLine($"{dto.DialogId},{party},1,ActorName,DialogSeenLogSeenByActor,,{dto.DialogId},,{dto.FormattedTimestamp},{dto.FormattedTimestamp},");
27+
28+
// Transmission
29+
var transmissionId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 1);
30+
actorCsvData.AppendLine($"{transmissionId1},,1,ActorName,DialogTransmissionSenderActor,,,{transmissionId1},{dto.FormattedTimestamp},{dto.FormattedTimestamp},");
31+
32+
var transmissionId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 2);
33+
actorCsvData.AppendLine($"{transmissionId2},,1,ActorName,DialogTransmissionSenderActor,,,{transmissionId2},{dto.FormattedTimestamp},{dto.FormattedTimestamp},");
34+
35+
return actorCsvData.ToString();
36+
}
37+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;
3+
4+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
5+
6+
internal static class Attachment
7+
{
8+
public const string CopyCommand = """COPY "Attachment" ("Id", "CreatedAt", "UpdatedAt", "Discriminator", "DialogId", "TransmissionId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
9+
10+
public static string Generate(DialogTimestamp dto)
11+
{
12+
var attachmentCsvData = new StringBuilder();
13+
14+
var transmissionId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 1);
15+
var transmissionId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 2);
16+
attachmentCsvData.AppendLine($"{transmissionId1},{dto.FormattedTimestamp},{dto.FormattedTimestamp},DialogTransmissionAttachment,,{transmissionId1}");
17+
attachmentCsvData.AppendLine($"{transmissionId2},{dto.FormattedTimestamp},{dto.FormattedTimestamp},DialogTransmissionAttachment,,{transmissionId2}");
18+
19+
attachmentCsvData.AppendLine($"{dto.DialogId},{dto.FormattedTimestamp},{dto.FormattedTimestamp},DialogAttachment,{dto.DialogId},");
20+
21+
return attachmentCsvData.ToString();
22+
}
23+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;
3+
4+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
5+
6+
internal static class AttachmentUrl
7+
{
8+
public const string CopyCommand = """COPY "AttachmentUrl" ("Id", "CreatedAt", "MediaType", "Url", "ConsumerTypeId", "AttachmentId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
9+
10+
public static string Generate(DialogTimestamp dto)
11+
{
12+
var attachmentUrlCsvData = new StringBuilder();
13+
14+
var transmissionAttachmentId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 1);
15+
var attachmentUrlId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 1);
16+
var attachmentUrlId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 2);
17+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId1},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{transmissionAttachmentId1}");
18+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId2},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{transmissionAttachmentId1}");
19+
20+
var transmissionAttachmentId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 2);
21+
var attachmentUrlId3 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 3);
22+
var attachmentUrlId4 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 4);
23+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId3},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{transmissionAttachmentId2}");
24+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId4},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{transmissionAttachmentId2}");
25+
26+
var attachmentUrlId5 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 5);
27+
var attachmentUrlId6 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Attachments.AttachmentUrl), 6);
28+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId5},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{dto.DialogId}");
29+
attachmentUrlCsvData.AppendLine($"{attachmentUrlId6},{dto.FormattedTimestamp},text/plain,https://digdir.apps.tt02.altinn.no/,1,{dto.DialogId}");
30+
31+
return attachmentUrlCsvData.ToString();
32+
}
33+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
2+
3+
internal static class Dialog
4+
{
5+
private static readonly string[] ServiceResources = File.ReadAllLines("./service_resources");
6+
7+
public const string CopyCommand = """COPY "Dialog" ("Id", "CreatedAt", "Deleted", "DeletedAt", "DueAt", "ExpiresAt", "ExtendedStatus", "ExternalReference", "Org", "Party", "PrecedingProcess", "Process", "Progress", "Revision", "ServiceResource", "ServiceResourceType", "StatusId", "VisibleFrom", "UpdatedAt") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
8+
9+
public static string Generate(DialogTimestamp dto)
10+
{
11+
var serviceResourceIndex = dto.DialogCounter % ServiceResources.Length;
12+
var serviceResource = ServiceResources[serviceResourceIndex];
13+
14+
var rng = new Random(dto.DialogId.GetHashCode());
15+
var partyIndex = rng.Next(0, Parties.List.Length);
16+
var party = Parties.List[partyIndex];
17+
18+
return
19+
$"{dto.DialogId},{dto.FormattedTimestamp},FALSE,,,,sql-generated,,ttd,{party},,,11,{Guid.NewGuid()},{serviceResource},GenericAccessResource,1,,{dto.FormattedTimestamp}";
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
using System.Text;
2+
3+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
4+
5+
internal static class DialogContent
6+
{
7+
public const string CopyCommand = """COPY "DialogContent" ("Id", "CreatedAt", "UpdatedAt", "MediaType", "DialogId", "TypeId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
8+
9+
public static string Generate(DialogTimestamp dto)
10+
{
11+
var contentId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Dialogs.Entities.Contents.DialogContent), 1);
12+
var contentId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(Domain.Dialogporten.Domain.Dialogs.Entities.Contents.DialogContent), 2);
13+
14+
var dialogContentCsvData = new StringBuilder();
15+
16+
dialogContentCsvData.AppendLine($"{contentId1},{dto.FormattedTimestamp},{dto.FormattedTimestamp},text/plain,{dto.DialogId},1");
17+
dialogContentCsvData.AppendLine($"{contentId2},{dto.FormattedTimestamp},{dto.FormattedTimestamp},text/plain,{dto.DialogId},3");
18+
19+
return dialogContentCsvData.ToString();
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
2+
3+
internal static class EndUserContext
4+
{
5+
public const string CopyCommand = """COPY "DialogEndUserContext" ("Id", "CreatedAt", "UpdatedAt", "Revision", "DialogId", "SystemLabelId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
6+
7+
public static string Generate(DialogTimestamp dto) => $"{dto.DialogId},{dto.FormattedTimestamp},{dto.FormattedTimestamp},{Guid.NewGuid()},{dto.DialogId},1";
8+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Actions;
3+
4+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
5+
6+
internal static class GuiAction
7+
{
8+
public const string CopyCommand = """COPY "DialogGuiAction" ("Id", "CreatedAt", "UpdatedAt", "Action", "Url", "AuthorizationAttribute", "IsDeleteDialogAction", "PriorityId", "HttpMethodId", "DialogId") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
9+
10+
public static string Generate(DialogTimestamp dto)
11+
{
12+
var guiActionCsvData = new StringBuilder();
13+
14+
var guiActionId1 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 1);
15+
var guiActionId2 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 2);
16+
var guiActionId3 = DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 3);
17+
18+
guiActionCsvData.AppendLine($"{guiActionId1},{dto.FormattedTimestamp},{dto.FormattedTimestamp},submit,https://digdir.apps.tt02.altinn.no,,FALSE,1,2,{dto.DialogId}");
19+
guiActionCsvData.AppendLine($"{guiActionId2},{dto.FormattedTimestamp},{dto.FormattedTimestamp},submit,https://digdir.apps.tt02.altinn.no,,FALSE,2,2,{dto.DialogId}");
20+
guiActionCsvData.AppendLine($"{guiActionId3},{dto.FormattedTimestamp},{dto.FormattedTimestamp},submit,https://digdir.apps.tt02.altinn.no,,FALSE,3,2,{dto.DialogId}");
21+
22+
return guiActionCsvData.ToString();
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
using System.Text;
2+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Actions;
3+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Activities;
4+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions;
5+
using Digdir.Domain.Dialogporten.Domain.Dialogs.Entities.Transmissions.Contents;
6+
7+
namespace Digdir.Tool.Dialogporten.LargeDataSetGenerator.EntityGenerators;
8+
9+
internal static class Localization
10+
{
11+
public const string CopyCommand = """COPY "Localization" ("LanguageCode", "LocalizationSetId", "CreatedAt", "UpdatedAt", "Value") FROM STDIN (FORMAT csv, HEADER false, NULL '')""";
12+
13+
public static string Generate(DialogTimestamp dto)
14+
{
15+
var csvData = new StringBuilder();
16+
17+
List<Guid> localizationSetIds =
18+
[
19+
dto.DialogId,
20+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 1),
21+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmission), 2),
22+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 1),
23+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 2),
24+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogGuiAction), 3),
25+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), Activity.DialogCreatedType),
26+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogActivity), Activity.InformationType),
27+
DeterministicUuidV7.Generate(dto.Timestamp,
28+
nameof(Domain.Dialogporten.Domain.Dialogs.Entities.Contents.DialogContent), 1),
29+
DeterministicUuidV7.Generate(dto.Timestamp,
30+
nameof(Domain.Dialogporten.Domain.Dialogs.Entities.Contents.DialogContent), 2),
31+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmissionContent), 1),
32+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmissionContent), 2),
33+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmissionContent), 3),
34+
DeterministicUuidV7.Generate(dto.Timestamp, nameof(DialogTransmissionContent), 4)
35+
];
36+
37+
foreach (var localizationSetId in localizationSetIds)
38+
{
39+
var rng = new Random(localizationSetId.GetHashCode());
40+
41+
var english = Words.English.Length != 0
42+
? Words.English[rng.Next(0, Words.English.Length)] + " " +
43+
Words.English[rng.Next(0, Words.English.Length)]
44+
: $"English {Guid.NewGuid().ToString()[..8]}";
45+
46+
var norwegian = Words.Norwegian.Length != 0
47+
? Words.Norwegian[rng.Next(0, Words.Norwegian.Length)] + " " +
48+
Words.Norwegian[rng.Next(0, Words.Norwegian.Length)]
49+
: $"Norsk {Guid.NewGuid().ToString()[..8]}";
50+
51+
csvData.AppendLine(
52+
$"nb,{localizationSetId},{dto.FormattedTimestamp},{dto.FormattedTimestamp},{norwegian}");
53+
csvData.AppendLine(
54+
$"en,{localizationSetId},{dto.FormattedTimestamp},{dto.FormattedTimestamp},{english}");
55+
}
56+
57+
return csvData.ToString();
58+
}
59+
}

0 commit comments

Comments
 (0)