Skip to content

Commit

Permalink
Add optional CancellationToken arguments to all async methods and pas…
Browse files Browse the repository at this point in the history
…s token to child tasks
  • Loading branch information
GabrielHare authored and ashishdhingra committed May 12, 2023
1 parent 4e9f2fa commit 8ac3dd9
Show file tree
Hide file tree
Showing 4 changed files with 239 additions and 235 deletions.
18 changes: 9 additions & 9 deletions src/Amazon.Extensions.CognitoAuthentication/CognitoDevice.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;

using System.Threading;
using Amazon.CognitoIdentityProvider;
using Amazon.CognitoIdentityProvider.Model;
using Amazon.Extensions.CognitoAuthentication.Util;
Expand Down Expand Up @@ -156,12 +156,12 @@ public string GetDeviceName()
/// Gets the device from the Cognito service using the device key and user's access
/// token using an asynchronous call
/// </summary>
public async Task GetDeviceAsync()
public async Task GetDeviceAsync(CancellationToken cancellationToken = default)
{
GetDeviceRequest getDeviceRequest = CreateGetDeviceRequest();

GetDeviceResponse getDeviceResponse =
await User.Provider.GetDeviceAsync(getDeviceRequest).ConfigureAwait(false);
await User.Provider.GetDeviceAsync(getDeviceRequest, cancellationToken).ConfigureAwait(false);

UpdateThisDevice(getDeviceResponse.Device);
}
Expand All @@ -170,32 +170,32 @@ public async Task GetDeviceAsync()
/// Forgets the device associated with the CognitoDevice's device key using
/// an asynchronous call
/// </summary>
public Task ForgetDeviceAsync()
public Task ForgetDeviceAsync(CancellationToken cancellationToken = default)
{
ForgetDeviceRequest forgetDeviceRequest = CreateForgetDeviceRequest();
return User.Provider.ForgetDeviceAsync(forgetDeviceRequest);
return User.Provider.ForgetDeviceAsync(forgetDeviceRequest, cancellationToken);
}

/// <summary>
/// Updates the device status to be remembered using an asynchronous call
/// </summary>
public Task RememberThisDeviceAsync()
public Task RememberThisDeviceAsync(CancellationToken cancellationToken = default)
{
UpdateDeviceStatusRequest updateRequest =
CreateUpdateDeviceStatusRequest(new DeviceRememberedStatusType(CognitoConstants.DeviceAttrRemembered));

return User.Provider.UpdateDeviceStatusAsync(updateRequest);
return User.Provider.UpdateDeviceStatusAsync(updateRequest, cancellationToken);
}

/// <summary>
/// Updates the device status to not be remembered using an asynchronous call
/// </summary>
public Task DoNotRememberThisDeviceAsync()
public Task DoNotRememberThisDeviceAsync(CancellationToken cancellationToken = default)
{
UpdateDeviceStatusRequest updateRequest =
CreateUpdateDeviceStatusRequest(new DeviceRememberedStatusType(CognitoConstants.DeviceAttrNotRemembered));

return User.Provider.UpdateDeviceStatusAsync(updateRequest);
return User.Provider.UpdateDeviceStatusAsync(updateRequest, cancellationToken);
}

private GetDeviceRequest CreateGetDeviceRequest()
Expand Down
61 changes: 31 additions & 30 deletions src/Amazon.Extensions.CognitoAuthentication/CognitoUser.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
using System;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Threading;
using Amazon.CognitoIdentityProvider;
using Amazon.CognitoIdentityProvider.Model;
using Amazon.Extensions.CognitoAuthentication.Util;
Expand Down Expand Up @@ -163,33 +164,33 @@ public partial class CognitoUser
/// </summary>
/// <param name="confirmationCode">Confirmation code sent to user via email or SMS</param>
/// <param name="forcedAliasCreation">Boolean specifying whether forced alias creation is desired</param>
public virtual Task ConfirmSignUpAsync(string confirmationCode, bool forcedAliasCreation)
public virtual Task ConfirmSignUpAsync(string confirmationCode, bool forcedAliasCreation, CancellationToken cancellationToken = default)
{
ConfirmSignUpRequest confirmRequest = CreateConfirmSignUpRequest(confirmationCode, forcedAliasCreation);

return Provider.ConfirmSignUpAsync(confirmRequest);
return Provider.ConfirmSignUpAsync(confirmRequest, cancellationToken);
}

