Skip to content

Commit 6cfdad8

Browse files
committed
Merge branch 'feat/fcm_options' of https://github.com/Odonno/firebase-admin-dotnet into feat/fcm_options
2 parents 3650f93 + 481c60e commit 6cfdad8

File tree

5 files changed

+335
-18
lines changed

5 files changed

+335
-18
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
# Unreleased
22

33
- [added] `WebpushFcmOptions` added to the `WebpushConfig` class.
4+
- [added] Implemented the `GetUserByEmailAsync()` and `GetUserByPhoneNumberAsync()`
5+
APIs in the `FirebaseAuth` class.
46

57
# v1.5.0
68

FirebaseAdmin/FirebaseAdmin.Snippets/FirebaseAuthSnippets.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,24 @@ internal static async Task GetUserAsync(string uid)
6767
// [END get_user_by_id]
6868
}
6969

70+
internal static async Task GetUserByEmailAsync(string email)
71+
{
72+
// [START get_user_by_email]
73+
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByEmailAsync(email);
74+
// See the UserRecord reference doc for the contents of userRecord.
75+
Console.WriteLine("Successfully fetched user data: {0}", userRecord.Uid);
76+
// [END get_user_by_email]
77+
}
78+
79+
internal static async Task GetUserByPhoneNumberAsync(string phoneNumber)
80+
{
81+
// [START get_user_by_phone]
82+
UserRecord userRecord = await FirebaseAuth.DefaultInstance.GetUserByPhoneNumberAsync(phoneNumber);
83+
// See the UserRecord reference doc for the contents of userRecord.
84+
Console.WriteLine("Successfully fetched user data: {0}", userRecord.Uid);
85+
// [END get_user_by_phone]
86+
}
87+
7088
internal static async Task DeleteUserAsync(string uid)
7189
{
7290
// [START delete_user]

FirebaseAdmin/FirebaseAdmin.Tests/Auth/FirebaseUserManagerTest.cs

Lines changed: 144 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public async Task GetUserById()
4545
};
4646
var userManager = this.CreateFirebaseUserManager(handler);
4747

48-
var userRecord = await userManager.GetUserById("user1");
48+
var userRecord = await userManager.GetUserByIdAsync("user1");
4949

5050
Assert.Equal("user1", userRecord.Uid);
5151
Assert.Null(userRecord.DisplayName);
@@ -60,6 +60,9 @@ public async Task GetUserById()
6060
Assert.Empty(userRecord.ProviderData);
6161
Assert.Null(userRecord.UserMetaData.CreationTimestamp);
6262
Assert.Null(userRecord.UserMetaData.LastSignInTimestamp);
63+
64+
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.Request);
65+
Assert.Equal(new JArray("user1"), request["localId"]);
6366
}
6467

6568
[Fact]
@@ -99,7 +102,7 @@ public async Task GetUserByIdWithProperties()
99102
};
100103
var userManager = this.CreateFirebaseUserManager(handler);
101104

102-
var userRecord = await userManager.GetUserById("user1");
105+
var userRecord = await userManager.GetUserByIdAsync("user1");
103106

104107
Assert.Equal("user1", userRecord.Uid);
105108
Assert.Equal("Test User", userRecord.DisplayName);
@@ -150,8 +153,145 @@ public async Task GetUserByIdUserNotFound()
150153
};
151154
var userManager = this.CreateFirebaseUserManager(handler);
152155

