Загрузка данных


package ru.notesapp.data

import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import ru.notesapp.data.local.NoteDao
import ru.notesapp.data.local.toDomain
import ru.notesapp.data.local.toEntity
import ru.notesapp.data.remote.NetworkResult
import ru.notesapp.data.remote.NoteApi
import ru.notesapp.data.remote.safeApiCall
import ru.notesapp.data.remote.toDto
import ru.notesapp.data.remote.toEntity
import ru.notesapp.domain.Note
import javax.inject.Inject
import javax.inject.Singleton

@Singleton
class SyncedNotesRepository @Inject constructor(
    private val dao: NoteDao,
    private val api: NoteApi,
) : NotesRepository {

    override fun observeAll(): Flow<List<Note>> =
        dao.observeAll().map { list -> list.map { it.toDomain() } }

    override suspend fun refresh(): NetworkResult<Unit> = safeApiCall {
        val remote = api.listPosts()
        dao.insertAll(remote.map { it.toEntity() })
        Unit
    }

    override suspend fun add(note: Note): NetworkResult<Long> = safeApiCall {
        dao.insert(note.toEntity())
    }

    override suspend fun update(note: Note): NetworkResult<Unit> = safeApiCall {
        dao.update(note.toEntity())
        Unit
    }

    override suspend fun delete(id: Long): NetworkResult<Unit> = safeApiCall {
        api.deletePost(id)
        dao.deleteById(id)
        Unit
    }

    override suspend fun getById(id: Long): Note? =
        dao.getById(id)?.toDomain()

    override fun search(query: String): Flow<List<Note>> =
        dao.searchByTitle(query).map { list -> list.map { it.toDomain() } }
}