Skip to content

Commit 571ef32

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 7d113c6 commit 571ef32

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

0 commit comments

Comments
 (0)