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


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

class SyncedNotesRepository(
    private val dao: NoteDao,
    private val api: NoteApi,
) {

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

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

    suspend fun add(note: Note): NetworkResult<Long> = safeApiCall {
        val created = api.createPost(note.toDto())
        dao.insert(created.toEntity())
    }

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