public static async Task <ValidatedView> UpdateHangar(int accountId, HangarView hangarView)
        {
            if (!hangarView.IsValid(out string message))
            {
                return(ValidatedView.Invalid(message));
            }

            try {
                HangarModel hangarModel = Mapper <HangarView> .Map(hangarView, new HangarModel { AccountID = accountId });

                hangarModel.Configuration_1 = Mapper <ConfigurationView> .Map <Configuration>(hangarView.Configuration_1);

                hangarModel.Configuration_2 = Mapper <ConfigurationView> .Map <Configuration>(hangarView.Configuration_2);

                ReplaceOneResult result = await Model <HangarModel> .AsCollection()
                                          .ReplaceOneAsync(x => x.AccountID == accountId && x.ShipID == hangarView.ShipID, hangarModel);

                if (result.IsModifiedCountAvailable && result.ModifiedCount == 1)
                {
                    return(ValidatedView.Valid());
                }
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
        public static async Task <ValidatedView> UpdateHangar(int accountId, HangarDetailView hangarDetailView)
        {
            if (!hangarDetailView.IsValid(out string message))
            {
                return(ValidatedView.Invalid(message));
            }

            try {
                if (GameManager.Get(accountId, out PlayerController controller) && !controller.ZoneAssembly.CanEquip)
                {
                    return(ValidatedView.Invalid(ErrorCode.EQUIPMENT_NOT_POSSIBLE));
                }

                HangarModel hangarModel = await Model <HangarModel> .AsQueryable()
                                          .FirstOrDefault(x => x.AccountID == accountId && x.ShipID == hangarDetailView.ShipID);

                if (hangarModel == null)
                {
                    return(ValidatedView <HangarView> .Invalid(ErrorCode.NO_HANGAR_FOUND));
                }

                if (controller != null && controller.HangarAssembly.Ship.ID == hangarDetailView.ShipID)
                {
                    HangarView hangarView = Mapper <HangarModel> .Map <HangarView>(hangarModel);

                    hangarView.Configuration_1 = hangarDetailView.Configuration_1;
                    hangarView.Configuration_2 = hangarDetailView.Configuration_2;

                    UpdateHangarIngame(accountId, hangarView);
                }
                else
                {
                    hangarModel.Configuration_1 = Mapper <ConfigurationView> .Map <Configuration>(hangarDetailView.Configuration_1);

                    hangarModel.Configuration_2 = Mapper <ConfigurationView> .Map <Configuration>(hangarDetailView.Configuration_2);

                    ReplaceOneResult result = await Model <HangarModel> .AsCollection()
                                              .ReplaceOneAsync(x => x.AccountID == accountId && x.ShipID == hangarDetailView.ShipID, hangarModel);
                }

                return(ValidatedView.Valid());
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
        public static async Task <ValidatedView> ActivateHangar(int accountId, int shipId)
        {
            try {
                if (GameManager.Get(accountId, out PlayerController controller) && !controller.ZoneAssembly.CanEquip)
                {
                    return(ValidatedView.Invalid(ErrorCode.EQUIPMENT_NOT_POSSIBLE));
                }

                HangarModel hangarModel = await Model <HangarModel> .AsQueryable()
                                          .FirstOrDefault(x => x.AccountID == accountId && x.ShipID == shipId);

                if (hangarModel == null)
                {
                    return(ValidatedView <HangarView> .Invalid(ErrorCode.NO_HANGAR_FOUND));
                }

                if (await Model <AccountModel> .AsQueryable()
                    .Any(x => x.ID == accountId && x.ActiveShipID == shipId))
                {
                    return(ValidatedView.Invalid(ErrorCode.HANGAR_ALREADY_ACTIVE));
                }

                if (controller != null)
                {
                    HangarView hangarView = Mapper <HangarModel> .Map <HangarView>(hangarModel);

                    hangarView.Configuration_1 = Mapper <Configuration> .Map <ConfigurationView>(hangarModel.Configuration_1);

                    hangarView.Configuration_2 = Mapper <Configuration> .Map <ConfigurationView>(hangarModel.Configuration_2);

                    UpdateHangarIngame(accountId, hangarView);
                }

                await Model <AccountModel> .AsCollection()
                .UpdateOneAsync(x => x.ID == accountId,
                                new UpdateDefinitionBuilder <AccountModel>()
                                .Set(x => x.ActiveShipID, shipId));

                return(ValidatedView.Valid());
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView.Invalid(ErrorCode.OPERATION_FAILED));
        }
        public static async Task <ValidatedView <HangarView> > RetrieveHangar(int accountId, int shipId)
        {
            try {
                HangarModel hangarModel = await Model <HangarModel> .AsQueryable()
                                          .FirstOrDefault(x => x.AccountID == accountId && x.ShipID == shipId);

                if (hangarModel == null)
                {
                    return(ValidatedView <HangarView> .Invalid(ErrorCode.NO_HANGAR_FOUND));
                }

                HangarView hangarView = Mapper <HangarModel> .Map <HangarView>(hangarModel);

                hangarView.Configuration_1 = Mapper <Configuration> .Map <ConfigurationView>(hangarModel.Configuration_1);

                hangarView.Configuration_2 = Mapper <Configuration> .Map <ConfigurationView>(hangarModel.Configuration_2);

                return(ValidatedView <HangarView> .Valid(hangarView));
            } catch (Exception e) {
                GameContext.Logger.LogError(e);
            }
            return(ValidatedView <HangarView> .Invalid(ErrorCode.OPERATION_FAILED));
        }