using MongoDB.Bson; using MongoDB.Bson.IO; using MongoDB.Bson.Serialization; using MongoDB.Bson.Serialization.Serializers; using ExpenseTracker.Domain.Entities; using ExpenseTracker.Domain.Enums; namespace ExpenseTracker.Persistence.Serializers; public class AccountSerializer : SerializerBase, IBsonDocumentSerializer { private const string IdDeserializedFieldName = "Id"; private const string IdSerializedFieldName = "_id"; private const string NameDeserializedFieldName = "Name"; private const string NameSerializedFieldName = "name"; private const string DescriptionDeserializedFieldName = "Description"; private const string DescriptionSerializedFieldName = "description"; private const string CurrencyDeserializedFieldName = "Currency"; private const string CurrencySerializedFieldName = "currency"; private const string UserIdDeserializedFieldName = "UserId"; private const string UserIdSerializedFieldName = "userId"; public override Account Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { context.Reader.ReadStartDocument(); var entity = new Account(); while (context.Reader.ReadBsonType() != BsonType.EndOfDocument) { var fieldName = context.Reader.ReadName(); switch (fieldName) { case IdSerializedFieldName: entity.Id = context.Reader.ReadString(); break; case NameSerializedFieldName: entity.Name = context.Reader.ReadString(); break; case DescriptionSerializedFieldName: var description = context.Reader.ReadString(); entity.Description = description.Equals(String.Empty) ? null : description; break; case CurrencySerializedFieldName: entity.Currency = Currency.FromName(context.Reader.ReadString()); break; case UserIdSerializedFieldName: entity.UserId = context.Reader.ReadString(); break; } } context.Reader.ReadEndDocument(); return entity; } public override void Serialize(BsonSerializationContext context, BsonSerializationArgs args, Account value) { context.Writer.WriteStartDocument(); context.Writer.WriteString(IdSerializedFieldName, value.Id); context.Writer.WriteString(NameSerializedFieldName, value.Name); context.Writer.WriteString(DescriptionSerializedFieldName, value.Description ?? String.Empty); context.Writer.WriteString(CurrencySerializedFieldName, value.Currency.Name); context.Writer.WriteString(UserIdSerializedFieldName, value.UserId); context.Writer.WriteEndDocument(); } public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializationInfo serializationInfo) { switch (memberName) { case IdDeserializedFieldName: serializationInfo = new BsonSerializationInfo(IdSerializedFieldName, new StringSerializer(), typeof(string)); return true; case NameDeserializedFieldName: serializationInfo = new BsonSerializationInfo(NameSerializedFieldName, new StringSerializer(), typeof(string)); return true; case DescriptionDeserializedFieldName: serializationInfo = new BsonSerializationInfo(DescriptionSerializedFieldName, new StringSerializer(), typeof(string)); return true; case CurrencyDeserializedFieldName: serializationInfo = new BsonSerializationInfo(CurrencySerializedFieldName, new CurrencySerializer(), typeof(Currency)); return true; case UserIdDeserializedFieldName: serializationInfo = new BsonSerializationInfo(UserIdSerializedFieldName, new StringSerializer(), typeof(string)); return true; default: serializationInfo = null; return false; } } } public class CurrencySerializer : SerializerBase { public override Currency Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args) { var name = context.Reader.ReadString(); return Currency.FromName(name); } }