Skip to content

Commit

Permalink
Merge pull request #212 from mende273/migrate-api
Browse files Browse the repository at this point in the history
migrate from nonfunctional quotable.io api to zenquotes.io api
  • Loading branch information
mende273 authored Sep 29, 2024
2 parents 93761ee + 4679c45 commit 7ccb9e8
Show file tree
Hide file tree
Showing 40 changed files with 217 additions and 599 deletions.
2 changes: 1 addition & 1 deletion app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -92,7 +92,7 @@ dependencies {

// tests
testImplementation("junit:junit:4.13.2")
androidTestImplementation("androidx.test.ext:junit:1.1.5")
androidTestImplementation("androidx.test.ext:junit:1.2.0")

// compose
implementation("androidx.activity:activity-compose:1.9.0")
Expand Down
2 changes: 1 addition & 1 deletion app/config/detekt.yml
Original file line number Diff line number Diff line change
Expand Up @@ -592,7 +592,7 @@ style:
active: false
maxChainedCalls: 5
MaxLineLength:
active: true
active: false
maxLineLength: 120
excludePackageStatements: true
excludeImportStatements: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ package com.jumrukovski.quotescompose.data.db

import androidx.room.Database
import androidx.room.RoomDatabase
import com.jumrukovski.quotescompose.data.model.entity.FavouriteQuoteEntity
import com.jumrukovski.quotescompose.data.model.entity.QuoteEntity

@Database(entities = [FavouriteQuoteEntity::class], version = 1)
@Database(entities = [QuoteEntity::class], version = 1)
abstract class LocalDB : RoomDatabase() {

abstract fun quoteDao(): QuoteDao
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import com.jumrukovski.quotescompose.data.model.entity.FavouriteQuoteEntity
import com.jumrukovski.quotescompose.data.model.entity.QuoteEntity
import kotlinx.coroutines.flow.Flow

@Dao
interface QuoteDao {

@Query("SELECT * FROM FavouriteQuoteEntity")
fun getAllFavouriteQuotesAsync(): Flow<List<FavouriteQuoteEntity>>
@Query("SELECT * FROM QuoteEntity")
fun getAllFavouriteQuotes(): Flow<List<QuoteEntity>>

@Query("SELECT * FROM FavouriteQuoteEntity WHERE id=:id LIMIT 1")
fun getFavouriteQuoteAsync(id: String): Flow<FavouriteQuoteEntity>
@Query("SELECT * FROM QuoteEntity WHERE id=:id LIMIT 1")
fun getFavouriteQuote(id: Int): Flow<QuoteEntity>

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addFavouriteQuote(entity: FavouriteQuoteEntity)
fun addFavouriteQuote(entity: QuoteEntity)

@Delete
fun deleteFavouriteQuote(entity: FavouriteQuoteEntity)
fun deleteFavouriteQuote(entity: QuoteEntity)
}
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package com.jumrukovski.quotescompose.data.mapper

import com.jumrukovski.quotescompose.data.model.entity.FavouriteQuoteEntity
import com.jumrukovski.quotescompose.data.model.entity.QuoteEntity
import com.jumrukovski.quotescompose.domain.model.Quote
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

fun Flow<List<FavouriteQuoteEntity>>.mapToQuotes(): Flow<List<Quote>> {
fun Flow<List<QuoteEntity>>.mapToQuotes(): Flow<List<Quote>> {
return this.map { items ->
items.map {
Quote(id = it.id, content = it.content, author = it.author)
}
}
}

fun Flow<FavouriteQuoteEntity?>.mapToQuote(): Flow<Quote?> {
fun Flow<QuoteEntity?>.mapToQuote(): Flow<Quote?> {
return this.map {
it?.let {
Quote(id = it.id, content = it.content, author = it.author)
}
}
}

fun mapToFavouriteQuoteEntity(id: String, content: String, author: String): FavouriteQuoteEntity {
return FavouriteQuoteEntity(id, content, author)
fun mapToFavouriteQuoteEntity(id: Int, content: String, author: String): QuoteEntity {
return QuoteEntity(id, content, author)
}
Original file line number Diff line number Diff line change
@@ -1,33 +1,23 @@
package com.jumrukovski.quotescompose.data.mapper

import com.jumrukovski.quotescompose.data.model.dto.QuoteDTO
import com.jumrukovski.quotescompose.data.model.dto.QuotesResultsDTO
import com.jumrukovski.quotescompose.data.model.dto.TagDTO
import com.jumrukovski.quotescompose.domain.model.Quote
import com.jumrukovski.quotescompose.domain.model.Tag
import retrofit2.Response

fun Response<List<TagDTO>>.mapTagsAsResult(): Result<List<Tag>> =
fun Response<List<QuoteDTO>>.mapQuotesAsListResult(): Result<List<Quote>> =
runCatching {
this.body()?.mapToTags() ?: emptyList()
this.body()?.mapToQuotes() ?: emptyList()
}

fun Response<QuotesResultsDTO>.mapQuotesAsResult(): Result<List<Quote>> =
fun Response<List<QuoteDTO>>.mapToFirstQuoteAsResult(): Result<Quote> =
runCatching {
this.body()?.results?.mapToQuotes() ?: emptyList()
this.body()?.mapToQuotes()?.first() ?: Quote(0, "", "")
}

fun Response<QuoteDTO>.mapQuoteAsResult(): Result<Quote> =
runCatching {
this.body()?.mapToQuote() ?: throw Exception("Failed to retrieve data")
}

private fun List<TagDTO>.mapToTags(): List<Tag> = this.map { Tag(id = it.id, name = it.name) }

private fun List<QuoteDTO>.mapToQuotes(): List<Quote> = this.map { it.mapToQuote() }

private fun QuoteDTO.mapToQuote(): Quote = Quote(
id = this.id,
content = this.content,
author = this.author
id = this.c ?: 0,
content = this.q,
author = this.a
)
Original file line number Diff line number Diff line change
@@ -1,15 +1,7 @@
package com.jumrukovski.quotescompose.data.model.dto

import com.squareup.moshi.Json

data class QuoteDTO(
@Json(name = "_id")
val id: String,
val author: String,
val content: String,
val tags: List<String>,
val authorSlug: String,
val length: Long,
val dateAdded: String,
val dateModified: String
val c: Int?,
val q: String,
val a: String
)

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity
data class FavouriteQuoteEntity(
data class QuoteEntity(
@PrimaryKey(autoGenerate = false)
val id: String,
val id: Int,
val content: String,
val author: String
)
Original file line number Diff line number Diff line change
@@ -1,23 +1,17 @@
package com.jumrukovski.quotescompose.data.network

import com.jumrukovski.quotescompose.data.model.dto.QuoteDTO
import com.jumrukovski.quotescompose.data.model.dto.QuotesResultsDTO
import com.jumrukovski.quotescompose.data.model.dto.TagDTO
import retrofit2.Response
import retrofit2.http.GET
import retrofit2.http.Query

interface ApiService {

@GET("quotes")
suspend fun getQuotes(): Response<QuotesResultsDTO>

@GET("tags")
suspend fun getAllTags(): Response<List<TagDTO>>

@GET("quotes")
suspend fun getQuotesForTag(@Query("tags") tag: String): Response<QuotesResultsDTO>
suspend fun getQuotes(): Response<List<QuoteDTO>>

@GET("random")
suspend fun getRandomQuote(): Response<QuoteDTO>
suspend fun getRandomQuote(): Response<List<QuoteDTO>>

@GET("today")
suspend fun getQuoteOfTheDay(): Response<List<QuoteDTO>>
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,18 +11,18 @@ import kotlinx.coroutines.flow.Flow

class LocalRepositoryImpl @Inject constructor(private val localDB: LocalDB) : LocalRepository {

override fun getAllFavouriteQuotesAsync(): Flow<List<Quote>> =
localDB.quoteDao().getAllFavouriteQuotesAsync().mapToQuotes()
override fun getAllFavouriteQuotes(): Flow<List<Quote>> =
localDB.quoteDao().getAllFavouriteQuotes().mapToQuotes()

override fun getFavouriteQuoteAsync(id: String): Flow<Quote?> =
localDB.quoteDao().getFavouriteQuoteAsync(id).mapToQuote()
override fun getFavouriteQuote(id: Int): Flow<Quote?> =
localDB.quoteDao().getFavouriteQuote(id).mapToQuote()

override fun addFavouriteQuote(id: String, content: String, author: String) {
override fun addFavouriteQuote(id: Int, content: String, author: String) {
val entity = mapToFavouriteQuoteEntity(id, content, author)
localDB.quoteDao().addFavouriteQuote(entity)
}

override fun removeFavouriteQuote(id: String, content: String, author: String) {
override fun removeFavouriteQuote(id: Int, content: String, author: String) {
val entity = mapToFavouriteQuoteEntity(id, content, author)
localDB.quoteDao().deleteFavouriteQuote(entity)
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,21 @@
package com.jumrukovski.quotescompose.data.repository

import com.jumrukovski.quotescompose.data.mapper.mapQuoteAsResult
import com.jumrukovski.quotescompose.data.mapper.mapQuotesAsResult
import com.jumrukovski.quotescompose.data.mapper.mapTagsAsResult
import com.jumrukovski.quotescompose.data.mapper.mapQuotesAsListResult
import com.jumrukovski.quotescompose.data.mapper.mapToFirstQuoteAsResult
import com.jumrukovski.quotescompose.data.network.ApiService
import com.jumrukovski.quotescompose.domain.model.Quote
import com.jumrukovski.quotescompose.domain.model.Tag
import com.jumrukovski.quotescompose.domain.repository.RemoteRepository
import javax.inject.Inject

class RemoteRepositoryImpl @Inject constructor(private val apiService: ApiService) :
RemoteRepository {

override suspend fun getQuotes(): Result<List<Quote>> =
apiService.getQuotes().mapQuotesAsResult()

override suspend fun getAllTags(): Result<List<Tag>> =
apiService.getAllTags().mapTagsAsResult()

override suspend fun getQuotesForTag(tag: String): Result<List<Quote>> =
apiService.getQuotesForTag(tag).mapQuotesAsResult()
apiService.getQuotes().mapQuotesAsListResult()

override suspend fun getRandomQuote(): Result<Quote> =
apiService.getRandomQuote().mapQuoteAsResult()
apiService.getRandomQuote().mapToFirstQuoteAsResult()

override suspend fun getQuoteOfTheDay(): Result<Quote> =
apiService.getQuoteOfTheDay().mapToFirstQuoteAsResult()
}
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ object RetrofitModule {
moshiConverterFactory: MoshiConverterFactory
): Retrofit {
return Retrofit.Builder()
.baseUrl("https://api.quotable.io/")
.baseUrl("https://zenquotes.io/api/")
.addConverterFactory(moshiConverterFactory)
.client(okHttpClient)
.build()
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
package com.jumrukovski.quotescompose.domain.model

data class Quote(val id: String, val content: String, val author: String)
data class Quote(val id: Int, val content: String, val author: String)

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@ import kotlinx.coroutines.flow.Flow

interface LocalRepository {

fun getAllFavouriteQuotesAsync(): Flow<List<Quote>>
fun getFavouriteQuoteAsync(id: String): Flow<Quote?>
fun addFavouriteQuote(id: String, content: String, author: String)
fun removeFavouriteQuote(id: String, content: String, author: String)
fun getAllFavouriteQuotes(): Flow<List<Quote>>
fun getFavouriteQuote(id: Int): Flow<Quote?>
fun addFavouriteQuote(id: Int, content: String, author: String)
fun removeFavouriteQuote(id: Int, content: String, author: String)
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package com.jumrukovski.quotescompose.domain.repository

import com.jumrukovski.quotescompose.domain.model.Quote
import com.jumrukovski.quotescompose.domain.model.Tag

interface RemoteRepository {
suspend fun getQuotes(): Result<List<Quote>>
suspend fun getAllTags(): Result<List<Tag>>
suspend fun getQuotesForTag(tag: String): Result<List<Quote>>
suspend fun getRandomQuote(): Result<Quote>
suspend fun getQuoteOfTheDay(): Result<Quote>
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,11 @@ enum class BottomNavigationItem(
@DrawableRes val icon: Int?
) {
HOME(Screen.WithoutArguments.Home.route, R.string.screen_home, R.drawable.baseline_home_24),
TAGS(Screen.WithoutArguments.Tags.route, R.string.screen_tags, R.drawable.baseline_tag_24),
QUOTE_OF_THE_DAY(
Screen.WithoutArguments.QuoteOfTheDay.route,
R.string.screen_quote_today,
R.drawable.baseline_today_24
),
FAVORITES(
Screen.WithoutArguments.Favourites.route,
R.string.screen_favourites,
Expand Down
Loading

0 comments on commit 7ccb9e8

Please sign in to comment.