Initial implementation of missing UserOrganization client methods

This commit is contained in:
Ryan Gribble
2016-02-14 00:59:30 +10:00
parent 307b1b8b41
commit 1b3fef81f2
15 changed files with 734 additions and 45 deletions
@@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using NSubstitute;
using Octokit.Tests.Helpers;
@@ -9,6 +10,174 @@ namespace Octokit.Tests.Clients
{
public class UserAdministrationClientTests
{
public class TheCreateMethod
{
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Create(null));
}
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/users";
client.Create(new NewUser("name", "email@company.com"));
connection.Received().Post<User>(
Arg.Is<Uri>(u => u.ToString() == expectedUri),
Arg.Any<object>());
}
[Fact]
public void PassesRequestObject()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
client.Create(new NewUser("name", "email@company.com"));
connection.Received().Post<User>(
Arg.Any<Uri>(),
Arg.Is<NewUser>(a =>
a.Login == "name" &&
a.Email == "email@company.com"));
}
}
public class TheRenameMethod
{
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Rename(null, new UserRename("newlogin")));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Rename("login", null));
}
[Fact]
public async Task EnsuresNonEmptyString()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
var exception = await Assert.ThrowsAsync<ArgumentException>(() => client.Rename("", new UserRename()));
Assert.Equal("login", exception.ParamName);
}
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/users/auser";
client.Rename("auser", new UserRename());
connection.Received().Patch<UserRenameResponse>(
Arg.Is<Uri>(u => u.ToString() == expectedUri),
Arg.Any<object>());
}
[Fact]
public void PassesRequestObject()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
client.Rename("auser", new UserRename("newlogin"));
connection.Received().Patch<UserRenameResponse>(
Arg.Any<Uri>(),
Arg.Is<UserRename>(a =>
a.Login == "newlogin"));
}
}
public class TheCreateImpersonationTokenMethod
{
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateImpersonationToken(null, new NewImpersonationToken()));
await Assert.ThrowsAsync<ArgumentNullException>(() => client.CreateImpersonationToken("login", null));
}
[Fact]
public async Task EnsuresNonEmptyString()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
var exception = await Assert.ThrowsAsync<ArgumentException>(() => client.CreateImpersonationToken("", new NewImpersonationToken()));
Assert.Equal("login", exception.ParamName);
}
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/users/auser/authorizations";
client.CreateImpersonationToken("auser", new NewImpersonationToken());
connection.Received().Post<Authorization>(
Arg.Is<Uri>(u => u.ToString() == expectedUri),
Arg.Any<object>());
}
[Fact]
public void PassesRequestObject()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
string[] scopes = new string[] { "public-repo" };
client.CreateImpersonationToken("auser", new NewImpersonationToken(scopes));
connection.Received().Post<Authorization>(
Arg.Any<Uri>(),
Arg.Is<NewImpersonationToken>(a =>
a.Scopes.Count() == scopes.Count() &&
a.Scopes.ToList().All(s => scopes.Contains(s)) &&
scopes.ToList().All(s => a.Scopes.Contains(s))));
}
}
public class TheDeleteImpersonationTokenMethod
{
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.DeleteImpersonationToken(null));
}
[Fact]
public async Task EnsuresNonEmptyString()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
var exception = await Assert.ThrowsAsync<ArgumentException>(() => client.DeleteImpersonationToken(""));
Assert.Equal("login", exception.ParamName);
}
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/users/auser/authorizations";
client.DeleteImpersonationToken("auser");
connection.Connection.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
public class ThePromoteMethod
{
[Fact]
@@ -32,11 +201,14 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "users/auser/site_admin";
client.Promote("auser");
connection.Received().Put(Arg.Is<Uri>(u => u.ToString() == "/users/auser/site_admin"));
connection.Received().Put(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
public class TheDemoteMethod
{
[Fact]
@@ -60,9 +232,11 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "users/auser/site_admin";
client.Demote("auser");
connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "/users/auser/site_admin"));
connection.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
@@ -89,9 +263,11 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "users/auser/suspended";
client.Suspend("auser");
connection.Received().Put(Arg.Is<Uri>(u => u.ToString() == "/users/auser/suspended"));
connection.Received().Put(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
@@ -118,9 +294,74 @@ namespace Octokit.Tests.Clients
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "users/auser/suspended";
client.Unsuspend("auser");
connection.Received().Delete(Arg.Is<Uri>(u => u.ToString() == "/users/auser/suspended"));
connection.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
public class TheListAllPublicKeysMethod
{
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/keys";
client.ListAllPublicKeys();
connection.Received().GetAll<PublicKey>(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
public class TheDeleteMethod
{
[Fact]
public async Task EnsuresNonNullArguments()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
await Assert.ThrowsAsync<ArgumentNullException>(() => client.Delete(null));
}
[Fact]
public async Task EnsuresNonEmptyString()
{
var client = new UserAdministrationClient(Substitute.For<IApiConnection>());
var exception = await Assert.ThrowsAsync<ArgumentException>(() => client.Delete(""));
Assert.Equal("login", exception.ParamName);
}
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/users/auser";
client.Delete("auser");
connection.Connection.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
public class TheDeletePublicKeyMethod
{
[Fact]
public void RequestsTheCorrectUrl()
{
var connection = Substitute.For<IApiConnection>();
var client = new UserAdministrationClient(connection);
var expectedUri = "admin/keys/1";
client.DeletePublicKey(1);
connection.Connection.Received().Delete(
Arg.Is<Uri>(u => u.ToString() == expectedUri));
}
}
}
+99 -18
View File
@@ -1,56 +1,137 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace Octokit
{ /// <summary>
/// A client for GitHub's User Administration API.
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/v3/users/administration/">Administration API documentation</a> for more details.
/// </remarks>
{
/// <summary>
/// A client for GitHub's User Administration API (GitHub Enterprise)
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/v3/users/administration/">Administration API documentation</a> for more details.
/// </remarks>
public interface IUserAdministrationClient
{
/// <summary>
/// Promotes ordinary user to a site administrator.
/// Create a new user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#create-a-new-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="newUser">The <see cref="NewUser"/> object describing the user to create</param>
/// <returns>The created <see cref="User"/> object</returns>
Task<User> Create(NewUser newUser);
/// <summary>
/// Rename an existing user (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#rename-an-existing-user">API documentation</a>
/// for more information.
/// Note that this queues a request to rename a user, rather than execute it straight away
/// </remarks>
/// <param name="login">The username to rename</param>
/// <param name="userRename">The <see cref="UserRename"/> request, specifying the new login</param>
/// <returns>A <see cref="UserRenameResponse"/> object indicating the queued task message and Url to the user</returns>
Task<UserRenameResponse> Rename(string login, UserRename userRename);
/// <summary>
/// Create an impersonation OAuth token (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#create-an-impersonation-oauth-token">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to impersonate</param>
/// <param name="newImpersonationToken">The <see cref="NewImpersonationToken"/> request specifying the required scopes</param>
/// <returns>An <see cref="Authorization"/> object containing the impersonation token</returns>
Task<Authorization> CreateImpersonationToken(string login, NewImpersonationToken newImpersonationToken);
/// <summary>
/// Deletes an impersonation OAuth token (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-an-impersonation-oauth-token">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to remove impersonation token from</param>
/// <returns></returns>
Task DeleteImpersonationToken(string login);
/// <summary>
/// Promotes ordinary user to a site administrator (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to promote to administrator.</param>
/// <returns></returns>
Task Promote(string login);
/// <summary>
/// Demotes a site administrator to an ordinary user.
/// Demotes a site administrator to an ordinary user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user
/// See the <a href="https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to demote from administrator.</param>
/// <returns></returns>
Task Demote(string login);
/// <summary>
/// Suspends a user.
/// Suspends a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#suspend-a-user
/// See the <a href="https://developer.github.com/v3/users/administration/#suspend-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to suspend.</param>
/// <returns></returns>
Task Suspend(string login);
/// <summary>
/// Unsuspends a user.
/// Unsuspends a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#unsuspend-a-user
/// See the <a href="https://developer.github.com/v3/users/administration/#unsuspend-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to unsuspend.</param>
/// <returns></returns>
Task Unsuspend(string login);
/// <summary>
/// List all public keys (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#list-all-public-keys">API documentation</a>
/// for more information.
/// </remarks>
/// <returns></returns>
Task<IReadOnlyList<PublicKey>> ListAllPublicKeys();
/// <summary>
/// Delete a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to delete</param>
/// <returns></returns>
Task Delete(string login);
/// <summary>
/// Delete a public key (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-a-public-key">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="keyId">The key to delete</param>
/// <returns></returns>
Task DeletePublicKey(int keyId);
}
}
+162 -17
View File
@@ -1,13 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.Generic;
using System.Net;
using System.Threading.Tasks;
namespace Octokit
{
/// <summary>
/// A client for GitHub's User Administration API.
/// A client for GitHub's User Administration API (GitHub Enterprise)
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/v3/users/administration/">Administration API documentation</a> for more details.
@@ -24,63 +22,210 @@ namespace Octokit
}
/// <summary>
/// Promotes ordinary user to a site administrator.
/// Create a new user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#create-a-new-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="newUser">The <see cref="NewUser"/> object describing the user to create</param>
/// <returns>The created <see cref="User"/> object</returns>
public Task<User> Create(NewUser newUser)
{
Ensure.ArgumentNotNull(newUser, "newUser");
var endpoint = ApiUrls.UserAdministration();
return ApiConnection.Post<User>(endpoint, newUser);
}
/// <summary>
/// Rename an existing user (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#rename-an-existing-user">API documentation</a>
/// for more information.
/// Note that this queues a request to rename a user, rather than execute it straight away
/// </remarks>
/// <param name="login">The username to rename</param>
/// <param name="userRename">The <see cref="UserRename"/> request, specifying the new login</param>
/// <returns>A <see cref="UserRenameResponse"/> object indicating the queued task message and Url to the user</returns>
public Task<UserRenameResponse> Rename(string login, UserRename userRename)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
Ensure.ArgumentNotNull(userRename, "userRename");
var endpoint = ApiUrls.UserAdministration(login);
return ApiConnection.Patch<UserRenameResponse>(endpoint, userRename);
}
/// <summary>
/// Create an impersonation OAuth token (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#create-an-impersonation-oauth-token">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to impersonate</param>
/// <param name="newImpersonationToken">The <see cref="NewImpersonationToken"/> request specifying the required scopes</param>
/// <returns>An <see cref="Authorization"/> object containing the impersonation token</returns>
public Task<Authorization> CreateImpersonationToken(string login, NewImpersonationToken newImpersonationToken)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
Ensure.ArgumentNotNull(newImpersonationToken, "newImpersonationToken");
var endpoint = ApiUrls.UserAdministrationAuthorization(login);
return ApiConnection.Post<Authorization>(endpoint, newImpersonationToken);
}
/// <summary>
/// Deletes an impersonation OAuth token (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-an-impersonation-oauth-token">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to remove impersonation token from</param>
/// <returns></returns>
public async Task DeleteImpersonationToken(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserAdministrationAuthorization(login);
var response = ((HttpStatusCode)await Connection.Delete(endpoint));
if (response != HttpStatusCode.NoContent)
{
throw new ApiException("Invalid Status Code returned. Expected a 204", response);
}
return;
}
/// <summary>
/// Promotes ordinary user to a site administrator (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/v3/users/administration/#promote-an-ordinary-user-to-a-site-administrator">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to promote to administrator.</param>
/// <returns></returns>
public Task Promote(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserAdministration(login);
var endpoint = ApiUrls.UserAdministrationSiteAdmin(login);
return ApiConnection.Put(endpoint);
}
/// <summary>
/// Demotes a site administrator to an ordinary user.
/// Demotes a site administrator to an ordinary user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user
/// See the <a href="https://developer.github.com/v3/users/administration/#demote-a-site-administrator-to-an-ordinary-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to demote from administrator.</param>
/// <returns></returns>
public Task Demote(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserAdministration(login);
var endpoint = ApiUrls.UserAdministrationSiteAdmin(login);
return ApiConnection.Delete(endpoint);
}
/// <summary>
/// Suspends a user.
/// Suspends a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#suspend-a-user
/// See the <a href="https://developer.github.com/v3/users/administration/#suspend-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to suspend.</param>
/// <returns></returns>
public Task Suspend(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserSuspension(login);
var endpoint = ApiUrls.UserAdministrationSuspension(login);
return ApiConnection.Put(endpoint);
}
/// <summary>
/// Unsuspends a user.
/// Unsuspends a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// https://developer.github.com/v3/users/administration/#unsuspend-a-user
/// See the <a href="https://developer.github.com/v3/users/administration/#unsuspend-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to unsuspend.</param>
/// <returns></returns>
public Task Unsuspend(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserSuspension(login);
var endpoint = ApiUrls.UserAdministrationSuspension(login);
return ApiConnection.Delete(endpoint);
}
/// <summary>
/// List all public keys (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#list-all-public-keys">API documentation</a>
/// for more information.
/// </remarks>
/// <returns></returns>
public Task<IReadOnlyList<PublicKey>> ListAllPublicKeys()
{
var endpoint = ApiUrls.UserAdministrationPublicKeys();
return ApiConnection.GetAll<PublicKey>(endpoint);
}
/// <summary>
/// Delete a user (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-a-user">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="login">The user to delete</param>
/// <returns></returns>
public async Task Delete(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
var endpoint = ApiUrls.UserAdministration(login);
var response = ((HttpStatusCode)await Connection.Delete(endpoint));
if (response != HttpStatusCode.NoContent)
{
throw new ApiException("Invalid Status Code returned. Expected a 204", response);
}
return;
}
/// <summary>
/// Delete a public key (must be Site Admin user).
/// </summary>
/// <remarks>
/// See the <a href="https://developer.github.com/enterprise/2.5/v3/users/administration/#delete-a-public-key">API documentation</a>
/// for more information.
/// </remarks>
/// <param name="keyId">The key to delete</param>
/// <returns></returns>
public async Task DeletePublicKey(int keyId)
{
Ensure.ArgumentNotNull(keyId, "keyId");
var endpoint = ApiUrls.UserAdministrationPublicKeys(keyId);
var response = ((HttpStatusCode)await Connection.Delete(endpoint));
if (response != HttpStatusCode.NoContent)
{
throw new ApiException("Invalid Status Code returned. Expected a 204", response);
}
return;
}
}
}
+29 -4
View File
@@ -1699,14 +1699,39 @@ namespace Octokit
return "staff/indexing_jobs".FormatUri();
}
public static Uri UserAdministration()
{
return "admin/users".FormatUri();
}
public static Uri UserAdministration(string login)
{
return "admin/users/{0}".FormatUri(login);
}
public static Uri UserAdministrationAuthorization(string login)
{
return "admin/users/{0}/authorizations".FormatUri(login);
}
public static Uri UserAdministrationPublicKeys()
{
return "admin/keys".FormatUri();
}
public static Uri UserAdministrationPublicKeys(int keyId)
{
return "admin/keys/{0}".FormatUri(keyId);
}
/// <summary>
/// Creates the relative <see cref="Uri"/> for altering administration status of a user.
/// </summary>
/// <param name="login">The login for the intended user.</param>
/// <returns></returns>
public static Uri UserAdministration(string login)
public static Uri UserAdministrationSiteAdmin(string login)
{
return "/users/{0}/site_admin".FormatUri(login);
return "users/{0}/site_admin".FormatUri(login);
}
/// <summary>
@@ -1714,9 +1739,9 @@ namespace Octokit
/// </summary>
/// <param name="login">The login for the intended user.</param>
/// <returns></returns>
public static Uri UserSuspension(string login)
public static Uri UserAdministrationSuspension(string login)
{
return "/users/{0}/suspended".FormatUri(login);
return "users/{0}/suspended".FormatUri(login);
}
}
}
@@ -0,0 +1,38 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
/// <summary>
/// Describes a new Impersonation Token to create via the <see cref="IUserAdministrationClient.CreateImpersonationToken(string, NewImpersonationToken)"/> method.
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class NewImpersonationToken
{
public NewImpersonationToken() { }
/// <summary>
/// Initializes a new instance of the <see cref="NewImpersonationToken"/> class.
/// </summary>
/// <param name="scopes">The scopes for the token.</param>
public NewImpersonationToken(IEnumerable<string> scopes)
{
Scopes = scopes;
}
/// <summary>
/// The scopes for the token
/// </summary>
public IEnumerable<string> Scopes { get; set; }
internal string DebuggerDisplay
{
get
{
return string.Format(CultureInfo.InvariantCulture, "Scopes: {0}", string.Join("\r\n", Scopes));
}
}
}
}
+48
View File
@@ -0,0 +1,48 @@
using System;
using System.Diagnostics;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
namespace Octokit
{
/// <summary>
/// Describes a new user to create via the <see cref="IUserAdministrationClient.Create(NewUser)"/> method.
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class NewUser
{
public NewUser() { }
/// <summary>
/// Initializes a new instance of the <see cref="NewUser"/> class.
/// </summary>
/// <param name="login">The login for the user.</param>
/// <param name="email">The email address of the user</param>
public NewUser(string login, string email)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
Ensure.ArgumentNotNullOrEmptyString(email, "email");
Login = login;
Email = email;
}
/// <summary>
/// Login of the user
/// </summary>
public string Login { get; protected set; }
/// <summary>
/// Email address of the user
/// </summary>
public string Email { get; protected set; }
internal string DebuggerDisplay
{
get
{
return string.Format(CultureInfo.InvariantCulture, "Login: {0} Email: {1}", Login, Email);
}
}
}
}
+38
View File
@@ -0,0 +1,38 @@
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
/// <summary>
/// Describes the new login when renaming a user via the <see cref="IUserAdministrationClient.Rename(string, UserRename)"/> method.
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class UserRename
{
public UserRename() { }
/// <summary>
/// Initializes a new instance of the <see cref="UserRename"/> class.
/// </summary>
/// <param name="login">The new login for the user.</param>
public UserRename(string login)
{
Ensure.ArgumentNotNullOrEmptyString(login, "login");
Login = login;
}
/// <summary>
/// The new username for the user
/// </summary>
public string Login { get; protected set; }
internal string DebuggerDisplay
{
get
{
return string.Format(CultureInfo.InvariantCulture, "Login: {0}", Login);
}
}
}
}
+12 -1
View File
@@ -14,11 +14,12 @@ namespace Octokit
{
public User() { }
public User(string avatarUrl, string bio, string blog, int collaborators, string company, DateTimeOffset createdAt, int diskUsage, string email, int followers, int following, bool? hireable, string htmlUrl, int totalPrivateRepos, int id, string location, string login, string name, int ownedPrivateRepos, Plan plan, int privateGists, int publicGists, int publicRepos, string url, bool siteAdmin, string ldapDistinguishedName)
public User(string avatarUrl, string bio, string blog, int collaborators, string company, DateTimeOffset createdAt, int diskUsage, string email, int followers, int following, bool? hireable, string htmlUrl, int totalPrivateRepos, int id, string location, string login, string name, int ownedPrivateRepos, Plan plan, int privateGists, int publicGists, int publicRepos, string url, bool siteAdmin, string ldapDistinguishedName, DateTimeOffset? suspendedAt)
: base(avatarUrl, bio, blog, collaborators, company, createdAt, diskUsage, email, followers, following, hireable, htmlUrl, totalPrivateRepos, id, location, login, name, ownedPrivateRepos, plan, privateGists, publicGists, publicRepos, AccountType.User, url)
{
SiteAdmin = siteAdmin;
LdapDistinguishedName = ldapDistinguishedName;
SuspendedAt = suspendedAt;
}
/// <summary>
@@ -26,6 +27,16 @@ namespace Octokit
/// </summary>
public bool SiteAdmin { get; protected set; }
/// <summary>
/// When the user was suspended, if at all (GitHub Enterprise)
/// </summary>
public DateTimeOffset? SuspendedAt { get; protected set; }
/// <summary>
/// Whether or not the user is currently suspended
/// </summary>
public bool Suspended { get { return SuspendedAt.HasValue; } }
/// <summary>
/// LDAP Binding (GitHub Enterprise only)
/// </summary>
@@ -0,0 +1,38 @@
using System.Diagnostics;
using System.Globalization;
namespace Octokit
{
/// <summary>
/// Represents the response information from a <see cref="UserAdministrationClient.Rename(string, UserRename)"/> operation
/// </summary>
[DebuggerDisplay("{DebuggerDisplay,nq}")]
public class UserRenameResponse
{
public UserRenameResponse() { }
public UserRenameResponse(string message, string url)
{
Message = message;
Url = url;
}
/// <summary>
/// Message indiating if the Rename request was queued
/// </summary>
public string Message { get; protected set; }
/// <summary>
/// Url to the user that will be renamed
/// </summary>
public string Url { get; protected set; }
internal string DebuggerDisplay
{
get
{
return string.Format(CultureInfo.InvariantCulture, "Message: {0}", Message);
}
}
}
}
+4
View File
@@ -452,6 +452,10 @@
<Compile Include="Clients\Enterprise\IEnterpriseLdapClient.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Response\Enterprise\LdapSyncResponse.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
</Project>
+4
View File
@@ -460,6 +460,10 @@
<Compile Include="Clients\Enterprise\IEnterpriseLdapClient.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Response\Enterprise\LdapSyncResponse.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Novell\Novell.MonoDroid.CSharp.targets" />
</Project>
+4
View File
@@ -456,6 +456,10 @@
<Compile Include="Clients\Enterprise\IEnterpriseLdapClient.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Response\Enterprise\LdapSyncResponse.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
</ItemGroup>
<Import Project="$(MSBuildExtensionsPath)\Xamarin\iOS\Xamarin.MonoTouch.CSharp.targets" />
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
+4
View File
@@ -449,6 +449,10 @@
<Compile Include="Clients\Enterprise\IEnterpriseLdapClient.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Response\Enterprise\LdapSyncResponse.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+4
View File
@@ -456,6 +456,10 @@
<Compile Include="Clients\Enterprise\IEnterpriseLdapClient.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Response\Enterprise\LdapSyncResponse.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
</ItemGroup>
<ItemGroup>
<CodeAnalysisDictionary Include="..\CustomDictionary.xml">
+5 -1
View File
@@ -113,12 +113,14 @@
<Compile Include="Http\ProductHeaderValue.cs" />
<Compile Include="Http\RequestBody.cs" />
<Compile Include="Models\Request\BranchUpdate.cs" />
<Compile Include="Models\Request\NewImpersonationToken.cs" />
<Compile Include="Models\Request\Enterprise\NewLdapMapping.cs" />
<Compile Include="Models\Request\GistFileUpdate.cs" />
<Compile Include="Models\Request\NewArbitraryMarkDown.cs" />
<Compile Include="Models\Request\Enterprise\NewOrganization.cs" />
<Compile Include="Models\Request\NewMerge.cs" />
<Compile Include="Models\Request\NewRepositoryWebHook.cs" />
<Compile Include="Models\Request\NewUser.cs" />
<Compile Include="Models\Request\PublicRepositoryRequest.cs" />
<Compile Include="Models\Request\ReleaseAssetUpload.cs" />
<Compile Include="Models\Request\RepositoryForksListRequest.cs" />
@@ -132,6 +134,7 @@
<Compile Include="Models\Request\NewRelease.cs" />
<Compile Include="Models\Request\NotificationsRequest.cs" />
<Compile Include="Models\Request\CommitRequest.cs" />
<Compile Include="Models\Request\UserRename.cs" />
<Compile Include="Models\Response\ActivityPayloads\ActivityPayload.cs" />
<Compile Include="Models\Response\ActivityPayloads\CommitCommentPayload.cs" />
<Compile Include="Models\Response\ActivityPayloads\ForkEventPayload.cs" />
@@ -171,6 +174,7 @@
<Compile Include="Models\Response\PagesBuild.cs" />
<Compile Include="Models\Response\PublicKey.cs" />
<Compile Include="Models\Response\PullRequestFile.cs" />
<Compile Include="Models\Response\UserRenameResponse.cs" />
<Compile Include="Models\Response\ResourceRateLimit.cs" />
<Compile Include="Models\Response\RepositoryContent.cs" />
<Compile Include="Models\Response\RepositoryContentChangeSet.cs" />
@@ -488,4 +492,4 @@
<Target Name="AfterBuild">
</Target>
-->
</Project>
</Project>