Implement local data source

This commit is contained in:
Vincent Brison 2021-09-24 16:34:24 +02:00
parent 2e645228f1
commit 1c3a09341b
8 changed files with 34 additions and 15 deletions

View File

@ -49,24 +49,28 @@ class ContactLocalDataSourceImpl(
}.distinctUntilChanged()
}
override suspend fun updateContacts(contacts: List<Contact>) {
TODO("Not yet implemented")
override suspend fun updateContactsOrThrow(contacts: List<Contact>) {
val updateCount = contactDatabase.contactDao().update(*contacts.map { it.toContactEntity() }.toTypedArray())
if (updateCount != contacts.size) throw IllegalStateException()
}
override suspend fun updateContactEmails(emails: List<ContactEmail>) {
TODO("Not yet implemented")
override suspend fun updateContactEmailsOrThrow(emails: List<ContactEmail>) {
val updateCount = contactDatabase.contactEmailDao().update(
*emails.map { it.toContactEmailEntity() }.toTypedArray()
)
if (updateCount != emails.size) throw IllegalStateException()
}
override suspend fun deleteContact(contactId: ContactId) {
contactDatabase.contactDao().deleteContact(contactId)
contactDatabase.contactDao().deleteContacts(contactId)
}
override suspend fun deleteContacts(contactIds: List<ContactId>) {
TODO("Not yet implemented")
contactDatabase.contactDao().deleteContacts(*contactIds.toTypedArray())
}
override suspend fun deleteContactEmails(emailIds: List<ContactEmailId>) {
TODO("Not yet implemented")
contactDatabase.contactEmailDao().deleteContactsEmails(*emailIds.toTypedArray())
}
override suspend fun deleteAllContacts(userId: UserId) {

View File

@ -39,8 +39,8 @@ abstract class ContactDao: BaseDao<ContactEntity>() {
@Query("SELECT * FROM ContactEntity WHERE userId = :userId")
abstract fun observeAllContacts(userId: UserId): Flow<List<ContactWithMailsRelation>>
@Query("DELETE FROM ContactEntity WHERE contactId = :contactId")
abstract suspend fun deleteContact(contactId: ContactId)
@Query("DELETE FROM ContactEntity WHERE contactId IN (:contactIds)")
abstract suspend fun deleteContacts(vararg contactIds: ContactId)
@Query("DELETE FROM ContactEntity")
abstract suspend fun deleteAllContacts()

View File

@ -24,6 +24,7 @@ import androidx.room.Transaction
import kotlinx.coroutines.flow.Flow
import me.proton.core.contact.data.local.db.entity.ContactEmailEntity
import me.proton.core.contact.data.local.db.entity.relation.ContactEmailWithLabelsRelation
import me.proton.core.contact.domain.entity.ContactEmailId
import me.proton.core.contact.domain.entity.ContactId
import me.proton.core.data.room.db.BaseDao
import me.proton.core.domain.entity.UserId
@ -38,6 +39,9 @@ abstract class ContactEmailDao: BaseDao<ContactEmailEntity>() {
@Query("SELECT * FROM ContactEmailEntity WHERE contactId = :contactId ORDER BY `order`, name")
abstract fun observeAllContactsEmails(contactId: ContactId): Flow<List<ContactEmailWithLabelsRelation>>
@Query("DELETE FROM ContactEmailEntity WHERE contactId IN (:contactEmailIds)")
abstract suspend fun deleteContactsEmails(vararg contactEmailIds: ContactEmailId)
@Query("DELETE FROM ContactEmailEntity WHERE userId = :userId")
abstract suspend fun deleteAllContactsEmails(userId: UserId)

View File

@ -46,7 +46,7 @@ class ForeignKeyTests : ContactDatabaseTests() {
db.contactDao().insertOrUpdate(User0.Contact0.contactEntity)
db.contactCardDao().insertOrUpdate(User0.Contact0.ContactCard0.contactCardEntity)
assert(hasContactCard())
db.contactDao().deleteContact(User0.Contact0.contactId)
db.contactDao().deleteContacts(User0.Contact0.contactId)
assert(!hasContactCard())
}

View File

@ -33,7 +33,7 @@ class TransactionTests: ContactDatabaseTests() {
fun `delete contact delete contact and emails`() = runBlocking {
db.contactDao().insertOrUpdate(User0.Contact0.contactEntity)
db.contactEmailDao().insertOrUpdate(User0.Contact0.ContactEmail0.contactEmailEntity)
db.contactDao().deleteContact(User0.Contact0.contactId)
db.contactDao().deleteContacts(User0.Contact0.contactId)
assert(db.contactDao().observeContact(User0.Contact0.contactId).firstOrNull() == null)
assert(db.contactEmailDao().observeAllContactsEmails(User0.Contact0.contactId).first().isEmpty())
}
@ -89,4 +89,15 @@ class TransactionTests: ContactDatabaseTests() {
localDataSource.mergeContactWithCards(updatedContact)
assert(localDataSource.observeContact(User0.Contact0.contactId).first() == updatedContact)
}
@Test(expected = IllegalStateException::class)
fun `update throws if entity not present`() = runBlocking {
localDataSource.updateContactsOrThrow(listOf(User0.Contact0.contact))
}
@Test
fun `update doesn't throws if same entity present`() = runBlocking {
localDataSource.mergeContacts(listOf(User0.Contact0.contact))
localDataSource.updateContactsOrThrow(listOf(User0.Contact0.contact))
}
}

View File

@ -30,8 +30,8 @@ interface ContactLocalDataSource {
fun observeContact(contactId: ContactId): Flow<ContactWithCards>
fun observeAllContacts(userId: UserId): Flow<List<Contact>>
suspend fun updateContacts(contacts: List<Contact>)
suspend fun updateContactEmails(emails: List<ContactEmail>)
suspend fun updateContactsOrThrow(contacts: List<Contact>)
suspend fun updateContactEmailsOrThrow(emails: List<ContactEmail>)
suspend fun deleteContact(contactId: ContactId)
suspend fun deleteContacts(contactIds: List<ContactId>)

View File

@ -23,7 +23,7 @@ plugins {
kotlin("android")
}
libVersion = Version(1, 15, 0)
libVersion = Version(1, 16, 0)
android()

View File

@ -36,7 +36,7 @@ abstract class BaseDao<in T> {
}
@Update
abstract suspend fun update(vararg entities: T)
abstract suspend fun update(vararg entities: T): Int
@Delete
abstract suspend fun delete(vararg entities: T)