diff --git a/tvApp/src/main/java/band/effective/office/tv/domain/model/notion/EmployeeInfoEntity.kt b/tvApp/src/main/java/band/effective/office/tv/domain/model/notion/EmployeeInfoEntity.kt index 91ff9803d4c80d1831ac9982a0e25489419b6de9..c34d2fe093e7874546aed90c5fa8dbf8984299b1 100644 --- a/tvApp/src/main/java/band/effective/office/tv/domain/model/notion/EmployeeInfoEntity.kt +++ b/tvApp/src/main/java/band/effective/office/tv/domain/model/notion/EmployeeInfoEntity.kt @@ -14,47 +14,38 @@ class EmployeeInfoEntity( val photoUrl: String, ) -fun List.processEmployeeInfo(): List { - val resultList = mutableListOf() - this.forEach { employee -> - if (employee.nextBirthdayDate.isNotBlank() && isCelebrationToday(employee.nextBirthdayDate)) { - resultList.add( +fun List.processEmployeeInfo(): List = + map { employee -> + listOfNotNull( + if (employee.nextBirthdayDate.isNotBlank() && isCelebrationToday(employee.nextBirthdayDate)) { BirthdayUI( employee.firstName, employee.photoUrl, ) - ) - } - if (employee.startDate.isNotBlank() && isCelebrationToday(employee.startDate)) { - resultList.add( + } else null, + if (employee.startDate.isNotBlank() && isCelebrationToday(employee.startDate)) { AnniversaryUI( employee.firstName, employee.photoUrl, DateUtlils.getYearsFromStartDate(employee.startDate) - ) - ) - } else { + ).run { if (yearsInCompany == 0) null else this } + } else null, if (employee.startDate.isNotBlank() && isNewEmployeeToday(employee.startDate)) { - resultList.add( - NewEmployeeUI( - employee.firstName, - employee.photoUrl, - ) + NewEmployeeUI( + employee.firstName, + employee.photoUrl, ) - } - } - } - return resultList -} + } else null + ) + }.flatten() fun isCelebrationToday(date: String): Boolean { val dateInfo = date.split('-') val dayOfMonth = dateInfo[2].toInt() val monthNumber = dateInfo[1].toInt() val calendar = Calendar.getInstance() - return (calendar.get(Calendar.DAY_OF_MONTH) == dayOfMonth && calendar.get( - Calendar.MONTH - ) + 1 == monthNumber) + return (calendar.get(Calendar.DAY_OF_MONTH) == dayOfMonth + && calendar.get(Calendar.MONTH) + 1 == monthNumber) } fun isNewEmployeeToday(date: String): Boolean { diff --git a/tvApp/src/main/java/band/effective/office/tv/domain/use_cases/EventStoryDataUseCase.kt b/tvApp/src/main/java/band/effective/office/tv/domain/use_cases/EventStoryDataUseCase.kt index fef1a43fc821d6bd7ab944bc7220a403eb99234a..a383825c4d3d113f7f9bbccd98bca4f054cae5e5 100644 --- a/tvApp/src/main/java/band/effective/office/tv/domain/use_cases/EventStoryDataUseCase.kt +++ b/tvApp/src/main/java/band/effective/office/tv/domain/use_cases/EventStoryDataUseCase.kt @@ -1,5 +1,6 @@ package band.effective.office.tv.domain.use_cases +import android.util.Log import band.effective.office.tv.core.network.entity.Either import band.effective.office.tv.domain.model.duolingo.DuolingoUser import band.effective.office.tv.domain.model.message.MessageQueue @@ -7,23 +8,59 @@ import band.effective.office.tv.domain.model.notion.EmployeeInfoEntity import band.effective.office.tv.domain.model.notion.processEmployeeInfo import band.effective.office.tv.repository.duolingo.DuolingoRepository import band.effective.office.tv.repository.notion.EmployeeInfoRepository +import band.effective.office.tv.repository.workTogether.Teammate +import band.effective.office.tv.repository.workTogether.WorkTogether import band.effective.office.tv.screen.duolingo.model.toUI import band.effective.office.tv.screen.eventStory.KeySortDuolingoUser import band.effective.office.tv.screen.eventStory.models.DuolingoUserInfo import band.effective.office.tv.screen.eventStory.models.MessageInfo import band.effective.office.tv.screen.eventStory.models.StoryModel import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.map +import java.text.SimpleDateFormat +import java.util.GregorianCalendar import javax.inject.Inject +import kotlinx.coroutines.flow.flow as flow // this use case combine data from many data sources for EvenStory screen class EventStoryDataCombinerUseCase @Inject constructor( - private val employeeInfoRepository: EmployeeInfoRepository, - private val duolingoRepository: DuolingoRepository + private val duolingoRepository: DuolingoRepository, + private val workTogether: WorkTogether ) { private val countShowUsers = 10 + private fun Teammate.toEmployeeInfoEntity() = + SimpleDateFormat("yyyy-MM-dd").let { formater -> + EmployeeInfoEntity( + firstName = name, + startDate = formater.format(startDate.time), + nextBirthdayDate = formater.format(nextBDay.time), + photoUrl = photo + ) + } + + private fun getNotionDataForStories() = flow { + val response = try { + Either.Success( + workTogether.getAll() + .filter { it.employment in setOf("Band", "Intern") && it.status == "Active" }) + } catch (t: Throwable) { + Either.Failure( + t.message ?: "Error in EventStoryDataCombinerUseCase.getNotionDataForStories" + ) + } + emit(response) + }.map { + when (it) { + is Either.Failure -> it + is Either.Success -> { + Either.Success(it.data.map { it.toEmployeeInfoEntity() }) + } + } + } + suspend fun getAllDataForStories() = - employeeInfoRepository.latestEvents() + getNotionDataForStories() .combine(duolingoRepository.getUsers()) { employeeInfoEntities: Either>, usersDuolingo: Either> -> var error = "" val duolingoInfo = when (usersDuolingo) { @@ -39,6 +76,7 @@ class EventStoryDataCombinerUseCase @Inject constructor( is Either.Success -> { employeeInfoEntities.data.processEmployeeInfo() } + is Either.Failure -> { error = employeeInfoEntities.error emptyList() diff --git a/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSource.kt b/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSource.kt index 27ee76c99ea6cb6096074ab78f9c9ed192fa3c0e..543d675055c392e98a0142c71ad9be3baffc9697 100644 --- a/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSource.kt +++ b/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSource.kt @@ -2,7 +2,7 @@ package band.effective.office.tv.network.notion import band.effective.office.tv.core.network.entity.Either import kotlinx.coroutines.flow.Flow - +@Deprecated("Let's use WorkTogether") interface EmployeeInfoRemoteDataSource { suspend fun fetchLatestBirthdays(): Flow>> } \ No newline at end of file diff --git a/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSourceImpl.kt b/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSourceImpl.kt index 1ac09ef35964a6a50fa6ad2ac750bb45e5736a43..0ffe25eb467284810ec6141f718751c9d943844b 100644 --- a/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSourceImpl.kt +++ b/tvApp/src/main/java/band/effective/office/tv/network/notion/EmployeeInfoRemoteDataSourceImpl.kt @@ -14,7 +14,7 @@ import java.net.UnknownHostException import java.util.concurrent.TimeoutException import javax.inject.Inject import javax.inject.Singleton - +@Deprecated("Let's use WorkTogether") @Singleton class EmployeeInfoRemoteDataSourceImpl @Inject constructor( private val notionClient: NotionClient diff --git a/tvApp/src/main/java/band/effective/office/tv/repository/notion/EmployeeInfoRepository.kt b/tvApp/src/main/java/band/effective/office/tv/repository/notion/EmployeeInfoRepository.kt index 59a1834d9448dd9ac0784bf415c5b38c311d3fb8..1e7c32438a9917914c4d07fc1014f5cf985c1dac 100644 --- a/tvApp/src/main/java/band/effective/office/tv/repository/notion/EmployeeInfoRepository.kt +++ b/tvApp/src/main/java/band/effective/office/tv/repository/notion/EmployeeInfoRepository.kt @@ -4,7 +4,7 @@ import band.effective.office.tv.core.network.entity.Either import band.effective.office.tv.domain.model.notion.EmployeeInfoEntity import kotlinx.coroutines.flow.Flow - +@Deprecated("Let's use WorkTogether") interface EmployeeInfoRepository { fun latestEvents(): Flow>> } \ No newline at end of file diff --git a/tvApp/src/main/java/band/effective/office/tv/repository/notion/impl/EmployeeInfoRepositoryImpl.kt b/tvApp/src/main/java/band/effective/office/tv/repository/notion/impl/EmployeeInfoRepositoryImpl.kt index 4297d43dee07858458a9fc14e84a8aa85b3f98b2..5e4693600501e0378c1a460c3bddbc62522227f8 100644 --- a/tvApp/src/main/java/band/effective/office/tv/repository/notion/impl/EmployeeInfoRepositoryImpl.kt +++ b/tvApp/src/main/java/band/effective/office/tv/repository/notion/impl/EmployeeInfoRepositoryImpl.kt @@ -8,7 +8,7 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow import javax.inject.Inject import javax.inject.Singleton - +@Deprecated("Let's use WorkTogether") @Singleton class EmployeeInfoRepositoryImpl @Inject constructor(private val employeeInfoRemoteDataSourceImpl: EmployeeInfoRemoteDataSourceImpl) : EmployeeInfoRepository { diff --git a/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/Teammate.kt b/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/Teammate.kt index 31f2366aa06720bf97cbf8e21899ae169571ab6a..7d49acf79706e5238c8163f1efe9d3506fa069f7 100644 --- a/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/Teammate.kt +++ b/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/Teammate.kt @@ -11,5 +11,7 @@ data class Teammate( val nextBDay: Calendar, val workEmail: String?, val personalEmail: String, - val duolingo: String? + val duolingo: String?, + val photo: String, + val status: String, ) diff --git a/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/WorkTogetherImpl.kt b/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/WorkTogetherImpl.kt index a34e3c71c0110ff887d9e8535f8e540ca4b27c72..7c5c9a8b747bdf9d7968f486cdd4032f318dcbea 100644 --- a/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/WorkTogetherImpl.kt +++ b/tvApp/src/main/java/band/effective/office/tv/repository/workTogether/WorkTogetherImpl.kt @@ -1,12 +1,13 @@ package band.effective.office.tv.repository.workTogether -import android.util.Log import band.effective.office.tv.BuildConfig import notion.api.v1.NotionClient +import notion.api.v1.model.common.File import notion.api.v1.model.common.PropertyType import notion.api.v1.model.pages.Page import notion.api.v1.request.databases.QueryDatabaseRequest import java.text.SimpleDateFormat +import java.util.Date import java.util.GregorianCalendar import javax.inject.Inject import javax.inject.Singleton @@ -36,12 +37,13 @@ class WorkTogetherImpl @Inject constructor(private val notionClient: NotionClien nextBDay = getDateFromProp("Next B-DAY"), workEmail = getStringFromProp("Effective Email"), personalEmail = getStringFromProp("Personal Email") ?: "", - duolingo = getStringFromProp("Профиль Duolingo") + duolingo = getStringFromProp("Профиль Duolingo"), + photo = getIconUrl() ?: "", + status = getStringFromProp("Status") ?: "Empty status" ) private fun Page.getStringFromProp(propName: String) = properties[propName]?.run { - if (propName == "Next B-DAY") Log.e("check", toString()) when (type) { PropertyType.Title -> title?.firstOrNull()?.text?.content PropertyType.RichText -> richText?.firstOrNull()?.text?.content @@ -56,8 +58,12 @@ class WorkTogetherImpl @Inject constructor(private val notionClient: NotionClien private fun Page.getDateFromProp(propName: String) = GregorianCalendar().apply { val date = getStringFromProp(propName) val simpleDateFormatter = SimpleDateFormat("yyyy-MM-dd") - if (date != null) { - time = simpleDateFormatter.parse(date) ?: time + time = if (date != null) { + simpleDateFormatter.parse(date) ?: Date(0) + } else { + Date(0) } } + + private fun Page.getIconUrl() = (icon as? File)?.file?.url } \ No newline at end of file