Skip to content

Commit 2679a0c

Browse files
feat(Auth): Add user attribute operations (Fetch/Update/Verify/Confirm user attributes) (#798)
* Add user attribute operations * Resolve code delivery conditions * Check if user attribute need code delivery to be updated * remove hard code * remove unnecessary error message * Recognize invalid user attributes * Remove unnecessary checks * Get rid of nesting * Add authUserAttributeKeyList method * only make one call to AWSMobileClient when updating a list of user attributes * Remove unnecessary checks, change the logic of updateUserAttributes * Remove nested loop * remove loop for details * add AuthComponentTest * Add RxAuthBinding * remove check in resendUserAttributeConfirmationCode * Add RxBindingTest and remove duplicated parentheses * Remove unused imports * Update rxbindings/src/main/java/com/amplifyframework/rx/RxAuthCategoryBehavior.java Co-authored-by: Jameson Williams <[email protected]> * Make AuthUserAttributeKey protected Co-authored-by: Jameson Williams <[email protected]>
1 parent 312a76a commit 2679a0c

File tree

11 files changed

+1071
-10
lines changed

11 files changed

+1071
-10
lines changed

aws-auth-cognito/src/main/java/com/amplifyframework/auth/cognito/AWSCognitoAuthPlugin.java

Lines changed: 186 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.amplifyframework.auth.AuthSession;
3333
import com.amplifyframework.auth.AuthUser;
3434
import com.amplifyframework.auth.AuthUserAttribute;
35+
import com.amplifyframework.auth.AuthUserAttributeKey;
3536
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthSignInOptions;
3637
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthSignUpOptions;
3738
import com.amplifyframework.auth.cognito.options.AWSCognitoAuthWebUISignInOptions;
@@ -46,12 +47,15 @@
4647
import com.amplifyframework.auth.result.AuthSessionResult;
4748
import com.amplifyframework.auth.result.AuthSignInResult;
4849
import com.amplifyframework.auth.result.AuthSignUpResult;
50+
import com.amplifyframework.auth.result.AuthUpdateAttributeResult;
4951
import com.amplifyframework.auth.result.step.AuthNextResetPasswordStep;
5052
import com.amplifyframework.auth.result.step.AuthNextSignInStep;
5153
import com.amplifyframework.auth.result.step.AuthNextSignUpStep;
54+
import com.amplifyframework.auth.result.step.AuthNextUpdateAttributeStep;
5255
import com.amplifyframework.auth.result.step.AuthResetPasswordStep;
5356
import com.amplifyframework.auth.result.step.AuthSignInStep;
5457
import com.amplifyframework.auth.result.step.AuthSignUpStep;
58+
import com.amplifyframework.auth.result.step.AuthUpdateAttributeStep;
5559
import com.amplifyframework.core.Action;
5660
import com.amplifyframework.core.Amplify;
5761
import com.amplifyframework.core.Consumer;
@@ -711,6 +715,188 @@ public void onError(Exception error) {
711715
});
712716
}
713717

