Skip to content

Commit

Permalink
Merge pull request #9 from groupeminaste/feature/cache
Browse files Browse the repository at this point in the history
Setting up cache
  • Loading branch information
nathanfallet committed Mar 5, 2024
2 parents 2dcbb4f + c434aa8 commit 624c093
Show file tree
Hide file tree
Showing 23 changed files with 269 additions and 25 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.nathanfallet.extopy.di

import me.nathanfallet.extopy.BuildConfig
import me.nathanfallet.extopy.database.DatabaseDriverFactory
import me.nathanfallet.extopy.models.application.ExtopyEnvironment
import me.nathanfallet.extopy.repositories.application.ITokenRepository
import me.nathanfallet.extopy.repositories.application.TokenRepository
Expand All @@ -13,11 +14,16 @@ val environmentModule = module {
}
}

val databaseModule = module {
single { DatabaseDriverFactory(get()) }
}

val repositoryModule = module {
single<ITokenRepository> { TokenRepository(get()) }
}

val androidModule = listOf(
databaseModule,
environmentModule,
repositoryModule
)
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ fun RootView() {
val navController = rememberNavController()
val navBackStackEntry by navController.currentBackStackEntryAsState()

LaunchedEffect("user") {
LaunchedEffect(Unit) {
viewModel.fetchUser()
}

Expand Down
2 changes: 1 addition & 1 deletion ios/Extopy.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -203,7 +203,6 @@
children = (
6AB01AE32B3605A1001AF7FF /* AuthView.swift */,
6A7D0795291D8C5F0023BE5B /* AuthSheet.swift */,
6A7D0793291D81950023BE5B /* SafariView.swift */,
);
path = Auth;
sourceTree = "<group>";
Expand Down Expand Up @@ -231,6 +230,7 @@
children = (
6AC04BBE2B35B682009938B9 /* Posts */,
6AC04BBD2B35B67A009938B9 /* Users */,
6A7D0793291D81950023BE5B /* SafariView.swift */,
);
path = Components;
sourceTree = "<group>";
Expand Down
File renamed without changes.
6 changes: 3 additions & 3 deletions shared/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,8 @@ kotlin {
}
}

val coroutinesVersion = "1.7.3"
val ktorVersion = "2.3.7"
val coroutinesVersion = "1.8.0"
val ktorVersion = "2.3.9"
val koinVersion = "3.5.3"
val sqlDelightVersion = "2.0.0"

Expand All @@ -44,7 +44,7 @@ kotlin {
implementation("io.ktor:ktor-client-content-negotiation:$ktorVersion")
implementation("io.ktor:ktor-serialization-kotlinx-json:$ktorVersion")
implementation("io.insert-koin:koin-core:$koinVersion")
implementation("io.sentry:sentry-kotlin-multiplatform:0.2.1")
implementation("io.sentry:sentry-kotlin-multiplatform:0.4.0")

implementation("app.cash.sqldelight:runtime:$sqlDelightVersion")
implementation("co.touchlab:stately-common:2.0.5")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@ import app.cash.sqldelight.db.SqlDriver
import app.cash.sqldelight.driver.android.AndroidSqliteDriver

actual class DatabaseDriverFactory(private val context: Context) {
actual fun createDriver(): SqlDriver {
return AndroidSqliteDriver(AppDatabase.Schema, context, "solar.db")
}

actual fun createDriver(): SqlDriver =
AndroidSqliteDriver(AppDatabase.Schema, context, "extopy.db")

}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ package me.nathanfallet.extopy.database
class Database(databaseDriverFactory: DatabaseDriverFactory) {

private val database = AppDatabase(databaseDriverFactory.createDriver())
//private val dbQuery = database.appDatabaseQueries

val usersQueries = database.usersDatabaseQueries
val postsQueries = database.postsDatabaseQueries

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,11 @@ package me.nathanfallet.extopy.di

import me.nathanfallet.extopy.client.ExtopyClient
import me.nathanfallet.extopy.client.IExtopyClient
import me.nathanfallet.extopy.database.Database
import me.nathanfallet.extopy.repositories.posts.IPostsRepository
import me.nathanfallet.extopy.repositories.posts.PostsRepository
import me.nathanfallet.extopy.repositories.users.IUsersRepository
import me.nathanfallet.extopy.repositories.users.UsersRepository
import me.nathanfallet.extopy.usecases.auth.*
import me.nathanfallet.extopy.usecases.posts.*
import me.nathanfallet.extopy.usecases.timelines.FetchTimelinePostsUseCase
Expand All @@ -19,8 +24,17 @@ import me.nathanfallet.extopy.viewmodels.users.ProfileViewModel
import me.nathanfallet.ktorx.usecases.api.IGetTokenUseCase
import org.koin.dsl.module

val databaseModule = module {
single { Database(get()) }
}

val repositoryModule = module {
// Remote client
single<IExtopyClient> { ExtopyClient(get(), get()) }

// Local cache
single<IUsersRepository> { UsersRepository(get()) }
single<IPostsRepository> { PostsRepository(get(), get()) }
}

val useCaseModule = module {
Expand All @@ -36,15 +50,15 @@ val useCaseModule = module {
single<IFetchTimelinePostsUseCase> { FetchTimelinePostsUseCase(get()) }

// Users
single<IFetchUserUseCase> { FetchUserUseCase(get()) }
single<IFetchUserUseCase> { FetchUserUseCase(get(), get()) }
single<IUpdateFollowInUserUseCase> { UpdateFollowInUserUseCase(get(), get()) }
single<IFetchUserPostsUseCase> { FetchUserPostsUseCase(get()) }
single<IFetchUserPostsUseCase> { FetchUserPostsUseCase(get(), get()) }

// Posts
single<ICreatePostUseCase> { CreatePostUseCase(get()) }
single<ICreatePostUseCase> { CreatePostUseCase(get(), get()) }
single<IUpdateLikeInPostUseCase> { UpdateLikeInPostUseCase(get(), get()) }
single<IFetchPostUseCase> { FetchPostUseCase(get()) }
single<IFetchPostRepliesUseCase> { FetchPostRepliesUseCase(get()) }
single<IFetchPostUseCase> { FetchPostUseCase(get(), get()) }
single<IFetchPostRepliesUseCase> { FetchPostRepliesUseCase(get(), get()) }
}

val viewModelModule = module {
Expand All @@ -58,6 +72,7 @@ val viewModelModule = module {
}

val sharedModule = listOf(
databaseModule,
repositoryModule,
useCaseModule,
viewModelModule,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package me.nathanfallet.extopy.repositories.posts

import kotlinx.datetime.Instant
import me.nathanfallet.extopy.models.posts.Post

interface IPostsRepository {

fun save(post: Post, expiresFromCacheAt: Instant)
fun get(id: String): Post?
fun delete(id: String)
fun deleteAll()
fun deleteExpired()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package me.nathanfallet.extopy.repositories.posts

import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import me.nathanfallet.extopy.database.Database
import me.nathanfallet.extopy.database.Posts
import me.nathanfallet.extopy.models.posts.Post
import me.nathanfallet.extopy.repositories.users.IUsersRepository

class PostsRepository(
private val database: Database,
private val usersRepository: IUsersRepository,
) : IPostsRepository {

override fun save(post: Post, expiresFromCacheAt: Instant) =
database.postsQueries.save(
Posts(
id = post.id,
userId = post.userId,
body = post.body,
expiresFromCacheAt = expiresFromCacheAt.toString()
)
)

override fun get(id: String): Post? =
database.postsQueries.get(id, Clock.System.now().toString()).executeAsOneOrNull()?.let {
Post(
id = it.id,
userId = it.userId,
body = it.body,
user = it.userId?.let { userId -> usersRepository.get(userId) },
)
}

override fun delete(id: String) =
database.postsQueries.delete(id)

override fun deleteAll() =
database.postsQueries.deleteAll()

override fun deleteExpired() =
database.postsQueries.deleteExpired(Clock.System.now().toString())

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package me.nathanfallet.extopy.repositories.users

import kotlinx.datetime.Instant
import me.nathanfallet.extopy.models.users.User

interface IUsersRepository {

fun save(user: User, expiresFromCacheAt: Instant)
fun get(id: String): User?
fun delete(id: String)
fun deleteAll()
fun deleteExpired()

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package me.nathanfallet.extopy.repositories.users

import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import me.nathanfallet.extopy.database.Database
import me.nathanfallet.extopy.database.Users
import me.nathanfallet.extopy.models.users.User

class UsersRepository(
private val database: Database,
) : IUsersRepository {

override fun save(user: User, expiresFromCacheAt: Instant) =
database.usersQueries.save(
Users(
id = user.id,
displayName = user.displayName,
username = user.username,
email = user.email,
biography = user.biography,
avatar = user.avatar,
expiresFromCacheAt = expiresFromCacheAt.toString()
)
)

override fun get(id: String): User? =
database.usersQueries.get(id, Clock.System.now().toString()).executeAsOneOrNull()?.let {
User(
id = it.id,
displayName = it.displayName,
username = it.username,
email = it.email,
biography = it.biography,
avatar = it.avatar
)
}

override fun delete(id: String) =
database.usersQueries.delete(id)

override fun deleteAll() =
database.usersQueries.deleteAll()

override fun deleteExpired() =
database.usersQueries.deleteExpired(Clock.System.now().toString())

}
Original file line number Diff line number Diff line change
@@ -1,15 +1,26 @@
package me.nathanfallet.extopy.usecases.posts

import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.TimeZone
import kotlinx.datetime.plus
import me.nathanfallet.extopy.client.IExtopyClient
import me.nathanfallet.extopy.models.posts.Post
import me.nathanfallet.extopy.models.posts.PostPayload
import me.nathanfallet.extopy.repositories.posts.IPostsRepository

class CreatePostUseCase(
private val client: IExtopyClient,
private val postsRepository: IPostsRepository,
) : ICreatePostUseCase {

override suspend fun invoke(input: PostPayload): Post? {
return client.posts.create(input)
return client.posts.create(input)?.also {
postsRepository.save(
it,
Clock.System.now().plus(60, DateTimeUnit.SECOND, TimeZone.currentSystemDefault())
)
}
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
package me.nathanfallet.extopy.usecases.posts

import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.TimeZone
import kotlinx.datetime.plus
import me.nathanfallet.extopy.client.IExtopyClient
import me.nathanfallet.extopy.models.posts.Post
import me.nathanfallet.extopy.repositories.posts.IPostsRepository

class FetchPostRepliesUseCase(
private val client: IExtopyClient,
private val postsRepository: IPostsRepository,
) : IFetchPostRepliesUseCase {

override suspend fun invoke(input1: String, input2: Long, input3: Long): List<Post> {
return client.posts.getReplies(input1, input2, input3)
return client.posts.getReplies(input1, input2, input3).onEach {
postsRepository.save(
it,
Clock.System.now().plus(60, DateTimeUnit.SECOND, TimeZone.currentSystemDefault())
)
}
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
package me.nathanfallet.extopy.usecases.posts

import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.TimeZone
import kotlinx.datetime.plus
import me.nathanfallet.extopy.client.IExtopyClient
import me.nathanfallet.extopy.models.posts.Post
import me.nathanfallet.extopy.repositories.posts.IPostsRepository

class FetchPostUseCase(
private val client: IExtopyClient,
private val postsRepository: IPostsRepository,
) : IFetchPostUseCase {

override suspend fun invoke(input: String): Post? {
return client.posts.get(input)
return postsRepository.get(input) ?: client.posts.get(input)?.also {
postsRepository.save(
it,
Clock.System.now().plus(60, DateTimeUnit.SECOND, TimeZone.currentSystemDefault())
)
}
}

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,25 @@
package me.nathanfallet.extopy.usecases.users

import kotlinx.datetime.Clock
import kotlinx.datetime.DateTimeUnit
import kotlinx.datetime.TimeZone
import kotlinx.datetime.plus
import me.nathanfallet.extopy.client.IExtopyClient
import me.nathanfallet.extopy.models.posts.Post
import me.nathanfallet.extopy.repositories.posts.IPostsRepository

class FetchUserPostsUseCase(
private val client: IExtopyClient,
private val postsRepository: IPostsRepository,
) : IFetchUserPostsUseCase {

override suspend fun invoke(input1: String, input2: Long, input3: Long): List<Post> {
return client.users.getPosts(input1, input2, input3)
return client.users.getPosts(input1, input2, input3).onEach {
postsRepository.save(
it,
Clock.System.now().plus(60, DateTimeUnit.SECOND, TimeZone.currentSystemDefault())
)
}
}

}
Loading

0 comments on commit 624c093

Please sign in to comment.