/// <summary>
/// Request to resend registration confirmation code for a user using an asynchronous call
/// </summary>
/// <returns>Returns the delivery details for the confirmation code request</returns>
public virtual Task ResendConfirmationCodeAsync()
public virtual Task ResendConfirmationCodeAsync(CancellationToken cancellationToken = default)
{
ResendConfirmationCodeRequest resendRequest = CreateResendConfirmationCodeRequest();

return Provider.ResendConfirmationCodeAsync(resendRequest);
return Provider.ResendConfirmationCodeAsync(resendRequest, cancellationToken);
}

/// <summary>
/// Allows the user to reset their password using an asynchronous call. Should be used in
/// conjunction with the ConfirmPasswordAsync method
/// </summary>
public virtual Task ForgotPasswordAsync()
public virtual Task ForgotPasswordAsync(CancellationToken cancellationToken = default)
{
ForgotPasswordRequest forgotPassRequest = CreateForgotPasswordRequest();

return Provider.ForgotPasswordAsync(forgotPassRequest);
return Provider.ForgotPasswordAsync(forgotPassRequest, cancellationToken);
}

/// <summary>
Expand All @@ -198,12 +199,12 @@ public virtual Task ForgotPasswordAsync()
/// </summary>
/// <param name="confirmationCode">The confirmation code sent to the suer</param>
/// <param name="newPassword">The new desired password for the user</param>
public virtual Task ConfirmForgotPasswordAsync(string confirmationCode, string newPassword)
public virtual Task ConfirmForgotPasswordAsync(string confirmationCode, string newPassword, CancellationToken cancellationToken = default)
{
ConfirmForgotPasswordRequest confirmResetPassRequest =
CreateConfirmPasswordRequest(confirmationCode, newPassword);

return Provider.ConfirmForgotPasswordAsync(confirmResetPassRequest);
return Provider.ConfirmForgotPasswordAsync(confirmResetPassRequest, cancellationToken);
}

/// <summary>
Expand All @@ -212,18 +213,18 @@ public virtual Task ConfirmForgotPasswordAsync(string confirmationCode, string n
/// </summary>
/// <param name="oldPass">The user's old password</param>
/// <param name="newPass">The desired new password</param>
public virtual Task ChangePasswordAsync(string oldPass, string newPass)
public virtual Task ChangePasswordAsync(string oldPass, string newPass, CancellationToken cancellationToken = default)
{
ChangePasswordRequest changePassRequest = CreateChangePasswordRequest(oldPass, newPass);

return Provider.ChangePasswordAsync(changePassRequest);
return Provider.ChangePasswordAsync(changePassRequest, cancellationToken);
}

/// <summary>
/// Gets the details for the current user using an asynchronous call
/// </summary>
/// <returns>Returns a tuple containing the user attributes and settings, in that order</returns>
public virtual Task<GetUserResponse> GetUserDetailsAsync()
public virtual Task<GetUserResponse> GetUserDetailsAsync(CancellationToken cancellationToken = default)
{
EnsureUserAuthenticated();

Expand All @@ -232,7 +233,7 @@ public virtual Task<GetUserResponse> GetUserDetailsAsync()
AccessToken = SessionTokens.AccessToken
};

return Provider.GetUserAsync(getUserRequest);
return Provider.GetUserAsync(getUserRequest, cancellationToken);
}

