Skip to content

Commit 6ff2701

Browse files
committed
Implements #81 - Adds InviteUserByEmailOptions as a parameter to the Gotrue Admin Client
1 parent 4e69643 commit 6ff2701

8 files changed

+43
-11
lines changed

Gotrue/AdminClient.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ public Func<Dictionary<string, string>>? GetHeaders
5757
public Task<User?> GetUser(string jwt) => _api.GetUser(jwt);
5858

5959
/// <inheritdoc />
60-
public async Task<bool> InviteUserByEmail(string email)
60+
public async Task<bool> InviteUserByEmail(string email, InviteUserByEmailOptions? options = null)
6161
{
62-
var response = await _api.InviteUserByEmail(email, _serviceKey);
62+
var response = await _api.InviteUserByEmail(email, _serviceKey, options);
6363
response.ResponseMessage?.EnsureSuccessStatusCode();
6464
return true;
6565
}

Gotrue/Api.cs

+9-3
Original file line numberDiff line numberDiff line change
@@ -257,11 +257,17 @@ public Task<BaseResponse> SendMagicLinkEmail(string email, SignInOptions? option
257257
/// </summary>
258258
/// <param name="email"></param>
259259
/// <param name="jwt">this token needs role 'supabase_admin' or 'service_role'</param>
260+
/// <param name="options"></param>
260261
/// <returns></returns>
261-
public Task<BaseResponse> InviteUserByEmail(string email, string jwt)
262+
public Task<BaseResponse> InviteUserByEmail(string email, string jwt, InviteUserByEmailOptions? options = null)
262263
{
263-
var data = new Dictionary<string, string> { { "email", email } };
264-
return Helpers.MakeRequest(HttpMethod.Post, $"{Url}/invite", data, CreateAuthedRequestHeaders(jwt));
264+
var url = options == null || string.IsNullOrEmpty(options.RedirectTo) ? $"{Url}/invite" : $"{Url}/invite?redirect_to={options.RedirectTo}";
265+
var body = new Dictionary<string, object> { { "email", email } };
266+
267+
if (options?.Data != null)
268+
body["data"] = options.Data;
269+
270+
return Helpers.MakeRequest(HttpMethod.Post, url, body, CreateAuthedRequestHeaders(jwt));
265271
}
266272

267273
/// <summary>

Gotrue/Interfaces/IGotrueAdminClient.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,9 @@ public interface IGotrueAdminClient<TUser> : IGettableHeaders
5151
/// Sends an email to the user.
5252
/// </summary>
5353
/// <param name="email"></param>
54+
/// <param name="options"></param>
5455
/// <returns></returns>
55-
Task<bool> InviteUserByEmail(string email);
56+
Task<bool> InviteUserByEmail(string email, InviteUserByEmailOptions? options = null);
5657

5758
/// <summary>
5859
/// Lists users

Gotrue/Interfaces/IGotrueApi.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public interface IGotrueApi<TUser, TSession> : IGettableHeaders
1515
Task<BaseResponse> DeleteUser(string uid, string jwt);
1616
Task<TUser?> GetUser(string jwt);
1717
Task<TUser?> GetUserById(string jwt, string userId);
18-
Task<BaseResponse> InviteUserByEmail(string email, string jwt);
18+
Task<BaseResponse> InviteUserByEmail(string email, string jwt, InviteUserByEmailOptions? options = null);
1919
Task<UserList<TUser>?> ListUsers(string jwt, string? filter = null, string? sortBy = null, SortOrder sortOrder = SortOrder.Descending, int? page = null, int? perPage = null);
2020
Task<TSession?> RefreshAccessToken(string accessToken, string refreshToken);
2121
Task<BaseResponse> ResetPasswordForEmail(string email);

Gotrue/Interfaces/IGotrueStatelessClient.cs

+3-2
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,16 @@ public interface IGotrueStatelessClient<TUser, TSession>
7676
/// <param name="userId"></param>
7777
/// <returns></returns>
7878
Task<TUser?> GetUserById(string serviceRoleToken, StatelessClientOptions options, string userId);
79-
79+
8080
/// <summary>
8181
/// Sends an invite email link to the specified email.
8282
/// </summary>
8383
/// <param name="email"></param>
8484
/// <param name="serviceRoleToken">this token needs role 'supabase_admin' or 'service_role'</param>
8585
/// <param name="options"></param>
86+
/// <param name="inviteOptions"></param>
8687
/// <returns></returns>
87-
Task<bool> InviteUserByEmail(string email, string serviceRoleToken, StatelessClientOptions options);
88+
Task<bool> InviteUserByEmail(string email, string serviceRoleToken, StatelessClientOptions options, InviteUserByEmailOptions? inviteOptions = null);
8889

8990
/// <summary>
9091
/// Lists users

Gotrue/InviteUserByEmailOptions.cs

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using System.Collections.Generic;
2+
3+
namespace Supabase.Gotrue
4+
{
5+
/// <summary>
6+
/// A utility class that represents options for sending a User an Invitation
7+
/// </summary>
8+
public class InviteUserByEmailOptions
9+
{
10+
/// <summary>
11+
/// The URL which will be appended to the email link sent to the user's email address. Once clicked the user will end up on this URL.
12+
/// </summary>
13+
public string? RedirectTo { get; set; }
14+
15+
/// <summary>
16+
/// A custom data object to store additional metadata about the user. This maps to the `auth.users.user_metadata` column.
17+
/// </summary>
18+
public Dictionary<string, object>? Data { get; set; }
19+
}
20+
}

Gotrue/ResetPasswordForEmailOptions.cs

+4
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ public class ResetPasswordForEmailOptions
3030
/// </summary>
3131
public string? PKCEVerifier { get; set; }
3232

33+
/// <summary>
34+
/// Initializes a new instance of the <see cref="ResetPasswordForEmailOptions"/> class with the provided email.
35+
/// </summary>
36+
/// <param name="email">The email of the user account for which the password is being reset.</param>
3337
public ResetPasswordForEmailOptions(string email)
3438
{
3539
Email = email;

Gotrue/StatelessClient.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -130,9 +130,9 @@ public async Task<bool> SignOut(string accessToken, StatelessClientOptions optio
130130
}
131131

132132
/// <inheritdoc />
133-
public async Task<bool> InviteUserByEmail(string email, string serviceRoleToken, StatelessClientOptions options)
133+
public async Task<bool> InviteUserByEmail(string email, string serviceRoleToken, StatelessClientOptions options, InviteUserByEmailOptions? invitationOptions = null)
134134
{
135-
var response = await GetApi(options).InviteUserByEmail(email, serviceRoleToken);
135+
var response = await GetApi(options).InviteUserByEmail(email, serviceRoleToken, invitationOptions);
136136
response.ResponseMessage?.EnsureSuccessStatusCode();
137137
return true;
138138
}

0 commit comments

Comments
 (0)