Skip to content

Commit

Permalink
Update project
Browse files Browse the repository at this point in the history
  • Loading branch information
michaelbel committed Mar 20, 2024
1 parent d8a8e4d commit e2ea6da
Show file tree
Hide file tree
Showing 18 changed files with 165 additions and 69 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package org.michaelbel.movies.network

import org.michaelbel.movies.network.ktor.KtorAccountService
import org.michaelbel.movies.network.model.Account
import org.michaelbel.movies.network.retrofit.RetrofitAccountService
import javax.inject.Inject

/**
* You can replace [ktorAccountService] with [retrofitAccountService] to use it.
*/
class AccountNetworkService @Inject internal constructor(
private val retrofitAccountService: RetrofitAccountService,
private val ktorAccountService: KtorAccountService
) {

suspend fun accountDetails(
sessionId: String
): Account {
return ktorAccountService.accountDetails(sessionId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package org.michaelbel.movies.network

import org.michaelbel.movies.network.ktor.KtorAuthenticationService
import org.michaelbel.movies.network.model.DeletedSession
import org.michaelbel.movies.network.model.RequestToken
import org.michaelbel.movies.network.model.Session
import org.michaelbel.movies.network.model.SessionRequest
import org.michaelbel.movies.network.model.Token
import org.michaelbel.movies.network.model.Username
import org.michaelbel.movies.network.retrofit.RetrofitAuthenticationService
import javax.inject.Inject

/**
* You can replace [ktorAuthenticationService] with [retrofitAuthenticationService] to use it.
*/
class AuthenticationNetworkService @Inject internal constructor(
private val retrofitAuthenticationService: RetrofitAuthenticationService,
private val ktorAuthenticationService: KtorAuthenticationService
) {

suspend fun createRequestToken(): Token {
return ktorAuthenticationService.createRequestToken()
}

suspend fun createSessionWithLogin(
username: Username
): Token {
return ktorAuthenticationService.createSessionWithLogin(username)
}

suspend fun createSession(
authToken: RequestToken
): Session {
return ktorAuthenticationService.createSession(authToken)
}

suspend fun deleteSession(
sessionRequest: SessionRequest
): DeletedSession {
return ktorAuthenticationService.deleteSession(sessionRequest)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package org.michaelbel.movies.network

import org.michaelbel.movies.network.ktor.KtorMovieService
import org.michaelbel.movies.network.model.ImagesResponse
import org.michaelbel.movies.network.model.Movie
import org.michaelbel.movies.network.model.MovieResponse
import org.michaelbel.movies.network.model.Result
import org.michaelbel.movies.network.retrofit.RetrofitMovieService
import javax.inject.Inject

/**
* You can replace [ktorMovieService] with [retrofitMovieService] to use it.
*/
class MovieNetworkService @Inject internal constructor(
private val retrofitMovieService: RetrofitMovieService,
private val ktorMovieService: KtorMovieService
) {

suspend fun movies(
list: String,
language: String,
page: Int
): Result<MovieResponse> {
return ktorMovieService.movies(list, language, page)
}

suspend fun movie(
movieId: Int,
language: String
): Movie {
return ktorMovieService.movie(movieId, language)
}

suspend fun images(
movieId: Int
): ImagesResponse {
return ktorMovieService.images(movieId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.michaelbel.movies.network

import org.michaelbel.movies.network.ktor.KtorSearchService
import org.michaelbel.movies.network.model.MovieResponse
import org.michaelbel.movies.network.model.Result
import org.michaelbel.movies.network.retrofit.RetrofitSearchService
import javax.inject.Inject

/**
* You can replace [ktorSearchService] with [retrofitSearchService] to use it.
*/
class SearchNetworkService @Inject internal constructor(
private val retrofitSearchService: RetrofitSearchService,
private val ktorSearchService: KtorSearchService
) {

suspend fun searchMovies(
query: String,
language: String,
page: Int
): Result<MovieResponse> {
return ktorSearchService.searchMovies(query, language, page)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.parameter
import javax.inject.Inject
import org.michaelbel.movies.network.model.Account
import javax.inject.Inject

class KtorAccountService @Inject constructor(
internal class KtorAccountService @Inject constructor(
private val ktorHttpClient: HttpClient
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import io.ktor.client.request.delete
import io.ktor.client.request.get
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import javax.inject.Inject
import org.michaelbel.movies.network.model.DeletedSession
import org.michaelbel.movies.network.model.RequestToken
import org.michaelbel.movies.network.model.Session
import org.michaelbel.movies.network.model.SessionRequest
import org.michaelbel.movies.network.model.Token
import org.michaelbel.movies.network.model.Username
import javax.inject.Inject

class KtorAuthenticationService @Inject constructor(
internal class KtorAuthenticationService @Inject constructor(
private val ktorHttpClient: HttpClient
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.parameter
import javax.inject.Inject
import org.michaelbel.movies.network.model.ImagesResponse
import org.michaelbel.movies.network.model.Movie
import org.michaelbel.movies.network.model.MovieResponse
import org.michaelbel.movies.network.model.Result
import javax.inject.Inject

class KtorMovieService @Inject constructor(
internal class KtorMovieService @Inject constructor(
private val ktorHttpClient: HttpClient
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ import io.ktor.client.HttpClient
import io.ktor.client.call.body
import io.ktor.client.request.get
import io.ktor.client.request.parameter
import javax.inject.Inject
import org.michaelbel.movies.network.model.MovieResponse
import org.michaelbel.movies.network.model.Result
import javax.inject.Inject

class KtorSearchService @Inject constructor(
internal class KtorSearchService @Inject constructor(
private val ktorHttpClient: HttpClient
) {

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import retrofit2.http.GET
import retrofit2.http.Query

@Deprecated("Use KtorAccountService instead", ReplaceWith("KtorAccountService"))
interface RetrofitAccountService {
internal interface RetrofitAccountService {

@GET("account")
suspend fun accountDetails(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ import retrofit2.http.HTTP
import retrofit2.http.POST

@Deprecated("Use KtorAuthenticationService instead", ReplaceWith("KtorAuthenticationService"))
interface RetrofitAuthenticationService {
internal interface RetrofitAuthenticationService {

@GET("authentication/token/new?")
suspend fun createRequestToken(): Token
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import retrofit2.http.Path
import retrofit2.http.Query

@Deprecated("Use KtorMovieService instead", ReplaceWith("KtorMovieService"))
interface RetrofitMovieService {
internal interface RetrofitMovieService {

@GET("movie/{list}")
suspend fun movies(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import retrofit2.http.GET
import retrofit2.http.Query

@Deprecated("Use KtorSearchService instead", ReplaceWith("KtorSearchService"))
interface RetrofitSearchService {
internal interface RetrofitSearchService {

@GET("search/movie")
suspend fun searchMovies(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,22 @@
package org.michaelbel.movies.repository.impl

import kotlinx.coroutines.ExperimentalCoroutinesApi
import javax.inject.Inject
import javax.inject.Singleton
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.map
import org.michaelbel.movies.common.exceptions.AccountDetailsException
import org.michaelbel.movies.network.ktor.KtorAccountService
import org.michaelbel.movies.network.retrofit.RetrofitAccountService
import org.michaelbel.movies.network.AccountNetworkService
import org.michaelbel.movies.persistence.database.AccountPersistence
import org.michaelbel.movies.persistence.database.entity.AccountDb
import org.michaelbel.movies.persistence.datastore.MoviesPreferences
import org.michaelbel.movies.repository.AccountRepository
import org.michaelbel.movies.repository.ktx.mapToAccountDb
import javax.inject.Inject
import javax.inject.Singleton

/**
* You can replace [ktorAccountService] with [retrofitAccountService] to use it.
*/
@Singleton
internal class AccountRepositoryImpl @Inject constructor(
private val retrofitAccountService: RetrofitAccountService,
private val ktorAccountService: KtorAccountService,
private val accountNetworkService: AccountNetworkService,
private val accountPersistence: AccountPersistence,
private val preferences: MoviesPreferences
): AccountRepository {
Expand All @@ -43,7 +38,7 @@ internal class AccountRepositoryImpl @Inject constructor(
override suspend fun accountDetails() {
runCatching {
val sessionId = preferences.sessionId().orEmpty()
val account = ktorAccountService.accountDetails(sessionId)
val account = accountNetworkService.accountDetails(sessionId)
preferences.run {
setAccountId(account.id)
setAccountExpireTime(System.currentTimeMillis())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,33 +4,28 @@ import org.michaelbel.movies.common.exceptions.CreateRequestTokenException
import org.michaelbel.movies.common.exceptions.CreateSessionException
import org.michaelbel.movies.common.exceptions.CreateSessionWithLoginException
import org.michaelbel.movies.common.exceptions.DeleteSessionException
import org.michaelbel.movies.network.ktor.KtorAuthenticationService
import org.michaelbel.movies.network.AuthenticationNetworkService
import org.michaelbel.movies.network.model.RequestToken
import org.michaelbel.movies.network.model.Session
import org.michaelbel.movies.network.model.SessionRequest
import org.michaelbel.movies.network.model.Token
import org.michaelbel.movies.network.model.Username
import org.michaelbel.movies.network.retrofit.RetrofitAuthenticationService
import org.michaelbel.movies.persistence.database.AccountPersistence
import org.michaelbel.movies.persistence.datastore.MoviesPreferences
import org.michaelbel.movies.repository.AuthenticationRepository
import javax.inject.Inject
import javax.inject.Singleton

/**
* You can replace [ktorAuthenticationService] with [retrofitAuthenticationService] to use it.
*/
@Singleton
internal class AuthenticationRepositoryImpl @Inject constructor(
private val retrofitAuthenticationService: RetrofitAuthenticationService,
private val ktorAuthenticationService: KtorAuthenticationService,
private val authenticationNetworkService: AuthenticationNetworkService,
private val accountPersistence: AccountPersistence,
private val preferences: MoviesPreferences
): AuthenticationRepository {

override suspend fun createRequestToken(loginViaTmdb: Boolean): Token {
return try {
val token = ktorAuthenticationService.createRequestToken()
val token = authenticationNetworkService.createRequestToken()
if (!token.success) {
throw CreateRequestTokenException(loginViaTmdb)
}
Expand All @@ -46,7 +41,7 @@ internal class AuthenticationRepositoryImpl @Inject constructor(
requestToken: String
): Token {
return try {
val token = ktorAuthenticationService.createSessionWithLogin(
val token = authenticationNetworkService.createSessionWithLogin(
username = Username(
username = username,
password = password,
Expand All @@ -64,7 +59,7 @@ internal class AuthenticationRepositoryImpl @Inject constructor(

override suspend fun createSession(token: String): Session {
return try {
val session = ktorAuthenticationService.createSession(RequestToken(token))
val session = authenticationNetworkService.createSession(RequestToken(token))
if (session.success) {
preferences.setSessionId(session.sessionId)
} else {
Expand All @@ -80,7 +75,7 @@ internal class AuthenticationRepositoryImpl @Inject constructor(
runCatching {
val sessionId = preferences.sessionId().orEmpty()
val sessionRequest = SessionRequest(sessionId)
val deletedSession = ktorAuthenticationService.deleteSession(sessionRequest)
val deletedSession = authenticationNetworkService.deleteSession(sessionRequest)
if (deletedSession.success) {
val accountId = preferences.accountId()
accountPersistence.removeById(accountId)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
package org.michaelbel.movies.repository.impl

import kotlinx.coroutines.flow.Flow
import org.michaelbel.movies.network.ktor.KtorMovieService
import org.michaelbel.movies.network.retrofit.RetrofitMovieService
import org.michaelbel.movies.network.MovieNetworkService
import org.michaelbel.movies.persistence.database.ImagePersistence
import org.michaelbel.movies.persistence.database.entity.ImageDb
import org.michaelbel.movies.persistence.database.ktx.imageDb
import org.michaelbel.movies.repository.ImageRepository
import javax.inject.Inject
import javax.inject.Singleton

/**
* You can replace [ktorMovieService] with [retrofitMovieService] to use it.
*/
@Singleton
internal class ImageRepositoryImpl @Inject constructor(
private val retrofitMovieService: RetrofitMovieService,
private val ktorMovieService: KtorMovieService,
private val movieNetworkService: MovieNetworkService,
private val imagePersistence: ImagePersistence
): ImageRepository {

Expand All @@ -25,7 +20,7 @@ internal class ImageRepositoryImpl @Inject constructor(
}

override suspend fun images(movieId: Int) {
val imageResponse = ktorMovieService.images(movieId)
val imageResponse = movieNetworkService.images(movieId)
val posters = imageResponse.posters.mapIndexed { index, image ->
image.imageDb(
movieId = movieId,
Expand Down
Loading

0 comments on commit e2ea6da

Please sign in to comment.