Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ import com.divinelink.core.network.media.model.changes.ChangesParameters
import com.divinelink.core.testing.MainDispatcherRule
import com.divinelink.core.testing.database.TestDatabaseFactory
import com.divinelink.core.testing.factories.api.details.person.PersonDetailsApiFactory
import com.divinelink.core.testing.factories.entity.person.PersonEntityFactory
import com.divinelink.core.testing.factories.entity.person.PersonDetailsEntityFactory
import com.divinelink.core.testing.factories.entity.person.credits.PersonCastCreditEntityFactory
import com.divinelink.core.testing.factories.entity.person.credits.PersonCrewCreditEntityFactory
import com.divinelink.core.testing.factories.model.change.ChangeSample
Expand Down Expand Up @@ -78,10 +78,10 @@ class ProdPersonRepositoryTest {

@Test
fun `test fetchPersonDetails with local data only fetches from database`() = runTest {
dao.insertPerson(PersonEntityFactory.steveCarell())
dao.insertPerson(PersonDetailsEntityFactory.steveCarell())

repository.fetchPersonDetails(id = 4495).test {
assertThat(awaitItem().getOrNull()).isEqualTo(PersonEntityFactory.steveCarell().map())
assertThat(awaitItem().getOrNull()).isEqualTo(PersonDetailsEntityFactory.steveCarell().map())
expectNoEvents()
}
}
Expand All @@ -91,7 +91,7 @@ class ProdPersonRepositoryTest {
service.mockFetchPersonDetails(response = PersonDetailsApiFactory.steveCarell())

repository.fetchPersonDetails(id = 4495).test {
assertThat(awaitItem().getOrNull()).isEqualTo(PersonEntityFactory.steveCarell().map())
assertThat(awaitItem().getOrNull()).isEqualTo(PersonDetailsEntityFactory.steveCarell().map())
expectNoEvents()
}
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,34 @@
package com.divinelink.core.data.details.mapper

import com.divinelink.core.data.details.mapper.entity.map
import com.divinelink.core.database.credits.model.AggregateCreditsEntity
import com.divinelink.core.model.credits.AggregateCredits
import com.divinelink.core.model.credits.PersonRole
import com.divinelink.core.model.credits.SeriesCrewDepartment
import com.divinelink.core.model.details.Person

fun AggregateCreditsEntity.map() = AggregateCredits(
cast = cast.map(),
cast = cast,
crewDepartments = crew.map(),
id = id,
)

/**
* Maps every crew department to its persons.
*/
fun List<Person>.map(): List<SeriesCrewDepartment> = this
.flatMap { person ->
person.role
.filterIsInstance<PersonRole.Crew>()
.map { crewRole -> person to crewRole }
}
.groupBy(
keySelector = { (_, crewRole) -> crewRole.department },
valueTransform = { (person, _) -> person },
)
.mapNotNull { (department, people) ->
if (department == null) {
null
} else {
SeriesCrewDepartment(department, people)
}
}
Original file line number Diff line number Diff line change
@@ -1,34 +1,36 @@
package com.divinelink.core.data.details.mapper.api

import com.divinelink.core.database.credits.cast.SeriesCast
import com.divinelink.core.database.credits.cast.SeriesCastRole
import com.divinelink.core.database.cast.PersonEntity
import com.divinelink.core.database.cast.PersonRoleEntity
import com.divinelink.core.database.credits.ShowCastRoleEntity
import com.divinelink.core.database.credits.crew.SeriesCrew
import com.divinelink.core.database.credits.crew.SeriesCrewJob
import com.divinelink.core.network.media.model.credits.AggregateCreditsApi

fun AggregateCreditsApi.toSeriesCastEntity() = cast.map { cast ->
SeriesCast(
fun AggregateCreditsApi.toPersonsEntity() = cast.map { cast ->
PersonEntity(
id = cast.id,
name = cast.name,
profilePath = cast.profilePath,
originalName = cast.name,
totalEpisodeCount = cast.totalEpisodeCount.toLong(),
knownForDepartment = cast.knownForDepartment,
gender = cast.gender,
aggregateCreditId = id,
)
}

fun AggregateCreditsApi.toSeriesCastRoleEntity() = cast
fun AggregateCreditsApi.toRolesEntity(): List<Pair<PersonRoleEntity, ShowCastRoleEntity>> = cast
.filter { it.roles.isNotEmpty() }
.flatMap { cast ->
cast.roles.map { role ->
SeriesCastRole(
aggregateCreditId = id,
PersonRoleEntity(
creditId = role.creditId,
character = role.character,
episodeCount = role.episodeCount.toLong(),
castId = cast.id,
) to ShowCastRoleEntity(
showId = id,
creditId = role.creditId,
episodeCount = role.episodeCount.toLong(),
creditOrder = cast.order.toLong(),
)
}
}
Expand Down

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@ package com.divinelink.core.data.details.repository
import com.divinelink.core.commons.domain.DispatcherProvider
import com.divinelink.core.data.details.mapper.api.map
import com.divinelink.core.data.details.mapper.api.reviews.map
import com.divinelink.core.data.details.mapper.api.toSeriesCastEntity
import com.divinelink.core.data.details.mapper.api.toSeriesCastRoleEntity
import com.divinelink.core.data.details.mapper.api.toPersonsEntity
import com.divinelink.core.data.details.mapper.api.toRolesEntity
import com.divinelink.core.data.details.mapper.api.toSeriesCrewEntity
import com.divinelink.core.data.details.mapper.api.toSeriesCrewJobEntity
import com.divinelink.core.data.details.mapper.map
Expand Down Expand Up @@ -212,10 +212,10 @@ class ProdDetailsRepository(
}
}.flowOn(dispatcher.io)

private suspend fun insertLocalAggregateCredits(aggregateCredits: AggregateCreditsApi) {
private fun insertLocalAggregateCredits(aggregateCredits: AggregateCreditsApi) {
creditsDao.insertAggregateCredits(aggregateCredits.id)
creditsDao.insertCastRoles(aggregateCredits.toSeriesCastRoleEntity())
creditsDao.insertCast(aggregateCredits.toSeriesCastEntity())
creditsDao.insertPersons(aggregateCredits.toPersonsEntity())
creditsDao.insertRoles(aggregateCredits.toRolesEntity())
creditsDao.insertCrewJobs(aggregateCredits.toSeriesCrewJobEntity())
creditsDao.insertCrew(aggregateCredits.toSeriesCrewEntity())
}
Expand All @@ -226,7 +226,7 @@ class ProdDetailsRepository(
Result.success(localCredits.map())
}

private suspend fun fetchRemoteAggregateCredits(id: Long): Flow<Result<AggregateCredits>> =
private fun fetchRemoteAggregateCredits(id: Long): Flow<Result<AggregateCredits>> =
mediaRemote.fetchAggregatedCredits(id)
.onEach { apiResponse ->
val duration = measureTime {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package com.divinelink.core.data.person.details.mapper

import com.divinelink.core.database.person.PersonEntity
import com.divinelink.core.database.person.PersonDetailsEntity
import com.divinelink.core.network.details.person.model.PersonDetailsApi

fun PersonDetailsApi.mapToEntity(timestamp: String) = PersonEntity(
fun PersonDetailsApi.mapToEntity(timestamp: String) = PersonDetailsEntity(
id = id,
biography = biography,
birthday = birthday,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
package com.divinelink.core.data.person.details.mapper

import com.divinelink.core.database.person.PersonEntity
import com.divinelink.core.database.person.PersonDetailsEntity
import com.divinelink.core.model.credits.PersonRole
import com.divinelink.core.model.details.Person
import com.divinelink.core.model.details.person.PersonDetails
import com.divinelink.core.model.person.Gender

fun PersonEntity.map() = PersonDetails(
fun PersonDetailsEntity.map() = PersonDetails(
person = Person(
id = id,
name = name,
Expand Down
2 changes: 1 addition & 1 deletion core/database/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ sqldelight {
create("Database") {
packageName.set("com.divinelink.core.database")
migrationOutputDirectory.set(file("src/main/sqldelight/migrations"))
version = 7
version = 8
}
}
}
Loading