153-
await Assert.ThrowsAsync<FirebaseException>(
154-
async () => await userManager.GetUserById("user1"));
156+
var exception = await Assert.ThrowsAsync<FirebaseException>(
157+
async () => await userManager.GetUserByIdAsync("user1"));
158+
Assert.Equal("Failed to get user with uid: user1", exception.Message);
159+
}
160+
161+
[Fact]
162+
public async Task GetUserByIdNull()
163+
{
164+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
165+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByIdAsync(null));
166+
}
167+
168+
[Fact]
169+
public async Task GetUserByIdEmpty()
170+
{
171+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
172+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByIdAsync(string.Empty));
173+
}
174+
175+
[Fact]
176+
public async Task GetUserByEmail()
177+
{
178+
var handler = new MockMessageHandler()
179+
{
180+
Response = @"{""users"": [
181+
{
182+
""localId"": ""user1""
183+
}
184+
]}",
185+
};
186+
var userManager = this.CreateFirebaseUserManager(handler);
187+
188+
var userRecord = await userManager.GetUserByEmailAsync("[email protected]");
189+
190+
Assert.Equal("user1", userRecord.Uid);
191+
Assert.Null(userRecord.DisplayName);
192+
Assert.Null(userRecord.Email);
193+
Assert.Null(userRecord.PhoneNumber);
194+
Assert.Null(userRecord.PhotoUrl);
195+
Assert.Equal("firebase", userRecord.ProviderId);
196+
Assert.False(userRecord.Disabled);
197+
Assert.False(userRecord.EmailVerified);
198+
Assert.Equal(UserRecord.UnixEpoch, userRecord.TokensValidAfterTimestamp);
199+
Assert.Empty(userRecord.CustomClaims);
200+
Assert.Empty(userRecord.ProviderData);
201+
Assert.Null(userRecord.UserMetaData.CreationTimestamp);
202+
Assert.Null(userRecord.UserMetaData.LastSignInTimestamp);
203+
204+
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.Request);
205+
Assert.Equal(new JArray("[email protected]"), request["email"]);
206+
}
207+
208+
[Fact]
209+
public async Task GetUserByEmailUserNotFound()
210+
{
211+
var handler = new MockMessageHandler()
212+
{
213+
Response = @"{""users"": []}",
214+
};
215+
var userManager = this.CreateFirebaseUserManager(handler);
216+
217+
var exception = await Assert.ThrowsAsync<FirebaseException>(
218+
async () => await userManager.GetUserByEmailAsync("[email protected]"));
219+
Assert.Equal("Failed to get user with email: [email protected]", exception.Message);
220+
}
221+
222+
[Fact]
223+
public async Task GetUserByEmailNull()
224+
{
225+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
226+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByEmailAsync(null));
227+
}
228+
229+
[Fact]
230+
public async Task GetUserByEmailEmpty()
231+
{
232+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
233+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByEmailAsync(string.Empty));
234+
}
235+
236+
[Fact]
237+
public async Task GetUserByPhoneNumber()
238+
{
239+
var handler = new MockMessageHandler()
240+
{
241+
Response = @"{""users"": [
242+
{
243+
""localId"": ""user1""
244+
}
245+
]}",
246+
};
247+
var userManager = this.CreateFirebaseUserManager(handler);
248+
249+
var userRecord = await userManager.GetUserByPhoneNumberAsync("+1234567890");
250+
251+
Assert.Equal("user1", userRecord.Uid);
252+
Assert.Null(userRecord.DisplayName);
253+
Assert.Null(userRecord.Email);
254+
Assert.Null(userRecord.PhoneNumber);
255+
Assert.Null(userRecord.PhotoUrl);
256+
Assert.Equal("firebase", userRecord.ProviderId);
257+
Assert.False(userRecord.Disabled);
258+
Assert.False(userRecord.EmailVerified);
259+
Assert.Equal(UserRecord.UnixEpoch, userRecord.TokensValidAfterTimestamp);
260+
Assert.Empty(userRecord.CustomClaims);
261+
Assert.Empty(userRecord.ProviderData);
262+
Assert.Null(userRecord.UserMetaData.CreationTimestamp);
263+
Assert.Null(userRecord.UserMetaData.LastSignInTimestamp);
264+
265+
var request = NewtonsoftJsonSerializer.Instance.Deserialize<Dictionary<string, object>>(handler.Request);
266+
Assert.Equal(new JArray("+1234567890"), request["phoneNumber"]);
267+
}
268+
269+
[Fact]
270+
public async Task GetUserByPhoneNumberUserNotFound()
271+
{
272+
var handler = new MockMessageHandler()
273+
{
274+
Response = @"{""users"": []}",
275+
};
276+
var userManager = this.CreateFirebaseUserManager(handler);
277+
278+
var exception = await Assert.ThrowsAsync<FirebaseException>(
279+
async () => await userManager.GetUserByPhoneNumberAsync("+1234567890"));
280+
Assert.Equal("Failed to get user with phone number: +1234567890", exception.Message);
281+
}
282+
283+
[Fact]
284+
public async Task GetUserByPhoneNumberNull()
285+
{
286+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
287+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByPhoneNumberAsync(null));
288+
}
289+
290+
[Fact]
291+
public async Task GetUserByPhoneNumberEmpty()
292+
{
293+
var userManager = this.CreateFirebaseUserManager(new MockMessageHandler());
294+
await Assert.ThrowsAsync<ArgumentException>(() => userManager.GetUserByPhoneNumberAsync(string.Empty));
155295
}
156296

