Ejemplo n.º 1
0
        /// <summary>
        /// Create displaying everything. Having a key as null is fine - then everything
        /// starts out blank.
        /// </summary>
        /// <param name="key"></param>
        public AddOrUpdateIndicoApiKeyViewModel(IndicoApiKey key)
        {
            if (key == null)
            {
                SiteName  = "";
                ApiKey    = "";
                SecretKey = "";
            }
            else
            {
                SiteName  = key.Site;
                ApiKey    = key.ApiKey;
                SecretKey = key.SecretKey;
            }

            // Setup the add and update commands to work correctly.
            // A missing secret key is allowed.
            var addCanExe = this.WhenAny(x => x.SiteName, x => x.ApiKey, x => x.SecretKey, (site, apik, seck) => Tuple.Create(site.Value, apik.Value, seck.Value))
                            .Select(x => !string.IsNullOrWhiteSpace(x.Item1) && !string.IsNullOrWhiteSpace(x.Item2));

            AddUpdateCommand = ReactiveCommand.Create(addCanExe);

            var isKnownSite = new ReplaySubject <bool>(1);

            DeleteCommand = ReactiveCommand.Create(isKnownSite.StartWith(false));

            Observable.Merge(
                this.WhenAny(x => x.SiteName, x => x.Value),
                AddUpdateCommand.IsExecuting.Where(isexe => isexe == false).Select(_ => SiteName),
                DeleteCommand.IsExecuting.Where(isexe => isexe == false).Select(_ => SiteName)
                )
            .Select(sname => IndicoApiKeyAccess.GetKey(sname) != null)
            .Subscribe(gotit => isKnownSite.OnNext(gotit));

            isKnownSite
            .Select(known => known ? "Update" : "Add")
            .ToProperty(this, x => x.AddOrUpdateText, out _addOrUpdateText, "Add");

            // Add, update, or remove
            AddUpdateCommand
            .Subscribe(o => IndicoApiKeyAccess.UpdateKey(new IndicoApiKey()
            {
                Site = SiteName, ApiKey = ApiKey, SecretKey = SecretKey
            }));
            DeleteCommand
            .Subscribe(o => IndicoApiKeyAccess.RemoveKey(SiteName));
        }
        public void RemoveKey()
        {
            int count = 0;

            IndicoApiKeyAccess.IndicoApiKeysUpdated.Subscribe(x => count++);
            var k = new IndicoApiKey()
            {
                ApiKey = "key", SecretKey = "noway", Site = "indico.cern.ch"
            };

            IndicoApiKeyAccess.UpdateKey(k);
            IndicoApiKeyAccess.RemoveKey("indico.cern.ch");
            var fk = IndicoApiKeyAccess.GetKey("indico.cern.ch");

            Assert.IsNull(fk);
            Assert.AreEqual(2, count);
        }