using Amazon.S3.Model; using Newtonsoft.Json; using ServerCore; using ServerBase; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ServerCommon { public class BuildingFloorAttribute : EntityAttributeBase, ICopyEntityAttributeFromDoc, IMergeWithEntityAttribute { [JsonProperty] public int LandMetaId { get; set; } [JsonProperty] public int BuildingMetaId { get; set; } [JsonProperty] public int Floor { get; set; } [JsonProperty] public string OwnerGuid { get; set; } = string.Empty; [JsonProperty] public string MyhomeGuid { get; set; } = string.Empty; [JsonProperty] public string InstanceName { get; set; } = string.Empty; public int ThumbnailImageId { get; set; } public int ListImageId { get; set; } [JsonProperty] public int EnterPlayerCount { get; set; } public TimeSpan RentalPeriod { get; set; } = new(); [JsonProperty] public DateTime RentalStartTime { get; set; } = new(); [JsonProperty] public DateTime RentalFinishTime { get; set; } = new(); public BuildingFloorAttribute(EntityBase owner) : base(owner) { } public override void newEntityAttribute() { base.newEntityAttribute(); } public override IEntityAttributeTransactor onNewEntityAttributeTransactor() { return new BuildingFloorAttributeTransactor(getOwner()); } public override void onClear() { LandMetaId = 0; BuildingMetaId = 0; Floor = 0; OwnerGuid = string.Empty; MyhomeGuid = string.Empty; InstanceName = string.Empty; ThumbnailImageId = 0; ListImageId = 0; EnterPlayerCount = 0; RentalPeriod = new(); RentalStartTime = new(); RentalFinishTime = new(); getAttributeState().reset(); } public override EntityAttributeBase onCloned() { var cloned = new BuildingFloorAttribute(getOwner()); cloned.deepCopyFromBase(this); cloned.LandMetaId = LandMetaId; cloned.BuildingMetaId = BuildingMetaId; cloned.Floor = Floor; cloned.OwnerGuid = OwnerGuid; cloned.MyhomeGuid = MyhomeGuid; cloned.InstanceName = InstanceName; cloned.ThumbnailImageId = ThumbnailImageId; cloned.ListImageId = ListImageId; cloned.EnterPlayerCount = EnterPlayerCount; cloned.RentalPeriod = RentalPeriod; cloned.RentalStartTime = RentalStartTime; cloned.RentalFinishTime = RentalFinishTime; return cloned; } public override async Task<(Result, DynamoDbDocBase?)> toDocBase(bool isForQuery = true) { var result = new Result(); var owner = getOwner(); NullReferenceCheckHelper.throwIfNull(owner, () => $"owner is null !!!"); //===================================================================================== // Attribute => try pending Doc //===================================================================================== var try_pending_doc = getTryPendingDocBase() as BuildingFloorDoc; if (null == try_pending_doc) { var ttl_seconds = DynamoDbClientHelper.makeTTLTimeForDynamoDB(RentalFinishTime); var to_copy_doc = new BuildingFloorDoc(BuildingMetaId, Floor, ttl_seconds); 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 building_floor_attrib = try_pending_doc.getAttrib(); NullReferenceCheckHelper.throwIfNull(building_floor_attrib, () => $"building_floor_attrib is null !!!"); building_floor_attrib.LandMetaId = LandMetaId; building_floor_attrib.BuildingMetaId = BuildingMetaId; building_floor_attrib.Floor = Floor; building_floor_attrib.OwnerGuid = OwnerGuid; building_floor_attrib.MyhomeGuid = MyhomeGuid; building_floor_attrib.InstanceName = InstanceName; building_floor_attrib.ThumbnailImageId = ThumbnailImageId; building_floor_attrib.ListImageId = ListImageId; building_floor_attrib.EnterPlayerCount = EnterPlayerCount; building_floor_attrib.RentalPeriod = RentalPeriod; building_floor_attrib.RentalStartTime = RentalStartTime; building_floor_attrib.RentalFinishTime = RentalFinishTime; 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, null); } return (result, to_query_doc); } public bool copyEntityAttributeFromDoc(DynamoDbDocBase? docBase) { var err_msg = string.Empty; var to_cast_string = typeof(BuildingFloorDoc).Name; var building_floor_doc_base = docBase as BuildingFloorDoc; if (null == building_floor_doc_base) { err_msg = $"Failed to copyEntityAttributeFromDoc() !!!, building_floor_doc_base is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } //===================================================================================== // New Doc => Origin Doc //===================================================================================== syncOriginDocBaseWithNewDoc(building_floor_doc_base); //===================================================================================== // Doc => Attribute //===================================================================================== var building_floor_attrib = building_floor_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(building_floor_attrib, () => $"building_floor_attrib is null !!!"); LandMetaId = building_floor_attrib.LandMetaId; BuildingMetaId = building_floor_attrib.BuildingMetaId; Floor = building_floor_attrib.Floor; OwnerGuid = building_floor_attrib.OwnerGuid; MyhomeGuid = building_floor_attrib.MyhomeGuid; InstanceName = building_floor_attrib.InstanceName; ThumbnailImageId = building_floor_attrib.ThumbnailImageId; ListImageId = building_floor_attrib.ListImageId; EnterPlayerCount = building_floor_attrib.EnterPlayerCount; RentalPeriod = building_floor_attrib.RentalPeriod; RentalStartTime = building_floor_attrib.RentalStartTime; RentalFinishTime = building_floor_attrib.RentalFinishTime; 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 building_floor_attribute = otherEntityAttribute as BuildingFloorAttribute; if (null == building_floor_attribute) { err_msg = $"Failed to cast BuildingFloorAttribute !!!, building_floor_attribute is null"; result.setFail(ServerErrorCode.ClassTypeCastIsNull, err_msg); Log.getLogger().error(result.toBasicString()); return result; } LandMetaId = building_floor_attribute.LandMetaId; BuildingMetaId = building_floor_attribute.BuildingMetaId; Floor = building_floor_attribute.Floor; OwnerGuid = building_floor_attribute.OwnerGuid; MyhomeGuid = building_floor_attribute.MyhomeGuid; InstanceName = building_floor_attribute.InstanceName; ThumbnailImageId = building_floor_attribute.ThumbnailImageId; ListImageId = building_floor_attribute.ListImageId; EnterPlayerCount = building_floor_attribute.EnterPlayerCount; RentalPeriod = building_floor_attribute.RentalPeriod; RentalStartTime = building_floor_attribute.RentalStartTime; RentalFinishTime = building_floor_attribute.RentalFinishTime; //===================================================================================== // Attribute Try Pending Doc => Origin Doc //===================================================================================== var try_pending_doc = building_floor_attribute.getTryPendingDocBase() as AccountBaseDoc; if (null != try_pending_doc) { building_floor_attribute.resetTryPendingDocBase(); syncOriginDocBaseWithNewDoc(try_pending_doc); } var origin_doc_base = getOriginDocBase(); if (null == origin_doc_base) { // DB 에 저장되어 있지 않는 경우 OriginDoc은 null 이다 !!! return result; } var building_floor_attrib = origin_doc_base.getAttrib(); NullReferenceCheckHelper.throwIfNull(building_floor_attrib, () => $"building_floor_attrib is null !!! - {owner.toBasicString()}"); building_floor_attrib.LandMetaId = LandMetaId; building_floor_attrib.BuildingMetaId = BuildingMetaId; building_floor_attrib.Floor = Floor; building_floor_attrib.OwnerGuid = OwnerGuid; building_floor_attrib.MyhomeGuid = MyhomeGuid; building_floor_attrib.InstanceName = InstanceName; building_floor_attrib.ThumbnailImageId = ThumbnailImageId; building_floor_attrib.ListImageId = ListImageId; building_floor_attrib.EnterPlayerCount = EnterPlayerCount; building_floor_attrib.RentalPeriod = RentalPeriod; building_floor_attrib.RentalStartTime = RentalStartTime; building_floor_attrib.RentalFinishTime = RentalFinishTime; return result; } } public class BuildingFloorAttributeTransactor : EntityAttributeTransactorBase, ICopyEntityAttributeTransactorFromEntityAttribute { public BuildingFloorAttributeTransactor(EntityBase owner) : base(owner) { } public bool copyEntityAttributeTransactorFromEntityAttribute(EntityAttributeBase? entityAttributeBase) { var err_msg = string.Empty; var to_cast_string = typeof(BuildingFloorAttribute).Name; var copy_from_building_floor_attribute = entityAttributeBase as BuildingFloorAttribute; if (null == copy_from_building_floor_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorBaseFromEntityAttribute() !!!, copy_from_building_floor_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } var copy_to_building_floor_attribute = getClonedEntityAttribute() as BuildingFloorAttribute; if (null == copy_to_building_floor_attribute) { err_msg = $"Failed to copyEntityAttributeTransactorBaseFromEntityAttribute() !!!, copy_to_building_floor_attribute is null :{to_cast_string}"; Log.getLogger().error(err_msg); return false; } copy_to_building_floor_attribute.LandMetaId = copy_from_building_floor_attribute.LandMetaId; copy_to_building_floor_attribute.BuildingMetaId = copy_from_building_floor_attribute.BuildingMetaId; copy_to_building_floor_attribute.Floor = copy_from_building_floor_attribute.Floor; copy_to_building_floor_attribute.OwnerGuid = copy_from_building_floor_attribute.OwnerGuid; copy_to_building_floor_attribute.MyhomeGuid = copy_from_building_floor_attribute.MyhomeGuid; copy_to_building_floor_attribute.InstanceName = copy_from_building_floor_attribute.InstanceName; copy_to_building_floor_attribute.ThumbnailImageId = copy_from_building_floor_attribute.ThumbnailImageId; copy_to_building_floor_attribute.ListImageId = copy_from_building_floor_attribute.ListImageId; copy_to_building_floor_attribute.EnterPlayerCount = copy_from_building_floor_attribute.EnterPlayerCount; copy_to_building_floor_attribute.RentalPeriod = copy_from_building_floor_attribute.RentalPeriod; copy_to_building_floor_attribute.RentalStartTime = copy_from_building_floor_attribute.RentalStartTime; copy_to_building_floor_attribute.RentalFinishTime = copy_from_building_floor_attribute.RentalFinishTime; return true; } } }