classlib/ExpenseTracker.Persistence/MongoDb/Serializers/AccountSerializer.cs
2024-08-07 21:12:02 +03:00

110 lines
4.4 KiB
C#

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<Account>, 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<Currency>
{
public override Currency Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
{
var name = context.Reader.ReadString();
return Currency.FromName(name);
}
}