Skip to content

Commit 04a01fe

Browse files
committed
Merge branch 'update-apollo' into develop
2 parents 94b68b0 + d0a6f82 commit 04a01fe

9 files changed

Lines changed: 111 additions & 14 deletions

File tree

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ buildscript {
88
classpath("org.jetbrains.kotlin:kotlin-serialization:1.5.30")
99
classpath("dev.icerock.moko:resources-generator:0.16.1")
1010
classpath("com.squareup.sqldelight:gradle-plugin:1.5.1")
11-
classpath("com.apollographql.apollo3:apollo-gradle-plugin:3.0.0-alpha03")
11+
classpath("com.apollographql.apollo3:apollo-gradle-plugin:${Version.apollo}")
1212
classpath("com.google.gms:google-services:4.3.10")
1313
}
1414
}

buildSrc/buildSrc/src/main/kotlin/Deps.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ object Lib {
172172
object Version {
173173
const val kotlin = "1.5.30"
174174
const val sqlDelight = "1.5.1"
175-
const val apollo = "3.0.0-alpha03"
175+
const val apollo = "3.0.0-alpha06"
176176
const val compose = "1.1.0-alpha04"
177177
const val coroutines = "1.5.2-native-mt"
178178
const val ktLint = "0.42.1"

data/network/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,4 +21,5 @@ configure<com.apollographql.apollo3.gradle.api.ApolloExtension> {
2121
)
2222
)
2323
packageName.set("yaba.schema")
24+
generateSchema.set(true)
2425
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
subscription TestSub($user:String!){
2+
testSub(user: $user)
3+
}

data/network/src/commonMain/graphql/tech/alexib/yaba/schema.graphqls

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -371,6 +371,10 @@ input SetAccountHiddenInput {
371371
hide: Boolean!
372372
}
373373

374+
type Subscription {
375+
testSub(user: String!): Int!
376+
}
377+
374378
type Transaction {
375379
accountId: UUID!
376380

@@ -447,4 +451,5 @@ type UserWithTokenResponse {
447451
schema {
448452
query: Query
449453
mutation: Mutation
454+
subscription: Subscription
450455
}

data/network/src/commonMain/kotlin/tech/alexib/yaba/data/network/api/UserDataApi.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,17 +17,20 @@ package tech.alexib.yaba.data.network.api
1717

1818
import com.benasher44.uuid.Uuid
1919
import kotlinx.coroutines.flow.Flow
20+
import kotlinx.coroutines.flow.mapLatest
2021
import tech.alexib.yaba.data.domain.DataResult
2122
import tech.alexib.yaba.data.domain.dto.TransactionsUpdateDto
2223
import tech.alexib.yaba.data.domain.dto.UserDataDto
2324
import tech.alexib.yaba.data.network.apollo.YabaApolloClient
2425
import tech.alexib.yaba.data.network.mapper.toDto
2526
import yaba.schema.AllUserDataQuery
27+
import yaba.schema.TestSubSubscription
2628
import yaba.schema.TransactionsUpdateQuery
2729

2830
interface UserDataApi {
2931
fun getTransactionsUpdate(updateId: Uuid): Flow<DataResult<TransactionsUpdateDto?>>
3032
fun getAllUserData(): Flow<DataResult<UserDataDto>>
33+
fun testSub(): Flow<Int>
3134

3235
class Impl(
3336
private val client: YabaApolloClient
@@ -42,5 +45,10 @@ interface UserDataApi {
4245
val query = AllUserDataQuery()
4346
return client.query(query) { it.toDto() }
4447
}
48+
49+
override fun testSub(): Flow<Int> {
50+
val sub = TestSubSubscription("Alexi")
51+
return client.subscribe(sub).mapLatest { it.dataOrThrow.testSub }
52+
}
4553
}
4654
}

data/network/src/commonMain/kotlin/tech/alexib/yaba/data/network/apollo/YabaApolloClient.kt

Lines changed: 80 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,31 @@ import com.apollographql.apollo3.api.ApolloResponse
2424
import com.apollographql.apollo3.api.Mutation
2525
import com.apollographql.apollo3.api.Operation
2626
import com.apollographql.apollo3.api.Query
27+
import com.apollographql.apollo3.api.Subscription
28+
import com.apollographql.apollo3.api.http.HttpHeader
29+
import com.apollographql.apollo3.api.http.withHttpHeader
30+
import com.apollographql.apollo3.api.http.withHttpHeaders
2731
import com.apollographql.apollo3.api.variables
2832
import com.apollographql.apollo3.interceptor.ApolloInterceptor
2933
import com.apollographql.apollo3.interceptor.ApolloInterceptorChain
34+
import com.apollographql.apollo3.network.NetworkTransport
3035
import com.apollographql.apollo3.network.http.BearerTokenInterceptor
3136
import com.apollographql.apollo3.network.http.HttpNetworkTransport
3237
import com.apollographql.apollo3.network.http.TokenProvider
3338
import com.apollographql.apollo3.network.ws.WebSocketNetworkTransport
3439
import kotlinx.coroutines.CoroutineDispatcher
3540
import kotlinx.coroutines.flow.Flow
3641
import kotlinx.coroutines.flow.firstOrNull
42+
import kotlinx.coroutines.flow.flow
3743
import kotlinx.coroutines.flow.map
44+
import kotlinx.coroutines.sync.Mutex
45+
import kotlinx.coroutines.sync.withLock
3846
import tech.alexib.yaba.data.domain.AuthTokenProvider
3947
import tech.alexib.yaba.data.domain.DataResult
4048
import tech.alexib.yaba.data.domain.ErrorResult
4149
import tech.alexib.yaba.data.domain.Success
42-
import yaba.schema.type.Types
50+
import yaba.schema.type.LocalDate
51+
import yaba.schema.type.UUID
4352
import kotlin.time.DurationUnit
4453
import kotlin.time.measureTimedValue
4554

@@ -60,6 +69,15 @@ interface YabaApolloClient {
6069
mutationData: Mutation<T>,
6170
): Flow<ApolloResponse<T>>
6271

72+
fun <T : Subscription.Data> subscribe(
73+
subscriptionData: Subscription<T>
74+
): Flow<ApolloResponse<T>>
75+
76+
fun <T : Subscription.Data, R> subscribe(
77+
subscriptionData: Subscription<T>,
78+
mapper: (T) -> R
79+
): Flow<DataResult<R>>
80+
6381
class Impl(
6482
serverUrl: String,
6583
log: Kermit,
@@ -76,25 +94,39 @@ interface YabaApolloClient {
7694

7795
private val apolloClient: ApolloClient by lazy {
7896

97+
// val netTransport = HttpNetworkTransport(
98+
// serverUrl = serverUrl,
99+
//
100+
// interceptors = listOf(BearerTokenInterceptor(this))
101+
// )
102+
// val wsTransport = WebSocketNetworkTransport(
103+
// serverUrl = serverUrl.replace("graphql", "subscriptions").replace("http", "ws"),
104+
//
105+
// )
106+
// val netInterceptor = NetworkInterceptor(netTransport, wsTransport)
79107
ApolloClient(
80108
networkTransport = HttpNetworkTransport(
81109
serverUrl = serverUrl,
82-
headers = mutableMapOf(
83-
"Accept" to "application/json",
84-
"Content-Type" to "application/json",
85-
),
110+
86111
interceptors = listOf(BearerTokenInterceptor(this))
87112
),
88113
subscriptionNetworkTransport = WebSocketNetworkTransport(
89-
serverUrl = serverUrl,
114+
serverUrl = serverUrl.replace("graphql", "subscriptions").replace("http", "ws"),
90115

91116
),
92117
customScalarAdapters = customScalarTypeAdapters,
93118
interceptors = listOf(
94119
MyLoggingInterceptor(log)
95120
)
96-
).withCustomScalarAdapter(Types.UUID, uuidAdapter)
97-
.withCustomScalarAdapter(Types.LocalDate, LocalDateAdapter)
121+
)
122+
.withCustomScalarAdapter(UUID.type, uuidAdapter)
123+
.withCustomScalarAdapter(LocalDate.type, LocalDateAdapter)
124+
.withHttpHeaders(
125+
listOf(
126+
HttpHeader("Accept", "application/json"),
127+
HttpHeader("Content-Type", "application/json")
128+
)
129+
)
98130
}
99131

100132
override suspend fun currentToken(): String = authTokenProvider.token().firstOrNull() ?: ""
@@ -119,6 +151,19 @@ interface YabaApolloClient {
119151
return apolloClient.mutateAsFlow(ApolloRequest(mutationData))
120152
}
121153

154+
override fun <T : Subscription.Data> subscribe(
155+
subscriptionData: Subscription<T>
156+
): Flow<ApolloResponse<T>> = apolloClient.subscribe(
157+
ApolloRequest(subscriptionData)
158+
)
159+
160+
override fun <T : Subscription.Data, R> subscribe(
161+
subscriptionData: Subscription<T>,
162+
mapper: (T) -> R
163+
): Flow<DataResult<R>> = apolloClient.subscribe(
164+
ApolloRequest(subscriptionData)
165+
).map(checkResponse(mapper))
166+
122167
private fun <T : Operation.Data, R> checkResponse(mapper: (T) -> R): suspend (
123168
ApolloResponse<T>
124169
) ->
@@ -157,3 +202,30 @@ internal class MyLoggingInterceptor(private val log: Kermit) : ApolloInterceptor
157202
return response
158203
}
159204
}
205+
206+
class NInt(
207+
private val networkTransport: NetworkTransport,
208+
private val subscriptionNetworkTransport: NetworkTransport,
209+
private val tokenProvider: TokenProvider
210+
) : ApolloInterceptor {
211+
private val mutex = Mutex()
212+
override fun <D : Operation.Data> intercept(
213+
request: ApolloRequest<D>,
214+
chain: ApolloInterceptorChain
215+
): Flow<ApolloResponse<D>> {
216+
217+
return flow {
218+
val token = mutex.withLock { tokenProvider.currentToken() }
219+
when (request.operation) {
220+
is Query<*> -> networkTransport.execute(request = request)
221+
is Mutation<*> -> networkTransport.execute(request = request)
222+
is Subscription<*> -> subscriptionNetworkTransport.execute(
223+
request = request.withHttpHeader(
224+
HttpHeader("Authorization", "Bearer $token")
225+
)
226+
)
227+
else -> error("")
228+
}
229+
}
230+
}
231+
}

data/network/src/commonMain/kotlin/tech/alexib/yaba/data/network/mapper/PlaidLinkEventMapper.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,17 +15,17 @@
1515
*/
1616
package tech.alexib.yaba.data.network.mapper
1717

18-
import com.apollographql.apollo3.api.Optional
18+
import com.apollographql.apollo3.api.Optional.Companion.presentIfNotNull
1919
import tech.alexib.yaba.model.request.PlaidLinkEventCreateRequest
2020
import yaba.schema.CreateLinkEventMutation
2121

2222
internal fun PlaidLinkEventCreateRequest.toMutation(): CreateLinkEventMutation {
2323
return when (this) {
2424
is PlaidLinkEventCreateRequest.Exit -> CreateLinkEventMutation(
2525
type = "LinkExit",
26-
requestId = Optional.Absent.presentIfNotNull(requestId),
27-
errorCode = Optional.Absent.presentIfNotNull(errorCode),
28-
errorType = Optional.Absent.presentIfNotNull(errorType),
26+
requestId = presentIfNotNull(requestId),
27+
errorCode = presentIfNotNull(errorCode),
28+
errorType = presentIfNotNull(errorType),
2929
linkSessionId = linkSessionId
3030
)
3131
is PlaidLinkEventCreateRequest.Success -> CreateLinkEventMutation(

data/src/commonTest/kotlin/tech/alexib/yaba/data/mock/api/UserDataApiMock.kt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
package tech.alexib.yaba.data.mock.api
1717

1818
import com.benasher44.uuid.Uuid
19+
import kotlinx.coroutines.delay
1920
import kotlinx.coroutines.flow.Flow
2021
import kotlinx.coroutines.flow.flow
2122
import tech.alexib.yaba.data.domain.DataResult
@@ -34,4 +35,11 @@ internal class UserDataApiMock : UserDataApi {
3435
override fun getAllUserData(): Flow<DataResult<UserDataDto>> = flow {
3536
emit(Success(UserDataDtoStubs.userData))
3637
}
38+
39+
override fun testSub(): Flow<Int> = flow {
40+
(0..500).forEach {
41+
emit(it)
42+
delay(1000)
43+
}
44+
}
3745
}

0 commit comments

Comments
 (0)