157297
[Fact]

FirebaseAdmin/FirebaseAdmin/Auth/FirebaseAuth.cs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,73 @@ public async Task<UserRecord> GetUserAsync(
293293
{
294294
var userManager = this.IfNotDeleted(() => this.userManager.Value);
295295

296-
return await userManager.GetUserById(uid, cancellationToken);
296+
return await userManager.GetUserByIdAsync(uid, cancellationToken);
297+
}
298+
299+
/// <summary>
300+
/// Gets a <see cref="UserRecord"/> object containing information about the user identified by
301+
/// <paramref name="email"/>.
302+
/// </summary>
303+
/// <param name="email">The email of the user who's data is to be retrieved.</param>
304+
/// <returns>A task that completes with a <see cref="UserRecord"/> representing
305+
/// a user with the specified email.</returns>
306+
/// <exception cref="ArgumentException">If the email argument is null or empty.</exception>
307+
/// <exception cref="FirebaseException">If a user cannot be found with the specified email.</exception>
308+
public async Task<UserRecord> GetUserByEmailAsync(string email)
309+
{
310+
return await this.GetUserByEmailAsync(email, default(CancellationToken));
311+
}
312+
313+
/// <summary>
314+
/// Gets a <see cref="UserRecord"/> object containing information about the user identified by
315+
/// <paramref name="email"/>.
316+
/// </summary>
317+
/// <param name="email">The email of the user who's data is to be retrieved.</param>
318+
/// <param name="cancellationToken">A cancellation token to monitor the asynchronous
319+
/// operation.</param>
320+
/// <returns>A task that completes with a <see cref="UserRecord"/> representing
321+
/// a user with the specified email.</returns>
322+
/// <exception cref="ArgumentException">If the email argument is null or empty.</exception>
323+
/// <exception cref="FirebaseException">If a user cannot be found with the specified email.</exception>
324+
public async Task<UserRecord> GetUserByEmailAsync(
325+
string email, CancellationToken cancellationToken)
326+
{
327+
var userManager = this.IfNotDeleted(() => this.userManager.Value);
328+
329+
return await userManager.GetUserByEmailAsync(email, cancellationToken);
330+
}
331+
332+
/// <summary>
333+
/// Gets a <see cref="UserRecord"/> object containing information about the user identified by
334+
/// <paramref name="phoneNumber"/>.
335+
/// </summary>
336+
/// <param name="phoneNumber">The phone number of the user who's data is to be retrieved.</param>
337+
/// <returns>A task that completes with a <see cref="UserRecord"/> representing
338+
/// a user with the specified phone number.</returns>
339+
/// <exception cref="ArgumentException">If the phone number argument is null or empty.</exception>
340+
/// <exception cref="FirebaseException">If a user cannot be found with the specified phone number.</exception>
341+
public async Task<UserRecord> GetUserByPhoneNumberAsync(string phoneNumber)
342+
{
343+
return await this.GetUserByPhoneNumberAsync(phoneNumber, default(CancellationToken));
344+
}
345+
346+
/// <summary>
347+
/// Gets a <see cref="UserRecord"/> object containing information about the user identified by
348+
/// <paramref name="phoneNumber"/>.
349+
/// </summary>
350+
/// <param name="phoneNumber">The phone number of the user who's data is to be retrieved.</param>
351+
/// <param name="cancellationToken">A cancellation token to monitor the asynchronous
352+
/// operation.</param>
353+
/// <returns>A task that completes with a <see cref="UserRecord"/> representing
354+
/// a user with the specified phone number.</returns>
355+
/// <exception cref="ArgumentException">If the phone number argument is null or empty.</exception>
356+
/// <exception cref="FirebaseException">If a user cannot be found with the specified phone number.</exception>
357+
public async Task<UserRecord> GetUserByPhoneNumberAsync(
358+
string phoneNumber, CancellationToken cancellationToken)
359+
{
360+
var userManager = this.IfNotDeleted(() => this.userManager.Value);
361+
362+
return await userManager.GetUserByPhoneNumberAsync(phoneNumber, cancellationToken);
297363
}
298364

299365
/// <summary>

0 commit comments

Comments
 (0)