718+
@Override
719+
public void fetchUserAttributes(
720+
@NonNull Consumer<List<AuthUserAttribute>> onSuccess,
721+
@NonNull Consumer<AuthException> onError
722+
) {
723+
awsMobileClient.getUserAttributes(new Callback<Map<String, String>>() {
724+
@Override
725+
public void onResult(Map<String, String> result) {
726+
List<AuthUserAttribute> userAttributes = new ArrayList<>();
727+
for (Map.Entry<String, String> entry : result.entrySet()) {
728+
userAttributes.add(new AuthUserAttribute(
729+
AuthUserAttributeKey.custom(entry.getKey()), entry.getValue()));
730+
}
731+
onSuccess.accept(userAttributes);
732+
}
733+
734+
@Override
735+
public void onError(Exception error) {
736+
onError.accept(new AuthException(
737+
"Failed to fetch user attributes",
738+
error,
739+
"Ensure that you are logged in and online"
740+
));
741+
}
742+
});
743+
}
744+
745+
@Override
746+
public void updateUserAttribute(
747+
@NonNull AuthUserAttribute attribute,
748+
@NonNull Consumer<AuthUpdateAttributeResult> onSuccess,
749+
@NonNull Consumer<AuthException> onError
750+
) {
751+
752+
awsMobileClient.updateUserAttributes(
753+
Collections.singletonMap(attribute.getKey().getKeyString(), attribute.getValue()),
754+
new Callback<List<UserCodeDeliveryDetails>>() {
755+
@Override
756+
public void onResult(List<UserCodeDeliveryDetails> result) {
757+
if (result.size() == 0) {
758+
onSuccess.accept(new AuthUpdateAttributeResult(
759+
true,
760+
new AuthNextUpdateAttributeStep(
761+
AuthUpdateAttributeStep.DONE,
762+
Collections.emptyMap(),
763+
null)
764+
));
765+
} else {
766+
onSuccess.accept(new AuthUpdateAttributeResult(
767+
true,
768+
new AuthNextUpdateAttributeStep(
769+
AuthUpdateAttributeStep.CONFIRM_ATTRIBUTE_WITH_CODE,
770+
Collections.emptyMap(),
771+
convertCodeDeliveryDetails(result.get(0)))
772+
));
773+
}
774+
}
775+
776+
@Override
777+
public void onError(Exception error) {
778+
onError.accept(new AuthException(
779+
"Failed to update user attributes",
780+
error,
781+
"See attached exception for more details"
782+
));
783+
}
784+
}
785+
);
786+
}
787+
788+
@Override
789+
public void updateUserAttributes(
790+
@NonNull List<AuthUserAttribute> attributes,
791+
@NonNull Consumer<Map<AuthUserAttributeKey, AuthUpdateAttributeResult>> onSuccess,
792+
@NonNull Consumer<AuthException> onError
793+
) {
794+
Map<String, String> attributesMap = new HashMap<>();
795+
for (AuthUserAttribute attribute : attributes) {
796+
attributesMap.put(attribute.getKey().getKeyString(), attribute.getValue());
797+
}
798+
799+
awsMobileClient.updateUserAttributes(
800+
attributesMap,
801+
new Callback<List<UserCodeDeliveryDetails>>() {
802+
@Override
803+
public void onResult(List<UserCodeDeliveryDetails> result) {
804+
Map<String, UserCodeDeliveryDetails> codeDetailsMap = new HashMap<>();
805+
Map<AuthUserAttributeKey, AuthUpdateAttributeResult> resultMap = new HashMap<>();
806+
807+
for (UserCodeDeliveryDetails details : result) {
808+
codeDetailsMap.put(details.getAttributeName(), details);
809+
}
810+
811+
for (String attributeKey : attributesMap.keySet()) {
812+
if (codeDetailsMap.containsKey(attributeKey)) {
813+
resultMap.put(AuthUserAttributeKey.custom(attributeKey),
814+
new AuthUpdateAttributeResult(
815+
true,
816+
new AuthNextUpdateAttributeStep(
817+
AuthUpdateAttributeStep.
818+
CONFIRM_ATTRIBUTE_WITH_CODE,
819+
Collections.emptyMap(),
820+
convertCodeDeliveryDetails(codeDetailsMap.get(attributeKey)))
821+
));
822+
} else {
823+
resultMap.put(AuthUserAttributeKey.custom(attributeKey),
824+
new AuthUpdateAttributeResult(
825+
true,
826+
new AuthNextUpdateAttributeStep(
827+
AuthUpdateAttributeStep.
828+
DONE,
829+
Collections.emptyMap(),
830+
null)
831+
));
832+
}
833+
onSuccess.accept(resultMap);
834+
}
835+
}
836+
837+
@Override
838+
public void onError(Exception error) {
839+
onError.accept(new AuthException(
840+
"Failed to update user attributes",
841+
error,
842+
"See attached exception for more details"
843+
));
844+
}
845+
});
846+
}
847+
848+
@Override
849+
public void resendUserAttributeConfirmationCode(
850+
@NonNull AuthUserAttributeKey attributeKey,
851+
@NonNull Consumer<AuthCodeDeliveryDetails> onSuccess,
852+
@NonNull Consumer<AuthException> onError
853+
) {
854+
String attributeName = attributeKey.getKeyString();
855+
awsMobileClient.verifyUserAttribute(attributeName, new Callback<UserCodeDeliveryDetails>() {
856+
@Override
857+
public void onResult(UserCodeDeliveryDetails result) {
858+
onSuccess.accept(convertCodeDeliveryDetails(result));
859+
}
860+
861+
@Override
862+
public void onError(Exception error) {
863+
onError.accept(new AuthException(
864+
"Failed to resend user attribute confirmation code",
865+
error,
866+
"See attached exception for more details"
867+
));
868+
}
869+
});
870+
}
871+
872+
@Override
873+
public void confirmUserAttribute(
874+
@NonNull AuthUserAttributeKey attributeKey,
875+
@NonNull String confirmationCode,
876+
@NonNull Action onSuccess,
877+
@NonNull Consumer<AuthException> onError
878+
) {
879+
880+
awsMobileClient.confirmUpdateUserAttribute(
881+
attributeKey.getKeyString(),
882+
confirmationCode,
883+
new Callback<Void>() {
884+
@Override
885+
public void onResult(Void result) {
886+
onSuccess.call();
887+
}
888+
889+
@Override
890+
public void onError(Exception error) {
891+
onError.accept(new AuthException(
892+
"An error occurred confirming user attribute",
893+
error,
894+
"See attached exception for more details"
895+
));
896+
}
897+
});
898+
}
899+
714900
@Override
715901
public AuthUser getCurrentUser() {
716902
if (userId != null) {

0 commit comments

Comments
 (0)