MangaRepositoryImpl.kt 5.2 KB

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