From b89bbf69a9ca81a11cab2460a0512297353f0e69 Mon Sep 17 00:00:00 2001 From: Thomas Andres Gomez Date: Tue, 11 May 2021 15:22:35 +0200 Subject: [PATCH] Add IBookRepository --- .../com/pixelized/biblib/BibLibApplication.kt | 3 + .../biblib/database/BibLibDatabase.kt | 1 + .../database/crossref/BookAuthorCrossRef.kt | 2 +- .../database/crossref/BookGenreCrossRef.kt | 2 +- .../pixelized/biblib/database/dao/BookDao.kt | 4 +- .../biblib/database/dao/CrossRefDao.kt | 17 ++++ .../biblib/repository/book/BookRepository.kt | 86 +++++++++++++++++++ .../biblib/repository/book/IBookRepository.kt | 7 ++ .../initialisation/IInitialisation.kt | 5 ++ .../initialisation/InitialisationViewModel.kt | 23 ++++- 10 files changed, 145 insertions(+), 5 deletions(-) create mode 100644 app/src/main/java/com/pixelized/biblib/database/dao/CrossRefDao.kt create mode 100644 app/src/main/java/com/pixelized/biblib/repository/book/BookRepository.kt create mode 100644 app/src/main/java/com/pixelized/biblib/repository/book/IBookRepository.kt diff --git a/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt b/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt index 663c5da..de0e8c2 100644 --- a/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt +++ b/app/src/main/java/com/pixelized/biblib/BibLibApplication.kt @@ -11,6 +11,8 @@ import com.pixelized.biblib.network.client.BibLibClient import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.repository.apiCache.APICacheRepository import com.pixelized.biblib.repository.apiCache.IAPICacheRepository +import com.pixelized.biblib.repository.book.BookRepository +import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.repository.credential.CredentialRepository import com.pixelized.biblib.repository.credential.ICredentialRepository import com.pixelized.biblib.repository.googleSignIn.GoogleSingInRepository @@ -37,6 +39,7 @@ class BibLibApplication : Application() { Bob[IGoogleSingInRepository::class] = GoogleSingInRepository(this) Bob[ICredentialRepository::class] = CredentialRepository() Bob[IAPICacheRepository::class] = APICacheRepository() + Bob[IBookRepository::class] = BookRepository() } companion object { diff --git a/app/src/main/java/com/pixelized/biblib/database/BibLibDatabase.kt b/app/src/main/java/com/pixelized/biblib/database/BibLibDatabase.kt index df852ac..898adf4 100644 --- a/app/src/main/java/com/pixelized/biblib/database/BibLibDatabase.kt +++ b/app/src/main/java/com/pixelized/biblib/database/BibLibDatabase.kt @@ -29,6 +29,7 @@ abstract class BibLibDatabase : RoomDatabase() { abstract fun genreDao(): GenreDao abstract fun languageDao(): LanguageDao abstract fun seriesDao(): SeriesDao + abstract fun crossRefDao(): CrossRefDao companion object { const val VERSION = 1 diff --git a/app/src/main/java/com/pixelized/biblib/database/crossref/BookAuthorCrossRef.kt b/app/src/main/java/com/pixelized/biblib/database/crossref/BookAuthorCrossRef.kt index 10e588a..c14a29e 100644 --- a/app/src/main/java/com/pixelized/biblib/database/crossref/BookAuthorCrossRef.kt +++ b/app/src/main/java/com/pixelized/biblib/database/crossref/BookAuthorCrossRef.kt @@ -8,7 +8,7 @@ import com.pixelized.biblib.database.data.BookDbo @Entity(primaryKeys = [BookDbo.ID, AuthorDbo.ID]) data class BookAuthorCrossRef( @ColumnInfo(name = BookDbo.ID) - val bookId: String, + val bookId: Int, @ColumnInfo(name = AuthorDbo.ID) val authorId: String ) diff --git a/app/src/main/java/com/pixelized/biblib/database/crossref/BookGenreCrossRef.kt b/app/src/main/java/com/pixelized/biblib/database/crossref/BookGenreCrossRef.kt index 478532c..3086520 100644 --- a/app/src/main/java/com/pixelized/biblib/database/crossref/BookGenreCrossRef.kt +++ b/app/src/main/java/com/pixelized/biblib/database/crossref/BookGenreCrossRef.kt @@ -8,7 +8,7 @@ import com.pixelized.biblib.database.data.GenreDbo @Entity(primaryKeys = [BookDbo.ID, GenreDbo.ID]) data class BookGenreCrossRef( @ColumnInfo(name = BookDbo.ID) - val bookId: String, + val bookId: Int, @ColumnInfo(name = GenreDbo.ID) val genreId: String ) \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/database/dao/BookDao.kt b/app/src/main/java/com/pixelized/biblib/database/dao/BookDao.kt index 5a6501d..ac023bb 100644 --- a/app/src/main/java/com/pixelized/biblib/database/dao/BookDao.kt +++ b/app/src/main/java/com/pixelized/biblib/database/dao/BookDao.kt @@ -10,8 +10,8 @@ interface BookDao { @Query("SELECT * FROM ${BookDbo.TABLE}") fun getAll(): List - @Insert - fun update(vararg books: BookDbo) + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg books: BookDbo) @Delete fun delete(book: BookDbo) diff --git a/app/src/main/java/com/pixelized/biblib/database/dao/CrossRefDao.kt b/app/src/main/java/com/pixelized/biblib/database/dao/CrossRefDao.kt new file mode 100644 index 0000000..ac68046 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/database/dao/CrossRefDao.kt @@ -0,0 +1,17 @@ +package com.pixelized.biblib.database.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import com.pixelized.biblib.database.crossref.BookAuthorCrossRef +import com.pixelized.biblib.database.crossref.BookGenreCrossRef + +@Dao +interface CrossRefDao { + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg bookAuthor: BookAuthorCrossRef) + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(vararg bookGenre: BookGenreCrossRef) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/repository/book/BookRepository.kt b/app/src/main/java/com/pixelized/biblib/repository/book/BookRepository.kt new file mode 100644 index 0000000..bb5f719 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/repository/book/BookRepository.kt @@ -0,0 +1,86 @@ +package com.pixelized.biblib.repository.book + +import com.pixelized.biblib.database.BibLibDatabase +import com.pixelized.biblib.database.crossref.BookAuthorCrossRef +import com.pixelized.biblib.database.crossref.BookGenreCrossRef +import com.pixelized.biblib.database.data.* +import com.pixelized.biblib.model.* +import com.pixelized.biblib.utils.injection.inject + +class BookRepository : IBookRepository { + val database: BibLibDatabase by inject() + + override fun update(data: List) { + val authors = mutableSetOf() + val genres = mutableSetOf() + val series = mutableSetOf() + val languages = mutableSetOf() + val books = mutableListOf() + + val bookAuthorCrossRef = mutableListOf() + val bookGenreCrossRef = mutableListOf() + + data.forEach { book -> + book.author.forEach { + authors.add(it.toDbo()) + bookAuthorCrossRef.add(BookAuthorCrossRef(bookId = book.id, it.id)) + } + book.genre?.forEach { + genres.add(it.toDbo()) + bookGenreCrossRef.add(BookGenreCrossRef(bookId = book.id, it.id)) + } + book.language?.let { languages.add(it.toDbo()) } + book.series?.let { + if (it.id != null) { + series.add(it.toDbo(it.id)) + } + } + books.add(book.toDbo()) + } + + database.authorDao().insert(*authors.toTypedArray()) + database.genreDao().insert(*genres.toTypedArray()) + database.languageDao().insert(*languages.toTypedArray()) + database.seriesDao().insert(*series.toTypedArray()) + database.bookDao().insert(*books.toTypedArray()) + + database.crossRefDao().insert(*bookAuthorCrossRef.toTypedArray()) + database.crossRefDao().insert(*bookGenreCrossRef.toTypedArray()) + } + + private fun Author.toDbo() = AuthorDbo( + id = id, + name = name, + sort = sort, + ) + + private fun Genre.toDbo() = GenreDbo( + id = id, + name = name, + ) + + private fun Series.toDbo(id: String) = SeriesDbo( + id = id, + name = name, + sort = sort, + index = index, + ) + + private fun Language.toDbo() = LanguageDbo( + id = id, + code = code + ) + + private fun Book.toDbo() = BookDbo( + id = id, + title = title, + sort = sort, + haveCover = haveCover, + releaseDate = releaseDate, + language = language?.id, + rating = rating, + series = series?.id, + synopsis = synopsis, + isNew = isNew, + ) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/repository/book/IBookRepository.kt b/app/src/main/java/com/pixelized/biblib/repository/book/IBookRepository.kt new file mode 100644 index 0000000..958c819 --- /dev/null +++ b/app/src/main/java/com/pixelized/biblib/repository/book/IBookRepository.kt @@ -0,0 +1,7 @@ +package com.pixelized.biblib.repository.book + +import com.pixelized.biblib.model.Book + +interface IBookRepository { + fun update(data: List) +} \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/IInitialisation.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/IInitialisation.kt index e68e32d..589043c 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/IInitialisation.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/IInitialisation.kt @@ -7,6 +7,9 @@ interface IInitialisation { @Composable fun LoadApplication(content: @Composable (State) -> Unit) + @Composable + fun LoadBook(content: @Composable (State) -> Unit) + sealed class State { object Initial : State() object Loading : State() @@ -16,5 +19,7 @@ interface IInitialisation { class Mock(private val state: State = State.Loading) : IInitialisation { @Composable override fun LoadApplication(content: (State) -> Unit) = content(state) + @Composable + override fun LoadBook(content: (State) -> Unit) = content(state) } } \ No newline at end of file diff --git a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/InitialisationViewModel.kt b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/InitialisationViewModel.kt index 0f516c4..64abc53 100644 --- a/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/InitialisationViewModel.kt +++ b/app/src/main/java/com/pixelized/biblib/ui/viewmodel/initialisation/InitialisationViewModel.kt @@ -4,7 +4,9 @@ import androidx.compose.runtime.* import androidx.lifecycle.ViewModel import com.pixelized.biblib.network.client.IBibLibClient import com.pixelized.biblib.network.data.query.AuthLoginQuery +import com.pixelized.biblib.network.factory.BookFactory import com.pixelized.biblib.repository.apiCache.IAPICacheRepository +import com.pixelized.biblib.repository.book.IBookRepository import com.pixelized.biblib.repository.credential.ICredentialRepository import com.pixelized.biblib.repository.googleSignIn.IGoogleSingInRepository import com.pixelized.biblib.ui.viewmodel.initialisation.IInitialisation.State.* @@ -13,6 +15,7 @@ import kotlinx.coroutines.delay class InitialisationViewModel : ViewModel(), IInitialisation { private val credentialRepository: ICredentialRepository by inject() + private val bookRepository: IBookRepository by inject() private val googleSignIn: IGoogleSingInRepository by inject() private val client: IBibLibClient by inject() private val apiCache: IAPICacheRepository by inject() @@ -35,6 +38,17 @@ class InitialisationViewModel : ViewModel(), IInitialisation { content(state.value) } + @Composable + override fun LoadBook(content: (IInitialisation.State) -> Unit) { + val state: MutableState = remember { mutableStateOf(Initial) } + LaunchedEffect(key1 = "LoadBook") { + state.value = Loading + loadNewBooks() && loadAllBooks() + state.value = Finished(needLogin = false) + } + content(state.value) + } + private suspend fun loginWithGoogle(): Boolean { val googleToken = googleSignIn.lastGoogleToken return if (googleToken != null) { @@ -89,7 +103,14 @@ class InitialisationViewModel : ViewModel(), IInitialisation { } private suspend fun loadAllBooks(): Boolean { - apiCache.list = client.service.list() + client.service.list().let { response -> + // TODO: useless isn't it ? + apiCache.list = response + + val factory = BookFactory() + val books = response.data?.map { dto -> factory.fromListResponseToBook(dto, false) } + books?.let { data -> bookRepository.update(data) } + } return true } } \ No newline at end of file