Skip to content

Commit aafd542

Browse files
committed
Added support for uploading of all types of RichTexts
1 parent 65fac68 commit aafd542

File tree

6 files changed

+115
-22
lines changed

6 files changed

+115
-22
lines changed

src/Notion.Sharp/Converters/PageOrDatabaseConverter.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
using System;
44
using System.Text.Json;
5-
using System.Text.Json.Serialization;
65

76
namespace Notion.Converters;
87

98
internal class PageOrDatabaseConverter : MyJsonConverter<PageOrDatabase>
109
{
10+
public override bool CanConvert(Type typeToConvert) => typeToConvert == typeof(PageOrDatabase);
11+
1112
public override PageOrDatabase Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
1213
{
1314
var tempReader = reader;
@@ -32,6 +33,9 @@ public override PageOrDatabase Read(ref Utf8JsonReader reader, Type typeToConver
3233

3334
public override void Write(Utf8JsonWriter writer, PageOrDatabase value, JsonSerializerOptions options)
3435
{
35-
throw new NotImplementedException();
36+
if (value is Page page)
37+
JsonSerializer.Serialize(writer, page, options);
38+
else if (value is Database database)
39+
JsonSerializer.Serialize(writer, database, options);
3640
}
3741
}

src/Notion.Sharp/Converters/UserConverter.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ public override User Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSer
3232

3333
public override void Write(Utf8JsonWriter writer, User value, JsonSerializerOptions options)
3434
{
35-
throw new NotImplementedException();
35+
writer.WriteStartObject();
36+
writer.WriteString("id", value.Id);
37+
writer.WriteEndObject();
3638
}
3739

3840
private static Parser<Void>? ignored;
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
using System;
2+
using System.Text.Json.Serialization;
23

34
namespace Notion.Model;
45

56
public record Link
67
{
8+
[JsonPropertyName("url")]
79
public Uri Url { get; init; }
810
}

src/Notion.Sharp/Notion.cs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,58 @@ public static INotion NewClient(string bearerToken, string version = "2021-08-16
241241
writer.WriteString("content", text.Content);
242242
writer.WriteEndObject();
243243
}),
244+
[typeof(RichText.Equation)] = Writer.GetWriter<RichText>("equation", (writer, rich_text, options) =>
245+
{
246+
var text = rich_text as RichText.Equation;
247+
writer.WriteStartObject();
248+
writer.WriteString("expression", text.Expression);
249+
writer.WriteEndObject();
250+
}),
251+
252+
[typeof(RichText.PageMention)] = Writer.GetWriter<RichText>("mention", (writer, rich_text, options) =>
253+
{
254+
var pageMention = rich_text as RichText.PageMention;
255+
writer.WriteStartObject();
256+
writer.WriteStartObject("page");
257+
writer.WriteString("id", pageMention.Id.ToString());
258+
writer.WriteEndObject();
259+
writer.WriteEndObject();
260+
}),
261+
[typeof(RichText.DatabaseMention)] = Writer.GetWriter<RichText>("mention", (writer, rich_text, options) =>
262+
{
263+
var databaseMention = rich_text as RichText.DatabaseMention;
264+
writer.WriteStartObject();
265+
writer.WriteStartObject("database");
266+
writer.WriteString("id", databaseMention.Id.ToString());
267+
writer.WriteEndObject();
268+
writer.WriteEndObject();
269+
}),
270+
[typeof(RichText.DateMention)] = Writer.GetWriter<RichText>("mention", (writer, rich_text, options) =>
271+
{
272+
var dateMention = rich_text as RichText.DateMention;
273+
writer.WriteStartObject();
274+
writer.WriteStartObject("date");
275+
writer.WriteString("start", $"{dateMention.Start:o}");
276+
if (dateMention.End is not null)
277+
writer.WriteString("end", $"{dateMention.End:o}");
278+
writer.WriteEndObject();
279+
writer.WriteEndObject();
280+
}),
281+
[typeof(RichText.UserMention)] = Writer.GetWriter<RichText>("mention", (writer, rich_text, options) =>
282+
{
283+
var userMention = rich_text as RichText.UserMention;
284+
writer.WriteStartObject();
285+
writer.WritePropertyName("user");
286+
JsonSerializer.Serialize(writer, userMention.User, options);
287+
writer.WriteEndObject();
288+
}),
289+
[typeof(RichText.Text)] = Writer.GetWriter<RichText>("text", (writer, rich_text, options) =>
290+
{
291+
var text = rich_text as RichText.Text;
292+
writer.WriteStartObject();
293+
writer.WriteString("content", text.Content);
294+
writer.WriteEndObject();
295+
}),
244296
}
245297
},
246298
new ParentConverter

