Skip to content

Commit fb6fa78

Browse files
committed
Bug fix: json converter for bson docs serialization in the lineage api
1 parent 629c4a7 commit fb6fa78

File tree

3 files changed

+113
-1
lines changed

3 files changed

+113
-1
lines changed

src/KeeperData.Bridge/Setup/ServiceCollectionExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
using KeeperData.Infrastructure.Crypto;
99
using KeeperData.Infrastructure.Database.Setup;
1010
using KeeperData.Infrastructure.Extensions;
11+
using KeeperData.Infrastructure.Json;
1112
using KeeperData.Infrastructure.Messaging.Setup;
1213
using KeeperData.Infrastructure.Storage.Setup;
1314
using KeeperData.Infrastructure.Telemetry;
@@ -185,6 +186,7 @@ private static void ConfigureAuthorization(this IServiceCollection services, ICo
185186
{
186187
var enumConverter = new JsonStringEnumConverter();
187188
opts.JsonSerializerOptions.Converters.Add(enumConverter);
189+
opts.JsonSerializerOptions.Converters.Add(new BsonDocumentJsonConverter());
188190
});
189191

190192
return;
@@ -219,6 +221,7 @@ private static void ConfigureAuthorization(this IServiceCollection services, ICo
219221
{
220222
var enumConverter = new JsonStringEnumConverter();
221223
opts.JsonSerializerOptions.Converters.Add(enumConverter);
224+
opts.JsonSerializerOptions.Converters.Add(new BsonDocumentJsonConverter());
222225
});
223226
}
224227
}

src/KeeperData.Core/ETL/Impl/AcquisitionPipeline.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class AcquisitionPipeline(
1919
ILogger<AcquisitionPipeline> logger) : IAcquisitionPipeline
2020
{
2121
private const string MimeTypeTextCsv = "text/csv";
22+
private const int DefaultLookbackDays = 200;
2223

2324
public async Task StartAsync(ImportReport report, CancellationToken ct)
2425
{
@@ -75,7 +76,7 @@ public async Task StartAsync(ImportReport report, CancellationToken ct)
7576
{
7677
logger.LogInformation("Step 1: Discovering files for ImportId: {ImportId}", importId);
7778

78-
var fileSets = await catalogueService.GetFileSetsAsync(100, ct);
79+
var fileSets = await catalogueService.GetFileSetsAsync(DefaultLookbackDays, ct);
7980
var totalFiles = fileSets.Sum(fs => fs.Files.Length);
8081

8182
logger.LogInformation("Discovered {FileSetCount} file set(s) containing {TotalFileCount} file(s) for ImportId: {ImportId}",
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
using MongoDB.Bson;
2+
using System.Text.Json;
3+
using System.Text.Json.Serialization;
4+
5+
namespace KeeperData.Infrastructure.Json;
6+
7+
/// <summary>
8+
/// Custom JSON converter for MongoDB BsonDocument to properly serialize to JSON.
9+
/// Handles conversion of BSON types to .NET types for System.Text.Json serialization.
10+
/// </summary>
11+
public class BsonDocumentJsonConverter : JsonConverter<BsonDocument>
12+
{
13+
public override BsonDocument? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
14+
{
15+
throw new NotImplementedException("Deserialization of BsonDocument is not supported");
16+
}
17+
18+
public override void Write(Utf8JsonWriter writer, BsonDocument value, JsonSerializerOptions options)
19+
{
20+
if (value == null)
21+
{
22+
writer.WriteNullValue();
23+
return;
24+
}
25+
26+
writer.WriteStartObject();
27+
28+
foreach (var element in value.Elements)
29+
{
30+
writer.WritePropertyName(options.PropertyNamingPolicy?.ConvertName(element.Name) ?? element.Name);
31+
WriteBsonValue(writer, element.Value, options);
32+
}
33+
34+
writer.WriteEndObject();
35+
}
36+
37+
private static void WriteBsonValue(Utf8JsonWriter writer, BsonValue value, JsonSerializerOptions options)
38+
{
39+
switch (value.BsonType)
40+
{
41+
case BsonType.Null:
42+
case BsonType.Undefined:
43+
writer.WriteNullValue();
44+
break;
45+
46+
case BsonType.String:
47+
writer.WriteStringValue(value.AsString);
48+
break;
49+
50+
case BsonType.Int32:
51+
writer.WriteNumberValue(value.AsInt32);
52+
break;
53+
54+
case BsonType.Int64:
55+
writer.WriteNumberValue(value.AsInt64);
56+
break;
57+
58+
case BsonType.Double:
59+
writer.WriteNumberValue(value.AsDouble);
60+
break;
61+
62+
case BsonType.Decimal128:
63+
writer.WriteNumberValue(Decimal128.ToDecimal(value.AsDecimal128));
64+
break;
65+
66+
case BsonType.Boolean:
67+
writer.WriteBooleanValue(value.AsBoolean);
68+
break;
69+
70+
case BsonType.DateTime:
71+
writer.WriteStringValue(value.ToUniversalTime());
72+
break;
73+
74+
case BsonType.ObjectId:
75+
writer.WriteStringValue(value.AsObjectId.ToString());
76+
break;
77+
78+
case BsonType.Array:
79+
writer.WriteStartArray();
80+
foreach (var item in value.AsBsonArray)
81+
{
82+
WriteBsonValue(writer, item, options);
83+
}
84+
writer.WriteEndArray();
85+
break;
86+
87+
case BsonType.Document:
88+
writer.WriteStartObject();
89+
foreach (var element in value.AsBsonDocument.Elements)
90+
{
91+
writer.WritePropertyName(options.PropertyNamingPolicy?.ConvertName(element.Name) ?? element.Name);
92+
WriteBsonValue(writer, element.Value, options);
93+
}
94+
writer.WriteEndObject();
95+
break;
96+
97+
case BsonType.Binary:
98+
// Serialize binary data as base64 string
99+
writer.WriteStringValue(Convert.ToBase64String(value.AsBsonBinaryData.Bytes));
100+
break;
101+
102+
default:
103+
// For any other BSON type, serialize as string
104+
writer.WriteStringValue(value.ToString());
105+
break;
106+
}
107+
}
108+
}

0 commit comments

Comments
 (0)