From 7d770e03c28bbf2e4194d7587c78f352db151f25 Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 16:03:38 +0900 Subject: [PATCH 1/6] #217 Add : containsSpecialCharacter --- .../main/kotlin/com/titi/app/core/util/StringExtensions.kt | 5 +++++ tds/build.gradle.kts | 1 + .../com/titi/app/tds/component/dialog/AddTaskNameDialog.kt | 3 ++- .../com/titi/app/tds/component/dialog/EditTaskNameDialog.kt | 3 ++- 4 files changed, 10 insertions(+), 2 deletions(-) diff --git a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt index 3d7a7750..d3db4ef8 100644 --- a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt +++ b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt @@ -9,3 +9,8 @@ fun String.isAfterH(hour: Int): Boolean { return inputDateTime.dayOfMonth != currentDateTime.dayOfMonth && currentDateTime.hour >= hour } + +fun String.containsSpecialCharacter(): Boolean { + val specialCharacters = "!@#$%^&*()_+-=[]{}|;':\",./<>?" + return this.any { it in specialCharacters } +} \ No newline at end of file diff --git a/tds/build.gradle.kts b/tds/build.gradle.kts index 66198bb9..945e347f 100644 --- a/tds/build.gradle.kts +++ b/tds/build.gradle.kts @@ -9,4 +9,5 @@ android { dependencies { implementation(project(":core:ui")) + implementation(project(":core:util")) } diff --git a/tds/src/main/kotlin/com/titi/app/tds/component/dialog/AddTaskNameDialog.kt b/tds/src/main/kotlin/com/titi/app/tds/component/dialog/AddTaskNameDialog.kt index f4bc14c1..4378c6c1 100644 --- a/tds/src/main/kotlin/com/titi/app/tds/component/dialog/AddTaskNameDialog.kt +++ b/tds/src/main/kotlin/com/titi/app/tds/component/dialog/AddTaskNameDialog.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp +import com.titi.app.core.util.containsSpecialCharacter import com.titi.app.tds.R import com.titi.app.tds.component.TtdsOutLinedTextField import com.titi.app.tds.model.TtdsDialogInfo @@ -53,7 +54,7 @@ fun AddTaskNameDialog(onPositive: (String) -> Unit, onShowDialog: (Boolean) -> U text = taskName, placeholder = stringResource(id = R.string.tasks_hint_newtasktitle), onValueChange = { - if (it.length <= 12) { + if (it.length <= 12 && !it.containsSpecialCharacter()) { taskName = it } }, diff --git a/tds/src/main/kotlin/com/titi/app/tds/component/dialog/EditTaskNameDialog.kt b/tds/src/main/kotlin/com/titi/app/tds/component/dialog/EditTaskNameDialog.kt index 850663b2..8174c779 100644 --- a/tds/src/main/kotlin/com/titi/app/tds/component/dialog/EditTaskNameDialog.kt +++ b/tds/src/main/kotlin/com/titi/app/tds/component/dialog/EditTaskNameDialog.kt @@ -15,6 +15,7 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp +import com.titi.app.core.util.containsSpecialCharacter import com.titi.app.tds.R import com.titi.app.tds.component.TtdsOutLinedTextField import com.titi.app.tds.model.TtdsDialogInfo @@ -57,7 +58,7 @@ fun EditTaskNameDialog( .focusRequester(modifyTaskNameFocusRequester), text = editTaskName, onValueChange = { - if (it.text.length <= 12) { + if (it.text.length <= 12 && !it.text.containsSpecialCharacter()) { editTaskName = it } }, From e47d73094d0ca39aaf1bb5e920ff176e1918ace3 Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 16:08:49 +0900 Subject: [PATCH 2/6] #217 Remove : url encoder decoder --- .../com/titi/app/feature/main/navigation/TiTiNavHost.kt | 6 +----- .../app/feature/measure/navigation/MeasureNavigation.kt | 8 -------- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt index d19ae7f0..44340178 100644 --- a/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt +++ b/feature/main/src/main/kotlin/com/titi/app/feature/main/navigation/TiTiNavHost.kt @@ -35,8 +35,6 @@ import com.titi.app.feature.time.navigation.navigateToTimer import com.titi.app.feature.time.navigation.timeGraph import com.titi.app.feature.webview.navigateToWebView import com.titi.app.feature.webview.webViewGraph -import java.net.URLEncoder -import java.nio.charset.StandardCharsets @Composable fun TiTiNavHost( @@ -74,9 +72,7 @@ fun TiTiNavHost( context.startActivity(intent) }, onNavigateToMeasure = { - navController.navigateToMeasure( - URLEncoder.encode(it, StandardCharsets.UTF_8.toString()), - ) + navController.navigateToMeasure(it) }, onNavigateToDestination = { navController.navigateToTopLevelDestination(it) diff --git a/feature/measure/src/main/kotlin/com/titi/app/feature/measure/navigation/MeasureNavigation.kt b/feature/measure/src/main/kotlin/com/titi/app/feature/measure/navigation/MeasureNavigation.kt index 0f88f66b..e2136076 100644 --- a/feature/measure/src/main/kotlin/com/titi/app/feature/measure/navigation/MeasureNavigation.kt +++ b/feature/measure/src/main/kotlin/com/titi/app/feature/measure/navigation/MeasureNavigation.kt @@ -6,8 +6,6 @@ import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.navArgument import com.titi.app.feature.measure.ui.MeasuringScreen -import java.net.URLDecoder -import java.nio.charset.StandardCharsets private const val MEASURE_SCREEN = "measure" const val MEASURE_ARG = "splashResultState" @@ -29,12 +27,6 @@ fun NavGraphBuilder.measureGraph(onFinish: (isFinish: Boolean) -> Unit) { MeasuringScreen( splashResultState = it.arguments ?.getString(MEASURE_ARG, "") - ?.let { jsonString -> - URLDecoder.decode( - jsonString, - StandardCharsets.UTF_8.toString(), - ) - } ?: "", onFinish = onFinish, ) From 91b9bda2399ab220725f50341b67d92d2d63dd1e Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 17:46:22 +0900 Subject: [PATCH 3/6] #217 Add : removeSpecialCharacter --- .../com/titi/app/core/util/StringExtensions.kt | 5 +++++ .../doamin/daily/mapper/RepositoryToDomainMapper.kt | 13 +++++++++++++ .../daily/usecase/GetTodayDailyFlowUseCase.kt | 6 +++--- .../doamin/daily/usecase/GetTodayDailyUseCase.kt | 11 ++++++++--- domain/task/build.gradle.kts | 1 + .../domain/task/mapper/RepositoryToDomainMapper.kt | 3 ++- domain/time/build.gradle.kts | 2 +- .../domain/time/mapper/RepositoryToDomainMapper.kt | 3 ++- .../domain/time/usecase/GetRecordTimesUseCase.kt | 11 +++++++++-- .../com/titi/app/feature/edit/ui/EditScreen.kt | 5 +++-- 10 files changed, 47 insertions(+), 13 deletions(-) diff --git a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt index d3db4ef8..9956a0c1 100644 --- a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt +++ b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt @@ -13,4 +13,9 @@ fun String.isAfterH(hour: Int): Boolean { fun String.containsSpecialCharacter(): Boolean { val specialCharacters = "!@#$%^&*()_+-=[]{}|;':\",./<>?" return this.any { it in specialCharacters } +} + +fun String.removeSpecialCharacter() : String { + val specialCharacters = "!@#$%^&*()_+-=[]{}|;':\",./<>?" + return this.filterNot { it in specialCharacters } } \ No newline at end of file diff --git a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/mapper/RepositoryToDomainMapper.kt b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/mapper/RepositoryToDomainMapper.kt index ea3e10d6..4dd07cea 100644 --- a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/mapper/RepositoryToDomainMapper.kt +++ b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/mapper/RepositoryToDomainMapper.kt @@ -1,5 +1,6 @@ package com.titi.app.doamin.daily.mapper +import com.titi.app.core.util.removeSpecialCharacter import com.titi.app.data.daily.api.model.DailyRepositoryModel import com.titi.app.data.daily.api.model.TaskHistoryRepositoryModel import com.titi.app.doamin.daily.model.Daily @@ -15,6 +16,18 @@ internal fun DailyRepositoryModel.toDomainModel() = Daily( taskHistories = taskHistories?.mapValues { it.value.map { it.toDomainModel() } }, ) +internal fun DailyRepositoryModel.toDomainModelWithRemovingSpecialCharacters() = Daily( + id = id, + status = status, + day = day, + timeLine = timeline, + maxTime = maxTime, + tasks = tasks?.mapKeys { it.key.removeSpecialCharacter() }, + taskHistories = taskHistories + ?.mapKeys { it.key.removeSpecialCharacter() } + ?.mapValues { it.value.map { it.toDomainModel() } }, +) + internal fun TaskHistoryRepositoryModel.toDomainModel() = TaskHistory( startDate = startDate, endDate = endDate, diff --git a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt index 09e78cdb..c45763b0 100644 --- a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt +++ b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt @@ -2,11 +2,11 @@ package com.titi.app.doamin.daily.usecase import com.titi.app.core.util.getDailyDayWithHour import com.titi.app.data.daily.api.DailyRepository -import com.titi.app.doamin.daily.mapper.toDomainModel +import com.titi.app.doamin.daily.mapper.toDomainModelWithRemovingSpecialCharacters import com.titi.app.doamin.daily.model.Daily -import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map +import javax.inject.Inject class GetTodayDailyFlowUseCase @Inject constructor( private val dailyRepository: DailyRepository, @@ -17,6 +17,6 @@ class GetTodayDailyFlowUseCase @Inject constructor( return dailyRepository.getDateDailyFlow( startDateTime = timePair.first, endDateTime = timePair.second, - ).map { it?.toDomainModel() ?: Daily() } + ).map { it?.toDomainModelWithRemovingSpecialCharacters() ?: Daily() } } } diff --git a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyUseCase.kt b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyUseCase.kt index d344bcc7..2fd66afb 100644 --- a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyUseCase.kt +++ b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyUseCase.kt @@ -2,7 +2,8 @@ package com.titi.app.doamin.daily.usecase import com.titi.app.core.util.getDailyDayWithHour import com.titi.app.data.daily.api.DailyRepository -import com.titi.app.doamin.daily.mapper.toDomainModel +import com.titi.app.doamin.daily.mapper.toDomainModelWithRemovingSpecialCharacters +import com.titi.app.doamin.daily.mapper.toRepositoryModel import com.titi.app.doamin.daily.model.Daily import javax.inject.Inject @@ -12,9 +13,13 @@ class GetTodayDailyUseCase @Inject constructor( suspend operator fun invoke(): Daily { val timePair = getDailyDayWithHour(6) - return dailyRepository.getDateDaily( + val daily = dailyRepository.getDateDaily( startDateTime = timePair.first, endDateTime = timePair.second, - )?.toDomainModel() ?: Daily() + )?.toDomainModelWithRemovingSpecialCharacters() ?: Daily() + + dailyRepository.upsert(daily.toRepositoryModel()) + + return daily } } diff --git a/domain/task/build.gradle.kts b/domain/task/build.gradle.kts index 367f743c..8f0e52d0 100644 --- a/domain/task/build.gradle.kts +++ b/domain/task/build.gradle.kts @@ -8,4 +8,5 @@ android { dependencies { implementation(project(":data:task:api")) + implementation(project(":core:util")) } diff --git a/domain/task/src/main/kotlin/com/titi/app/domain/task/mapper/RepositoryToDomainMapper.kt b/domain/task/src/main/kotlin/com/titi/app/domain/task/mapper/RepositoryToDomainMapper.kt index caafbd1d..15ec17f2 100644 --- a/domain/task/src/main/kotlin/com/titi/app/domain/task/mapper/RepositoryToDomainMapper.kt +++ b/domain/task/src/main/kotlin/com/titi/app/domain/task/mapper/RepositoryToDomainMapper.kt @@ -1,12 +1,13 @@ package com.titi.app.domain.task.mapper +import com.titi.app.core.util.removeSpecialCharacter import com.titi.app.data.task.api.model.TaskRepositoryModel import com.titi.app.domain.task.model.Task internal fun TaskRepositoryModel.toDomainModel() = Task( id = id, position = position, - taskName = taskName, + taskName = taskName.removeSpecialCharacter(), taskTargetTime = taskTargetTime, isTaskTargetTimeOn = isTaskTargetTimeOn, savedSumTime = savedSumTime, diff --git a/domain/time/build.gradle.kts b/domain/time/build.gradle.kts index 34aae15c..f61e6d50 100644 --- a/domain/time/build.gradle.kts +++ b/domain/time/build.gradle.kts @@ -9,6 +9,6 @@ android { dependencies { implementation(project(":data:time:api")) - + implementation(project(":core:util")) implementation(libs.threetenabp) } diff --git a/domain/time/src/main/kotlin/com/titi/app/domain/time/mapper/RepositoryToDomainMapper.kt b/domain/time/src/main/kotlin/com/titi/app/domain/time/mapper/RepositoryToDomainMapper.kt index a5918c6d..b6a5b6ad 100644 --- a/domain/time/src/main/kotlin/com/titi/app/domain/time/mapper/RepositoryToDomainMapper.kt +++ b/domain/time/src/main/kotlin/com/titi/app/domain/time/mapper/RepositoryToDomainMapper.kt @@ -1,5 +1,6 @@ package com.titi.app.domain.time.mapper +import com.titi.app.core.util.removeSpecialCharacter import com.titi.app.data.time.api.model.CurrentTaskRepositoryModel import com.titi.app.data.time.api.model.RecordTimesRepositoryModel import com.titi.app.domain.time.model.CurrentTask @@ -19,7 +20,7 @@ internal fun RecordTimesRepositoryModel.toDomainModel() = RecordTimes( ) internal fun CurrentTaskRepositoryModel.toDomainModel() = CurrentTask( - taskName = taskName, + taskName = taskName.removeSpecialCharacter(), taskTargetTime = taskTargetTime, isTaskTargetTimeOn = isTaskTargetTimeOn, ) diff --git a/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt b/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt index fd6087be..8c39fddd 100644 --- a/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt +++ b/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt @@ -2,12 +2,19 @@ package com.titi.app.domain.time.usecase import com.titi.app.data.time.api.RecordTimesRepository import com.titi.app.domain.time.mapper.toDomainModel +import com.titi.app.domain.time.mapper.toRepositoryModel import com.titi.app.domain.time.model.RecordTimes import javax.inject.Inject class GetRecordTimesUseCase @Inject constructor( private val recordTimesRepository: RecordTimesRepository, ) { - suspend operator fun invoke() = - recordTimesRepository.getRecordTimes()?.toDomainModel() ?: RecordTimes() + suspend operator fun invoke() : RecordTimes { + val recordTimes = recordTimesRepository.getRecordTimes() + ?.toDomainModel() + ?: RecordTimes() + + recordTimesRepository.setRecordTimes(recordTimes.toRepositoryModel()) + return recordTimes + } } diff --git a/feature/edit/src/main/kotlin/com/titi/app/feature/edit/ui/EditScreen.kt b/feature/edit/src/main/kotlin/com/titi/app/feature/edit/ui/EditScreen.kt index 3ef680f1..902b1b0a 100644 --- a/feature/edit/src/main/kotlin/com/titi/app/feature/edit/ui/EditScreen.kt +++ b/feature/edit/src/main/kotlin/com/titi/app/feature/edit/ui/EditScreen.kt @@ -64,6 +64,7 @@ import com.titi.app.core.designsystem.component.TdsText import com.titi.app.core.designsystem.extension.getTimeString import com.titi.app.core.designsystem.theme.TdsColor import com.titi.app.core.designsystem.theme.TdsTextStyle +import com.titi.app.core.util.removeSpecialCharacter import com.titi.app.core.util.toOnlyTime import com.titi.app.feature.edit.mapper.toFeatureModel import com.titi.app.feature.edit.model.DateTimeTaskHistory @@ -299,8 +300,8 @@ private fun EditTaskContent( if (taskName.isNotEmpty()) { EditTaskNameDialog( taskName = TextFieldValue( - text = taskName, - selection = TextRange(taskName.length), + text = taskName.removeSpecialCharacter(), + selection = TextRange(taskName.removeSpecialCharacter().length), ), onPositive = { onEditActions( From 72f0b69a36cdffbab5f81a22ab014cd2e59326bc Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 17:46:42 +0900 Subject: [PATCH 4/6] #217 Update : version code --- build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt b/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt index 5be97671..bc80103e 100644 --- a/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt +++ b/build-logic/src/main/kotlin/com/titi/common/BuildInfo.kt @@ -9,7 +9,7 @@ object BuildType { object AppConfig { const val APP_ID = "com.titi.app" - const val APP_VERSION_NAME = "1.4.9" - const val APP_VERSION_CODE = 51 + const val APP_VERSION_NAME = "1.4.10" + const val APP_VERSION_CODE = 52 const val APP_NAME = "TiTi" } \ No newline at end of file From 85c995286b03844cf5de72a6ed2a2bb967b2f556 Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 17:47:13 +0900 Subject: [PATCH 5/6] #217 Docs : release-note --- release-note.txt | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/release-note.txt b/release-note.txt index b9d84826..3cafdc5b 100644 --- a/release-note.txt +++ b/release-note.txt @@ -1,3 +1,2 @@ -TiTi android 1.4.9 -- recordTimes, Daily 동기화 -- measuring finish event \ No newline at end of file +TiTi android 1.4.10 +- Special Characters 대응 \ No newline at end of file From 102d60499f0982416bc29ab4f157ab1b83e499bd Mon Sep 17 00:00:00 2001 From: koreatlwls Date: Sun, 5 Jan 2025 17:50:31 +0900 Subject: [PATCH 6/6] #217 Update : lint --- .../kotlin/com/titi/app/core/util/StringExtensions.kt | 4 ++-- .../app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt | 2 +- .../titi/app/domain/time/usecase/GetRecordTimesUseCase.kt | 8 ++++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt index 9956a0c1..3e25b713 100644 --- a/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt +++ b/core/util/src/main/kotlin/com/titi/app/core/util/StringExtensions.kt @@ -15,7 +15,7 @@ fun String.containsSpecialCharacter(): Boolean { return this.any { it in specialCharacters } } -fun String.removeSpecialCharacter() : String { +fun String.removeSpecialCharacter(): String { val specialCharacters = "!@#$%^&*()_+-=[]{}|;':\",./<>?" return this.filterNot { it in specialCharacters } -} \ No newline at end of file +} diff --git a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt index c45763b0..90239212 100644 --- a/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt +++ b/domain/daily/src/main/kotlin/com/titi/app/doamin/daily/usecase/GetTodayDailyFlowUseCase.kt @@ -4,9 +4,9 @@ import com.titi.app.core.util.getDailyDayWithHour import com.titi.app.data.daily.api.DailyRepository import com.titi.app.doamin.daily.mapper.toDomainModelWithRemovingSpecialCharacters import com.titi.app.doamin.daily.model.Daily +import javax.inject.Inject import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.map -import javax.inject.Inject class GetTodayDailyFlowUseCase @Inject constructor( private val dailyRepository: DailyRepository, diff --git a/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt b/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt index 8c39fddd..333b0b00 100644 --- a/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt +++ b/domain/time/src/main/kotlin/com/titi/app/domain/time/usecase/GetRecordTimesUseCase.kt @@ -9,10 +9,10 @@ import javax.inject.Inject class GetRecordTimesUseCase @Inject constructor( private val recordTimesRepository: RecordTimesRepository, ) { - suspend operator fun invoke() : RecordTimes { - val recordTimes = recordTimesRepository.getRecordTimes() - ?.toDomainModel() - ?: RecordTimes() + suspend operator fun invoke(): RecordTimes { + val recordTimes = recordTimesRepository.getRecordTimes() + ?.toDomainModel() + ?: RecordTimes() recordTimesRepository.setRecordTimes(recordTimes.toRepositoryModel()) return recordTimes