Skip to content

Commit

Permalink
Add env vars for PubSub handlers (#83)
Browse files Browse the repository at this point in the history
  • Loading branch information
gchristov authored Aug 17, 2023
1 parent 9bd448d commit 74b577d
Show file tree
Hide file tree
Showing 51 changed files with 275 additions and 207 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import com.gchristov.thecodinglove.commonservice.pubsub.GoogleCloudPubSubSubscri
import com.gchristov.thecodinglove.commonservicedata.http.HttpService
import com.gchristov.thecodinglove.commonservicedata.pubsub.PubSubPublisher
import com.gchristov.thecodinglove.commonservicedata.pubsub.PubSubSubscription
import com.gchristov.thecodinglove.kmpcommonkotlin.AppConfig
import com.gchristov.thecodinglove.kmpcommonkotlin.di.DiModule
import org.kodein.di.DI
import org.kodein.di.bindProvider
Expand All @@ -26,6 +27,7 @@ object CommonServiceModule : DiModule() {
providePubSubSubscription(
log = instance(),
pubSub = instance(),
appConfig = instance(),
)
}
}
Expand All @@ -42,8 +44,10 @@ object CommonServiceModule : DiModule() {
private fun providePubSubSubscription(
log: Logger,
pubSub: GoogleCloudPubSubExternals.PubSub,
appConfig: AppConfig,
): PubSubSubscription = GoogleCloudPubSubSubscription(
log = log,
pubSub = pubSub,
appConfig = appConfig,
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ package com.gchristov.thecodinglove.commonservice.pubsub
import arrow.core.Either
import co.touchlab.kermit.Logger
import com.gchristov.thecodinglove.commonservicedata.pubsub.PubSubSubscription
import com.gchristov.thecodinglove.kmpcommonkotlin.AppConfig
import com.gchristov.thecodinglove.kmpcommonkotlin.process
import kotlinx.coroutines.await
import kotlin.js.json

internal class GoogleCloudPubSubSubscription(
private val log: Logger,
private val pubSub: GoogleCloudPubSubExternals.PubSub,
private val appConfig: AppConfig,
) : PubSubSubscription {
init {
process.env.GOOGLE_APPLICATION_CREDENTIALS = "local-credentials-pubsub.json"
Expand All @@ -28,9 +30,11 @@ internal class GoogleCloudPubSubSubscription(
val pubSubSubscription = pubSubTopic.subscription(subscription)
if (!pubSubSubscription.exists().await().first()) {
log.d("Creating PubSub subscription $subscription")
val trimmedDomain = appConfig.publicUrl
val trimmedPath = httpPath.removePrefix("/")
pubSubSubscription.create(
// TODO: Fix this to use a env variable for the website
json("pushEndpoint" to "https://cloudrun-test-oe6rkpnjrq-uw.a.run.app/$httpPath")
json("pushEndpoint" to "$trimmedDomain/$trimmedPath")
).await()
}
Either.Right(Unit)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ package com.gchristov.thecodinglove.searchdata
import com.gchristov.thecodinglove.commonservicedata.pubsub.PubSubPublisher
import com.gchristov.thecodinglove.htmlparsedata.usecase.ParseHtmlPostsUseCase
import com.gchristov.thecodinglove.htmlparsedata.usecase.ParseHtmlTotalPostsUseCase
import com.gchristov.thecodinglove.kmpcommonkotlin.BuildConfig
import com.gchristov.thecodinglove.kmpcommonkotlin.di.DiModule
import com.gchristov.thecodinglove.kmpcommonnetwork.HtmlClient
import com.gchristov.thecodinglove.searchdata.model.SearchConfig
import com.gchristov.thecodinglove.searchdata.domain.SearchConfig
import com.gchristov.thecodinglove.searchdata.usecase.*
import dev.gitlive.firebase.firestore.FirebaseFirestore
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -42,6 +43,7 @@ object SearchDataModule : DiModule() {
searchWithHistoryUseCase = instance(),
pubSubPublisher = instance(),
jsonSerializer = instance(),
searchConfig = instance(),
)
}
bindProvider {
Expand All @@ -67,7 +69,10 @@ object SearchDataModule : DiModule() {
firebaseFirestore = firebaseFirestore
)

private fun provideSearchConfig(): SearchConfig = SearchConfig(postsPerPage = 4)
private fun provideSearchConfig(): SearchConfig = SearchConfig(
postsPerPage = 4,
preloadPubSubTopic = BuildConfig.SEARCH_PRELOAD_PUBSUB_TOPIC,
)

private fun provideSearchWithHistoryUseCase(
searchRepository: SearchRepository,
Expand All @@ -83,12 +88,14 @@ object SearchDataModule : DiModule() {
searchWithHistoryUseCase: SearchWithHistoryUseCase,
pubSubPublisher: PubSubPublisher,
jsonSerializer: Json,
searchConfig: SearchConfig,
): SearchUseCase = RealSearchUseCase(
dispatcher = Dispatchers.Default,
searchRepository = searchRepository,
searchWithHistoryUseCase = searchWithHistoryUseCase,
pubSubPublisher = pubSubPublisher,
jsonSerializer = jsonSerializer,
searchConfig = searchConfig,
)

private fun providePreloadSearchResultUseCase(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import com.gchristov.thecodinglove.htmlparsedata.usecase.ParseHtmlPostsUseCase
import com.gchristov.thecodinglove.htmlparsedata.usecase.ParseHtmlTotalPostsUseCase
import com.gchristov.thecodinglove.searchdata.db.DbSearchSession
import com.gchristov.thecodinglove.searchdata.db.toSearchSession
import com.gchristov.thecodinglove.searchdata.model.*
import com.gchristov.thecodinglove.searchdata.domain.*
import dev.gitlive.firebase.firestore.FirebaseFirestore
import io.ktor.client.statement.*

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.gchristov.thecodinglove.searchdata.api

import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.domain.Post
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package com.gchristov.thecodinglove.searchdata.db

import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.domain.Post
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ package com.gchristov.thecodinglove.searchdata.db

import com.gchristov.thecodinglove.kmpcommonkotlin.di.DiGraph
import com.gchristov.thecodinglove.kmpcommonkotlin.di.inject
import com.gchristov.thecodinglove.searchdata.model.SearchSession
import com.gchristov.thecodinglove.searchdata.domain.SearchSession
import kotlinx.serialization.*
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gchristov.thecodinglove.searchdata.model
package com.gchristov.thecodinglove.searchdata.domain

import com.gchristov.thecodinglove.htmlparsedata.HtmlPost
import com.gchristov.thecodinglove.searchdata.db.DbPost
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
package com.gchristov.thecodinglove.searchdata.model
package com.gchristov.thecodinglove.searchdata.domain

import kotlinx.serialization.Serializable

@Serializable
data class PreloadSearchPubSubMessage(
val searchSessionId: String
)

const val PreloadSearchPubSubTopic = "preload_search"
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.gchristov.thecodinglove.searchdata.domain

data class SearchConfig(
val postsPerPage: Int,
val preloadPubSubTopic: String,
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gchristov.thecodinglove.searchdata.model
package com.gchristov.thecodinglove.searchdata.domain

sealed class SearchError(error: String? = null) : Throwable(error) {
object Empty : SearchError("No results found")
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.gchristov.thecodinglove.searchdata.model
package com.gchristov.thecodinglove.searchdata.domain

import com.gchristov.thecodinglove.searchdata.db.DbSearchSession

Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.gchristov.thecodinglove.searchdata.usecase
import arrow.core.Either
import arrow.core.flatMap
import com.gchristov.thecodinglove.searchdata.SearchRepository
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.model.SearchSession
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchSession
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.gchristov.thecodinglove.searchdata.usecase

import arrow.core.Either
import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.domain.Post
import kotlin.math.max
import kotlin.random.Random

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import arrow.core.flatMap
import com.benasher44.uuid.uuid4
import com.gchristov.thecodinglove.commonservicedata.pubsub.PubSubPublisher
import com.gchristov.thecodinglove.searchdata.SearchRepository
import com.gchristov.thecodinglove.searchdata.model.*
import com.gchristov.thecodinglove.searchdata.domain.*
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import kotlinx.serialization.json.Json
Expand All @@ -32,16 +32,19 @@ class RealSearchUseCase(
private val searchWithHistoryUseCase: SearchWithHistoryUseCase,
private val pubSubPublisher: PubSubPublisher,
private val jsonSerializer: Json,
private val searchConfig: SearchConfig,
) : SearchUseCase {
override suspend operator fun invoke(
type: SearchUseCase.Type
): Either<SearchError, SearchUseCase.Result> = withContext(dispatcher) {
search(type)
.flatMap { searchResult ->
publishSearchPreloadMessage(searchResult.searchSessionId)
.flatMap {
Either.Right(searchResult)
}
publishSearchPreloadMessage(
searchSessionId = searchResult.searchSessionId,
searchConfig = searchConfig,
).flatMap {
Either.Right(searchResult)
}
}
}

Expand Down Expand Up @@ -106,9 +109,12 @@ class RealSearchUseCase(
}
}

private suspend fun publishSearchPreloadMessage(searchSessionId: String) = pubSubPublisher
private suspend fun publishSearchPreloadMessage(
searchSessionId: String,
searchConfig: SearchConfig,
) = pubSubPublisher
.publishJson(
topic = PreloadSearchPubSubTopic,
topic = searchConfig.preloadPubSubTopic,
body = PreloadSearchPubSubMessage(searchSessionId),
jsonSerializer = jsonSerializer,
strategy = PreloadSearchPubSubMessage.serializer(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@ package com.gchristov.thecodinglove.searchdata.usecase
import arrow.core.Either
import arrow.core.flatMap
import com.gchristov.thecodinglove.searchdata.SearchRepository
import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.model.SearchConfig
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.domain.Post
import com.gchristov.thecodinglove.searchdata.domain.SearchConfig
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.withContext
import kotlin.random.Random
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package com.gchristov.thecodinglove.searchdata.usecase

import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeCoroutineDispatcher
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.model.SearchSession
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchSession
import com.gchristov.thecodinglove.searchtestfixtures.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestResult
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ package com.gchristov.thecodinglove.searchdata.usecase
import arrow.core.Either
import com.gchristov.thecodinglove.commonservicetestfixtures.FakePubSubPublisher
import com.gchristov.thecodinglove.kmpcommontest.FakeCoroutineDispatcher
import com.gchristov.thecodinglove.searchdata.model.PreloadSearchPubSubMessage
import com.gchristov.thecodinglove.searchdata.model.PreloadSearchPubSubTopic
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.model.SearchSession
import com.gchristov.thecodinglove.searchdata.domain.PreloadSearchPubSubMessage
import com.gchristov.thecodinglove.searchdata.domain.SearchConfig
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchSession
import com.gchristov.thecodinglove.searchtestfixtures.*
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.TestResult
Expand Down Expand Up @@ -98,7 +98,7 @@ class RealSearchUseCaseTest {
actual = actualResult
)
pubSub.assertEquals(
topic = PreloadSearchPubSubTopic,
topic = TestPreloadSearchPubSubTopic,
message = PreloadSearchPubSubMessage(TestSearchSessionId),
)
}
Expand Down Expand Up @@ -195,7 +195,7 @@ class RealSearchUseCaseTest {
)
)
pubSub.assertEquals(
topic = PreloadSearchPubSubTopic,
topic = TestPreloadSearchPubSubTopic,
message = PreloadSearchPubSubMessage(TestSearchSessionId),
)
}
Expand All @@ -221,10 +221,16 @@ class RealSearchUseCaseTest {
searchWithHistoryUseCase = searchWithHistoryUseCase,
jsonSerializer = Json,
pubSubPublisher = pubSubPublisher,
searchConfig = SearchConfig(
postsPerPage = TestSearchPostsPerPage,
preloadPubSubTopic = TestPreloadSearchPubSubTopic,
)
)
testBlock(useCase, pubSubPublisher, searchRepository, searchWithHistoryUseCase)
}
}

private const val TestSearchQuery = "test"
private const val TestSearchSessionId = "session_123"
private const val TestSearchSessionId = "session_123"
private const val TestSearchPostsPerPage = 4
private const val TestPreloadSearchPubSubTopic = "topic_123"
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package com.gchristov.thecodinglove.searchdata.usecase

import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeCoroutineDispatcher
import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.model.SearchConfig
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.domain.Post
import com.gchristov.thecodinglove.searchdata.domain.SearchConfig
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchtestfixtures.FakeSearchRepository
import com.gchristov.thecodinglove.searchtestfixtures.PostCreator
import kotlinx.coroutines.ExperimentalCoroutinesApi
Expand Down Expand Up @@ -185,6 +185,8 @@ class RealSearchWithHistoryUseCaseTest {
}

private const val TestSearchQuery = "test"
private const val TestSearchPreloadPubSubTopic = "topic_123"
private val TestSearchConfig = SearchConfig(
postsPerPage = PostCreator.multiPageMultiPostPageSize()
postsPerPage = PostCreator.multiPageMultiPostPageSize(),
preloadPubSubTopic = TestSearchPreloadPubSubTopic,
)
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.gchristov.thecodinglove.searchtestfixtures
import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeResponse
import com.gchristov.thecodinglove.kmpcommontest.execute
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.usecase.PreloadSearchResultUseCase
import kotlin.test.assertEquals

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeResponse
import com.gchristov.thecodinglove.kmpcommontest.execute
import com.gchristov.thecodinglove.searchdata.SearchRepository
import com.gchristov.thecodinglove.searchdata.model.Post
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.model.SearchSession
import com.gchristov.thecodinglove.searchdata.domain.Post
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchSession
import kotlin.test.assertEquals
import kotlin.test.assertFalse
import kotlin.test.assertTrue
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.gchristov.thecodinglove.searchtestfixtures
import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeResponse
import com.gchristov.thecodinglove.kmpcommontest.execute
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.usecase.SearchUseCase
import kotlin.test.assertEquals

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.gchristov.thecodinglove.searchtestfixtures
import arrow.core.Either
import com.gchristov.thecodinglove.kmpcommontest.FakeResponse
import com.gchristov.thecodinglove.kmpcommontest.execute
import com.gchristov.thecodinglove.searchdata.model.SearchError
import com.gchristov.thecodinglove.searchdata.domain.SearchError
import com.gchristov.thecodinglove.searchdata.usecase.SearchWithHistoryUseCase
import kotlin.test.assertEquals

Expand Down
Loading

0 comments on commit 74b577d

Please sign in to comment.