Skip to content

Commit 338e345

Browse files
krisadamqdcshinyford
authored andcommitted
Unnecessary call update user even field not change (#286)
Unnecessary call updateUser even if the field not changed
1 parent 33ce683 commit 338e345

File tree

2 files changed

+92
-13
lines changed

2 files changed

+92
-13
lines changed

packages/clerk_auth/lib/src/clerk_auth/auth.dart

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -647,19 +647,30 @@ class Auth {
647647
case SignUp signUp when hasInitialSignUp:
648648
// if we didn't create a SignUp object earlier, now is the time to
649649
// update the preexisting SignUp object, in case of changes
650-
await _api
651-
.updateSignUp(
652-
signUp,
653-
strategy: strategy,
654-
password: password,
655-
firstName: firstName,
656-
lastName: lastName,
657-
username: username,
658-
emailAddress: emailAddress,
659-
phoneNumber: phoneNumber,
660-
legalAccepted: legalAccepted,
661-
)
662-
.then(_housekeeping);
650+
final needsUpdate = (password?.isNotEmpty == true) ||
651+
(firstName is String && firstName != signUp.firstName) ||
652+
(lastName is String && lastName != signUp.lastName) ||
653+
(username is String && username != signUp.username) ||
654+
(emailAddress is String && emailAddress != signUp.emailAddress) ||
655+
(phoneNumber is String && phoneNumber != signUp.phoneNumber) ||
656+
// We don't have current state for legalAccepted in SignUp;
657+
// if provided, assume it's a change worth sending
658+
(legalAccepted is bool);
659+
if (needsUpdate) {
660+
await _api
661+
.updateSignUp(
662+
signUp,
663+
strategy: strategy,
664+
password: password,
665+
firstName: firstName,
666+
lastName: lastName,
667+
username: username,
668+
emailAddress: emailAddress,
669+
phoneNumber: phoneNumber,
670+
legalAccepted: legalAccepted,
671+
)
672+
.then(_housekeeping);
673+
}
663674
}
664675
}
665676

packages/clerk_auth/test/integration/clerk_auth/sign_up_test.dart

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,5 +117,73 @@ void main() {
117117
expect(httpService.isCompleted);
118118
});
119119
});
120+
121+
test('does not updateSignUp when values are unchanged', () async {
122+
await runWithLogging(() async {
123+
expect(auth.user, null);
124+
125+
// 1) Create initial sign up with emailCode and an email address
126+
httpService.expect(
127+
'POST /v1/client/sign_ups strategy=email_code&email_address=$emailAddress',
128+
200,
129+
'{"response":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["oauth_github","oauth_google","email_address","phone_number","username","last_name","first_name","oauth_apple"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$emailAddress","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"client":{"object":"client","id":"CLIENT_ID","sessions":[],"sign_in":null,"sign_up":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["phone_number","username","first_name","last_name","oauth_github","oauth_google","oauth_apple","email_address"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$emailAddress","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"last_active_session_id":null,"cookie_expires_at":null,"created_at":1732020614717,"updated_at":1732020614748}}',
130+
);
131+
132+
// Initial create
133+
Client client = await auth.attemptSignUp(
134+
strategy: Strategy.emailCode,
135+
emailAddress: emailAddress,
136+
);
137+
expect(client.signUp?.status, Status.missingRequirements);
138+
139+
// 2) Call attemptSignUp again with the same email
140+
// No HTTP expectation should be queued for this invocation.
141+
client = await auth.attemptSignUp(
142+
strategy: Strategy.emailCode,
143+
emailAddress: emailAddress, // unchanged
144+
);
145+
146+
// State should remain in missing requirements; no extra PATCH occurred.
147+
expect(client.signUp?.status, Status.missingRequirements);
148+
});
149+
});
150+
151+
test('updates SignUp when provided value changes', () async {
152+
await runWithLogging(() async {
153+
expect(auth.user, null);
154+
155+
final firstEmail = '$username[email protected]';
156+
final secondEmail = '$username[email protected]';
157+
158+
// 1) Create initial sign up with first email
159+
httpService.expect(
160+
'POST /v1/client/sign_ups strategy=email_code&email_address=$firstEmail',
161+
200,
162+
'{"response":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["oauth_github","oauth_google","email_address","phone_number","username","last_name","first_name","oauth_apple"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$firstEmail","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"client":{"object":"client","id":"CLIENT_ID","sessions":[],"sign_in":null,"sign_up":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["phone_number","username","first_name","last_name","oauth_github","oauth_google","oauth_apple","email_address"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$firstEmail","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"last_active_session_id":null,"cookie_expires_at":null,"created_at":1732020614717,"updated_at":1732020614748}}',
163+
);
164+
165+
Client client = await auth.attemptSignUp(
166+
strategy: Strategy.emailCode,
167+
emailAddress: firstEmail,
168+
);
169+
expect(client.signUp?.status, Status.missingRequirements);
170+
171+
// 2) Provide a different email -> should PATCH
172+
httpService.expect(
173+
'PATCH /v1/client/sign_ups/SIGN_UP_ATTEMPT_ID strategy=email_code&email_address=$secondEmail',
174+
200,
175+
'{"response":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["oauth_github","oauth_google","email_address","phone_number","username","last_name","first_name","oauth_apple"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$secondEmail","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"client":{"object":"client","id":"CLIENT_ID","sessions":[],"sign_in":null,"sign_up":{"object":"sign_up_attempt","id":"SIGN_UP_ATTEMPT_ID","status":"missing_requirements","required_fields":["password"],"optional_fields":["phone_number","username","first_name","last_name","oauth_github","oauth_google","oauth_apple","email_address"],"missing_fields":["password"],"unverified_fields":["email_address"],"verifications":{"email_address":null,"phone_number":null,"web3_wallet":null,"external_account":null},"username":null,"email_address":"$secondEmail","phone_number":null,"web3_wallet":null,"password_enabled":false,"first_name":null,"last_name":null,"unsafe_metadata":{},"public_metadata":{},"custom_action":false,"external_id":null,"created_session_id":null,"created_user_id":null,"abandon_at":1732107014735,"legal_accepted_at":null},"last_active_session_id":null,"cookie_expires_at":null,"created_at":1732020614717,"updated_at":1732020614748}}',
176+
);
177+
178+
client = await auth.attemptSignUp(
179+
strategy: Strategy.emailCode,
180+
emailAddress: secondEmail,
181+
);
182+
183+
// Still in missing requirements, but email reflected the change via PATCH
184+
expect(client.signUp?.status, Status.missingRequirements);
185+
expect(client.signUp?.emailAddress, secondEmail);
186+
});
187+
});
120188
});
121189
}

0 commit comments

Comments
 (0)