tests/Notion.Sharp.Tests/RichTextSerializationTests.cs renamed to tests/Notion.Sharp.Tests/AppendBlocksToPageTests.cs

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
namespace Notion.Sharp.Tests;
88

9-
public class AppendBlocksToPage : NotionTestsBase
9+
public class AppendBlocksToPageTests : NotionTestsBase
1010
{
1111
[Theory]
1212
[MemberData(nameof(Blocks))]
@@ -18,24 +18,7 @@ public async Task AppendChildren_Succeds(Block block)
1818
block
1919
});
2020
result.Should().NotBeNull();
21-
}
22-
23-
[Fact]
24-
public async Task AppendImage_Succeds()
25-
{
26-
var result = await SUT.AppendBlockChildrenAsync(ValidPageId, new List<Block>
27-
{
28-
new Block.Image
29-
{
30-
File = new Model.File.External
31-
{
32-
Uri = new Uri("https://i.scdn.co/image/ab6761610000e5ebdef2f4887831f20c342d790e")
33-
34-
//Uri = new Uri("https://images.unsplash.com/photo-1533551268962-824e232f7ee1?ixlib=rb-1.2.1&q=85&fm=jpg&crop=entropy&cs=srgb")
35-
}
36-
},
37-
});
38-
result.Should().NotBeNull();
21+
await SUT.DeleteBlockAsync(result.Results[0].Id);
3922
}
4023

4124
public static TheoryData<Block> Blocks { get; } = new TheoryData<Block>
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+

2+
using Notion.Model;
3+
4+
namespace Notion.Sharp.Tests;
5+
6+
public class RichTextsTests : NotionTestsBase
7+
{
8+
[Theory]
9+
[InlineData("3bbf6ded7f2d467c85d36bc284fcaef1")]
10+
[InlineData("83de0d65771d4281b92a9e7a88097259")]
11+
[InlineData("3321337b0208402db5541969f0cb6251")]
12+
[InlineData("67f26dd5e73c452e82308c289d8e3996")]
13+
[InlineData("9ad3666614394d2fbd661a6ee184f254")]
14+
[InlineData("30e286a392b0413992ea355facf9e195")]
15+
[InlineData("fea9c0130e8743cc9608c227b6bca5a9")]
16+
[InlineData("25c3c8f17ef047a3b3a6da6e99d255bf")]
17+
public async Task GetRichText(string guid)
18+
{
19+
var block = await SUT.GetBlockAsync(new Guid(guid));
20+
block.Should().NotBeNull();
21+
}
22+
23+
[Theory]
24+
[MemberData(nameof(RichTexts))]
25+
public async Task AppendRichText_Succed(RichText richText)
26+
{
27+
var result = await SUT.AppendBlockChildrenAsync(ValidPageId, new List<Block>
28+
{
29+
new Block.Paragraph
30+
{
31+
Text = new RichText[]
32+
{
33+
richText
34+
}
35+
}
36+
});
37+
var block = await SUT.DeleteBlockAsync(result.Results[0].Id);
38+
}
39+
40+
public static TheoryData<RichText> RichTexts { get; } = new TheoryData<RichText>
41+
{
42+
new RichText.Text { Content = "Some text here and there" },
43+
new RichText.Text { Content = "Some text here and there", Link = new Link { Url = new Uri("https://google.com") } },
44+
new RichText.DatabaseMention { Id = new Guid("a6dbd20bafdb4b3e857bcf04a77ee3b5") },
45+
new RichText.PageMention { Id = new Guid("72437ca5b34c484f901a6f2368f5199e") },
46+
new RichText.DateMention { Start = DateTime.Today, End = DateTime.Today },
47+
new RichText.UserMention { User = new User.Person { Id = new Guid("6591a4d4-ca53-4b54-a3ca-7d2420d6b902") } },
48+
new RichText.Equation { Expression = "1 + 1" },
49+
};
50+
}

0 commit comments

Comments
 (0)