public void Save(OAuthClient oauthClient)
        {
            if (oauthClient == null)
                throw new ArgumentNullException("oauthClient");

            _mongo.EnsureIdentity(oauthClient);
            _mongo.OAuthClients.Save(oauthClient);

            _mongo.OAuthGrants.Update(Query<OAuthGrant>.EQ(e => e.ClientID, oauthClient.ID),
                Update<OAuthGrant>.Set(e => e.Client, oauthClient), new MongoUpdateOptions { Flags = UpdateFlags.Multi });
        }
        public void Save(OAuthClient oauthClient)
        {
            if (oauthClient == null)
                throw new ArgumentNullException("oauthClient");

            using (var context = new DeviceHiveContext())
            {
                context.OAuthClients.Add(oauthClient);
                if (oauthClient.ID > 0)
                {
                    context.Entry(oauthClient).State = EntityState.Modified;
                }
                context.SaveChanges();
            }
        }
        /// <summary>
        /// Initializes all required properties.
        /// </summary>
        /// <param name="client">Associated OAuthClient object.</param>
        /// <param name="userId">Associated user identifier.</param>
        /// <param name="accessKey">Associated AccessKey object.</param>
        /// <param name="type">OAuth type.</param>
        /// <param name="scope">Requested OAuth scope.</param>
        public OAuthGrant(OAuthClient client, int userId, AccessKey accessKey, int type, string scope)
        {
            if (client == null)
                throw new ArgumentNullException("client");
            if (accessKey == null)
                throw new ArgumentNullException("accessKey");
            if (string.IsNullOrEmpty(scope))
                throw new ArgumentException("Scope is null or empty!", "scope");

            this.Timestamp = DateTime.UtcNow;
            this.Client = client;
            this.UserID = userId;
            this.AccessKey = accessKey;
            this.Type = type;
            this.Scope = scope;
        }
        public void OAuthGrant()
        {
            var user = new User("Test", 0, 0);
            user.SetPassword("pass");
            DataContext.User.Save(user);
            RegisterTearDown(() => DataContext.User.Delete(user.ID));

            var accessKey = new AccessKey(user.ID, AccessKeyType.OAuth, "test");
            DataContext.AccessKey.Save(accessKey);
            RegisterTearDown(() => DataContext.AccessKey.Delete(accessKey.ID));

            var client = new OAuthClient("Test", "test.com", "http://test.com/oauth2", "test_client");
            DataContext.OAuthClient.Save(client);
            RegisterTearDown(() => DataContext.OAuthClient.Delete(client.ID));

            var grant = new OAuthGrant(client, user.ID, accessKey, 0, "scope");
            grant.AuthCode = Guid.NewGuid();
            DataContext.OAuthGrant.Save(grant);
            RegisterTearDown(() => DataContext.OAuthGrant.Delete(grant.ID));

            // test GetByUser
            var grants = DataContext.OAuthGrant.GetByUser(user.ID);
            Assert.Greater(grants.Count, 0);

            // test Get(id)
            var grant1 = DataContext.OAuthGrant.Get(grant.ID);
            Assert.IsNotNull(grant1);
            Assert.Less(Math.Abs(DateTime.UtcNow.Subtract(grant1.Timestamp).TotalMinutes), 10);
            Assert.AreEqual(0, grant1.Type);
            Assert.AreEqual("scope", grant1.Scope);
            Assert.AreEqual(client.ID, grant1.ClientID);
            Assert.IsNotNull(grant1.Client);
            Assert.AreEqual(user.ID, grant1.UserID);
            Assert.AreEqual(accessKey.ID, grant1.AccessKeyID);
            Assert.IsNotNull(grant1.AccessKey);

            // test Get(authCode)
            var grant2 = DataContext.OAuthGrant.Get(grant.AuthCode.Value);
            Assert.IsNotNull(grant2);
            Assert.AreEqual(0, grant2.Type);
            Assert.AreEqual("scope", grant2.Scope);
            Assert.AreEqual(user.ID, grant2.UserID);
            Assert.AreEqual(client.ID, grant2.ClientID);
            Assert.IsNotNull(grant2.Client);
            Assert.AreEqual(accessKey.ID, grant2.AccessKeyID);
            Assert.IsNotNull(grant2.AccessKey);

            // test Save
            grant.AuthCode = Guid.NewGuid();
            grant.Type = 1;
            grant.AccessType = 1;
            grant.RedirectUri = "http://test.com/oauth";
            grant.Scope = "scope scope2";
            grant.Networks = new[] { 5, 10 };
            DataContext.OAuthGrant.Save(grant);
            var grant3 = DataContext.OAuthGrant.Get(grant.ID);
            Assert.AreEqual(grant.AuthCode, grant3.AuthCode);
            Assert.AreEqual(1, grant3.Type);
            Assert.AreEqual(1, grant3.AccessType);
            Assert.AreEqual("http://test.com/oauth", grant3.RedirectUri);
            Assert.AreEqual("scope scope2", grant3.Scope);
            Assert.AreEqual(2, grant3.Networks.Length);
            Assert.AreEqual(5, grant3.Networks[0]);
            Assert.AreEqual(10, grant3.Networks[1]);
            Assert.AreEqual(user.ID, grant3.UserID);
            Assert.AreEqual(client.ID, grant3.ClientID);
            Assert.IsNotNull(grant3.Client);
            Assert.AreEqual(accessKey.ID, grant3.AccessKeyID);
            Assert.IsNotNull(grant3.AccessKey);

            // test update relationship
            var client2 = new OAuthClient("Test2", "test2.com", "http://test.com/oauth/2", "test_client2");
            DataContext.OAuthClient.Save(client2);
            RegisterTearDown(() => DataContext.OAuthClient.Delete(client2.ID));
            grant.Client = client2;
            DataContext.OAuthGrant.Save(grant);
            var grant4 = DataContext.OAuthGrant.Get(grant.ID);
            Assert.AreEqual(client2.ID, grant4.ClientID);
            Assert.IsNotNull(grant4.Client);

            // test Delete
            DataContext.OAuthClient.Delete(grant.ID);
            var grant5 = DataContext.OAuthClient.Get(grant.ID);
            Assert.IsNull(grant5);
        }
        public void OAuthClient()
        {
            var client = new OAuthClient("Test", "test.com", "http://test.com/oauth2", "test_client");
            DataContext.OAuthClient.Save(client);
            RegisterTearDown(() => DataContext.OAuthClient.Delete(client.ID));

            // test GetAll
            var clients = DataContext.OAuthClient.GetAll();
            Assert.Greater(clients.Count, 0);

            // test Get(id)
            var client1 = DataContext.OAuthClient.Get(client.ID);
            Assert.IsNotNull(client1);
            Assert.AreEqual("Test", client1.Name);
            Assert.AreEqual("test.com", client1.Domain);
            Assert.AreEqual("http://test.com/oauth2", client1.RedirectUri);
            Assert.AreEqual("test_client", client1.OAuthID);
            Assert.IsNotNull(client1.OAuthSecret);

            // test Get(oauthId)
            var client2 = DataContext.OAuthClient.Get("test_client");
            Assert.IsNotNull(client2);

            // test Save
            client.Name = "Test2";
            client.Domain = "test2.com";
            client.Subnet = "127.0.0.1";
            client.RedirectUri = "http://test.com/oauth/2";
            client.OAuthID = "test_client2";
            DataContext.OAuthClient.Save(client);
            var client3 = DataContext.OAuthClient.Get(client.ID);
            Assert.AreEqual("Test2", client3.Name);
            Assert.AreEqual("test2.com", client3.Domain);
            Assert.AreEqual("127.0.0.1", client3.Subnet);
            Assert.AreEqual("http://test.com/oauth/2", client3.RedirectUri);
            Assert.AreEqual("test_client2", client3.OAuthID);

            // test Delete
            DataContext.OAuthClient.Delete(client.ID);
            var client4 = DataContext.OAuthClient.Get(client.ID);
            Assert.IsNull(client4);
        }