Skip to content

Commit fc7cb62

Browse files
authoredAug 30, 2024
Merge pull request #556 from mr-kew/auth-result
Missing fields added to AuthResult
2 parents ba73861 + 9e8ef04 commit fc7cb62

File tree

9 files changed

+152
-5
lines changed

9 files changed

+152
-5
lines changed
 

‎firebase-auth/api/android/firebase-auth.api

+12
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public final class dev/gitlive/firebase/auth/ActionCodeSettings {
5151
public fun toString ()Ljava/lang/String;
5252
}
5353

54+
public final class dev/gitlive/firebase/auth/AdditionalUserInfo {
55+
public fun <init> (Lcom/google/firebase/auth/AdditionalUserInfo;)V
56+
public final fun getProfile ()Ljava/util/Map;
57+
public final fun getProviderId ()Ljava/lang/String;
58+
public final fun getUsername ()Ljava/lang/String;
59+
public final fun isNewUser ()Z
60+
}
61+
5462
public final class dev/gitlive/firebase/auth/AndroidPackageName {
5563
public fun <init> (Ljava/lang/String;ZLjava/lang/String;)V
5664
public synthetic fun <init> (Ljava/lang/String;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -74,6 +82,9 @@ public class dev/gitlive/firebase/auth/AuthCredential {
7482
}
7583

7684
public final class dev/gitlive/firebase/auth/AuthResult {
85+
public fun <init> (Lcom/google/firebase/auth/AuthResult;)V
86+
public final fun getAdditionalUserInfo ()Ldev/gitlive/firebase/auth/AdditionalUserInfo;
87+
public final fun getCredential ()Ldev/gitlive/firebase/auth/AuthCredential;
7788
public final fun getUser ()Ldev/gitlive/firebase/auth/FirebaseUser;
7889
}
7990

@@ -278,6 +289,7 @@ public final class dev/gitlive/firebase/auth/UserMetaData {
278289

279290
public final class dev/gitlive/firebase/auth/android {
280291
public static final fun auth (Ldev/gitlive/firebase/Firebase;Ldev/gitlive/firebase/FirebaseApp;)Ldev/gitlive/firebase/auth/FirebaseAuth;
292+
public static final fun getAndroid (Ldev/gitlive/firebase/auth/AdditionalUserInfo;)Lcom/google/firebase/auth/AdditionalUserInfo;
281293
public static final fun getAndroid (Ldev/gitlive/firebase/auth/AuthResult;)Lcom/google/firebase/auth/AuthResult;
282294
public static final fun getAndroid (Ldev/gitlive/firebase/auth/AuthTokenResult;)Lcom/google/firebase/auth/GetTokenResult;
283295
public static final fun getAndroid (Ldev/gitlive/firebase/auth/FirebaseAuth;)Lcom/google/firebase/auth/FirebaseAuth;

‎firebase-auth/api/jvm/firebase-auth.api

+11
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,14 @@ public final class dev/gitlive/firebase/auth/ActionCodeSettings {
5151
public fun toString ()Ljava/lang/String;
5252
}
5353

54+
public final class dev/gitlive/firebase/auth/AdditionalUserInfo {
55+
public fun <init> ()V
56+
public final fun getProfile ()Ljava/util/Map;
57+
public final fun getProviderId ()Ljava/lang/String;
58+
public final fun getUsername ()Ljava/lang/String;
59+
public final fun isNewUser ()Z
60+
}
61+
5462
public final class dev/gitlive/firebase/auth/AndroidPackageName {
5563
public fun <init> (Ljava/lang/String;ZLjava/lang/String;)V
5664
public synthetic fun <init> (Ljava/lang/String;ZLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
@@ -74,6 +82,9 @@ public class dev/gitlive/firebase/auth/AuthCredential {
7482
}
7583

7684
public final class dev/gitlive/firebase/auth/AuthResult {
85+
public fun <init> (Lcom/google/firebase/auth/AuthResult;)V
86+
public final fun getAdditionalUserInfo ()Ldev/gitlive/firebase/auth/AdditionalUserInfo;
87+
public final fun getCredential ()Ldev/gitlive/firebase/auth/AuthCredential;
7788
public final fun getUser ()Ldev/gitlive/firebase/auth/FirebaseUser;
7889
}
7990

‎firebase-auth/src/androidMain/kotlin/dev/gitlive/firebase/auth/auth.kt

+21-1
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,29 @@ public actual class FirebaseAuth internal constructor(internal val android: com.
118118

119119
public val AuthResult.android: com.google.firebase.auth.AuthResult get() = android
120120

121-
public actual class AuthResult internal constructor(internal val android: com.google.firebase.auth.AuthResult) {
121+
public actual class AuthResult(internal val android: com.google.firebase.auth.AuthResult) {
122122
public actual val user: FirebaseUser?
123123
get() = android.user?.let { FirebaseUser(it) }
124+
public actual val credential: AuthCredential?
125+
get() = android.credential?.let { AuthCredential(it) }
126+
public actual val additionalUserInfo: AdditionalUserInfo?
127+
get() = android.additionalUserInfo?.let { AdditionalUserInfo(it) }
128+
}
129+
130+
public val AdditionalUserInfo.android: com.google.firebase.auth.AdditionalUserInfo
131+
get() = android
132+
133+
public actual class AdditionalUserInfo(
134+
internal val android: com.google.firebase.auth.AdditionalUserInfo,
135+
) {
136+
public actual val providerId: String?
137+
get() = android.providerId
138+
public actual val username: String?
139+
get() = android.username
140+
public actual val profile: Map<String, Any?>?
141+
get() = android.profile
142+
public actual val isNewUser: Boolean
143+
get() = android.isNewUser
124144
}
125145

126146
public val AuthTokenResult.android: com.google.firebase.auth.GetTokenResult get() = android

‎firebase-auth/src/commonMain/kotlin/dev/gitlive/firebase/auth/auth.kt

+9
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,15 @@ public expect class FirebaseAuth {
4141

4242
public expect class AuthResult {
4343
public val user: FirebaseUser?
44+
public val credential: AuthCredential?
45+
public val additionalUserInfo: AdditionalUserInfo?
46+
}
47+
48+
public expect class AdditionalUserInfo {
49+
public val providerId: String?
50+
public val username: String?
51+
public val profile: Map<String, Any?>?
52+
public val isNewUser: Boolean
4453
}
4554

4655
public expect class AuthTokenResult {

‎firebase-auth/src/commonTest/kotlin/dev/gitlive/firebase/auth/auth.kt

+16
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,22 @@ class FirebaseAuthTest {
112112
assertEquals(uid, result.user!!.uid)
113113
}
114114

115+
@Test
116+
fun testAuthResultStructure() = runTest {
117+
val uid = getTestUid("test@test.com", "test123")
118+
val result = auth.signInWithEmailAndPassword("test@test.com", "test123")
119+
assertNotNull(result.user, "User does not exist.")
120+
assertEquals(uid, result.user!!.uid, "uid does not match.")
121+
assertNull(result.credential, "Credential throws.")
122+
// Just test if it does not throw
123+
result.additionalUserInfo?.let { additionalUserInfo ->
124+
additionalUserInfo.providerId
125+
additionalUserInfo.username
126+
additionalUserInfo.profile
127+
additionalUserInfo.isNewUser
128+
}
129+
}
130+
115131
@Test
116132
fun testIsSignInWithEmailLink() {
117133
val validLink = "http://localhost:9099/emulator/action?mode=signIn&lang=en&oobCode=_vr0QcFcxcVeLZbrcU-GpTaZiuxlHquqdC8MSy0YM_vzWCTAQgV9Jq&apiKey=fake-api-key&continueUrl=https%3A%2F%2Fexample.com%2Fsignin"

‎firebase-auth/src/iosMain/kotlin/dev/gitlive/firebase/auth/auth.kt

+30-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import kotlinx.coroutines.channels.awaitClose
1717
import kotlinx.coroutines.flow.callbackFlow
1818
import kotlinx.coroutines.flow.Flow
1919
import platform.Foundation.NSError
20+
import platform.Foundation.NSString
2021
import platform.Foundation.NSURL
2122

2223
public val FirebaseAuth.ios: FIRAuth get() = FIRAuth.auth()
@@ -104,11 +105,39 @@ public actual class FirebaseAuth internal constructor(internal val ios: FIRAuth)
104105

105106
public actual fun useEmulator(host: String, port: Int): Unit = ios.useEmulatorWithHost(host, port.toLong())
106107
}
108+
107109
public val AuthResult.ios: FIRAuthDataResult get() = ios
108110

109-
public actual class AuthResult internal constructor(internal val ios: FIRAuthDataResult) {
111+
public actual class AuthResult(internal val ios: FIRAuthDataResult) {
110112
public actual val user: FirebaseUser?
111113
get() = FirebaseUser(ios.user())
114+
public actual val credential: AuthCredential?
115+
get() = ios.credential()?.let { AuthCredential(it) }
116+
public actual val additionalUserInfo: AdditionalUserInfo?
117+
get() = ios.additionalUserInfo()?.let { AdditionalUserInfo(it) }
118+
}
119+
120+
public val AdditionalUserInfo.ios: FIRAdditionalUserInfo get() = ios
121+
122+
public actual class AdditionalUserInfo(
123+
internal val ios: FIRAdditionalUserInfo,
124+
) {
125+
public actual val providerId: String?
126+
get() = ios.providerID()
127+
public actual val username: String?
128+
get() = ios.username()
129+
public actual val profile: Map<String, Any?>?
130+
get() = ios.profile()
131+
?.mapNotNull { (key, value) ->
132+
if (key is NSString && value != null) {
133+
key.toString() to value
134+
} else {
135+
null
136+
}
137+
}
138+
?.toMap()
139+
public actual val isNewUser: Boolean
140+
get() = ios.newUser()
112141
}
113142

114143
public val AuthTokenResult.ios: FIRAuthTokenResult get() = ios

‎firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/auth.kt

+28-1
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,10 @@ import kotlinx.coroutines.await
3333
import kotlinx.coroutines.channels.awaitClose
3434
import kotlinx.coroutines.flow.Flow
3535
import kotlinx.coroutines.flow.callbackFlow
36+
import kotlin.js.Json
3637
import kotlin.js.json
3738
import dev.gitlive.firebase.auth.externals.AuthResult as JsAuthResult
39+
import dev.gitlive.firebase.auth.externals.AdditionalUserInfo as JsAdditionalUserInfo
3840

3941
public actual val Firebase.auth: FirebaseAuth
4042
get() = rethrow { FirebaseAuth(getAuth()) }
@@ -133,9 +135,34 @@ public actual class FirebaseAuth internal constructor(internal val js: Auth) {
133135

134136
public val AuthResult.js: JsAuthResult get() = js
135137

136-
public actual class AuthResult internal constructor(internal val js: JsAuthResult) {
138+
public actual class AuthResult(internal val js: JsAuthResult) {
137139
public actual val user: FirebaseUser?
138140
get() = rethrow { js.user?.let { FirebaseUser(it) } }
141+
public actual val credential: AuthCredential?
142+
get() = rethrow { js.credential?.let { AuthCredential(it) } }
143+
public actual val additionalUserInfo: AdditionalUserInfo?
144+
get() = rethrow { js.additionalUserInfo?.let { AdditionalUserInfo(it) } }
145+
}
146+
147+
public val AdditionalUserInfo.js: JsAdditionalUserInfo get() = js
148+
149+
public actual class AdditionalUserInfo(
150+
internal val js: JsAdditionalUserInfo,
151+
) {
152+
public actual val providerId: String?
153+
get() = js.providerId
154+
public actual val username: String?
155+
get() = js.username
156+
public actual val profile: Map<String, Any?>?
157+
get() = rethrow {
158+
val profile = js.profile ?: return@rethrow null
159+
val entries = js("Object.entries") as (Json) -> Array<Array<Any?>>
160+
return@rethrow entries
161+
.invoke(profile)
162+
.associate { entry -> entry[0] as String to entry[1] }
163+
}
164+
public actual val isNewUser: Boolean
165+
get() = js.newUser
139166
}
140167

141168
public val AuthTokenResult.js: IdTokenResult get() = js

‎firebase-auth/src/jsMain/kotlin/dev/gitlive/firebase/auth/externals/auth.kt

+8
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,14 @@ public external interface AuthResult {
170170
public val credential: AuthCredential?
171171
public val operationType: String?
172172
public val user: User?
173+
public val additionalUserInfo: AdditionalUserInfo?
174+
}
175+
176+
public external interface AdditionalUserInfo {
177+
public val providerId: String?
178+
public val username: String?
179+
public val profile: Json?
180+
public val newUser: Boolean
173181
}
174182

175183
public external interface AuthCredential {

‎firebase-auth/src/jvmMain/kotlin/dev/gitlive/firebase/auth/auth.kt

+17-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import kotlinx.coroutines.flow.Flow
1818
import kotlinx.coroutines.flow.callbackFlow
1919
import kotlinx.coroutines.tasks.await
2020

21-
public actual val Firebase.auth
21+
public actual val Firebase.auth: FirebaseAuth
2222
get() = FirebaseAuth(com.google.firebase.auth.FirebaseAuth.getInstance())
2323

2424
public actual fun Firebase.auth(app: FirebaseApp) =
@@ -127,9 +127,24 @@ public actual class FirebaseAuth internal constructor(internal val android: com.
127127

128128
public val AuthResult.android: com.google.firebase.auth.AuthResult get() = android
129129

130-
public actual class AuthResult internal constructor(internal val android: com.google.firebase.auth.AuthResult) {
130+
public actual class AuthResult(internal val android: com.google.firebase.auth.AuthResult) {
131131
public actual val user: FirebaseUser?
132132
get() = android.user?.let { FirebaseUser(it) }
133+
public actual val credential: AuthCredential?
134+
get() = throw NotImplementedError()
135+
public actual val additionalUserInfo: AdditionalUserInfo?
136+
get() = throw NotImplementedError()
137+
}
138+
139+
public actual class AdditionalUserInfo {
140+
public actual val providerId: String?
141+
get() = throw NotImplementedError()
142+
public actual val username: String?
143+
get() = throw NotImplementedError()
144+
public actual val profile: Map<String, Any?>?
145+
get() = throw NotImplementedError()
146+
public actual val isNewUser: Boolean
147+
get() = throw NotImplementedError()
133148
}
134149

135150
public val AuthTokenResult.android: com.google.firebase.auth.GetTokenResult get() = android

0 commit comments

Comments
 (0)
Failed to load comments.