using Newtonsoft.Json; using ServerCore; using ServerBase; using BEACON_GUID = System.String; using META_ID = System.UInt32; using ANCHOR_GUID = System.String; using USER_GUID = System.String; using Amazon.S3.Model; namespace ServerCommon { public class CraftAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { [JsonProperty] public ANCHOR_GUID AnchorGuid { get; set; } = string.Empty; [JsonProperty] public META_ID CraftMetaId { get; set; } = 0; [JsonProperty] public DateTime CraftStartTime { get; set; } = new(); [JsonProperty] public DateTime CraftFinishTime { get; set; } = new(); [JsonProperty] public BEACON_GUID BeaconGuid { get; set; } = string.Empty; [JsonProperty] public int CraftCount { get; set; } = 1; public CraftAttribute(EntityBase owner, EntityBase entityOfOwnerEntityType) : base(owner, entityOfOwnerEntityType) { } public override void onClear() { AnchorGuid = string.Empty; CraftMetaId = 0; CraftStartTime = new(); CraftFinishTime = new(); BeaconGuid = string.Empty; CraftCount = 1; } public override EntityAttributeBase onCloned() { var entity_of_owner_entity_type = getEntityOfOwnerEntityType(); NullReferenceCheckHelper.throwIfNull(entity_of_owner_entity_type, () => $"entity_of_owner_entity_type is null !!!"); var cloned = new CraftAttribute(getOwner(), entity_of_owner_entity_type); cloned.AnchorGuid = AnchorGuid; cloned.CraftMetaId = CraftMetaId; cloned.CraftStartTime = CraftStartTime; cloned.CraftFinishTime = CraftFinishTime; cloned.BeaconGuid = BeaconGuid; cloned.CraftCount = CraftCount; return cloned; } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new CraftAttributeTransactor(getOwner()); } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var err_msg = string.Empty; var acoount_attribute = getOwner().getRootParent().getEntityAttribute(); NullReferenceCheckHelper.throwIfNull(acoount_attribute, () => $"acoount_attribute is null !!!"); USER_GUID user_guid = acoount_attribute.UserGuid; //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as CraftDoc; if (null == try_pending_doc) { var to_copy_doc = new CraftDoc(user_guid, AnchorGuid); var origin_doc = getOriginDocBase(); if (null != origin_doc) { to_copy_doc.copyTimestampsFromOriginDocBase(origin_doc); } try_pending_doc = to_copy_doc; setTryPendingDocBase(try_pending_doc); } var to_copy_doc_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(to_copy_doc_attrib, () => $"to_copy_doc_attrib is null !!!"); to_copy_doc_attrib.AnchorGuid = AnchorGuid; to_copy_doc_attrib.CraftMetaId = CraftMetaId; to_copy_doc_attrib.CraftStartTime = CraftStartTime; to_copy_doc_attrib.CraftFinishTime = CraftFinishTime; to_copy_doc_attrib.BeaconGuid = BeaconGuid; to_copy_doc_attrib.CraftCount = CraftCount; if (false == isForQuery) { return (result, try_pending_doc); } //===================================================================================== // Doc QueryType 반영 //===================================================================================== (result, var to_query_doc) = await applyDoc4Query(try_pending_doc); if (result.isFail()) { return (result, to_query_doc); } return (result, to_query_doc); } public bool copyEntityAttributeFromDoc(DynamoDbDocBase docBase) { var result = new Result(); var err_msg = string.Empty; var to_cast_string = typeof(CraftDoc).Name; var craft_doc_base = docBase as CraftDoc; if (null == craft_doc_base) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, craft_doc_base is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(craft_doc_base); //===================================================================================== // Doc => Attribute //===================================================================================== var doc_attrib = craft_doc_base.getAttrib(); if (doc_attrib == null) { err_msg = $"Failed to get craft attrib : {nameof(CraftAttrib)}"; result.setFail(ServerErrorCode.EntityAttributeIsNull, err_msg); Log.getLogger().error(err_msg); return false; } AnchorGuid = doc_attrib.AnchorGuid; CraftMetaId = doc_attrib.CraftMetaId; CraftStartTime = doc_attrib.CraftStartTime; CraftFinishTime = doc_attrib.CraftFinishTime; BeaconGuid = doc_attrib.BeaconGuid; CraftCount = doc_attrib.CraftCount; return true; } public Result onMerge(EntityAttributeBase otherEntityAttribute) { var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); var result = new Result(); var err_msg = string.Empty; if (null == otherEntityAttribute) { err_msg = $"Invalid Param !!!, otherEntityAttribute is null"; result.setFail(ServerErrorCode.FunctionParamNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } //===================================================================================== // OtherAttribute => Attribute //===================================================================================== var craft_attribute = otherEntityAttribute as CraftAttribute; if (null == craft_attribute) { err_msg = $"Failed to cast Attribute !!!, craft_attribute is null"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } AnchorGuid = craft_attribute.AnchorGuid; CraftMetaId = craft_attribute.CraftMetaId; CraftStartTime = craft_attribute.CraftStartTime; CraftFinishTime = craft_attribute.CraftFinishTime; BeaconGuid = craft_attribute.BeaconGuid; CraftCount = craft_attribute.CraftCount; //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = craft_attribute.getTryPendingDocBase() as CraftDoc; if (null != try_pending_doc) { craft_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var craft_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(craft_attrib, () => $"craft_attrib is null !!! - {owner.toBasicString()}"); craft_attrib.AnchorGuid = AnchorGuid; craft_attrib.CraftMetaId = CraftMetaId; craft_attrib.CraftStartTime = CraftStartTime; craft_attrib.CraftFinishTime = CraftFinishTime; craft_attrib.BeaconGuid = BeaconGuid; craft_attrib.CraftCount = CraftCount; return result; } } public class CraftAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public CraftAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase? entityAttributeBase) { var err_msg = string.Empty; var to_cast_string = typeof(CraftAttribute).Name; var copy_from_attribute = entityAttributeBase as CraftAttribute; if (null == copy_from_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_from_craft_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } var copy_to_attribute = getClonedEntityAttribute() as CraftAttribute; if (null == copy_to_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorFromEntityAttribute() !!!, copy_to_craft_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } copy_to_attribute.AnchorGuid = copy_from_attribute.AnchorGuid; copy_to_attribute.CraftMetaId = copy_from_attribute.CraftMetaId; copy_to_attribute.CraftStartTime = copy_from_attribute.CraftStartTime; copy_to_attribute.CraftFinishTime = copy_from_attribute.CraftFinishTime; copy_to_attribute.BeaconGuid = copy_from_attribute.BeaconGuid; copy_to_attribute.CraftCount = copy_from_attribute.CraftCount; return true; } } }