MangaRepositoryImpl.kt 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. package eu.kanade.data.manga
  2. import eu.kanade.data.DatabaseHandler
  3. import eu.kanade.data.listOfStringsAdapter
  4. import eu.kanade.data.toLong
  5. import eu.kanade.domain.manga.model.Manga
  6. import eu.kanade.domain.manga.model.MangaUpdate
  7. import eu.kanade.domain.manga.repository.MangaRepository
  8. import eu.kanade.tachiyomi.data.database.models.LibraryManga
  9. import eu.kanade.tachiyomi.util.system.logcat
  10. import kotlinx.coroutines.flow.Flow
  11. import logcat.LogPriority
  12. class MangaRepositoryImpl(
  13. private val handler: DatabaseHandler,
  14. ) : MangaRepository {
  15. override suspend fun getMangaById(id: Long): Manga {
  16. return handler.awaitOne { mangasQueries.getMangaById(id, mangaMapper) }
  17. }
  18. override suspend fun getMangaByIdAsFlow(id: Long): Flow<Manga> {
  19. return handler.subscribeToOne { mangasQueries.getMangaById(id, mangaMapper) }
  20. }
  21. override suspend fun getMangaByUrlAndSourceId(url: String, sourceId: Long): Manga? {
  22. return handler.awaitOneOrNull { mangasQueries.getMangaByUrlAndSource(url, sourceId, mangaMapper) }
  23. }
  24. override suspend fun getFavorites(): List<Manga> {
  25. return handler.awaitList { mangasQueries.getFavorites(mangaMapper) }
  26. }
  27. override suspend fun getLibraryManga(): List<LibraryManga> {
  28. return handler.awaitList { mangasQueries.getLibrary(libraryManga) }
  29. }
  30. override fun getLibraryMangaAsFlow(): Flow<List<LibraryManga>> {
  31. return handler.subscribeToList { mangasQueries.getLibrary(libraryManga) }
  32. }
  33. override fun getFavoritesBySourceId(sourceId: Long): Flow<List<Manga>> {
  34. return handler.subscribeToList { mangasQueries.getFavoriteBySourceId(sourceId, mangaMapper) }
  35. }
  36. override suspend fun getDuplicateLibraryManga(title: String, sourceId: Long): Manga? {
  37. return handler.awaitOneOrNull {
  38. mangasQueries.getDuplicateLibraryManga(title, sourceId, mangaMapper)
  39. }
  40. }
  41. override suspend fun resetViewerFlags(): Boolean {
  42. return try {
  43. handler.await { mangasQueries.resetViewerFlags() }
  44. true
  45. } catch (e: Exception) {
  46. logcat(LogPriority.ERROR, e)
  47. false
  48. }
  49. }
  50. override suspend fun setMangaCategories(mangaId: Long, categoryIds: List<Long>) {
  51. handler.await(inTransaction = true) {
  52. mangas_categoriesQueries.deleteMangaCategoryByMangaId(mangaId)
  53. categoryIds.map { categoryId ->
  54. mangas_categoriesQueries.insert(mangaId, categoryId)
  55. }
  56. }
  57. }
  58. override suspend fun insert(manga: Manga): Long? {
  59. return handler.awaitOneOrNull {
  60. mangasQueries.insert(
  61. source = manga.source,
  62. url = manga.url,
  63. artist = manga.artist,
  64. author = manga.author,
  65. description = manga.description,
  66. genre = manga.genre,
  67. title = manga.title,
  68. status = manga.status,
  69. thumbnail_url = manga.thumbnailUrl,
  70. favorite = manga.favorite,
  71. last_update = manga.lastUpdate,
  72. next_update = null,
  73. initialized = manga.initialized,
  74. viewer = manga.viewerFlags,
  75. chapter_flags = manga.chapterFlags,
  76. cover_last_modified = manga.coverLastModified,
  77. date_added = manga.dateAdded,
  78. )
  79. mangasQueries.selectLastInsertedRowId()
  80. }
  81. }
  82. override suspend fun update(update: MangaUpdate): Boolean {
  83. return try {
  84. partialUpdate(update)
  85. true
  86. } catch (e: Exception) {
  87. logcat(LogPriority.ERROR, e)
  88. false
  89. }
  90. }
  91. override suspend fun updateAll(values: List<MangaUpdate>): Boolean {
  92. return try {
  93. partialUpdate(*values.toTypedArray())
  94. true
  95. } catch (e: Exception) {
  96. logcat(LogPriority.ERROR, e)
  97. false
  98. }
  99. }
  100. private suspend fun partialUpdate(vararg values: MangaUpdate) {
  101. handler.await(inTransaction = true) {
  102. values.forEach { value ->
  103. mangasQueries.update(
  104. source = value.source,
  105. url = value.url,
  106. artist = value.artist,
  107. author = value.author,
  108. description = value.description,
  109. genre = value.genre?.let(listOfStringsAdapter::encode),
  110. title = value.title,
  111. status = value.status,
  112. thumbnailUrl = value.thumbnailUrl,
  113. favorite = value.favorite?.toLong(),
  114. lastUpdate = value.lastUpdate,
  115. initialized = value.initialized?.toLong(),
  116. viewer = value.viewerFlags,
  117. chapterFlags = value.chapterFlags,
  118. coverLastModified = value.coverLastModified,
  119. dateAdded = value.dateAdded,
  120. mangaId = value.id,
  121. )
  122. }
  123. }
  124. }
  125. }