110 lines
4.4 KiB
C#
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);
|
|
}
|
|
}
|