From 90b9012c32bc5eb9e5b251965fbe7f97b0632a8b Mon Sep 17 00:00:00 2001 From: Abdullah Atta Date: Fri, 7 Jun 2024 11:00:48 +0500 Subject: [PATCH] sync: use custom bson serializer for SyncItem for perf --- Notesnook.API/Interfaces/ISyncItem.cs | 43 ----------- Notesnook.API/Models/SyncItem.cs | 103 +++++++++++++++++++++++++- Notesnook.API/Startup.cs | 1 + 3 files changed, 103 insertions(+), 44 deletions(-) delete mode 100644 Notesnook.API/Interfaces/ISyncItem.cs diff --git a/Notesnook.API/Interfaces/ISyncItem.cs b/Notesnook.API/Interfaces/ISyncItem.cs deleted file mode 100644 index 2858555..0000000 --- a/Notesnook.API/Interfaces/ISyncItem.cs +++ /dev/null @@ -1,43 +0,0 @@ -/* -This file is part of the Notesnook Sync Server project (https://notesnook.com/) - -Copyright (C) 2023 Streetwriters (Private) Limited - -This program is free software: you can redistribute it and/or modify -it under the terms of the Affero GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -Affero GNU General Public License for more details. - -You should have received a copy of the Affero GNU General Public License -along with this program. If not, see . -*/ - -using System.Text.Json.Serialization; -using MongoDB.Bson.Serialization.Attributes; -using MongoDB.Bson.Serialization.Serializers; -using Notesnook.API.Models; -using Streetwriters.Common.Attributes; -using Streetwriters.Common.Converters; -using Streetwriters.Common.Interfaces; - -namespace Notesnook.API.Interfaces -{ - [BsonSerializer(typeof(ImpliedImplementationInterfaceSerializer))] - [JsonInterfaceConverter(typeof(InterfaceConverter))] - public interface ISyncItem - { - long DateSynced - { - get; set; - } - - string UserId { get; set; } - string Algorithm { get; set; } - string IV { get; set; } - } -} diff --git a/Notesnook.API/Models/SyncItem.cs b/Notesnook.API/Models/SyncItem.cs index 1416f22..fac0d1e 100644 --- a/Notesnook.API/Models/SyncItem.cs +++ b/Notesnook.API/Models/SyncItem.cs @@ -17,17 +17,21 @@ You should have received a copy of the Affero GNU General Public License along with this program. If not, see . */ +using System; using System.ComponentModel.DataAnnotations; using System.Runtime.Serialization; using System.Text.Json.Serialization; using MongoDB.Bson; +using MongoDB.Bson.IO; +using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Attributes; +using MongoDB.Bson.Serialization.Serializers; using Notesnook.API.Interfaces; namespace Notesnook.API.Models { [MessagePack.MessagePackObject] - public class SyncItem : ISyncItem + public class SyncItem { [IgnoreDataMember] [MessagePack.IgnoreMember] @@ -110,6 +114,103 @@ namespace Notesnook.API.Models } = Algorithms.Default; } + public class SyncItemBsonSerializer : SerializerBase + { + public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, SyncItem value) + { + var writer = context.Writer; + writer.WriteStartDocument(); + + if (value.Id != ObjectId.Empty) + { + writer.WriteName("_id"); + writer.WriteObjectId(value.Id); + } + + writer.WriteName("DateSynced"); + writer.WriteInt64(value.DateSynced); + + writer.WriteName("UserId"); + writer.WriteString(value.UserId); + + writer.WriteName("IV"); + writer.WriteString(value.IV); + + writer.WriteName("Cipher"); + writer.WriteString(value.Cipher); + + writer.WriteName("ItemId"); + writer.WriteString(value.ItemId); + + writer.WriteName("Length"); + writer.WriteInt64(value.Length); + + writer.WriteName("Version"); + writer.WriteDouble(value.Version); + + writer.WriteName("Algorithm"); + writer.WriteString(value.Algorithm); + + writer.WriteEndDocument(); + } + + public override SyncItem Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) + { + var bsonReader = context.Reader; + bsonReader.ReadStartDocument(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var id = bsonReader.ReadObjectId(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var dateSynced = bsonReader.ReadInt64(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var userId = bsonReader.ReadString(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var iv = bsonReader.ReadString(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var cipher = bsonReader.ReadString(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var itemId = bsonReader.ReadString(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var length = bsonReader.ReadInt64(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var version = bsonReader.ReadDouble(); + + bsonReader.ReadBsonType(); + bsonReader.SkipName(); + var algorithm = bsonReader.ReadString(); + + bsonReader.ReadEndDocument(); + return new SyncItem + { + Id = id, + DateSynced = dateSynced, + UserId = userId, + IV = iv, + Cipher = cipher, + ItemId = itemId, + Length = length, + Version = version, + Algorithm = algorithm + }; + } + } + [MessagePack.MessagePackObject] public class SettingItem : SyncItem { } diff --git a/Notesnook.API/Startup.cs b/Notesnook.API/Startup.cs index fe1cfd6..8932f4b 100644 --- a/Notesnook.API/Startup.cs +++ b/Notesnook.API/Startup.cs @@ -159,6 +159,7 @@ namespace Notesnook.API options.CacheDuration = TimeSpan.FromMinutes(30); }); + BsonSerializer.RegisterSerializer(new SyncItemBsonSerializer()); if (!BsonClassMap.IsClassMapRegistered(typeof(UserSettings))) BsonClassMap.RegisterClassMap();