Skip to content

feat(auth): sesión de teléfono completa y testeable en las dos plataformas - #20

Closed
rndevelo wants to merge 1 commit into
feature/008-demo-bundle-idfrom
feature/009-phone-session-parity
Closed

feat(auth): sesión de teléfono completa y testeable en las dos plataformas#20
rndevelo wants to merge 1 commit into
feature/008-demo-bundle-idfrom
feature/009-phone-session-parity

Conversation

@rndevelo

Copy link
Copy Markdown
Collaborator

Sale de #19.

Qué

Entrar por SMS dejaba al usuario con una sesión distinta según la plataforma: Android leía el
FirebaseUser entero, iOS solo recibía el uid y fabricaba UserSession(userId, email = null).
Cualquier pantalla que pinte el email o mire isEmailVerified se comportaba distinto para el mismo
usuario.

El arreglo va en el sitio común, no en cada plataforma: cuando la plataforma dice que ha firmado,
el usuario ya está en Firebase, así que la fuente de verdad es el gateway.

is AuthResult.Success -> runAuth { gateway.currentUser?.toSuccess() ?: result }

El ?: result conserva el resultado de la plataforma si el gateway no ve usuario: mejor que
inventar un fallo cuando la plataforma acaba de decir que todo fue bien.

Y de paso

PhoneAuthPort hace testeable un flujo que era intesteable por construcción — los dos puntos de
entrada eran funciones expect de nivel superior, que no se pueden falsear desde commonTest.
Cuatro tests donde no había ninguno.

De los cuatro ACs solo uno nació rojo; los otros tres son cobertura que antes era imposible
escribir, y la tabla de trazabilidad lo dice así en vez de venderlos como TDD.

Verificado en Windows: :custom-login:ktlintCheck + :custom-login:testDebugUnitTest (254 tests, 0 fallos). El Swift de esta rama no se ha compilado nunca: pendiente de Mac.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E41idMYhfgBSz2EeuNUn5Q

…ormas

Entrar por SMS dejaba una sesión distinta según la plataforma: Android la
construye leyendo el FirebaseUser, iOS solo recibe el uid de Swift y fabricaba
UserSession(userId, email = null). Cualquier pantalla que pinte el email o mire
isEmailVerified se comportaba distinto para el mismo usuario, y la que se
equivocaba era iOS.

El arreglo va en el sitio común, no en cada actual: cuando la plataforma dice que
ha firmado, el usuario ya está en Firebase, así que la fuente de verdad es el
gateway. Es el mismo patrón que ya usa SocialTokenResult.PlatformHandled, donde
Swift firma y Kotlin vuelve a leer la sesión. Si el gateway no ve usuario se
conserva el resultado de la plataforma, que es mejor que inventar un fallo cuando
la plataforma acaba de decir que fue bien.

Debajo había un agujero mayor: los dos puntos de entrada del teléfono son
funciones expect de nivel superior, así que el flujo entero era intesteable desde
commonTest — el mismo hueco que FLE-90 cerró para el resto del provider y dejó
abierto aquí. Entra PhoneAuthPort, cuarto puerto de la misma familia, con default
en el constructor.

Rojo antes de implementar solo AC-01, que es el único que cambia comportamiento;
los otros tres tests son cobertura que antes no se podía escribir y así se apuntan
en la trazabilidad.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rkh7MzVRj5iXT2rLiqyW6A
hgarciaalberto pushed a commit that referenced this pull request Aug 19, 2026
…21)

Cierra de una vez la pila 003→010, que estaba encadenada PR sobre PR. Sustituye a #14, #15,
#16, #17, #18, #19 y #20.

- 003 Apple Sign-In de producción en el demo y contrato correcto para Swift
- 004 Cablea GitHub, Microsoft, Twitter, Facebook y teléfono en el demo (+ su spec)
- 005 Revoca el token de Apple antes de borrar la cuenta
- 006 Cierra también la sesión de GoogleSignIn al salir, en iOS
- 007 Pasa los scopes de AppleSignInConfig al handler de iOS
- 008 Fija el bundle id de iOS y alinea el magic link
- 009 Sesión de teléfono completa y testeable en las dos plataformas
- 010 Documenta lo que falta para construir el demo y deprecar código muerto

Las ocho PRs intermedias apuntaban cada una a la rama de la anterior, y el CI solo disparaba
en PRs contra develop/main, así que ninguna había pasado un check. Eso lo arregló #23. Esta
pila se validó entera antes de entrar: ambos jobs en verde.
@hgarciaalberto

Copy link
Copy Markdown
Contributor

Integrada en develop vía #21, que agrupó la pila 003→010 en un único squash en vez de encadenar ocho merges con su rebase detrás. El código de esta PR está en develop; se cierra sin mergear porque el commit ya no existe con este SHA.

@hgarciaalberto
hgarciaalberto deleted the feature/009-phone-session-parity branch August 19, 2026 22:50
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants