Skip to content

Commit d1ce70e

Browse files
authored
Unnecessary call update user even field not change (#286)
Unnecessary call updateUser even if the field not changed
1 parent b779851 commit d1ce70e

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
@@ -649,19 +649,30 @@ class Auth {
649649
case SignUp signUp when hasInitialSignUp:
650650
// if we didn't create a SignUp object earlier, now is the time to
651651
// update the preexisting SignUp object, in case of changes
652-
await _api
653-
.updateSignUp(
654-
signUp,
655-
strategy: strategy,
656-
password: password,
657-
firstName: firstName,
658-
lastName: lastName,
659-
username: username,
660-
emailAddress: emailAddress,
661-
phoneNumber: phoneNumber,
662-
legalAccepted: legalAccepted,
663-
)
664-
.then(_housekeeping);
652+
final needsUpdate = (password?.isNotEmpty == true) ||
653+
(firstName is String && firstName != signUp.firstName) ||
654+
(lastName is String && lastName != signUp.lastName) ||
655+
(username is String && username != signUp.username) ||
656+
(emailAddress is String && emailAddress != signUp.emailAddress) ||
657+
(phoneNumber is String && phoneNumber != signUp.phoneNumber) ||
658+
// We don't have current state for legalAccepted in SignUp;
659+
// if provided, assume it's a change worth sending
660+
(legalAccepted is bool);
661+
if (needsUpdate) {
662+
await _api
663+
.updateSignUp(
664+
signUp,
665+
strategy: strategy,
666+
password: password,
667+
firstName: firstName,
668+
lastName: lastName,
669+
username: username,
670+
emailAddress: emailAddress,
671+
phoneNumber: phoneNumber,
672+
legalAccepted: legalAccepted,
673+
)
674+
.then(_housekeeping);
675+
}
665676
}
666677
}
667678

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
@@ -229,5 +229,73 @@ void main() {
229229
expect(httpService.isCompleted, true);
230230
});
231231
});
232+
233+
test('does not updateSignUp when values are unchanged', () async {
234+
await runWithLogging(() async {
235+
expect(auth.user, null);
236+
237+
// 1) Create initial sign up with emailCode and an email address
238+
httpService.expect(
239+
'POST /v1/client/sign_ups strategy=email_code&email_address=$emailAddress',
240+
200,
241+
'{"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}}',
242+
);
243+
244+
// Initial create
245+
Client client = await auth.attemptSignUp(
246+
strategy: Strategy.emailCode,
247+
emailAddress: emailAddress,
248+
);
249+
expect(client.signUp?.status, Status.missingRequirements);
250+
251+
// 2) Call attemptSignUp again with the same email
252+
// No HTTP expectation should be queued for this invocation.
253+
client = await auth.attemptSignUp(
254+
strategy: Strategy.emailCode,
255+
emailAddress: emailAddress, // unchanged
256+
);
257+
258+
// State should remain in missing requirements; no extra PATCH occurred.
259+
expect(client.signUp?.status, Status.missingRequirements);
260+
});
261+
});
262+
263+
test('updates SignUp when provided value changes', () async {
264+
await runWithLogging(() async {
265+
expect(auth.user, null);
266+
267+
final firstEmail = '$username[email protected]';
268+
final secondEmail = '$username[email protected]';
269+
270+
// 1) Create initial sign up with first email
271+
httpService.expect(
272+
'POST /v1/client/sign_ups strategy=email_code&email_address=$firstEmail',
273+
200,
274+
'{"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}}',
275+
);
276+
277+
Client client = await auth.attemptSignUp(
278+
strategy: Strategy.emailCode,
279+
emailAddress: firstEmail,
280+
);
281+
expect(client.signUp?.status, Status.missingRequirements);
282+
283+
// 2) Provide a different email -> should PATCH
284+
httpService.expect(
285+
'PATCH /v1/client/sign_ups/SIGN_UP_ATTEMPT_ID strategy=email_code&email_address=$secondEmail',
286+
200,
287+
'{"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}}',
288+
);
289+
290+
client = await auth.attemptSignUp(
291+
strategy: Strategy.emailCode,
292+
emailAddress: secondEmail,
293+
);
294+
295+
// Still in missing requirements, but email reflected the change via PATCH
296+
expect(client.signUp?.status, Status.missingRequirements);
297+
expect(client.signUp?.emailAddress, secondEmail);
298+
});
299+
});
232300
});
233301
}

0 commit comments

Comments
 (0)