/// <summary>
Expand All @@ -242,18 +243,18 @@ public virtual Task<GetUserResponse> GetUserDetailsAsync()
/// <param name="medium">Name of the attribute the verification code is being sent to.
/// Should be either email or phone_number.</param>
/// <returns>Returns the delivery details for the attribute verification code request</returns>
public virtual Task GetAttributeVerificationCodeAsync(string medium)
public virtual Task GetAttributeVerificationCodeAsync(string medium, CancellationToken cancellationToken = default)
{
GetUserAttributeVerificationCodeRequest getAttributeCodeRequest =
CreateGetUserAttributeVerificationCodeRequest(medium);

return Provider.GetUserAttributeVerificationCodeAsync(getAttributeCodeRequest);
return Provider.GetUserAttributeVerificationCodeAsync(getAttributeCodeRequest, cancellationToken);
}

/// <summary>
/// Sign-out from all devices associated with this user using an asynchronous call
/// </summary>
public virtual Task GlobalSignOutAsync()
public virtual Task GlobalSignOutAsync(CancellationToken cancellationToken = default)
{
EnsureUserAuthenticated();

Expand All @@ -263,13 +264,13 @@ public virtual Task GlobalSignOutAsync()
};

SessionTokens = null;
return Provider.GlobalSignOutAsync(globalSignOutRequest);
return Provider.GlobalSignOutAsync(globalSignOutRequest, cancellationToken);
}

/// <summary>
/// Deletes the current user using an asynchronous call
/// </summary>
public virtual Task DeleteUserAsync()
public virtual Task DeleteUserAsync(CancellationToken cancellationToken = default)
{
EnsureUserAuthenticated();

Expand All @@ -278,33 +279,33 @@ public virtual Task DeleteUserAsync()
AccessToken = SessionTokens.AccessToken
};

return Provider.DeleteUserAsync(deleteUserRequest);
return Provider.DeleteUserAsync(deleteUserRequest, cancellationToken);
}

/// <summary>
/// Verifies the given attribute using an asynchronous call
/// </summary>
/// <param name="attributeName">Attribute to be verified. Should either be email or phone_number</param>
/// <param name="verificationCode">The verification code for the attribute being verified</param>
public virtual Task VerifyAttributeAsync(string attributeName, string verificationCode)
public virtual Task VerifyAttributeAsync(string attributeName, string verificationCode, CancellationToken cancellationToken = default)
{
VerifyUserAttributeRequest verifyUserAttributeRequest =
CreateVerifyUserAttributeRequest(attributeName, verificationCode);

return Provider.VerifyUserAttributeAsync(verifyUserAttributeRequest);
return Provider.VerifyUserAttributeAsync(verifyUserAttributeRequest, cancellationToken);
}

