Skip to content

Commit bbb8d2b

Browse files
committed
Add get user by id and delete user
1 parent 4f7020b commit bbb8d2b

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
bin/
22
obj/
33
.vscode/
4+
.vs/
45

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,62 @@ public void TooLargeClaimsPayload()
7171
Assert.Throws<ArgumentException>(() => new UserRecord("user1") { CustomClaims = customClaims });
7272
}
7373

74+
[Fact]
75+
public async Task GetUserById()
76+
{
77+
var handler = new MockMessageHandler()
78+
{
79+
Response = new UserRecord("user1"),
80+
};
81+
var factory = new MockHttpClientFactory(handler);
82+
var userManager = new FirebaseUserManager(
83+
new FirebaseUserManagerArgs
84+
{
85+
Credential = MockCredential,
86+
ProjectId = MockProjectId,
87+
ClientFactory = factory,
88+
});
89+
await userManager.GetUserById("user1");
90+
}
91+
92+
[Fact]
93+
public async Task GetUserByIdIncorrectUid()
94+
{
95+
var handler = new MockMessageHandler()
96+
{
97+
Response = new UserRecord("testuser"),
98+
};
99+
var factory = new MockHttpClientFactory(handler);
100+
var userManager = new FirebaseUserManager(
101+
new FirebaseUserManagerArgs
102+
{
103+
Credential = MockCredential,
104+
ProjectId = MockProjectId,
105+
ClientFactory = factory,
106+
});
107+
await Assert.ThrowsAsync<FirebaseException>(
108+
async () => await userManager.GetUserById("user1"));
109+
}
110+
111+
[Fact]
112+
public async Task GetUserByIdHttpError()
113+
{
114+
var handler = new MockMessageHandler()
115+
{
116+
StatusCode = HttpStatusCode.Unauthorized,
117+
};
118+
var factory = new MockHttpClientFactory(handler);
119+
var userManager = new FirebaseUserManager(
120+
new FirebaseUserManagerArgs
121+
{
122+
Credential = MockCredential,
123+
ProjectId = MockProjectId,
124+
ClientFactory = factory,
125+
});
126+
await Assert.ThrowsAsync<FirebaseException>(
127+
async () => await userManager.GetUserById("user1"));
128+
}
129+
74130
[Fact]
75131
public async Task UpdateUser()
76132
{
@@ -165,5 +221,45 @@ public async Task UpdateUserHttpError()
165221
await Assert.ThrowsAsync<FirebaseException>(
166222
async () => await userManager.UpdateUserAsync(new UserRecord("user1") { CustomClaims = customClaims }));
167223
}
224+
225+
[Fact]
226+
public async Task DeleteUser()
227+
{
228+
var handler = new MockMessageHandler()
229+
{
230+
Response = new Dictionary<string, string>()
231+
{
232+
{ "kind", "identitytoolkit#DeleteAccountResponse" },
233+
},
234+
};
235+
var factory = new MockHttpClientFactory(handler);
236+
var userManager = new FirebaseUserManager(
237+
new FirebaseUserManagerArgs
238+
{
239+
Credential = MockCredential,
240+
ProjectId = MockProjectId,
241+
ClientFactory = factory,
242+
});
243+
await userManager.DeleteUser("user1");
244+
}
245+
246+
[Fact]
247+
public async Task DeleteUserHttpError()
248+
{
249+
var handler = new MockMessageHandler()
250+
{
251+
StatusCode = HttpStatusCode.Unauthorized,
252+
};
253+
var factory = new MockHttpClientFactory(handler);
254+
var userManager = new FirebaseUserManager(
255+
new FirebaseUserManagerArgs
256+
{
257+
Credential = MockCredential,
258+
ProjectId = MockProjectId,
259+
ClientFactory = factory,
260+
});
261+
await Assert.ThrowsAsync<FirebaseException>(
262+
async () => await userManager.DeleteUser("user1"));
263+
}
168264
}
169265
}

FirebaseAdmin/FirebaseAdmin/Auth/FirebaseUserManager.cs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using System.Collections.Generic;
1617
using System.Net.Http;
1718
using System.Threading;
1819
using System.Threading.Tasks;
@@ -60,6 +61,30 @@ public static FirebaseUserManager Create(FirebaseApp app)
6061
return new FirebaseUserManager(args);
6162
}
6263

64+
/// <summary>
65+
/// Get a user by id.
66+
/// </summary>
67+
/// <param name="uid">The query user id.</param>
68+
/// <param name="cancellationToken">For asynchronous operation.</param>
69+
/// <returns>A record of user with the queried id if one exists.</returns>
70+
public async Task<UserRecord> GetUserById(
71+
string uid, CancellationToken cancellationToken = default(CancellationToken))
72+
{
73+
const string getUserPath = "accounts:lookup";
74+
var payload = new Dictionary<string, object>()
75+
{
76+
{ "localId", uid },
77+
};
78+
var response = await this.PostAndDeserializeAsync<JObject>(
79+
getUserPath, payload, cancellationToken).ConfigureAwait(false);
80+
if (response == null || uid != (string)response["localId"])
81+
{
82+
throw new FirebaseException($"Failed to get user: {uid}");
83+
}
84+
85+
return new UserRecord((string)response["localId"]);
86+
}
87+
6388
/// <summary>
6489
/// Update an existing user.
6590
/// </summary>
@@ -79,6 +104,27 @@ public async Task UpdateUserAsync(
79104
}
80105
}
81106

107+
/// <summary>
108+
/// Delete user with a given id.
109+
/// </summary>
110+
/// <param name="uid">The delete query user id.</param>
111+
/// <param name="cancellationToken">For asynchronous operation.</param>
112+
public async Task DeleteUser(
113+
string uid, CancellationToken cancellationToken = default(CancellationToken))
114+
{
115+
const string getUserPath = "accounts:delete";
116+
var payload = new Dictionary<string, object>()
117+
{
118+
{ "localId", uid },
119+
};
120+
var response = await this.PostAndDeserializeAsync<JObject>(
121+
getUserPath, payload, cancellationToken).ConfigureAwait(false);
122+
if (response == null || (string)response["kind"] == null)
123+
{
124+
throw new FirebaseException($"Failed to delete user: {uid}");
125+
}
126+
}
127+
82128
public void Dispose()
83129
{
84130
this.httpClient.Dispose();

0 commit comments

Comments
 (0)