feat: support time_zone for user registration context

This commit is contained in:
Ilia Denisov
2026-04-09 09:00:06 +02:00
parent e6b73a8f55
commit 7043af4cb3
40 changed files with 3452 additions and 164 deletions
@@ -72,21 +72,21 @@ func TestUserServiceRESTCompatibilityPublicConfirmUsesEnsureOutcomes(t *testing.
createdChallengeID := harness.sendChallengeID(t, "created@example.com")
blockedChallengeID := harness.sendChallengeID(t, "blocked@example.com")
existing := gatewayCompatibilityPostJSONValue(t, harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code", map[string]string{
"challenge_id": existingChallengeID,
"code": userServiceRESTCompatibilityCode,
"client_public_key": gatewayCompatibilityClientPublicKey,
})
created := gatewayCompatibilityPostJSONValue(t, harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code", map[string]string{
"challenge_id": createdChallengeID,
"code": userServiceRESTCompatibilityCode,
"client_public_key": gatewayCompatibilityClientPublicKey,
})
blocked := gatewayCompatibilityPostJSONValue(t, harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code", map[string]string{
"challenge_id": blockedChallengeID,
"code": userServiceRESTCompatibilityCode,
"client_public_key": gatewayCompatibilityClientPublicKey,
})
existing := gatewayCompatibilityPostJSONValue(
t,
harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code",
gatewayCompatibilityConfirmRequest(existingChallengeID, userServiceRESTCompatibilityCode, gatewayCompatibilityClientPublicKey),
)
created := gatewayCompatibilityPostJSONValue(
t,
harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code",
gatewayCompatibilityConfirmRequest(createdChallengeID, userServiceRESTCompatibilityCode, gatewayCompatibilityClientPublicKey),
)
blocked := gatewayCompatibilityPostJSONValue(
t,
harness.publicBaseURL+"/api/v1/public/auth/confirm-email-code",
gatewayCompatibilityConfirmRequest(blockedChallengeID, userServiceRESTCompatibilityCode, gatewayCompatibilityClientPublicKey),
)
assert.Equal(t, http.StatusOK, existing.StatusCode)
assert.JSONEq(t, `{"device_session_id":"device-session-1"}`, existing.Body)
@@ -326,13 +326,39 @@ func newUserServiceStubHandler(directory *userservice.StubDirectory) http.Handle
writeUserServiceStubJSON(writer, http.StatusOK, map[string]bool{"exists": exists})
case request.Method == http.MethodPost && request.URL.Path == "/api/v1/internal/users/ensure-by-email":
var input struct {
Email string `json:"email"`
Email string `json:"email"`
RegistrationContext *struct {
PreferredLanguage string `json:"preferred_language"`
TimeZone string `json:"time_zone"`
} `json:"registration_context"`
}
if !decodeUserServiceStubRequest(writer, request, &input) {
return
}
result, err := directory.EnsureUserByEmail(request.Context(), common.Email(input.Email))
ensureInput := ports.EnsureUserInput{
Email: common.Email(input.Email),
}
if input.RegistrationContext != nil {
ensureInput.RegistrationContext = &ports.RegistrationContext{
PreferredLanguage: input.RegistrationContext.PreferredLanguage,
TimeZone: input.RegistrationContext.TimeZone,
}
}
if ensureInput.RegistrationContext == nil {
writeUserServiceStubError(writer, http.StatusBadRequest, errors.New("registration_context must be present"))
return
}
if ensureInput.RegistrationContext.PreferredLanguage != "en" {
writeUserServiceStubError(writer, http.StatusBadRequest, errors.New("registration_context.preferred_language must equal en during rollout"))
return
}
if ensureInput.RegistrationContext.TimeZone != gatewayCompatibilityTimeZone {
writeUserServiceStubError(writer, http.StatusBadRequest, errors.New("registration_context.time_zone must match public confirm time_zone"))
return
}
result, err := directory.EnsureUserByEmail(request.Context(), ensureInput)
if err != nil {
writeUserServiceStubError(writer, http.StatusInternalServerError, err)
return