/// <summary>
/// Updates the user's attributes defined in the attributes parameter (one at a time)
/// using an asynchronous call
/// </summary>
/// <param name="attributes">The attributes to be updated</param>
public virtual async Task UpdateAttributesAsync(IDictionary<string, string> attributes)
public virtual async Task UpdateAttributesAsync(IDictionary<string, string> attributes, CancellationToken cancellationToken = default)
{
UpdateUserAttributesRequest updateUserAttributesRequest =
CreateUpdateUserAttributesRequest(attributes);

await Provider.UpdateUserAttributesAsync(updateUserAttributesRequest).ConfigureAwait(false);
await Provider.UpdateUserAttributesAsync(updateUserAttributesRequest, cancellationToken).ConfigureAwait(false);

//Update the local Attributes property
foreach (KeyValuePair<string, string> entry in attributes)
Expand All @@ -318,12 +319,12 @@ public virtual async Task UpdateAttributesAsync(IDictionary<string, string> attr
/// an asynchronous call
/// </summary>
/// <param name="attributeNamesToDelete">List of attributes to delete</param>
public virtual async Task DeleteAttributesAsync(IList<string> attributeNamesToDelete)
public virtual async Task DeleteAttributesAsync(IList<string> attributeNamesToDelete, CancellationToken cancellationToken = default)
{
DeleteUserAttributesRequest deleteUserAttributesRequest =
CreateDeleteUserAttributesRequest(attributeNamesToDelete);

await Provider.DeleteUserAttributesAsync(deleteUserAttributesRequest).ConfigureAwait(false);
await Provider.DeleteUserAttributesAsync(deleteUserAttributesRequest, cancellationToken).ConfigureAwait(false);

//Update the local Attributes property
foreach (string attribute in attributeNamesToDelete)
Expand All @@ -340,11 +341,11 @@ public virtual async Task DeleteAttributesAsync(IList<string> attributeNamesToDe
/// using an asynchronous call
/// </summary>
/// <param name="userSettings">Dictionary for the user MFA settings of the form [attribute, delivery medium]</param>
public virtual async Task SetUserSettingsAsync(IDictionary<string, string> userSettings)
public virtual async Task SetUserSettingsAsync(IDictionary<string, string> userSettings, CancellationToken cancellationToken = default)
{
SetUserSettingsRequest setUserSettingsRequest = CreateSetUserSettingsRequest(userSettings);

await Provider.SetUserSettingsAsync(setUserSettingsRequest).ConfigureAwait(false);
await Provider.SetUserSettingsAsync(setUserSettingsRequest, cancellationToken).ConfigureAwait(false);

//Update the local Settings property
foreach (KeyValuePair<string, string> entry in userSettings)
Expand All @@ -360,10 +361,10 @@ public virtual async Task SetUserSettingsAsync(IDictionary<string, string> userS
/// <param name="paginationToken">Token to continue earlier search</param>
/// <returns>Returns a list of CognitoDevices associated with this user</returns>
[Obsolete("This method is deprecated since it only lists the first page of devices. The method ListDevicesV2Async should be used instead which allows listing additional pages of devices.")]
public virtual async Task<List<CognitoDevice>> ListDevicesAsync(int limit, string paginationToken)
public virtual async Task<List<CognitoDevice>> ListDevicesAsync(int limit, string paginationToken, CancellationToken cancellationToken = default)
{
ListDevicesRequest listDevicesRequest = CreateListDevicesRequest(limit, paginationToken);
ListDevicesResponse listDevicesReponse = await Provider.ListDevicesAsync(listDevicesRequest).ConfigureAwait(false);
ListDevicesResponse listDevicesReponse = await Provider.ListDevicesAsync(listDevicesRequest, cancellationToken).ConfigureAwait(false);
List<CognitoDevice> devicesList = new List<CognitoDevice>();

foreach (DeviceType device in listDevicesReponse.Devices)
Expand All @@ -382,10 +383,10 @@ public virtual async Task<List<CognitoDevice>> ListDevicesAsync(int limit, strin
/// <param name="limit">Maxmimum number of devices to be returned in this call</param>
/// <param name="paginationToken">Token to continue earlier search</param>
/// <returns>Returns underlying ListDevicesResponse that contains list of DeviceType objects along with PaginationToken.</returns>
public virtual async Task<ListDevicesResponse> ListDevicesV2Async(int limit, string paginationToken)
public virtual async Task<ListDevicesResponse> ListDevicesV2Async(int limit, string paginationToken, CancellationToken cancellationToken = default)
{
ListDevicesRequest listDevicesRequest = CreateListDevicesRequest(limit, paginationToken);
return await Provider.ListDevicesAsync(listDevicesRequest).ConfigureAwait(false);
return await Provider.ListDevicesAsync(listDevicesRequest, cancellationToken).ConfigureAwait(false);
}

private ConfirmSignUpRequest CreateConfirmSignUpRequest(string confirmationCode, bool forcedAliasCreation)
Expand Down

0 comments on commit 8ac3dd9

Please sign in to comment.