using Newtonsoft.Json; using ServerCore; using ServerBase; namespace ServerCommon; public class CaliumAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { [JsonProperty] public double DailyCalium { get { return m_daily_calium; } set { var recorder = getEntityRecorder(); if (null != recorder) { recorder.applyDeltaCounter(EntityDeltaType.MoneyCalium, value - m_daily_calium, value); } m_daily_calium = value; } } private double m_daily_calium = 0.0; [JsonProperty] public DateTime ProvidedDate { get; set; } public CaliumAttribute(UserBase owner) : base(owner, false){} public override void onClear() { DailyCalium = 0.0; ProvidedDate = DateTimeHelper.MinTime; getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var owner = getOwner() as UserBase; NullReferenceCheckHelper.throwIfNull(owner, () => "owner is null !!!"); var cloned = new CaliumAttribute(owner); cloned.DailyCalium = DailyCalium; cloned.ProvidedDate = ProvidedDate; return cloned; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new CaliumAttributeTransactor(getOwner()); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var owner = getOwner(); var user_attribute = owner.getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(user_attribute, () => $"user_attribute is null !!! - {owner.toBasicString()}"); var user_guid = user_attribute.UserGuid; var to_copy_doc = new CaliumDoc(user_guid); if (false == getAttributeState().hasFlag(StateType.Created)) { var origin_doc_base = getOriginDocBase(); NullReferenceCheckHelper.throwIfNull(origin_doc_base, () => $"origin_doc_base is null !!! - {owner.toBasicString()}"); to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc_base); } var to_copy_calium_attrib = to_copy_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(to_copy_calium_attrib, () => $"to_copy_calium_attrib is null !!! - {owner.toBasicString()}"); to_copy_calium_attrib.DailyCalium = DailyCalium; to_copy_calium_attrib.ProvidedDate = ProvidedDate; if (false == isForQuery) { return (result, to_copy_doc); } (result, var to_query_doc) = await applyDoc4Query(to_copy_doc); if (result.isFail()) { return (result, null); } return (result, to_query_doc); } public Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); ArgumentNullReferenceCheckHelper.throwIfNull(otherEntityAttribute, () => $"otherEntityAttribute is null !!! - {owner.toBasicString()}"); var result = new Result(); string err_msg; //===================================================================================== // OtherAttribute => Attribute //===================================================================================== var calium_attribute = otherEntityAttribute as CaliumAttribute; if (null == calium_attribute) { err_msg = $"Failed to cast CaliumAttribute !!!, calium_attribute is null - {toBasicString()}, {owner.toBasicString()}"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } DailyCalium = calium_attribute.DailyCalium; ProvidedDate = calium_attribute.ProvidedDate; //===================================================================================== // Attribute => Origin Doc //===================================================================================== var origin_doc = getOriginDocBase() as CaliumDoc; if (null == origin_doc) { err_msg = $"getOriginDocBase() is null !!! - docName:{nameof(CaliumDoc)} - {toBasicString()}"; Log.getLogger().warn(err_msg); } else { var calium_attrib = origin_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(calium_attrib, () => $"calium_attrib is null !!! - {toBasicString()}"); calium_attrib.DailyCalium = DailyCalium; calium_attrib.ProvidedDate = ProvidedDate; } return result; } public bool copyEntityAttributeFromDoc(DynamoDbDocBase? newDocBase) { var owner = getOwner(); var calium_doc = newDocBase as CaliumDoc; if (null == calium_doc) { var err_msg = $"calium_doc is null !!!, in copyEntityAttributeFromDoc() - docName:{nameof(CaliumDoc)} - {owner.toBasicString()}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(calium_doc); //===================================================================================== // Origin Doc => Attribute //===================================================================================== var calium_attrib = calium_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(calium_attrib, () => $"calium_attrib is null !!! - {owner.toBasicString()}"); DailyCalium = calium_attrib.DailyCalium; ProvidedDate = calium_attrib.ProvidedDate; return true; } } public class CaliumAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public CaliumAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase? entityAttributeBase) { string err_msg; var copy_from_calium_attribute = entityAttributeBase as CaliumAttribute; if (null == copy_from_calium_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_from_calium_attribute is null :{nameof(CaliumAttribute)}"; Log.getLogger().error(err_msg); return false; } var copy_to_calium_attribute = getClonedEntityAttribute() as CaliumAttribute; if (null == copy_to_calium_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_to_calium_attribute is null :{nameof(CaliumAttribute)}"; Log.getLogger().error(err_msg); return false; } copy_to_calium_attribute.DailyCalium = copy_from_calium_attribute.DailyCalium; copy_to_calium_attribute.ProvidedDate = copy_from_calium_attribute.ProvidedDate; return true; } }