From a4add62828fb5deb0394e4724ecd0e96115392fd Mon Sep 17 00:00:00 2001 From: GerardPaligot Date: Sat, 30 Nov 2024 22:16:36 +0100 Subject: [PATCH] refactor(shared): use entity classes for UserRepository. --- .../android/widgets/NetworkingAppWidget.kt | 4 +- .../infos/presentation/EventViewModel.kt | 1 + .../paligot/confily/main/MainNavigation.kt | 3 +- .../confily/main/MainNavigationViewModel.kt | 18 ++- .../presentation/ContactsViewModel.kt | 16 ++- .../presentation/MyProfileViewModel.kt | 9 +- .../presentation/NetworkingViewModel.kt | 7 +- .../presentation/ProfileInputViewModel.kt | 23 ++-- .../speakers/speakers-di/build.gradle.kts | 1 + iosApp/iosApp.xcodeproj/project.pbxproj | 4 - .../UserInterfaceState.xcuserstate | Bin 180177 -> 176146 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 4 +- .../extensions/NetworkingRepositoryExt.swift | 20 ---- .../networking/NetworkingViewModel.swift | 19 ++-- .../com/paligot/confily/db/Ticket.sq | 6 +- .../sqldelight/com/paligot/confily/db/User.sq | 8 -- .../confily/core/di/RepositoryModule.kt | 5 +- .../com/paligot/confily/core/di/Helper.kt | 7 +- .../paligot/confily/core/events/EventDao.kt | 2 - .../confily/core/events/EventRepository.kt | 8 +- .../core/events/EventRepositoryImpl.kt | 8 +- .../{VCardExtensions.kt => User.ext.kt} | 4 +- .../core/networking/NetworkingRepository.kt | 103 ------------------ .../confily/core/networking/UserDao.kt | 28 ++--- .../confily/core/networking/UserRepository.kt | 28 +++++ .../core/networking/UserRepositoryImpl.kt | 65 +++++++++++ .../core/networking/entities/ExportUsers.kt | 9 ++ .../confily/core/networking/entities/User.kt | 18 +++ .../core/networking/entities/UserInfo.kt | 27 +++++ .../core/networking/entities/UserItem.kt | 27 +++++ .../entities/UserTicket.kt} | 10 +- .../confily/core/events/EventInteractor.kt | 1 + .../confily/core/networking/UserInteractor.kt | 32 ++++++ .../confily/core/events/EntityMappers.kt | 11 -- .../confily/core/events/EventDaoSQLDelight.kt | 8 +- .../confily/core/networking/DbMappers.kt | 26 +++-- .../core/networking/UserDaoSQLDelight.kt | 67 ++++++------ .../confily/core/events/EventDaoSettings.kt | 6 - .../core/networking/UserDaoSettings.kt | 27 ++--- .../paligot/confily/models/ui/VCardModel.kt | 7 -- .../presentation/NetworkingViewModel.kt | 9 +- .../widgets/presentation/NetworkingWidget.kt | 4 +- 42 files changed, 378 insertions(+), 312 deletions(-) delete mode 100644 iosApp/iosApp/extensions/NetworkingRepositoryExt.swift rename shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/{VCardExtensions.kt => User.ext.kt} (52%) delete mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/NetworkingRepository.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepository.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepositoryImpl.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/ExportUsers.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/User.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserInfo.kt create mode 100644 shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserItem.kt rename shared/core/src/commonMain/kotlin/com/paligot/confily/core/{events/entities/Ticket.kt => networking/entities/UserTicket.kt} (68%) create mode 100644 shared/core/src/iosMain/kotlin/com/paligot/confily/core/networking/UserInteractor.kt diff --git a/androidApp/src/main/java/com/paligot/confily/android/widgets/NetworkingAppWidget.kt b/androidApp/src/main/java/com/paligot/confily/android/widgets/NetworkingAppWidget.kt index 5a6338ba6..3f8e90b74 100644 --- a/androidApp/src/main/java/com/paligot/confily/android/widgets/NetworkingAppWidget.kt +++ b/androidApp/src/main/java/com/paligot/confily/android/widgets/NetworkingAppWidget.kt @@ -8,7 +8,7 @@ import androidx.glance.appwidget.GlanceAppWidget import androidx.glance.appwidget.action.actionStartActivity import androidx.glance.appwidget.provideContent import com.paligot.confily.android.R -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository import com.paligot.confily.navigation.Screen import com.paligot.confily.widgets.presentation.NetworkingWidget import com.paligot.confily.widgets.style.ConfilyGlanceTheme @@ -16,7 +16,7 @@ import org.koin.core.component.KoinComponent import org.koin.core.component.inject class NetworkingAppWidget : GlanceAppWidget(), KoinComponent { - private val userRepository: NetworkingRepository by inject() + private val userRepository: UserRepository by inject() override suspend fun provideGlance(context: Context, id: GlanceId) { provideContent { diff --git a/features/infos/infos-presentation/src/commonMain/kotlin/com/paligot/confily/infos/presentation/EventViewModel.kt b/features/infos/infos-presentation/src/commonMain/kotlin/com/paligot/confily/infos/presentation/EventViewModel.kt index 98caf8efc..49728508e 100644 --- a/features/infos/infos-presentation/src/commonMain/kotlin/com/paligot/confily/infos/presentation/EventViewModel.kt +++ b/features/infos/infos-presentation/src/commonMain/kotlin/com/paligot/confily/infos/presentation/EventViewModel.kt @@ -4,6 +4,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.paligot.confily.core.events.EventRepository import com.paligot.confily.core.events.entities.mapToUi +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.EventUi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow diff --git a/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigation.kt b/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigation.kt index 6bcb903ae..85833f24c 100644 --- a/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigation.kt +++ b/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigation.kt @@ -35,7 +35,6 @@ import com.paligot.confily.events.presentation.EventListVM import com.paligot.confily.infos.panes.TicketQrCodeScanner import com.paligot.confily.infos.presentation.InfoCompactVM import com.paligot.confily.models.ui.ExportNetworkingUi -import com.paligot.confily.models.ui.convertToModelUi import com.paligot.confily.navigation.Screen import com.paligot.confily.networking.presentation.NetworkingCompactVM import com.paligot.confily.networking.presentation.ProfileInputVM @@ -242,7 +241,7 @@ fun MainNavigation( VCardQrCodeScanner( navigateToSettingsScreen = {}, onQrCodeDetected = { vcard -> - viewModel.saveNetworkingProfile(vcard.convertToModelUi()) + viewModel.saveNetworkingProfile(vcard) navController.popBackStack() }, onBackClicked = { navController.popBackStack() } diff --git a/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigationViewModel.kt b/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigationViewModel.kt index ca73c2da3..3a29ab398 100644 --- a/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigationViewModel.kt +++ b/features/main/main/src/main/kotlin/com/paligot/confily/main/MainNavigationViewModel.kt @@ -6,9 +6,10 @@ import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase import com.paligot.confily.core.agenda.AgendaRepository import com.paligot.confily.core.events.EventRepository -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.UserItem import com.paligot.confily.models.ui.ScaffoldConfigUi -import com.paligot.confily.models.ui.UserNetworkingUi +import com.paligot.confily.models.ui.VCardModel import com.paligot.confily.navigation.BottomActions import com.paligot.confily.style.theme.actions.NavigationAction import com.paligot.confily.style.theme.actions.NavigationActionsUi @@ -29,7 +30,7 @@ sealed class MainNavigationUiState { class MainNavigationViewModel( agendaRepository: AgendaRepository, private val eventRepository: EventRepository, - private val userRepository: NetworkingRepository + private val userRepository: UserRepository ) : ViewModel() { val uiState: StateFlow = agendaRepository.scaffoldConfig() .map { MainNavigationUiState.Success(navActions(it)) } @@ -47,8 +48,8 @@ class MainNavigationViewModel( eventRepository.insertOrUpdateTicket(barcode) } - fun saveNetworkingProfile(user: UserNetworkingUi) = viewModelScope.launch { - userRepository.insertNetworkingProfile(user) + fun saveNetworkingProfile(model: VCardModel) = viewModelScope.launch { + userRepository.insertUserScanned(model.mapToEntity()) } private fun navActions(config: ScaffoldConfigUi): NavigationActionsUi = @@ -66,3 +67,10 @@ class MainNavigationViewModel( }.toImmutableList() ) } + +private fun VCardModel.mapToEntity(): UserItem = UserItem( + email = email, + firstName = firstName, + lastName = lastName, + company = company +) diff --git a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ContactsViewModel.kt b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ContactsViewModel.kt index c9f80464a..490a9e08d 100644 --- a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ContactsViewModel.kt +++ b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ContactsViewModel.kt @@ -2,9 +2,11 @@ package com.paligot.confily.networking.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.UserNetworkingUi import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.catch @@ -19,10 +21,14 @@ sealed class ContactsUiState { } class ContactsViewModel( - private val repository: NetworkingRepository + private val repository: UserRepository ) : ViewModel() { - val uiState: StateFlow = repository.fetchNetworking() - .map { ContactsUiState.Success(users = it) as ContactsUiState } + val uiState: StateFlow = repository.fetchUsersScanned() + .map { users -> + ContactsUiState.Success( + users = users.map { it.mapToUi() }.toImmutableList() + ) as ContactsUiState + } .catch { emit(ContactsUiState.Failure(it)) } .stateIn( scope = viewModelScope, @@ -31,6 +37,6 @@ class ContactsViewModel( ) fun deleteNetworking(email: String) = viewModelScope.launch { - repository.deleteNetworkProfile(email) + repository.deleteUserScannedByEmail(email) } } diff --git a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/MyProfileViewModel.kt b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/MyProfileViewModel.kt index b81467026..316069554 100644 --- a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/MyProfileViewModel.kt +++ b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/MyProfileViewModel.kt @@ -2,7 +2,8 @@ package com.paligot.confily.networking.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.UserProfileUi import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -16,11 +17,11 @@ sealed class MyProfileUiState { data class Failure(val throwable: Throwable) : MyProfileUiState() } -class MyProfileViewModel(repository: NetworkingRepository) : ViewModel() { - val uiState: StateFlow = repository.fetchProfile() +class MyProfileViewModel(repository: UserRepository) : ViewModel() { + val uiState: StateFlow = repository.fetchUserProfile() .map { MyProfileUiState.Success( - profile = it ?: UserProfileUi( + profile = it?.mapToUi() ?: UserProfileUi( email = "", firstName = "", lastName = "", diff --git a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/NetworkingViewModel.kt b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/NetworkingViewModel.kt index 191e5a0fa..f32046c7e 100644 --- a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/NetworkingViewModel.kt +++ b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/NetworkingViewModel.kt @@ -3,7 +3,8 @@ package com.paligot.confily.networking.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.paligot.confily.core.agenda.AgendaRepository -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.ExportNetworkingUi import com.paligot.confily.navigation.FabActions import com.paligot.confily.navigation.Screen @@ -36,7 +37,7 @@ sealed class NetworkingUiState { class NetworkingViewModel( agendaRepository: AgendaRepository, - private val networkingRepository: NetworkingRepository + private val userRepository: UserRepository ) : ViewModel() { private val _exportPath = MutableSharedFlow(replay = 1) val exportPath: SharedFlow = _exportPath @@ -85,6 +86,6 @@ class NetworkingViewModel( } fun exportNetworking() = viewModelScope.launch { - _exportPath.tryEmit(networkingRepository.exportNetworking()) + _exportPath.tryEmit(userRepository.exportUserScanned().mapToUi()) } } diff --git a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ProfileInputViewModel.kt b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ProfileInputViewModel.kt index 2fc7d1e98..60f78c260 100644 --- a/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ProfileInputViewModel.kt +++ b/features/networking/networking-presentation/src/commonMain/kotlin/com/paligot/confily/networking/presentation/ProfileInputViewModel.kt @@ -2,7 +2,9 @@ package com.paligot.confily.networking.presentation import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.Field import com.paligot.confily.models.ui.UserProfileUi import kotlinx.coroutines.flow.MutableStateFlow @@ -16,7 +18,7 @@ sealed class ProfileInputUiState { } class ProfileInputViewModel( - private val repository: NetworkingRepository + private val repository: UserRepository ) : ViewModel() { private val _uiState = MutableStateFlow(ProfileInputUiState.Loading) val uiState: StateFlow = _uiState @@ -24,9 +26,9 @@ class ProfileInputViewModel( init { viewModelScope.launch { try { - repository.fetchProfile().collect { + repository.fetchUserProfile().collect { _uiState.value = ProfileInputUiState.Success( - profile = it ?: UserProfileUi( + profile = it?.mapToUi() ?: UserProfileUi( email = "", firstName = "", lastName = "", @@ -58,11 +60,14 @@ class ProfileInputViewModel( val profile = (_uiState.value as ProfileInputUiState.Success).profile val email = profile.email if (email == "") return@launch - repository.saveProfile( - email, - profile.firstName, - profile.lastName, - profile.company + repository.insertUserInfo( + UserInfo( + firstName = email, + lastName = profile.firstName, + email = profile.lastName, + company = profile.company, + qrCode = null + ) ) } } diff --git a/features/speakers/speakers-di/build.gradle.kts b/features/speakers/speakers-di/build.gradle.kts index cf233bbd1..fd8d7a0fc 100644 --- a/features/speakers/speakers-di/build.gradle.kts +++ b/features/speakers/speakers-di/build.gradle.kts @@ -25,6 +25,7 @@ kotlin { implementation(projects.shared.coreDi) implementation(libs.koin.compose.viewmodel) + implementation(libs.lyricist) } } } diff --git a/iosApp/iosApp.xcodeproj/project.pbxproj b/iosApp/iosApp.xcodeproj/project.pbxproj index ebfeed1a1..75b0688c9 100644 --- a/iosApp/iosApp.xcodeproj/project.pbxproj +++ b/iosApp/iosApp.xcodeproj/project.pbxproj @@ -9,7 +9,6 @@ /* Begin PBXBuildFile section */ 0060F46B2C8BC231000BCD06 /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 0060F46A2C8BC231000BCD06 /* GoogleService-Info.plist */; }; 009DACF52C69384200A7F42E /* AgendaRepositoryExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009DACF42C69384200A7F42E /* AgendaRepositoryExt.swift */; }; - 009DACF92C693B0900A7F42E /* NetworkingRepositoryExt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 009DACF82C693B0900A7F42E /* NetworkingRepositoryExt.swift */; }; 058557BB273AAA24004C7B11 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557BA273AAA24004C7B11 /* Assets.xcassets */; }; 058557D9273AAEEB004C7B11 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */; }; 2152FB042600AC8F00CF470E /* iOSApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2152FB032600AC8F00CF470E /* iOSApp.swift */; }; @@ -119,7 +118,6 @@ /* Begin PBXFileReference section */ 0060F46A2C8BC231000BCD06 /* GoogleService-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; }; 009DACF42C69384200A7F42E /* AgendaRepositoryExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AgendaRepositoryExt.swift; sourceTree = ""; }; - 009DACF82C693B0900A7F42E /* NetworkingRepositoryExt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkingRepositoryExt.swift; sourceTree = ""; }; 058557BA273AAA24004C7B11 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 058557D8273AAEEB004C7B11 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; 2152FB032600AC8F00CF470E /* iOSApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = iOSApp.swift; sourceTree = ""; }; @@ -344,7 +342,6 @@ D52F3B992961CDCC00535233 /* ViewExt.swift */, D5C1B3BA29F26D9E00D94391 /* BundleExt.swift */, 009DACF42C69384200A7F42E /* AgendaRepositoryExt.swift */, - 009DACF82C693B0900A7F42E /* NetworkingRepositoryExt.swift */, ); path = extensions; sourceTree = ""; @@ -725,7 +722,6 @@ buildActionMask = 2147483647; files = ( D574DE1A292446AE00468074 /* EventSessionView.swift in Sources */, - 009DACF92C693B0900A7F42E /* NetworkingRepositoryExt.swift in Sources */, D59944BE2833CDC900F59C1B /* TicketDetailedView.swift in Sources */, D5BC483229B0CC98002CC517 /* ViewModelFactory.swift in Sources */, D5B5E8522B4C972D00129758 /* AgendaFiltersViewModel.swift in Sources */, diff --git a/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/mac-GPALIG05.xcuserdatad/UserInterfaceState.xcuserstate b/iosApp/iosApp.xcodeproj/project.xcworkspace/xcuserdata/mac-GPALIG05.xcuserdatad/UserInterfaceState.xcuserstate index 36d94447dc02f7af542ff2756d81c37bc7916176..da1a3e1f94835d6ed743db9442beac4d7e736c74 100644 GIT binary patch literal 176146 zcmeEP2YeI9(!aaCsxGT{$#jAn&4z?(Q%ncbAqZj1Sm1^wQv=)*O6Z{kNJt3SR8vyu zDL@)E0Rm~H5K0m{1ky+$`Sx@Y7-XFH-e*6;`#D6iE$!XS?#}E zM;ML~7{Ex3!f1@aBz>!o^cMJidAa?ndkWICeCV&9)dP9?eXHjU8Rkt7_@gj<>TjYe(gL1nbC$Y)cQ`mHDHZ}*F zhpod(u=UsmY$LV_dkK3Pdj)$H+l=kR-o$oc$FSqrN7%>MC)lUhXV?ksbL=GcHFg#| zhn>eRU>C8g*bVF^_A7P^`xD1-9H($8uEbTi7PsTkcs0BhUK_86$KZ*065a%FiZ{bs z;VF1Kygl9nPs4lSz3_f`e|#{Wjt|AN@EklB&%?*y%i!Joxnz?b1g zcrm^PUyECv?aO_ zU5Rc)U!ot;pU5D*L?$tm7*6C7`NU{q3^9+GPb?r763-Beh{ePb;#uN3Vkz-Fv65It ztR^-QFA*;juMw{kZxC-1ZxQbidx?F-5#lIup143; z{v`ea3}68VG(Zb>0dxeNKxfbebOqf&chCc*fu5i*aD$;B z3;4hYPyqa3JeU9`0v=2TPl4%R9+(f7fak#rU&R8ccbpAyhh* zL3t@3l~0YJ3MfA{j(UO`PfeqqqNYN#pD^*r?gwTfCz?V@&5d#Jalx2boi zcd7TNz0^KxKlMI!ocf6RnEHx3NqtS7qs~(os2`{wsh_Byso$tSslRB3W@#twqNC|* zbalE0U6Zaw*QV>xb?I2T5#5Y#PPd@j(e3F}I*sm0_o92#{pmrpn;uGM(L4?5N%WKS zWO@ocm7YdFMNg+^&~xZ#=ojc^^o#TwdM&+<-b`jD(RgGDgoB7$ak1Y>bOZVCpjsn1)OvrZJPq zv|w5?t(ewKGSiOf%yeP8GJTl7OabF(0!$$@k{QK}X2vjMnQ_b$%y;!>nc2F(u3<=2hlx<{jo;<~?RFvya)&9A!RaK4m^*PBEvM-|%BayPRFY7O@-HjqE1&C3Z8r zo!!muVc%ijW#3~zU=OqB*$eDN_7Z!Uy~18)ud&~=*V!BF59}}OpX^^8!?7I4X*eyX z)bb1k@bTzjqy*OlwW_2v3;elEZjawEA>+-PnL zH<3iHgoTA?{e>Pd%1nwe(nJG zA$N@Xj61=7&Yj`Ta=&wbaJRTWxxXZs1eXvJAR#4`gp;TwYKci=mRKa!B-JG~Byo~> zNrI%lq_L!_q_rejGC(p=^0;J>#4Q;t@koY9(j^%Zuf!+GmyD1UNXAOWNuH2Ql}wX7 zC7CXnEtw~IR`Q%=siau4Qu2o6P023FZpj|WTavdW??~R2yeHW!IVky1a!m5MnTX}UB+`h;}6bb@rEl$S#3BPf$GL=j%i;`(%2AM@xO;%m@n5>zsxvYh(rL2{#wJcedB5NaS zE9)TZF6$xdFB>2mD9e-$m1W6%vK-k6*%;Ya**Mt~vhlJhvZ=CVvKM8`Wh-PwvSQgv z*(%v;*&5ke*#_BW*%sMW*_*OmvfZ+Mvi-6Hvg5LkWFN~uk$o;ZDf?P>N_Jj$L5|A_ zIgpcbN>0leIV&au}vGV%z#`5O!7V?(z_VQG@M?OTJ zF3*sA<(cxK@+`SeK1@Dbo+lqEA0?kC=jBj7T|PrTQ~r#6k$kayiTru_a`_7RI(dow zZTUO$cjfQN_saLl_sb8+56Tb8-Rsc5C>sOY5VtmvZXq3Ep`q;M++ zE3y@rq)r;!VXa z#cstu#eT&p#c9PE#aYESifW#uc%1ImNSL(2D+A1Dtik0_5S zKU5x59#?*cHHC8oMwNj<3I;c9T(o{WFy;N@1V3kKTM3t!;rYcbRRkKxdRC85N ztLCZZs}`shs-96TQY}_3RTZgRXbEWRj;Xbsoqu{R2@>iuliE;mFlGG zYt<>$Y1J9kMb#zMb=3{kZ>rzbI<;PHP#e`IwOMUZTh%tTUF}di)z#IHs2ivosvD`B zshg`?s8iJ))E(8G)ZNrQ)xFeSb*6f#I!o!{?Y zj!~VWI!E=1>KoNBs(;j=s3B3qqJ~F388ta-O4QV-X;Du_O^=!pH8W~f)ap3+R$EYK{}Jfm5pc}}xTvs$x8vsUx6 z<`vBW%|Xo}&HI`UG>0`uG)FZbYL01+Yd+PS)O@Eor#Y{=q4`1cqvj{gubNw0N=s`Q zEvr>&)!I7Ry4pvy^|UeCSZ$m(UYnq;uWg`B)Hc_)(6-aI*QRRIv^}-Gw7s?cwS%;o z+M(JkZN7GdcDiv$?K16Z?HcV`?W@|&+AZ3x+MU`r zweM;7YWHc6Xpd^oYcFUoYAlhuYi_&RyTAfa3 z(%E!1bTxIgbhUNyx&&RSu7j?lu9L2_u8Xd#uA8pAu7@s7*GD%<=hh9@W$ApnVY+~> zP&ZOHN;gh7Q8!KZly16ihHk!Yfo`L2lkO$m%eq%|uj)4Iw&=F%w&}L(Ue~>?dq;Oj z_rC4}-KVrU#<=q~Cm=`QR3(B0DgsryTh>2W=wm*}N>wLVI((OdLZeM5aC zePey1K1tt1-&Fso{xN+seRF+leX72@zK1?d|G0jT-mM?3&(LS-^YtV21^Ti2ary=N zh5Bdoi}Z{2OZ3m`pVKeZKd*m5ze2xO|FZrS{j2&n^l$2S>38ej(eKkA(I3@+s6V0q zTz^CVgZ@YTPx_zrzvyr3f7Sn{|6Tuw0W&ZLr9ov-8!QH^!Dg@ZRlg@Yv^a_Zx~>38!`>KhCD;QVXR@C;R(Zd12jxA%r?w1%rz`F zEHS)nc*XFlVY6Y2VXI-AVY^|6VW;6W!!E;nhP{S;h9icfh7S#27``-oWjJX#WBAT+ z)o{)5z2T4rOV+&)l zv7NE2v752Gv7fQOvB2mz28@Nqk;YNR(Z(^xvBq)6CycytnsKi2Y2!TOv&QF)OO30H ztBq@nYmFO>FB^9lcN&iyKQex7{KWXF@iXHInRU_2v!cjpj|}SIyhZ+s(Vpd(5Ai zPnbV9e_{U8{FV8n`D^nj^J()L^LOSe=BwtP&A*s$S}+T4AuKYB+@i23EgFl#;;=X^ zO)ZaF9vOsg`b*?v{R*{+0ojbW4WCYss_ZTSiz4EF&#r zEi)`LEwe1MEpse$El*pPSe~`KXjyJqYguP`%ksA69m~6x_bhuY`z-q{2P_9Ihb%`d zpIA;>zP6mQT(n%WT((@XT(|sWxn=p&@|TsdvR0?nWsSC0vsSm(u-3HJvevfNvDUT5 zS{qrLS({s1Sle0KTT`uR)}Gd0*520s)rm@ND{qC?N!BN=ldV&%Q?1jiPg$p1 zXImFqpSQkXU1nWvU1MEqebu_zy2ZNHy3_im^*!re>nZDL>ly1=>o?YKt>0PCS98>qivIIi*1K(r){@wk8Q7QpY2oIXSNfz&uw4WzO;R1J8e5-J8!#SyKcK-`@v4x zX**+Q?VMd=m)d1^mEB->*qwHl{SkXTdyGBSUf-rU~8-qPOQo@(!4?_%#}PqX*2 z_q7kQ53#4)^X&Qd5%vPR-yX0R+Q-R`)vCh`&|1%`x5&ydy&1^zRq4^ z-(=rr-)?`yzQ_KqeZTz!`*Hh6_K)o+>|fi@+OOEJ+OOHaxBqPa&3?-P9E?NiP&=X= zI!BBn))D83cO*FKI~q6|IvP0|I}#m9jwX(#jz=AjIhr||J6bt9JGwZ!I=VT!J9;?M z96cTV9T^U&6?{EmQQlw+FXDaUlj4985z9LHQov16rUm1DJIjbp82oukCD z-m$^)w&NYgyN>r9dmZ~6`yB@y2OWnT-#Wf?oO7IaTyR`;Tyk7?Tyb1=TyuQy_|x&1 z6LaED!U>$5Q{q%OwN9hc8$0f?X2Uh>x_3MI2$<|J0EqnbGCP;Iy*Q!Iy*Ug zIMbYcoPC`cPOmf5Inx(@-*CR^e8>5&bHDR|^F!w`=W*v(&Xdlsou{0q zofn)}o!6Z|Ie&Kk=KS3yb;(?Em%^oVsa$H8&1H8vTuztERl`-&RmWA=)!3EjN^&)E zHFY(2wQ#j@wRLrHb#(P}^>+<$4Rk&38szf0GF)C)rYqN#=gN2aT>;lv*ErXcuF0+` zt`}X)T`OEgu430p*DBX)*BaMa*E&~;YnyAkYlmy6>owP2*FM*N*8$f-*HPDpu1{R2 zT&G=UTxVV1xW08=bA9i+9!*8l(M&WO%|%P1rO~ozd9)&08Lf)eMpuun5nVI7R&?#? zI?;8bABk=h-8eciIw|_G=$6qb(Ve2ZMfZ&E743;05^sMNoqZdX$6a8HDvgno3tD;Myw?uD^-WI(l`mN}TMb|Y@E+(aePwiMr|6$ zH*TC1ezF;>gC%XkESMFuVRp=cIWZR&ja9>{V>PgvSS_qJPw_O*@GQ^q5?;#7csZ}& zmAr~q^HH0yy4WLFJuC)`#p1AdECH*JH9&tg!Wv_VyoRp}IVohn<)4O}0&+@zKIGJp zv!jn77Z14vejcCdRvCME(~;zDGJJu&f^a>0_2}extIR3hOiy8U=)0ho*WWg;K=^WC ztMmZ!5~rnSd2_sOl}-G!TS1=SEl%?WQZvv!eVIOQ0rD54R_Rfgo8t8ce7T+g@-heA z#{pEbu)y2f=l2cqW%~lCm@@qQKEB+HyitM(;%}`A3Ou<((W7z$Dc&K4LsN4z^V}*; zn_SP3Y;Vu30GTbY67f+5iD6lfk zn~mi2X55w}zLUovNY2a2&-S8^y9w@ce*noNHbHBTA9=-vHbE8X;myx0K)Rr9jRYH> zpXbXB_=DdeH+jafpw6|&(n_#YtOM2&>x6a2x?o+gZdiA$2e0J~yotB)Hr~Oz_-cF& zz7}8SIMxg4X>Y6#))(t1XzCF3xB=*Afj1j9=twV*@p@k8R*lZ|WqX^(#l`jVBLU-b zJn1p*y0z+*+Ah9PT)1uhaihX&8#6p7KQ28lH`80-%}w|E8)l(KjPvFBTjl46fB4f2 zyxv@YoIfAc#aj@UCjRX0^N#AAm*LHh^^fvp2999^vB$ANn7h9Snq1V7eZ^nB{$5?u zkj@mLuLt+-lGZi2qENa@8A0)lZq=mC%PB-~%tIK-@)V$Z`eHK+5DtVs zjuUkaX?FQc#fUZq=xY7o=3*hLr1XI(Ax6 zn3|QMX!q6ka_~1RC{OK5<%Cc#h2fXt4S0On_sArY?Og0>G!zIU-R^1=vFD8Eg@@7+Zopi#>-e#h&LM;p_1+d@LWw$MXq%eZB$TumoF%y@)NxR$xU~ zF}4z0g{{Wc@QwKHd@p`9#LW=5L%arLw?Xy-Wd9T_hT1{o#3K8rqc0G9x8V@m%J26E zk`bD+^M<-rNr--9J^5(NjLitdcJ}$xgMex0DIAK1h1A%#Xt+x48vIinG{ZXXR@Ex+ zDcyv1Z1Kr%Rnu}ydWU-ah5jyixx%y3#-K4fCoQkAAl;jc;O|y76fX{nH56GZku?fR z*V&tc=;w}f^~!suaOWO*+1YoB$COvRn;QHUJA}QD zeSjUtj$lXmR(uNImT$+m=R5FS`EG)O8~h>TFBK`v9ZS|fz#mi`;ZtN&sxpGu6im$m z)Y;wwWJ~84c#$oIxL@qdPDo4p_%Z@nkNeZJed%bRk3j>22VE=PDMnD^&__x%*9f#l z^9aF^M1>yDLqQlLk!=$EUbGs&z`k06eaW}xliey^Y@9FMJ<2--jf~z{UycVM${Vu7 zPGP49c1i187!b^3WQ`YNr?4~FU}T4(Kg3&oBi!m+zRmq_g{=D2)~U%MEO!k_bEmr1 zT4wLTg#W@la0$DNB`sghr;7Y^4f`IM=(oj4@geItFBgr$#n?6MIyM+dc;~b5J$}G` z613_^zT*n)XTFor8%po!d{1tMHzU{^DSlD@->^ScV88R7`7YgK#pj*D{wfk`IY?|< zq3wls4BZ(ga3D$-{(#0=^eCL+d#u1YzUN&Ej4Of)oQ4=|bj)bMP>4Y$LuQPi%`v__ zWMLNsZTuG5p2FPptTeA*uvvO|Gn+MN(j?In-=Kbc_%Uic>h9<2a1)kPjO%d&ZsdFO zefj>yxEZ(LR(>Gw?b}FeBuDNYFNcT@%}XqPVVtoyuQ%dad}Vu&ck7gz*3;c4CADYQ9`3X@o!TV#Ozqmm-LVa7sK^3s z`gUv8CGB3R0?$o9Sx{Yv;pw8ltVrk3yI^yrm5&rNN{184_{JS-tyqr%D zYBJsiZ#(EVZh`}RG2TWP;t@5C8y8>C8B;%Ld_Cv5goce8)pI5#G#)=btZk`yXQ8?s z@Q!#VK9e8HXBFdJ@UD0_-p3E;NBmc-+Z#(;f%oBu@pTXnB)4r{n46L9P4W5jvpr*k ziMCkr0eEsTJ`jH#AH-+#Ieebb2*@jgdqNE&{GNd)ufV;0E}xF5GkhmBrR+H--z)L~ z?!%Lda4$X_70Tz+yT>Ck4mMT8hQXFoJO;7RbiGplAKQb)$lR>%ND$`v(Ro3&T;j^)% zRrpi*bbJOr6Q9M8;m7gg`H4JSh0np~;!orA@cI0c{9689{uGZ)uhJ-99K_UEH02Ky zREEzljEFfyvd18P@&`QW!`;F8M|W!2_tIXt8!ftRYyEamcZoK0L1wxj52N z`gn(=3if4M?{>n}2KhH4KS~x{ zCSf59?Vit4dM0=65oVNbg+tI>;X%oq=_~LG-eqLv`eXbV!{ge9J_y;kg6~wAJ^PUx zH~AkYWO81CHx4-oMIYinM!e(#G`MDu3HZ|eaixEMuw9*BkeA~_m<{)6T-(;2kjp^) z>>mN0UIAfY$cID}p>*eOVSOXCI)z--4-_$?XlTWxvln@q3WAGNA$jlquulQmn$q{|HC8=Wcdm*+``hsn7CA7@wZKGdcl}{ zv|9ZS6ZBr>hn7tru#~x;+`RlDXoWn-9h#N=V=Rxb_0}raBibMTkU{9aW@c(Ga!F(h zQ4PWxuxM+>{liV;pw$^NiyyEmMzpISTi4v|F<~R`AETLQxXui8>m1V!^>t=mK~9^| z!MWP)`Nmxu`(Lt|%5ugai@3a{{{N0KSC(KE<0T5kKZLXwc_9jNJlS!cf}F+;D_K?k zTXp)Ms!Yf|DY`RbkVh}LB=ryRP`2};$RQ!d4F!fFZ);~yzCSWFCc|*Zr*gd2bx_5{TdG;RC+K3*(hgA5mIenK01}$7Y zUH4j@Ar}XVgDwaK`8?ENSfR+Jp<&-h&|&kx5w?T^2!!pPcZFhwdT(T=Ux++Ik)98A z=LvyXsFs2Q_;xMFcyh993c-VgC?u+xxZgr_p9;ZIokCy42L0PL{eqYK?kL01XLn+~ z9!!wo-}tpdfndSV(BOX22jC5^67k>NomiGny{Z+fT2a`PT7~F{&Ae4`sfaDnRjpXn ziuc+L9``RKcYRE>&<5HuqKebnc{c zs^Y~eUaaE9DqgJO#kOQ472=8NN6%<%XCB z>h`i-sCDA*$^Dp+7~3ec!uLRPh?KwT6Ou5rjX+4&+Du%h4t;?({x`dS#l#F8&4Qam zVmv~2KOtK{LZjIDnAD9% z;8JgB(|PISH>-o`W_XltCMzP{OvldMx&$-yqKFNYO+&~v)5VOjwTgv$xLZmkTz*Iu?4CJ&Rr;9< zImxeLwe8+Ms!Bf-I(D?87KkdhyGpyo{zq7%D*eoVe#&R%DqAT}+(W8sRq1E`(d<^0 ze&+vk#BardKWv8HSP zOw+hHbe?+paCb0oQHyL(VQzX>C{VqJH?vv8_y(Dt#6(Yg&0w)$YRL8;e^#@`@eS)Y zuHPiSQNzYfnly<|OlnlRhXwGx=Hk>=OJnED=k<67XI4ZhQ~=`8Jlw&*A6s^U=Qr zd@;Wg{al6qPIarycUHLDWcZL79P9UHqoZfgA@OdNHS)`>yiuKfxjuBJuv_IS^J`(T zJXtuR1|`IFs~lyPNzEPU^ZSNmd;MkI1!WFG8GUXa(u&Gdi@ZyEL0)!tS^yo29GjP! z>GuZ8x|6?Dsce)Y=zdjdRT#+1D?ks5tg#RV&^9kS!tkxP;;K}bKBp*5!?5U$z z+6w$belA}}{QDy;Z6y{f{^Oqx{i~zGI5yn3C-Kvmz6k#sKgBQPpDDu6;AiMG@;1PT7o-e}>IFDb(^u_oE{33pdU(7Gz zpDo6(;8*c${B!*C{0qW^YDP3~{yk4lLz;nFFSKt{=;DyJ+$q>IZ%m5MFZ`XHmm3gz z$6Mf5*&}Z4_hop8cnV@i`7#1o$MBz!e*cXBGO$ZpY+<1u@L7rYU6oxqE*>)7B>GZBEGQ9lqQLGjD^6-5MtH{gr-!Thp8 z8F}f2Io{krCvWc1K-K_3kAfaxuV1aDTu2?yaMTtqZcji}DA<4gGU{04p_zlnc|f0=)U zf3<|DDPo+ci|;1tVF^Sm!uaM8#Vv4d`Ez1 zFVtGEMF2fqek?IX0OmO231U1kftX0}1SBRAPZE>)_xQd1K7K!cfIr9|;@{^#;18D& zQ$xU-ZJ?M}qcjK-%+hg!V*X)WCjWsa_$r3V3^!*i3BUKjlB;PZSf| zi0ue(pYvZlc)aaGAle-XBJaYP-M7wdJ8$FVbLU~VIcNwyM!b!Rz7tvW<$3iPdSRQ( zuNQoLZgSCtNy2Dr6~{$24#Lf_pExA6otij^koWcd+b&%GL*h#TdB=$3#7D%(#3#h3 z#An0_;&b8){xpAvKg)l^f6ITzpX1N-7x;@M#8)BYokm0AS%kcA5%MmDkarCYiN7P{ z{ZWOy3PoPf%q4yhhQuHF%i$sM7c?XiH;G?`7k`Dn8hq7J$yDt_eG4!EkS+im5d8Q2 z^&&t5ioe0%tT3||NPq%i4oHCv$oU`mANik(ffA??=6>dXdEl4>222TzkwDT<+1S37 zCuPa1)3iSJ!<|zQ=70qiwMG_wZ6d30@<;2!2Ht z0jP#7g5S!r2;@yv^6*7$LWo;dfJG3u@u{V!E3gc_h$SswF5Euo$O1)R z6_!*4ior^VJ0R{V0;|Cqh*yJn^}A)*Aj;r$s}6=`5F9arSD|TKFLZ$QJxg`}asqNO zA6V#Qr#R#v@_KXqaVWh)ZXm9W@ZQ_!9n~2HiVmmX=cshh`_wh)oobd4i<+euro?(0tGf zO4l^}N4Ta9gsO@iz6ET(TLX3gEEOC9N3l-e7&s0-0w04ufR$0H8=%MgEQbP z_y&9nz60mLd8{+m5nKY7!4+^7Tm#>O>);0X0sIJl0zZRaAYK#VwIN;?;`JaN3-Ne} z*XIooZwT?m5Kn@5Q;0tX@#YY33GvntPvNx?ZwvAEyanPNAl?b$T_D~K;yobV6XJ+j z`$D`w#0Nrr5X2FQA>zz{cqYWNAU+J@*$~f#cs|4nARd7DNZ!VqAU+!6VSbv2}qKpNSb6wmgGnY zDJ5m3oK%oXQbnrCC{jaeNgb&t4WyAYk!I3DT1gveCmp1dbdk|yHL^NcgRDu`B5RX% z$hzbsWIZy5j3wj9crt;kPd0!!8jfFq_z{R-f&>kT29Owl=D?6x0f|G9_z?mX1The# zLNqu42*C>wybi(V5c~{D4J2bB*#VMXNJ2=igXDflo`sYIQVk&04^jb0&4tufNPP&Y zE0E?OT^-V`Ank_qG)Nag`b|iG2I(Ilqk>EfWZFX}7cw&;vl=pQLFOc6euHc@WSc>@ zFJ%3YU3wRnkVzucY9T*5_L{=%_lg&hF>bO-C zDqfmg&q&`;lodY@aaxegLJJb90dG#1+uubB)mjwl5w|L@;)M#6ELso9&G5vv3jQdo zY1)ZW#JE-dikHGWI)Ioy*fPCRQ4W!8UwW{i&@w}0dvp>diF2#QRJR#$dMc|~!WxK+a|UYrc!gv?gi=&X`(tDv>RQNGMT>FyaOO7N&#m0$4^ zgu4eFloE#!eUIf z`&sbR2JyqRLPY4f8IcSzTdWcaMaU_qN)~ol|oac2G&xO-d`5Gs86MgYGG;0oMuIK&sI^Eew8W<>iB@*h!RoVR{Secme)jC z2Dnw@DqdAetFCA$Bkzv*OL$C+lxVjo(c_g$xpxg`kutn1%HVdZ##Vf*gtaAKG{^jC z%UjSc^OrNU9uNicR6gy7=2xA3{`<`K4vV6sSBfa5h9kj``Zt5oaZwZ$`c(-$ms#+y z@!V&k5Gelc$;#7}2%E69|Kxu2y{|;ce3ddl-d~H$Fk#M!k_>mNHkQ*y6=fOzOB+Pe zf@giE_+oFL>=`GzoDoHZzsf2-o}ClxkW;DS8ETzK)-G#2yDUnR=T>d|FSO`=ZS6bh z$kT+$b+6R8$WM~9g{WkITp#a{``9bj#mbDR6#FTxsHMF}VRpOEjOu4m9u#p~i8HDQ zdCI`e@1h`uZq?Lsdino3{V11P?ms3`m?+#Rw`x$u3+L;ahMXo5BQr&b4;@n}PNUMJ zPj0{$$o57~2`Pyv!8o^Se8pG0l*JVAr4RR_>1@y7Pm$xj8A5+Vwu(}eX}nvtIV@8t zC$c{-c!X`N;E58VpMwi-DMi%6-UleAhTeUMx3}wV8 zgh6`;=0UWJD`h|m zcX!ZM5FKKXUUWEAa;QI=`j!La!RGLs64Hck9 zp&&1+kQxc`Vu-ISqDE6=AifIX>nki|mYP6KLLqh3M2e>%#8*Qcg=VcSrkaflmGBptOxh(p{M8HXr&rdmtmU2%BSGHOLI4v$(c z#NoYM&eh>gT|>Pppm;5{jw+$nQyZv_)F$dB>SYSW+Pn(!%@E%L@vRWw2J!6>-vRNR z5PuEgua{7pLnz)(?GR#Usn-P*zY#|99*Dm$#?XFHh2ly;@c{wF2O<7u7{wn5C_YRb z5nd4A1@YbDJ3_Ha&{w3-%3c$kmL3}^N4-`|^sP6^fqnaLi@WB5Cq4{Pc zn)8+Ysn%a6&sedu{p)8Y!9fD>e@8|Ch%739QE{NFJ_XzQIo7^K_ge>0EUk!O3=4G; zjnTrc1VT*{0)`Kl(|X}6I9iJ^OiO4fEu-bMf>zQhT1`jMC>;4H#6N`iF^C_B_(u@` z7~-Em{8Nad{y$Md>qHFGCfZC5#}a6pfZ@->82%FC=h09g48<3!KwR-4rXN8drcuo2 z7aH#4{1f9{Sv3p&J8*R zZvgSrWo_Lc!`qGN4s;g;Ub-XQiS7*Xvk?CV;@=k2UFmKDc)x@Axd#qjx(}wL`$i&i z&NoFJ4W2ZLXQ`~`*Rq)H^ZA)2(k*hm4Mxu0(MbU^eSyT|5ijlN2A%$?-2j9;;_4%E*2iLLcs1H0(Msl*u7O2cJbJ- z0+!I51njP-H_#g){ud-LNZ`fvOZ3Y~?Fh8b7(96FZbyLJ5edi^lhSHjIn;T@>V;sz zfMXfW1nj6^3q)1|j9ZhANUwg}m`5M&8Tfb2>EvbXLF z+5PlKSkij>0DX`?M88jeKp&=$&`0SH>0|V9NHCCKA;CdH0tqQ3WRQ?ULIDXSBvg=4 zucto_;r0ZzgZ@G=o#~SZxhPXZFgXe&(7vJfA>j&I&qTui9(Ze~rnC_=cXTW8jtqIV zS{07=W&2Q0U-6q@Qk8!~HWm7cfb*-6(1dY*9pRk5fyD|hNND+|gKx;pmWC1aEB%K6 z!{6xNA)$wap@_ak{|N~rBrFw%bp|lOTp<)gAtRd*wp=kRQd`0tp|)zSFeDixXVeJm zjDk_3eGG&Z5;jQKi6W<}YfSTKx6gep=Vq&k)ub zJ1XjkEc*3?>>HQPcFo?PU4CKC$rFQbW1Wd+>R?H$nQBaRrUp}!sm0WWL^LF-L83Y& zYCxhUBxVpipB6pAQ3C1D~bxbO+&itkL{nAhgOTNcYm0M zl6?rC#MVOM9JIn{zFj<&vnJV-JJRD9+-h!>>E189qRd4FC`Apr&~o>EyZLf+y&0kM zD6`SMSEhLV0bg!#Q-N^raK9%pk0Om^nlMcvQ3n!riESE7F=;`nWqJryTfZEg4PViZ@gk~a`ZEKVfz0E~AjZuMW<1OgCY{NE zL_*n77KbyF^dGQZ7b;Q zvjW$)i{x5jVpy_eOp(B~FEYy+bP+;H2S{`*W{R1W0@rqeMCS+3wd)aqZipn%(|ONr zH@ww3YgN~7pXGMxj|lV_^Aalha%53zSLYqiSv%m{r;pt8d){gL9j@KXye4q%7G^86 zjoHrZV0J>HDqB|sdKq3tiJw>j4lZjz=6H`N6+Y50mB>JFyHUDj{{W~@-pN+%) zet>yj!Et5#YrLxzTymX zRiMwa%s0%p%y-N=<~(zOxyW2%E;9&C10nG^BnCmk4GE;p9!Lyo8vw9(sxt_Te zqR$_w9n4RHrOMnC=yPb8K7Bz;wNSKF`6~8&pzO&qh&@>}^~egbCo3&)M#@I9I;2gk zhSfr17$k-lv3k}3iEKy|2+Ua_iT_wD>qI2T+E_b_tjiooN;#s!&^ZNs(|?9>o*J^_gdK|{4tnDg)1@jta=!}adY3R&csCM+5n5Oa?I zTjpf@vjY)xvS=gt#PXPv^{^R1=48_a=7i;RLs*t!Y$0;XvBTMHHiyk+^VocL1Y5xR z*#IP-gv4Y>Oo6E3iD{5{3KG*HF#{4aAu+3j9VwC~I~L!~K7l2$69mef9j45Ad@&@J z3D)L||9gB{Ml#m_vI)t~5=d}1B<6%k@M%PX>^ye9@PY&~4bgmEct;cVZ&j{vcR$NM zFOcDL>{3XeVhf7c7uaQxSO|&dDvk_`*);+gu4GrSNDH5V#3D#6F2=91>sYj^4T&X? zcvg7Y-{dR(Pg0=%i`i9=u`eTrdnJ^`Ll7!F~>j zB1j-au7t!YNT55efy7!!tb;@eB-TS>!+Q415S~x5r`aD37NO?S1S&mPPLG7I=+9*$Cglcj z1G&e!L7bZ#%znZR;nKMb4ow)*qQwW0I1CBY$#yKlXAmp zGnd2VVhLQnz@(pqne=niX^{9164wPLz45=tqz~Rc;sh5Phg@u*hUk$KTx{Hv++^Ve ziO(Q$LVQQ|Q8iUexaVhba|DW<#Uaz`3rKuf#LeZ9A@vm`P6-rQAz7rkXSgLIMJyI5 z;-sLE&j}RqbtFY_?}a6Mkwa^q#oTgk1&4<6(~vj=iL=GrN^X_FtKUH4+Xv698xUD; zjI@+wkItuGIMX3+!TYnaWrJ^a6nGWcUtAgXSD)w?*1ftR*}wj=$&Y=%e&gahyt;*Z zU0}wo+%|4Iw}acsy#|SMkU&7X0Evr`xCDvIA~WtHrgD2w@+y%TuL#VDS}5iLFyr5` zUwKO+;eJ2JeIPO;q8&6@y!!Xdc%1uKU`E76-&WaxCMznOStbt zr1+y4M#%*|Y=4C)5fI437Id!xMHL-Zd=!U-Msz4)AizR&D3J)(;!Wx>aZ{o|iw*cL z^agN5hUQRLOQIx#-%O&BXdwU)kVO)`!~g*W0b5~ID6vW$K`NBk5fuU&X`sY~s1Pub zRLDk$C95f^i>OdiOHx}>2LcWP2?Ww&$s>|_hzfxWq9nu*`lt;_157Dt7)ga!20Z)P znGVUXFJ*u0ZQa_jDWXD2A}X2`S@g+6aVak>ZQpB4hn?Q}MEh>HsZjE$qj}VJB(PoG2(}Afu}bo?0NmA*HIlWGb&?XvddUXKM#(10OAsIhh=U*=f&>Wa zLx3LN5Q0V!G=?CtMDmI_-b%KLQInFL0&tVUz(wJ-V(M?ut_rx70Ni~7aQ8#dBn;d` z0&w3)z(p?znhL;0ZwR>Ba91Cfd?IMnN0N^rcnpGOMUqb?pFz+Zf|QDb?N^f10&Gu8 zzLuPVpaldiA!t=BIU_kMz_v96$qyd37ZDaOMPhMV-lMnrcWv2jdY$eobBAm>EWq|E zDtaxl=!JG_%ct!+Hd*xS^l9s|E}_#j!i{`G@{@o-O7f#%Z?q8*_=|wRwh;(a<3EQl z`a|-U2-`me*tRd{qRZ3udWU@JvC7tn4a zX$*B(k|XRh64LpjcRKruMMe8X7M=Im=qI?Oj_Y0@`uLY^H#Ki@ z8|~78Qgrqf^885$3Bb)Lr_sWF>6PXSz|E8nm1aqO(qYo!(rjstG*_AjK_&#q6w89Z z2f;81hC`4IK@J4D5ag9eM}&Y|7y|AX0l4{L;G#_qq49QN6>uv7xYGpSJ_W&uFmTbf zg_Y7-?0n$`L4mLw8hl5_S!XoKn=@JM=LNKP{fct_pcuE!} zeNh1JC_x8{1mKR21TJ0>mTZl5y#U;`(sj}j2*yG%4uU6&r5mIh1>lZ{V8Vk3E?O3q zma!~)ad(M@Kb-vBI)^K+&KbE@0PYS{bY~=R*L*V}rput@$t%YVuiNCWUr^*pxc+ZQ zcZ0C%r+pLDz&#Ja>@aXI2_tT<^osC; zID*U^@f`s-F5KBaNPiZ9`=j(H2oSF46-j@Q-h==F{h5jb?kyQ6JmgPdhPMFC@MO3! z!&_L^43BITl1#?PqzJe&R>sLB5S{k|7DKS4SSFLn1>iml!E+BBxH2uKl<6YT_-TV7 zPj9=D-15z~U!OC~dT%@euFQyvnj(vqJhtn%ClcFi+xh#Nk58;wH1RfYWmcIZ2wa(6 z0Pgb$xH4Q|yM+;K7jCf{vUmhsSxs3jS#4PzSzXy9vU;)@S*$D$f@KiA2*Gj)kQx+0 zPz=#oHeeM5=+8W09#o&Ds1Bp=K(IhoC_s>s1q6d*s{p}K0tB~3 zKu}FQTdie+7=WN6!ksihhCF-7XqNE;goOZx`&}QtVw!Be0O6-((`7ScGi9@6vt@H+ zb7fD<=0WfV1aCrsrcApb*aN{^5WEe+I}p4J!FwgL1tAD8mMxJziy*vIfbiZhgbzaS z2?U=C5dN$R!j%BwbpnKufw?aX;f(@>H_2WSUJ&eu;DGp!KwMp=2>16k*-in*+hsc- zI0V7_MY7jq=m??@AUIlK!>??Q>>c4DZwbTiVPW`vmqogS)^eYZ)MH8&7VV(yumJu; zviD_3oDU&52Ep-S*%ADj4E^yDiarGB{Mdiv6!r>_Q9LI56e0SvNJMY1w(Z8C*ION4 z{b}6rY0C$`B!K@5RP@WpqEnKac9)*$a{B2xUB>RcyybheLBD0)5RR4MrZ_G8M#S-1 z0mmm$1flF*Aqo*3iD_-T`fZ$6AzJlN+ z1YbjN3WC!RoPhvQ{Wm4DpF=?YO*Eoqe+oeUHVkBxT_ZI6{jmzi6^~=N4B=QVhv2&q zj^!$ZWBLX)oW3E~qHViEo-6bY&LJGzL!B)*$}LDgkS#% z(UQ5{IAbirqa3a3%F9^QJ$h@aEoVoYjFNn9oe%aTzj=EwmM6-a3LvE9O@zVt1{zG| zj|qeE4-ptt6XAUk@>cScAado&0&;&U=b~_5c98c%z?FBDcanFOcae9McawLQ_mHQ_ zdqQ;X9zb)WUm^Gn0%Vf?0l_T@{)FH!NMa@O-Xd`2{pAA)6!R+|gn&!pA>fiEBvrv2 zb)>oqxRn6hYyr4AkR-yu%}2nMkC1DH7bF3KtoV+AYYKPvX!$q+xMSpFAxS}!E|NbX z9}h_el9CD=e&v(oQ$)p`j1-q-1s$A*6qn>86_>JvC7UIGT0r}3`5gINNJ=3ogQUDz zK2JU$p`BDfQu*M~{w#vqS#;A8>$go| zhsjeXzA;Fzj%y{1zV+@3k@q z$~Vim$hSfgX@U-tdPo`|X@sN+l4eL+AZdl9twg>(gy7f32o3pe0m1*r-g&@BReXzo zcXR7PcJKCHLx%vN7eUg1NFYc;FCiog1k%VRRM8wz5ky2#DI$^$7J`Ce7gSU%NDoCR zR_qnAf%Sjp-n|=OL*Ts^9{=C_@PXYVyEAj|otf`BXU?3NamxgI

R`%{79r0KvE& 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 literal 180177 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ℑBf>`Ab1kNZxH+z!BYt0HvS&L(-lgi1Z1UEGNP4E5y(G8fsFHO zNJneJKWcDX^*C16$2e9dAb2K%V`VbNF{7oYF#8o&o;RfzBKM~q`?jV#7ZJR4 z(+6W^cS5D?5eu?qL%v(QVqn`|Z;X}C?7^86F&>q8T~~RHb={ACTjMBLpOITptgrLI z=Cs!@55~%V%7M6%!G7fcaWEDSw^a@n2jkykFsLD;J0q0Y%3KM#IT*PVaf6GZeR-F% zR0QrQWxldNS*R>h7Ax;omMDYD5TZy#!T-nJd%#CkbdCSJ$*qCx-tE1GUJ?>|5hN8N zB}nKkgk*t0n%RVo<^Y075kvt|lxzSYD9uV&DRxRI0xH-MQNdn7{hzsa?*`Zy_`PrV z^FGgq59}t{otb;@%zV!|bLPwpP!v!!Pz+EkP#jP^P!T}Ysfe5q0C!5{RI*E5w<14DKQXH*#@gYw`k0g~&?p2(CqL?B$V95^$f0 zTmh5-l*S+VROCvav_KhZP5nmtBiBeBcQtlgN=N$Ov)FMdeQ3v}ZStKx7rB|x{(R)d z$W1^QfieMQE|1(2xfN-rEI?UrKkaznd}K8T&aX>(d++D-Qd@4F*kp0HgeAp<_Fb5C zcc@_4c*y=`N4RI!><4y^Flt)F6Ybmlnn2#jHzM~-1n(mRJ8Gysx$54H#IrvuBHxRA zKk{JYp~%CLM1JzU}_y=M_ABy~myomiwHIv?vVBAbl+^8V(k4Un_ zHS*8M%Rof~72}WmEAnrkS^$Ny0JXFzQ5CLY5k?iIqE#sNV}XhTs%5!~Q}G1GRzS7B z?J%kYg<7QvC9LwVKU_UCde?pO`NjLr+1iaq7*%>qY6wlbw8?=VKjC{my~p2l>ifT* z+!R#3DznNaN-&j`NU*lZpvplc814meo%yR#;t6eH%c!DM4McEN^$EBgYRDw#Xr^k5 z;HsLdqE#`f7OGfPoT{a&m8!L>4N#qcx(lezKy?A?ZlJmX6%SMbP>Db#RjArY;Ho;| zRvftMScS*a1C=a;+l@r9lH=&9^gH0zKDer02(GF(P$>a$RrgBZE=F({i^!t(MSNAI zP2{E?q$2x^s0OQs0M#9+RKIGNYB*5$0M)1VupOns4M@sWS*mQ67pNXU^#rO{xoV7R zEWs9UIPLahTYxMUhO*e?v6q`0+}&&y?Y!PY&F|Sku=Qcm;?Sh`*WG^hu0K=x$G>TO z_ljN3Dyp!ZsG1^SJDFfhcA-#BBiL563kCI;+%lk&R=%pp%2%pi4VmN|539(^SJgb# zeANQgLe(RxMXJTBM^#Hyj{!9RsDVHY0%|Z&*wjOT8U_?L^a!9bDpY}$uc{SNOr(me ze5FRp*k;KwkyODQY;OU!WaX>sd7v_7Y{|-3)fRfbYD?JfK#pbJfbXT>p}LKb+xk`2 z4#Mp=)pnq=f%5uQJ5{@Y8VyuVtr^U!H&n#rQ|(266`rsBxLc+3FqeHB_hrb*48kmJk2WA|`lt!BRwNs4)s2M;#SZlDW>#G~#MU-dM4T+MPiTzgHg!EgC z8@aCEYN(-suB(nww?x?0E!44UG{t8FH3z7N%GIsZtqJUNfqMA1!>+~!uj*j z=29oCQ`Ftm-PNgTw4l%lvJj|8fI{pR1NEr5m`ja&)2aK&i@B&JWSJ}V_$^w@Rnt&U2eLvbi>SA??dV+eQdXjpwdWw3gdYXDVP%D6X5~!zuS_#zCKs^K0Dxk`M z@&i>~p?*LTq3W4+2dE!J0gCHgfm$sKP@J-V1E`mX^nCfhPkM&R;s3vPk5fNRMB-AQ z*2p692^5Ly73wF|Px0kItp(~?pw{8)R<3AsGnDFAu?{GdXsuHP-v%Z1Zq>cdaL>cBIEF*Ew^9BZAZbiBUEt39!l%8Ng!y|vIXw)QV(5T-~6DtrE!#<)I zULYX8Nfg72p^8D*N$4cE&HHM!0|~!}2*2b!jDO1}=QyGMl<@n3`lR}l`n38(^+)QD z)o0Xa)t>;h4Jfp9cL22$D715T1GNXJ*MNE*s5dIqp9T2+N*ceYzajkYmHEX}FQlcI z6q$zqFEf7r58(Sd!S@fK_R08OL448uBmP5wkMvJ=ISAnbgB?Sl1RAIVK)vb5qiS&a z<}IM!tu<>#h!g~J5fvG_yp2N_K|_Wv?^HK*q2vP`1e1X7wQ|8MSOhCj?*a8bPzTG& zN;E<`j%E(ucG89V3boK66yMUUQJpvSjDKYJoYCD@{q@#|NV?D%lQs!WS~>W@{_J16 z^DkUjIj&CJA2~tNh2}yF5m_OIAX|yZ3K~NCJ0YY8kQLep@i=r5+6wK2_Cg1tqtJ=D zD0CLO2zLuzfkIc)aiC5B^#M>Pfx-O-JD0_x)pLW0DtkP_w=x|6v&p$8%N zj7;vQxaSu2oitnb`yF;`-}fL4Ms|fEK%EV+D-0*2kr*L^ym0+AP@hQesCxU#t?m`Z z61YYSV}SY$sL%aEj(`LGFMz@gA8N_hFBAy4<#4%BDBLID5co@=z5?o8xlk;W5E#D( z>iq48aT*dfJ(RHJ%MR~=_j-(-H_)GYyqjkufw2^m;)xK$dZ)*fl;mWOnq2Jlr3pfv z#c3_S`zqdoAlYpY`*!>QMw#9@fAT)ACXA#dGE{fxU0Qn=y7t=YP@rh!DQ zY?Cdl7M{h*Vh0Or#bL-VHynlt&kLJy7$Tr8_ghWF5aC6E>>wP*2rmyK4HIbKzLI?9d{Y1D?t4P)Zak;1GEBYCD36&hXYLkO>Yq1 z3CP5Q!Xe?Xa0F!{p4SC56Of5C2eck&1KYnXA!aQeCLb^(s1VZapcb!As#sH+ⅆ3w{!#@D!W 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 diff --git a/iosApp/iosApp.xcodeproj/xcuserdata/mac-GPALIG05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/iosApp/iosApp.xcodeproj/xcuserdata/mac-GPALIG05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 8ad5de524..a89308a82 100644 --- a/iosApp/iosApp.xcodeproj/xcuserdata/mac-GPALIG05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/iosApp/iosApp.xcodeproj/xcuserdata/mac-GPALIG05.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -14,8 +14,8 @@ filePath = "iosApp/screens/networking/NetworkingViewModel.swift" startingColumnNumber = "9223372036854775807" endingColumnNumber = "9223372036854775807" - startingLineNumber = "40" - endingLineNumber = "40" + startingLineNumber = "41" + endingLineNumber = "41" landmarkName = "fetchNetworking()" landmarkType = "7"> diff --git a/iosApp/iosApp/extensions/NetworkingRepositoryExt.swift b/iosApp/iosApp/extensions/NetworkingRepositoryExt.swift deleted file mode 100644 index f3701f397..000000000 --- a/iosApp/iosApp/extensions/NetworkingRepositoryExt.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// UserRepositoryExt.swift -// iosApp -// -// Created by Gérard PALIGOT on 11/08/2024. -// Copyright © 2024 orgName. All rights reserved. -// - -import SharedDi -import KMPNativeCoroutinesCore - -extension NetworkingRepository { - func fetchProfile() -> NativeFlow { - NetworkingRepositoryNativeKt.fetchProfile(self) - } - - func fetchNetworking() -> NativeFlow, Error, KotlinUnit> { - NetworkingRepositoryNativeKt.fetchNetworking(self) - } -} diff --git a/iosApp/iosApp/screens/networking/NetworkingViewModel.swift b/iosApp/iosApp/screens/networking/NetworkingViewModel.swift index d910e5975..7309019f7 100644 --- a/iosApp/iosApp/screens/networking/NetworkingViewModel.swift +++ b/iosApp/iosApp/screens/networking/NetworkingViewModel.swift @@ -22,7 +22,8 @@ enum UserProfileUiState { @MainActor class NetworkingViewModel: ObservableObject { - private let repository: NetworkingRepository = RepositoryHelper().networkingRepository + private let repository: UserRepository = RepositoryHelper().userRepository + private let interactor: UserInteractor = InteractorHelper().userInteractor @Published var uiState: UserProfileUiState = UserProfileUiState.loading @@ -31,8 +32,8 @@ class NetworkingViewModel: ObservableObject { func fetchNetworking() { networkingTask = Task { do { - let networkingStream = asyncSequence(for: repository.fetchNetworking()) - let profileStream = asyncSequence(for: repository.fetchProfile()) + let networkingStream = asyncSequence(for: interactor.fetchUsersScanned()) + let profileStream = asyncSequence(for: interactor.fetchUserProfile()) for try await (networkings, profile) in combineLatest(networkingStream, profileStream) { self.uiState = .success(NetworkingUi(userProfileUi: profile, showQrCode: false, users: networkings)) } @@ -48,7 +49,9 @@ class NetworkingViewModel: ObservableObject { func saveProfile(email: String, firstName: String, lastName: String, company: String) { if (email == "") { return } - repository.saveProfile(email: email, firstName: firstName, lastName: lastName, company: company) + repository.insertUserInfo( + user: UserEntity(firstName: firstName, lastName: lastName, email: email, company: company, qrCode: nil) + ) } func saveNetworkingProfile(text: String) { @@ -56,13 +59,13 @@ class NetworkingViewModel: ObservableObject { do { let contacts = try CNContactVCardSerialization.contacts(with: data) let contact = contacts.first - let user = UserNetworkingUi( + let user = UserItemEntity( email: (contact?.emailAddresses.first?.value ?? "") as String, firstName: contact?.givenName ?? "", lastName: contact?.familyName ?? "", company: contact?.organizationName ?? "" ) - repository.insertNetworkingProfile(user: user) + repository.insertUserScanned(user: user) if case .success(let networkingUi) = uiState { self.uiState = .success(networkingUi.doCopy( userProfileUi: networkingUi.userProfileUi, @@ -88,11 +91,11 @@ class NetworkingViewModel: ObservableObject { } func deleteNetworkProfile(email: String) { - repository.deleteNetworkProfile(email: email) + repository.deleteUserScannedByEmail(email: email) } func exportNetworking() -> ComposeMailData { - let networking = repository.exportNetworking() + let networking = repository.exportUserScanned() let recipients = networking.mailto != nil ? [networking.mailto!] : [] do { return ComposeMailData( diff --git a/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/Ticket.sq b/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/Ticket.sq index a118f63ad..37987c6fe 100644 --- a/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/Ticket.sq +++ b/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/Ticket.sq @@ -10,9 +10,11 @@ qrcode BLOB NOT NULL ); selectTicket: -SELECT * FROM Ticket WHERE event_id == ?; +SELECT id, email, firstname, lastname, barcode, qrcode +FROM Ticket +WHERE event_id == ?; -insertUser: +insertTicket: INSERT OR REPLACE INTO Ticket( id, ext_id, event_id, email, firstname, lastname, barcode, qrcode ) VALUES (?, ?, ?, ?, ?, ?, ?, ?); diff --git a/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/User.sq b/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/User.sq index 85670234a..210ee99ef 100644 --- a/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/User.sq +++ b/shared/core-db/src/commonMain/sqldelight/com/paligot/confily/db/User.sq @@ -1,11 +1,3 @@ -CREATE TABLE User( -email TEXT NOT NULL PRIMARY KEY, -firstname TEXT NOT NULL, -lastname TEXT NOT NULL, -company TEXT, -qrcode BLOB NOT NULL -); - CREATE TABLE Profile( event_id TEXT NOT NULL PRIMARY KEY, email TEXT NOT NULL, diff --git a/shared/core-di/src/commonMain/kotlin/com/paligot/confily/core/di/RepositoryModule.kt b/shared/core-di/src/commonMain/kotlin/com/paligot/confily/core/di/RepositoryModule.kt index b682478ff..65c28a2b9 100644 --- a/shared/core-di/src/commonMain/kotlin/com/paligot/confily/core/di/RepositoryModule.kt +++ b/shared/core-di/src/commonMain/kotlin/com/paligot/confily/core/di/RepositoryModule.kt @@ -2,7 +2,7 @@ package com.paligot.confily.core.di import com.paligot.confily.core.agenda.AgendaRepository import com.paligot.confily.core.events.EventRepository -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository import com.paligot.confily.core.partners.PartnerRepository import com.paligot.confily.core.schedules.SessionRepository import com.paligot.confily.core.speakers.SpeakerRepository @@ -24,6 +24,7 @@ val repositoriesModule = module { api = get(), settings = get(), eventDao = get(), + userDao = get(), qrCodeGenerator = get() ) } @@ -34,7 +35,7 @@ val repositoriesModule = module { PartnerRepository.Factory.create(settings = get(), eventDao = get(), partnerDao = get()) } single { - NetworkingRepository.Factory.create( + UserRepository.Factory.create( userDao = get(), settings = get(), conferenceFs = get(), diff --git a/shared/core-di/src/iosMain/kotlin/com/paligot/confily/core/di/Helper.kt b/shared/core-di/src/iosMain/kotlin/com/paligot/confily/core/di/Helper.kt index 92c51dc80..dbfdc3fe3 100644 --- a/shared/core-di/src/iosMain/kotlin/com/paligot/confily/core/di/Helper.kt +++ b/shared/core-di/src/iosMain/kotlin/com/paligot/confily/core/di/Helper.kt @@ -3,7 +3,8 @@ package com.paligot.confily.core.di import com.paligot.confily.core.agenda.AgendaRepository import com.paligot.confily.core.events.EventInteractor import com.paligot.confily.core.events.EventRepository -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserInteractor +import com.paligot.confily.core.networking.UserRepository import com.paligot.confily.core.partners.PartnerInteractor import com.paligot.confily.core.partners.PartnerRepository import com.paligot.confily.core.schedules.SessionRepository @@ -31,7 +32,7 @@ class RepositoryHelper : KoinComponent { val partnerRepository: PartnerRepository by inject() val eventRepository: EventRepository by inject() val speakerRepository: SpeakerRepository by inject() - val networkingRepository: NetworkingRepository by inject() + val userRepository: UserRepository by inject() } class InteractorHelper : KoinComponent { @@ -39,6 +40,7 @@ class InteractorHelper : KoinComponent { val sessionInteractor: SessionInteractor by inject() val speakerInteractor: SpeakerInteractor by inject() val partnerInteractor: PartnerInteractor by inject() + val userInteractor: UserInteractor by inject() } val interactorsModule = module { @@ -46,6 +48,7 @@ val interactorsModule = module { single { SessionInteractor(get(), get()) } single { SpeakerInteractor(get(), get()) } single { PartnerInteractor(get()) } + single { UserInteractor(get()) } } fun initKoin() { diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventDao.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventDao.kt index a1107c76a..7683c623f 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventDao.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventDao.kt @@ -5,7 +5,6 @@ import com.paligot.confily.core.events.entities.Event import com.paligot.confily.core.events.entities.EventItemList import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.QAndAItem -import com.paligot.confily.core.events.entities.Ticket import com.paligot.confily.models.Attendee import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.Flow @@ -14,7 +13,6 @@ import com.paligot.confily.models.EventItemList as EventItemListNetworking interface EventDao { fun fetchEventList(): Flow fun fetchEvent(eventId: String): Flow - fun fetchTicket(eventId: String): Flow fun fetchQAndA(eventId: String): Flow> fun fetchMenus(eventId: String): Flow> fun fetchCoC(eventId: String): Flow diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepository.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepository.kt index 2bb8f649b..ddeb6a11b 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepository.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepository.kt @@ -7,8 +7,9 @@ import com.paligot.confily.core.events.entities.Event import com.paligot.confily.core.events.entities.EventItemList import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.QAndAItem -import com.paligot.confily.core.events.entities.Ticket import com.paligot.confily.core.kvalue.ConferenceSettings +import com.paligot.confily.core.networking.UserDao +import com.paligot.confily.core.networking.entities.UserTicket import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.flow.Flow @@ -16,7 +17,7 @@ interface EventRepository { suspend fun fetchAndStoreEventList() fun events(): Flow fun event(): Flow - fun ticket(): Flow + fun ticket(): Flow fun qanda(): Flow> fun menus(): Flow> fun coc(): Flow @@ -30,7 +31,8 @@ interface EventRepository { api: ConferenceApi, settings: ConferenceSettings, eventDao: EventDao, + userDao: UserDao, qrCodeGenerator: QrCodeGenerator - ): EventRepository = EventRepositoryImpl(api, settings, eventDao, qrCodeGenerator) + ): EventRepository = EventRepositoryImpl(api, settings, eventDao, userDao, qrCodeGenerator) } } diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepositoryImpl.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepositoryImpl.kt index 65e5456fd..cd6a3776c 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepositoryImpl.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/EventRepositoryImpl.kt @@ -7,9 +7,10 @@ import com.paligot.confily.core.events.entities.Event import com.paligot.confily.core.events.entities.EventItemList import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.QAndAItem -import com.paligot.confily.core.events.entities.Ticket import com.paligot.confily.core.kvalue.ConferenceSettings import com.paligot.confily.core.kvalue.EventSavedException +import com.paligot.confily.core.networking.UserDao +import com.paligot.confily.core.networking.entities.UserTicket import kotlinx.collections.immutable.ImmutableList import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.coroutineScope @@ -21,6 +22,7 @@ internal class EventRepositoryImpl( private val api: ConferenceApi, private val settings: ConferenceSettings, private val eventDao: EventDao, + private val userDao: UserDao, private val qrCodeGenerator: QrCodeGenerator ) : EventRepository { override suspend fun fetchAndStoreEventList() = coroutineScope { @@ -33,8 +35,8 @@ internal class EventRepositoryImpl( override fun event(): Flow = settings.fetchEventId() .flatMapConcat { eventDao.fetchEvent(eventId = it) } - override fun ticket(): Flow = settings.fetchEventId() - .flatMapConcat { eventDao.fetchTicket(eventId = it) } + override fun ticket(): Flow = settings.fetchEventId() + .flatMapConcat { userDao.fetchUserTicket(eventId = it) } override fun qanda(): Flow> = settings.fetchEventId() .flatMapConcat { eventDao.fetchQAndA(eventId = it) } diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/VCardExtensions.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/User.ext.kt similarity index 52% rename from shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/VCardExtensions.kt rename to shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/User.ext.kt index 024d6c967..b58a82964 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/VCardExtensions.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/extensions/User.ext.kt @@ -1,8 +1,8 @@ package com.paligot.confily.core.extensions -import com.paligot.confily.models.ui.UserNetworkingUi +import com.paligot.confily.core.networking.entities.UserInfo -inline fun UserNetworkingUi.encodeToString(): String = """BEGIN:VCARD +internal inline fun UserInfo.encodeToString(): String = """BEGIN:VCARD VERSION:4.0 N:$lastName;$firstName EMAIL;INTERNET:$email diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/NetworkingRepository.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/NetworkingRepository.kt deleted file mode 100644 index 4221853f8..000000000 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/NetworkingRepository.kt +++ /dev/null @@ -1,103 +0,0 @@ -package com.paligot.confily.core.networking - -import com.paligot.confily.core.QrCodeGenerator -import com.paligot.confily.core.extensions.encodeToString -import com.paligot.confily.core.fs.ConferenceFileSystem -import com.paligot.confily.core.fs.User -import com.paligot.confily.core.kvalue.ConferenceSettings -import com.paligot.confily.models.ui.ExportNetworkingUi -import com.paligot.confily.models.ui.UserNetworkingUi -import com.paligot.confily.models.ui.UserProfileUi -import com.rickclephas.kmp.nativecoroutines.NativeCoroutines -import kotlinx.collections.immutable.ImmutableList -import kotlinx.coroutines.ExperimentalCoroutinesApi -import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flatMapConcat - -interface NetworkingRepository { - @NativeCoroutines - fun fetchProfile(): Flow - - @NativeCoroutines - fun fetchNetworking(): Flow> - - fun saveProfile(email: String, firstName: String, lastName: String, company: String) - fun insertNetworkingProfile(user: UserNetworkingUi): Boolean - fun deleteNetworkProfile(email: String) - fun exportNetworking(): ExportNetworkingUi - - object Factory { - fun create( - userDao: UserDao, - settings: ConferenceSettings, - conferenceFs: ConferenceFileSystem, - qrCodeGenerator: QrCodeGenerator - ): NetworkingRepository = - NetworkingRepositoryImpl(userDao, settings, conferenceFs, qrCodeGenerator) - } -} - -class NetworkingRepositoryImpl( - private val userDao: UserDao, - private val settings: ConferenceSettings, - private val conferenceFs: ConferenceFileSystem, - private val qrCodeGenerator: QrCodeGenerator -) : NetworkingRepository { - @OptIn(ExperimentalCoroutinesApi::class) - override fun fetchProfile(): Flow = settings.fetchEventId() - .flatMapConcat { - combine( - userDao.fetchProfile(eventId = it), - userDao.fetchUserPreview(eventId = it), - transform = { profile, preview -> - return@combine profile ?: preview - } - ) - } - - @OptIn(ExperimentalCoroutinesApi::class) - override fun fetchNetworking(): Flow> = settings.fetchEventId() - .flatMapConcat { userDao.fetchNetworking(eventId = it) } - - override fun saveProfile(email: String, firstName: String, lastName: String, company: String) { - val qrCode = qrCodeGenerator.generate( - UserNetworkingUi(email, firstName, lastName, company).encodeToString() - ) - userDao.insertUser( - eventId = settings.getEventId(), - email = email, - firstName = firstName, - lastName = lastName, - company = company, - qrCode = qrCode - ) - } - - override fun insertNetworkingProfile(user: UserNetworkingUi): Boolean { - val hasRequiredFields = user.email != "" && user.lastName != "" && user.firstName != "" - if (!hasRequiredFields) return false - userDao.insertEmailNetworking(eventId = settings.getEventId(), userNetworkingUi = user) - return true - } - - override fun deleteNetworkProfile(email: String) = userDao.deleteNetworking( - eventId = settings.getEventId(), - email = email - ) - - override fun exportNetworking(): ExportNetworkingUi { - val eventId = settings.getEventId() - return ExportNetworkingUi( - mailto = userDao.getEmailProfile(eventId), - filePath = conferenceFs.exportUsers(userDao.getUsers(eventId).map { it.toUser() }) - ) - } -} - -private fun UserNetworkingUi.toUser(): User = User( - email = email, - firstname = firstName, - lastname = lastName, - company = company ?: "" -) diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserDao.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserDao.kt index 03bb2c7fd..73517619a 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserDao.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserDao.kt @@ -1,25 +1,17 @@ package com.paligot.confily.core.networking -import com.paligot.confily.models.ui.UserNetworkingUi -import com.paligot.confily.models.ui.UserProfileUi -import kotlinx.collections.immutable.ImmutableList +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import com.paligot.confily.core.networking.entities.UserTicket import kotlinx.coroutines.flow.Flow interface UserDao { - fun fetchProfile(eventId: String): Flow - fun fetchUserPreview(eventId: String): Flow - fun fetchNetworking(eventId: String): Flow> - fun getUsers(eventId: String): ImmutableList - fun insertUser( - eventId: String, - email: String, - firstName: String, - lastName: String, - company: String?, - qrCode: ByteArray - ) - - fun insertEmailNetworking(eventId: String, userNetworkingUi: UserNetworkingUi) - fun deleteNetworking(eventId: String, email: String) + fun fetchUser(eventId: String): Flow + fun fetchUserTicket(eventId: String): Flow + fun fetchUsersScanned(eventId: String): Flow> + fun getUsersScanned(eventId: String): List + fun insertUser(eventId: String, user: UserInfo) + fun insertUserScanned(eventId: String, user: UserItem) + fun deleteUserByEmail(eventId: String, email: String) fun getEmailProfile(eventId: String): String? } diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepository.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepository.kt new file mode 100644 index 000000000..6d35cc2b5 --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepository.kt @@ -0,0 +1,28 @@ +package com.paligot.confily.core.networking + +import com.paligot.confily.core.QrCodeGenerator +import com.paligot.confily.core.fs.ConferenceFileSystem +import com.paligot.confily.core.kvalue.ConferenceSettings +import com.paligot.confily.core.networking.entities.ExportUsers +import com.paligot.confily.core.networking.entities.User +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import kotlinx.coroutines.flow.Flow + +interface UserRepository { + fun fetchUserProfile(): Flow + fun insertUserInfo(user: UserInfo) + fun fetchUsersScanned(): Flow> + fun insertUserScanned(user: UserItem): Boolean + fun deleteUserScannedByEmail(email: String) + fun exportUserScanned(): ExportUsers + + object Factory { + fun create( + userDao: UserDao, + settings: ConferenceSettings, + conferenceFs: ConferenceFileSystem, + qrCodeGenerator: QrCodeGenerator + ): UserRepository = UserRepositoryImpl(userDao, settings, conferenceFs, qrCodeGenerator) + } +} diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepositoryImpl.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepositoryImpl.kt new file mode 100644 index 000000000..4dec0f667 --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/UserRepositoryImpl.kt @@ -0,0 +1,65 @@ +package com.paligot.confily.core.networking + +import com.paligot.confily.core.QrCodeGenerator +import com.paligot.confily.core.extensions.encodeToString +import com.paligot.confily.core.fs.ConferenceFileSystem +import com.paligot.confily.core.kvalue.ConferenceSettings +import com.paligot.confily.core.networking.entities.ExportUsers +import com.paligot.confily.core.networking.entities.User +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import com.paligot.confily.core.networking.entities.mapToFs +import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.flatMapConcat + +class UserRepositoryImpl( + private val userDao: UserDao, + private val settings: ConferenceSettings, + private val conferenceFs: ConferenceFileSystem, + private val qrCodeGenerator: QrCodeGenerator +) : UserRepository { + @OptIn(ExperimentalCoroutinesApi::class) + override fun fetchUserProfile(): Flow = settings.fetchEventId() + .flatMapConcat { + combine( + flow = userDao.fetchUser(eventId = it), + flow2 = userDao.fetchUserTicket(eventId = it), + transform = { info, ticket -> + User(info = info, ticket = ticket) + } + ) + } + + override fun insertUserInfo(user: UserInfo) { + userDao.insertUser( + eventId = settings.getEventId(), + user = user.copy( + qrCode = qrCodeGenerator.generate(user.encodeToString()) + ) + ) + } + + @OptIn(ExperimentalCoroutinesApi::class) + override fun fetchUsersScanned(): Flow> = settings.fetchEventId() + .flatMapConcat { userDao.fetchUsersScanned(eventId = it) } + + override fun insertUserScanned(user: UserItem): Boolean { + val hasRequiredFields = user.email != "" && user.lastName != "" && user.firstName != "" + if (!hasRequiredFields) return false + userDao.insertUserScanned(eventId = settings.getEventId(), user = user) + return true + } + + override fun deleteUserScannedByEmail(email: String) = userDao + .deleteUserByEmail(eventId = settings.getEventId(), email = email) + + override fun exportUserScanned(): ExportUsers { + val eventId = settings.getEventId() + return ExportUsers( + mailto = userDao.getEmailProfile(eventId), + filePath = conferenceFs.exportUsers(userDao.getUsersScanned(eventId).map { it.mapToFs() }) + ) + } +} diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/ExportUsers.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/ExportUsers.kt new file mode 100644 index 000000000..1712c62cc --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/ExportUsers.kt @@ -0,0 +1,9 @@ +package com.paligot.confily.core.networking.entities + +import com.paligot.confily.models.ui.ExportNetworkingUi +import kotlin.native.ObjCName + +@ObjCName("ExportUsersEntity") +class ExportUsers(val mailto: String?, val filePath: String) + +fun ExportUsers.mapToUi(): ExportNetworkingUi = ExportNetworkingUi(mailto, filePath) diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/User.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/User.kt new file mode 100644 index 000000000..8af6d909e --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/User.kt @@ -0,0 +1,18 @@ +package com.paligot.confily.core.networking.entities + +import com.paligot.confily.models.ui.UserProfileUi +import kotlin.native.ObjCName + +@ObjCName("UserProfileEntity") +class User( + val info: UserInfo?, + val ticket: UserTicket? +) + +fun User.mapToUi() = UserProfileUi( + firstName = info?.firstName ?: ticket?.firstName ?: "", + lastName = info?.lastName ?: ticket?.lastName ?: "", + email = info?.email ?: ticket?.email ?: "", + company = info?.company ?: "", + qrCode = info?.qrCode +) diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserInfo.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserInfo.kt new file mode 100644 index 000000000..0ac2169b7 --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserInfo.kt @@ -0,0 +1,27 @@ +package com.paligot.confily.core.networking.entities + +import com.paligot.confily.models.ui.TicketInfoUi +import com.paligot.confily.models.ui.TicketUi +import kotlin.native.ObjCName + +@ObjCName("UserEntity") +class UserInfo( + val firstName: String, + val lastName: String, + val email: String, + val company: String?, + val qrCode: ByteArray? +) { + fun copy( + firstName: String = this.firstName, + lastName: String = this.lastName, + email: String = this.email, + company: String? = this.company, + qrCode: ByteArray? = this.qrCode + ) = UserInfo(firstName, lastName, email, company, qrCode) +} + +fun UserInfo.mapToTicketUi() = TicketUi( + info = TicketInfoUi(id = email, firstName = firstName, lastName = lastName), + qrCode = qrCode +) diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserItem.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserItem.kt new file mode 100644 index 000000000..c431a3ee6 --- /dev/null +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserItem.kt @@ -0,0 +1,27 @@ +package com.paligot.confily.core.networking.entities + +import com.paligot.confily.core.fs.User +import com.paligot.confily.models.ui.UserNetworkingUi +import kotlin.native.ObjCName + +@ObjCName("UserItemEntity") +class UserItem( + val email: String, + val firstName: String, + val lastName: String, + val company: String? +) + +fun UserItem.mapToUi(): UserNetworkingUi = UserNetworkingUi( + email = email, + firstName = firstName, + lastName = lastName, + company = company ?: "" +) + +fun UserItem.mapToFs(): User = User( + email = email, + firstname = firstName, + lastname = lastName, + company = company ?: "" +) diff --git a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/entities/Ticket.kt b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserTicket.kt similarity index 68% rename from shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/entities/Ticket.kt rename to shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserTicket.kt index 269e209e7..70e93d5d6 100644 --- a/shared/core/src/commonMain/kotlin/com/paligot/confily/core/events/entities/Ticket.kt +++ b/shared/core/src/commonMain/kotlin/com/paligot/confily/core/networking/entities/UserTicket.kt @@ -1,18 +1,20 @@ -package com.paligot.confily.core.events.entities +package com.paligot.confily.core.networking.entities import com.paligot.confily.models.ui.TicketInfoUi import com.paligot.confily.models.ui.TicketUi import kotlin.native.ObjCName -@ObjCName("TicketEntity") -class Ticket( +@ObjCName("UserTicketEntity") +class UserTicket( val id: String?, val firstName: String?, val lastName: String?, + val email: String?, + val barcode: String, val qrCode: ByteArray ) -fun Ticket.mapToUi(): TicketUi = TicketUi( +fun UserTicket.mapToUi(): TicketUi = TicketUi( info = if (id != null && firstName != null && lastName != null) { TicketInfoUi(id = id, firstName = firstName, lastName = lastName) } else { diff --git a/shared/core/src/iosMain/kotlin/com/paligot/confily/core/events/EventInteractor.kt b/shared/core/src/iosMain/kotlin/com/paligot/confily/core/events/EventInteractor.kt index 457713632..231904363 100644 --- a/shared/core/src/iosMain/kotlin/com/paligot/confily/core/events/EventInteractor.kt +++ b/shared/core/src/iosMain/kotlin/com/paligot/confily/core/events/EventInteractor.kt @@ -1,6 +1,7 @@ package com.paligot.confily.core.events import com.paligot.confily.core.events.entities.mapToUi +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.EventItemListUi import com.paligot.confily.models.ui.EventUi import com.paligot.confily.models.ui.MenuItemUi diff --git a/shared/core/src/iosMain/kotlin/com/paligot/confily/core/networking/UserInteractor.kt b/shared/core/src/iosMain/kotlin/com/paligot/confily/core/networking/UserInteractor.kt new file mode 100644 index 000000000..a8aae8cc9 --- /dev/null +++ b/shared/core/src/iosMain/kotlin/com/paligot/confily/core/networking/UserInteractor.kt @@ -0,0 +1,32 @@ +package com.paligot.confily.core.networking + +import com.paligot.confily.core.networking.entities.mapToUi +import com.paligot.confily.models.ui.UserNetworkingUi +import com.paligot.confily.models.ui.UserProfileUi +import com.rickclephas.kmp.nativecoroutines.NativeCoroutines +import kotlinx.collections.immutable.ImmutableList +import kotlinx.collections.immutable.toImmutableList +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.map + +class UserInteractor( + private val userRepository: UserRepository +) { + @NativeCoroutines + fun fetchUserProfile(): Flow = userRepository + .fetchUserProfile() + .map { + it?.mapToUi() ?: UserProfileUi( + email = "", + firstName = "", + lastName = "", + company = "", + qrCode = null + ) + } + + @NativeCoroutines + fun fetchUsersScanned(): Flow> = userRepository + .fetchUsersScanned() + .map { users -> users.map { it.mapToUi() }.toImmutableList() } +} diff --git a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EntityMappers.kt b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EntityMappers.kt index a364618f6..94f2c0a4c 100644 --- a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EntityMappers.kt +++ b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EntityMappers.kt @@ -5,7 +5,6 @@ import com.paligot.confily.core.events.entities.Event import com.paligot.confily.core.events.entities.EventItem import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.Social -import com.paligot.confily.core.events.entities.Ticket import kotlinx.datetime.Instant import kotlinx.datetime.TimeZone import kotlinx.datetime.toLocalDateTime @@ -50,13 +49,3 @@ internal val menuMapper = { name: String, dish: String, accompaniment: String, d internal val cocMapper = { url: String, coc: String?, email: String?, phone: String? -> CodeOfConduct(url = url, content = coc, phone = phone, email = email) } - -internal val ticketMapper = { _: String, id: String?, _: String?, _: String?, - firstname: String?, lastname: String?, _: String, qrcode: ByteArray -> - Ticket( - id = id, - firstName = firstname, - lastName = lastname, - qrCode = qrcode - ) -} diff --git a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EventDaoSQLDelight.kt b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EventDaoSQLDelight.kt index 69c877a18..4c64446f8 100644 --- a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EventDaoSQLDelight.kt +++ b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/events/EventDaoSQLDelight.kt @@ -10,7 +10,6 @@ import com.paligot.confily.core.events.entities.EventItemList import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.QAndAAction import com.paligot.confily.core.events.entities.QAndAItem -import com.paligot.confily.core.events.entities.Ticket import com.paligot.confily.db.ConfilyDatabase import com.paligot.confily.models.Attendee import kotlinx.collections.immutable.ImmutableList @@ -36,11 +35,6 @@ class EventDaoSQLDelight( .asFlow() .mapToOneOrNull(dispatcher) - override fun fetchTicket(eventId: String): Flow = - db.ticketQueries.selectTicket(eventId, ticketMapper) - .asFlow() - .mapToOneOrNull(dispatcher) - override fun fetchQAndA(eventId: String): Flow> = db.transactionWithResult { return@transactionWithResult combine( @@ -101,7 +95,7 @@ class EventDaoSQLDelight( qrCode: ByteArray, barcode: String, attendee: Attendee? - ) = db.ticketQueries.insertUser( + ) = db.ticketQueries.insertTicket( id = attendee?.id, ext_id = attendee?.idExt, event_id = eventId, diff --git a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/DbMappers.kt b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/DbMappers.kt index 9d4fd63ea..4ee5d621f 100644 --- a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/DbMappers.kt +++ b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/DbMappers.kt @@ -1,36 +1,38 @@ package com.paligot.confily.core.networking -import com.paligot.confily.models.ui.UserNetworkingUi -import com.paligot.confily.models.ui.UserProfileUi +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import com.paligot.confily.core.networking.entities.UserTicket internal val profileMapper = { _: String, email: String, firstname: String, lastname: String, company: String?, qrcode: ByteArray -> - UserProfileUi( + UserInfo( email = email, firstName = firstname, lastName = lastname, - company = company ?: "", + company = company, qrCode = qrcode ) } -internal val tickerMapper = { _: String, _: String?, _: String?, _: String?, firstname: String?, - lastname: String?, _: String, _: ByteArray -> - UserProfileUi( - email = "", +internal val tickerMapper = { id: String?, email: String?, firstname: String?, lastname: String?, + barcode: String, qrcode: ByteArray -> + UserTicket( + id = id, + email = email ?: "", firstName = firstname ?: "", lastName = lastname ?: "", - company = "", - qrCode = null + barcode = barcode, + qrCode = qrcode ) } internal val userItemMapper = { email: String, firstName: String, lastName: String, company: String?, _: String, _: Long -> - UserNetworkingUi( + UserItem( email = email, firstName = firstName, lastName = lastName, - company = company ?: "" + company = company ) } diff --git a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/UserDaoSQLDelight.kt b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/UserDaoSQLDelight.kt index 1c1510550..ec242df5e 100644 --- a/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/UserDaoSQLDelight.kt +++ b/shared/core/src/mobileMain/kotlin/com/paligot/confily/core/networking/UserDaoSQLDelight.kt @@ -3,13 +3,11 @@ package com.paligot.confily.core.networking import app.cash.sqldelight.coroutines.asFlow import app.cash.sqldelight.coroutines.mapToList import app.cash.sqldelight.coroutines.mapToOneOrNull +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import com.paligot.confily.core.networking.entities.UserTicket import com.paligot.confily.db.ConfilyDatabase -import com.paligot.confily.models.ui.UserNetworkingUi -import com.paligot.confily.models.ui.UserProfileUi -import kotlinx.collections.immutable.ImmutableList -import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.map import kotlinx.datetime.Clock import kotlin.coroutines.CoroutineContext @@ -17,45 +15,48 @@ class UserDaoSQLDelight( private val db: ConfilyDatabase, private val dispatcher: CoroutineContext ) : UserDao { - override fun fetchProfile(eventId: String): Flow = - db.userQueries.selectProfile(eventId, profileMapper).asFlow().mapToOneOrNull(dispatcher) + override fun fetchUser(eventId: String): Flow = db.userQueries + .selectProfile(eventId, profileMapper) + .asFlow() + .mapToOneOrNull(dispatcher) - override fun fetchUserPreview(eventId: String): Flow = - db.ticketQueries.selectTicket(eventId, tickerMapper).asFlow().mapToOneOrNull(dispatcher) + override fun fetchUserTicket(eventId: String): Flow = db.ticketQueries + .selectTicket(eventId, tickerMapper) + .asFlow() + .mapToOneOrNull(dispatcher) - override fun fetchNetworking(eventId: String): Flow> = - db.userQueries.selectAll(eventId, userItemMapper).asFlow() - .mapToList(dispatcher) - .map { it.toImmutableList() } + override fun fetchUsersScanned(eventId: String): Flow> = db.userQueries + .selectAll(eventId, userItemMapper) + .asFlow() + .mapToList(dispatcher) - override fun getUsers(eventId: String): ImmutableList = - db.userQueries.selectAll(eventId, userItemMapper) - .executeAsList() - .toImmutableList() + override fun getUsersScanned(eventId: String): List = db.userQueries + .selectAll(eventId, userItemMapper) + .executeAsList() - override fun insertUser( - eventId: String, - email: String, - firstName: String, - lastName: String, - company: String?, - qrCode: ByteArray - ) { - db.userQueries.insertProfile(eventId, email, firstName, lastName, company, qrCode) + override fun insertUser(eventId: String, user: UserInfo) { + db.userQueries.insertProfile( + event_id = eventId, + email = user.email, + firstname = user.firstName, + lastname = user.lastName, + company = user.company, + qrcode = user.qrCode ?: byteArrayOf() + ) } - override fun insertEmailNetworking(eventId: String, userNetworkingUi: UserNetworkingUi) = + override fun insertUserScanned(eventId: String, user: UserItem) = db.userQueries.insertNetwork( - userNetworkingUi.email, - userNetworkingUi.firstName, - userNetworkingUi.lastName, - userNetworkingUi.company, + user.email, + user.firstName, + user.lastName, + user.company, eventId, Clock.System.now().epochSeconds ) - override fun deleteNetworking(eventId: String, email: String) = - db.userQueries.deleteNetwork(eventId, email) + override fun deleteUserByEmail(eventId: String, email: String) = db.userQueries + .deleteNetwork(eventId, email) override fun getEmailProfile(eventId: String): String? = db.userQueries .selectProfile(eventId) diff --git a/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/events/EventDaoSettings.kt b/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/events/EventDaoSettings.kt index 73e8b3f5c..cc05caec9 100644 --- a/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/events/EventDaoSettings.kt +++ b/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/events/EventDaoSettings.kt @@ -6,13 +6,11 @@ import com.paligot.confily.core.events.entities.EventItemList import com.paligot.confily.core.events.entities.MenuItem import com.paligot.confily.core.events.entities.QAndAAction import com.paligot.confily.core.events.entities.QAndAItem -import com.paligot.confily.core.events.entities.Ticket import com.paligot.confily.models.Attendee import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.toImmutableList import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.combine -import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.map import com.paligot.confily.models.EventItemList as EventItemListNetworking @@ -35,10 +33,6 @@ class EventDaoSettings( override fun fetchEvent(eventId: String): Flow = eventQueries.selectEvent(eventId).map(EventDb::convertToEntity) - override fun fetchTicket(eventId: String): Flow { - return flowOf(null) - } - override fun fetchQAndA(eventId: String): Flow> = combine( flow = qAndAQueries.selectQAndA(eventId), flow2 = qAndAQueries.selectQAndAActions(eventId), diff --git a/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/networking/UserDaoSettings.kt b/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/networking/UserDaoSettings.kt index b19a4b673..255f4c3e5 100644 --- a/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/networking/UserDaoSettings.kt +++ b/shared/core/src/wasmJsMain/kotlin/com/paligot/confily/core/networking/UserDaoSettings.kt @@ -1,43 +1,36 @@ package com.paligot.confily.core.networking -import com.paligot.confily.models.ui.UserNetworkingUi -import com.paligot.confily.models.ui.UserProfileUi -import kotlinx.collections.immutable.ImmutableList +import com.paligot.confily.core.networking.entities.UserInfo +import com.paligot.confily.core.networking.entities.UserItem +import com.paligot.confily.core.networking.entities.UserTicket import kotlinx.coroutines.flow.Flow class UserDaoSettings : UserDao { - override fun fetchProfile(eventId: String): Flow { + override fun fetchUser(eventId: String): Flow { TODO("Not yet implemented") } - override fun fetchUserPreview(eventId: String): Flow { + override fun fetchUserTicket(eventId: String): Flow { TODO("Not yet implemented") } - override fun fetchNetworking(eventId: String): Flow> { + override fun fetchUsersScanned(eventId: String): Flow> { TODO("Not yet implemented") } - override fun getUsers(eventId: String): ImmutableList { + override fun getUsersScanned(eventId: String): List { TODO("Not yet implemented") } - override fun insertUser( - eventId: String, - email: String, - firstName: String, - lastName: String, - company: String?, - qrCode: ByteArray - ) { + override fun insertUser(eventId: String, user: UserInfo) { TODO("Not yet implemented") } - override fun insertEmailNetworking(eventId: String, userNetworkingUi: UserNetworkingUi) { + override fun insertUserScanned(eventId: String, user: UserItem) { TODO("Not yet implemented") } - override fun deleteNetworking(eventId: String, email: String) { + override fun deleteUserByEmail(eventId: String, email: String) { TODO("Not yet implemented") } diff --git a/shared/ui-models/src/androidMain/kotlin/com/paligot/confily/models/ui/VCardModel.kt b/shared/ui-models/src/androidMain/kotlin/com/paligot/confily/models/ui/VCardModel.kt index 293ab7b34..337acaf3c 100644 --- a/shared/ui-models/src/androidMain/kotlin/com/paligot/confily/models/ui/VCardModel.kt +++ b/shared/ui-models/src/androidMain/kotlin/com/paligot/confily/models/ui/VCardModel.kt @@ -10,10 +10,3 @@ data class VCardModel( val lastName: String, val company: String ) : Parcelable - -fun VCardModel.convertToModelUi(): UserNetworkingUi = UserNetworkingUi( - email = email, - firstName = firstName, - lastName = lastName, - company = company -) diff --git a/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingViewModel.kt b/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingViewModel.kt index 7a942f474..1aa03d25a 100644 --- a/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingViewModel.kt +++ b/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingViewModel.kt @@ -1,6 +1,7 @@ package com.paligot.confily.widgets.presentation -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository +import com.paligot.confily.core.networking.entities.mapToUi import com.paligot.confily.models.ui.UserProfileUi import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Job @@ -16,11 +17,11 @@ sealed class NetworkingUiState { } class NetworkingViewModel( - userRepository: NetworkingRepository, + userRepository: UserRepository, coroutineScope: CoroutineScope = CoroutineScope(Job()) ) { - val uiState: StateFlow = userRepository.fetchProfile() - .map { NetworkingUiState.Success(it) } + val uiState: StateFlow = userRepository.fetchUserProfile() + .map { NetworkingUiState.Success(it?.mapToUi()) } .catch { emit(NetworkingUiState.Success(null)) } .stateIn( scope = coroutineScope, diff --git a/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingWidget.kt b/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingWidget.kt index 7034f992c..3d5acbc46 100644 --- a/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingWidget.kt +++ b/widgets/widgets-presentation/src/main/kotlin/com/paligot/confily/widgets/presentation/NetworkingWidget.kt @@ -8,13 +8,13 @@ import androidx.glance.GlanceModifier import androidx.glance.GlanceTheme import androidx.glance.action.Action import androidx.glance.background -import com.paligot.confily.core.networking.NetworkingRepository +import com.paligot.confily.core.networking.UserRepository import com.paligot.confily.widgets.panes.NetworkingScreen import com.paligot.confily.widgets.ui.Loading @Composable fun NetworkingWidget( - userRepository: NetworkingRepository, + userRepository: UserRepository, @DrawableRes iconId: Int, onNewProfile: Action, onMyProfile: Action,