Skip to content

Commit 9790424

Browse files
leandroBorgesFerreiraLeandro Ferreira
andauthored
Auth (#451)
* changing navigation for auth * right color for background * Login screen * Login screen looking nice * navigating back * Update AuthMenuScreen.kt * color fix in transition * Auth interface * Fixing background * ktlint * simple auth * Hitting endpoint * register endpoint * auth with tests * ktlint * Update Utils.kt * Update MainWeb.kt * Update build-and-test.yml * Update build-and-test.yml * Update build-and-test.yml * Update build-and-test.yml * Update DocumentsIntegrationTest.kt * Compiling auth with DI * Implementing SqlDelightRepository * Auth working for happy path * Saving token * Showing to a user that he is already logged in * code clean * Deleting unused class * Update AuthCoreInjectionNeo.js.kt * removing empty lines * logout * Fixing android crash * Update AuthCoreInjectionNeo.android.kt * Update AuthCoreInjectionNeo.android.kt * Cleaning code * removing printStackTrace --------- Co-authored-by: Leandro Ferreira <[email protected]>
1 parent faf9a17 commit 9790424

85 files changed

Lines changed: 4529 additions & 3354 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/build-and-test.yml

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ jobs:
1515
runs-on: ubuntu-22.04
1616
env:
1717
isCI: "true"
18+
JWT_SECRET: "testingsecret"
1819
steps:
1920
- name: Check out code
2021
uses: actions/checkout@v4
@@ -34,6 +35,7 @@ jobs:
3435
DB_USER: 'user'
3536
WRITEOPIA_FIREBASE_ID: 'id'
3637
WRITEOPIA_CLIENT_BASE_URL: "baseurl"
38+
JWT_SECRET: "testingsecret"
3739
steps:
3840
- name: Check out code
3941
uses: actions/checkout@v4
@@ -64,6 +66,7 @@ jobs:
6466
POSTGRES_USER: postgres
6567
POSTGRES_PASSWORD: postgres
6668
POSTGRES_DB: writeopia
69+
JWT_SECRET: "testingsecret"
6770
ports:
6871
- 5432:5432
6972
options: >-
@@ -77,6 +80,7 @@ jobs:
7780
DB_USER: 'user'
7881
WRITEOPIA_FIREBASE_ID: 'id'
7982
WRITEOPIA_CLIENT_BASE_URL: "baseurl"
83+
JWT_SECRET: "testingsecret"
8084
steps:
8185
- name: Check out code
8286
uses: actions/checkout@v4
@@ -137,6 +141,7 @@ jobs:
137141
DB_USER: 'user'
138142
WRITEOPIA_FIREBASE_ID: 'id'
139143
WRITEOPIA_CLIENT_BASE_URL: "baseurl"
144+
JWT_SECRET: "testingsecret"
140145
steps:
141146
- name: Check out code
142147
uses: actions/checkout@v4
@@ -164,12 +169,13 @@ jobs:
164169
if: failure()
165170
with:
166171
name: test-results-backend
167-
path: ./backend/editor/api_editor_spring/build/reports/
172+
path: backend/gateway/build/
168173
web_build:
169174
name: Web - Build debug
170175
runs-on: ubuntu-22.04
171176
env:
172177
isCI: "true"
178+
JWT_SECRET: "testingsecret"
173179
steps:
174180
- name: Check out code
175181
uses: actions/checkout@v4

application/common_flows/wide_screen_common/src/commonMain/kotlin/io/writeopia/notes/desktop/components/App.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@ import androidx.navigation.NavHostController
2929
import androidx.navigation.compose.rememberNavController
3030
import io.writeopia.account.ui.SettingsDialog
3131
import io.writeopia.common.utils.Destinations
32+
import io.writeopia.common.utils.NotesNavigation
33+
import io.writeopia.common.utils.NotesNavigationType
34+
import io.writeopia.documents.graph.di.DocumentsGraphInjection
3235
import io.writeopia.editor.di.EditorKmpInjector
3336
import io.writeopia.features.search.di.KmpSearchInjection
3437
import io.writeopia.features.search.ui.SearchDialog
@@ -40,17 +43,13 @@ import io.writeopia.model.isDarkTheme
4043
import io.writeopia.navigation.Navigation
4144
import io.writeopia.navigation.notes.navigateToFolder
4245
import io.writeopia.navigation.notes.navigateToNote
43-
import io.writeopia.common.utils.NotesNavigation
44-
import io.writeopia.common.utils.NotesNavigationType
45-
import io.writeopia.documents.graph.di.DocumentsGraphInjection
4646
import io.writeopia.notemenu.data.usecase.NotesNavigationUseCase
4747
import io.writeopia.notemenu.di.NotesMenuKmpInjection
4848
import io.writeopia.notemenu.navigation.NAVIGATION_PATH
4949
import io.writeopia.notemenu.navigation.NAVIGATION_TYPE
5050
import io.writeopia.notemenu.navigation.navigateToNotes
5151
import io.writeopia.notemenu.ui.screen.menu.EditFileScreen
5252
import io.writeopia.notemenu.ui.screen.menu.RoundedVerticalDivider
53-
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
5453
import io.writeopia.sql.WriteopiaDb
5554
import io.writeopia.sqldelight.di.SqlDelightDaoInjector
5655
import io.writeopia.sqldelight.di.WriteopiaDbInjector
@@ -74,10 +73,9 @@ fun DesktopApp(
7473
coroutineScope: CoroutineScope,
7574
selectColorTheme: (ColorThemeOption) -> Unit,
7675
toggleMaxScreen: () -> Unit,
76+
navigateToRegister: () -> Unit,
7777
startDestination: String = startDestination(),
7878
) {
79-
WriteopiaConnectionInjector.setBaseUrl("http://localhost:8080")
80-
8179
if (writeopiaDb != null) {
8280
WriteopiaDbInjector.initialize(writeopiaDb)
8381
}
@@ -104,7 +102,7 @@ fun DesktopApp(
104102
DocumentsGraphInjection(repositoryInjection = SqlDelightDaoInjector.singleton())
105103

106104
val globalShellViewModel: GlobalShellViewModel = sideMenuInjector.provideSideMenuViewModel()
107-
val colorTheme = colorThemeOption.collectAsState().value
105+
val colorTheme by colorThemeOption.collectAsState()
108106
val navigationController: NavHostController = rememberNavController()
109107
val searchViewModel = KmpSearchInjection.singleton().provideViewModel()
110108

@@ -220,6 +218,7 @@ fun DesktopApp(
220218
ollamaAvailableModels = globalShellViewModel.modelsForUrl,
221219
ollamaSelectedModel = globalShellViewModel.ollamaSelectedModelState,
222220
downloadModelState = globalShellViewModel.downloadModelState,
221+
userOnlineState = globalShellViewModel.userState,
223222
onDismissRequest = globalShellViewModel::hideSettings,
224223
selectColorTheme = selectColorTheme,
225224
selectWorkplacePath = globalShellViewModel::changeWorkspaceLocalPath,
@@ -229,7 +228,9 @@ fun DesktopApp(
229228
downloadModel = { model ->
230229
globalShellViewModel.modelToDownload(model)
231230
},
232-
deleteModel = globalShellViewModel::deleteModel
231+
deleteModel = globalShellViewModel::deleteModel,
232+
signIn = navigateToRegister,
233+
logout = globalShellViewModel::logout
233234
)
234235
}
235236

application/common_flows/wide_screen_common/src/jvmTest/kotlin/io/writeopia/menu/Utils.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ fun ComposeUiTest.startApp(
2828
selectColorTheme = {},
2929
selectionState = MutableStateFlow(false),
3030
keyboardEventFlow = MutableStateFlow(KeyboardEvent.IDLE),
31-
toggleMaxScreen = {}
31+
toggleMaxScreen = {},
32+
navigateToRegister = {}
3233
)
3334
}
3435
}

application/composeApp/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ kotlin {
6060
implementation(project(":application:features:account"))
6161
implementation(project(":application:features:search"))
6262
implementation(project(":application:features:global_shell"))
63+
implementation(project(":application:features:auth"))
6364

6465
implementation(libs.room.runtime)
6566

application/composeApp/src/androidMain/kotlin/io/writeopia/navigation/NavigationActivity.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,6 @@ import android.os.Bundle
88
import androidx.activity.ComponentActivity
99
import androidx.activity.compose.setContent
1010
import androidx.compose.runtime.Composable
11-
import androidx.compose.runtime.collectAsState
12-
import androidx.compose.runtime.getValue
1311
import androidx.compose.runtime.remember
1412
import androidx.lifecycle.viewmodel.compose.viewModel
1513
import androidx.navigation.NavHostController
@@ -18,11 +16,11 @@ import io.writeopia.BuildConfig
1816
import io.writeopia.auth.di.AuthInjection
1917
import io.writeopia.auth.navigation.authNavigation
2018
import io.writeopia.common.utils.Destinations
19+
import io.writeopia.common.utils.NotesNavigation
2120
import io.writeopia.common.utils.di.SharedPreferencesInjector
2221
import io.writeopia.editor.di.EditorKmpInjector
2322
import io.writeopia.features.search.di.MobileSearchInjection
2423
import io.writeopia.mobile.AppMobile
25-
import io.writeopia.common.utils.NotesNavigation
2624
import io.writeopia.notemenu.di.NotesMenuKmpInjection
2725
import io.writeopia.notemenu.di.UiConfigurationInjector
2826
import io.writeopia.notemenu.navigation.NoteMenuDestiny
@@ -79,7 +77,7 @@ fun NavigationGraph(
7977
WriteopiaConnectionInjector.setBaseUrl(BuildConfig.BASE_URL)
8078
val uiConfigViewModel = uiConfigInjection.provideUiConfigurationViewModel()
8179
val repositoryInjection = RoomRepositoryInjection.singleton()
82-
val authInjection = AuthInjection(repositoryInjection)
80+
val authInjection = AuthInjection()
8381
val editorInjector = EditorKmpInjector.mobile(repositoryInjection)
8482
val notesMenuInjection = NotesMenuKmpInjection.mobile(repositoryInjection)
8583

@@ -91,8 +89,7 @@ fun NavigationGraph(
9189
}
9290

9391
val navigationViewModel = viewModel { MobileNavigationViewModel() }
94-
95-
val colorTheme by uiConfigViewModel.listenForColorTheme { "disconnected_user" }.collectAsState()
92+
val colorThemeState = uiConfigViewModel.listenForColorTheme { "disconnected_user" }
9693

9794
AppMobile(
9895
startDestination = startDestination,
@@ -103,7 +100,7 @@ fun NavigationGraph(
103100
editorInjector = editorInjector,
104101
navigationViewModel = navigationViewModel
105102
) {
106-
authNavigation(navController, authInjection) {
103+
authNavigation(navController, authInjection, colorThemeState) {
107104
navController.navigateToNotes(NotesNavigation.Root)
108105
}
109106
}

application/composeApp/src/jvmMain/kotlin/io/writeopia/desktop/MainDesktop.kt

Lines changed: 55 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package io.writeopia.desktop
22

3+
import androidx.compose.foundation.background
34
import androidx.compose.foundation.layout.Box
45
import androidx.compose.foundation.layout.fillMaxSize
56
import androidx.compose.material.CircularProgressIndicator
@@ -11,19 +12,34 @@ import androidx.compose.ui.Alignment
1112
import androidx.compose.ui.Modifier
1213
import androidx.compose.ui.input.key.KeyEvent
1314
import androidx.compose.ui.unit.dp
14-
import androidx.compose.ui.window.*
15+
import androidx.compose.ui.window.ApplicationScope
16+
import androidx.compose.ui.window.Window
17+
import androidx.compose.ui.window.WindowPlacement
18+
import androidx.compose.ui.window.WindowPosition
19+
import androidx.compose.ui.window.application
20+
import androidx.compose.ui.window.rememberWindowState
21+
import androidx.navigation.compose.NavHost
22+
import androidx.navigation.compose.composable
23+
import androidx.navigation.compose.rememberNavController
1524
import io.github.kdroidfilter.platformtools.darkmodedetector.isSystemInDarkMode
1625
import io.github.kdroidfilter.platformtools.darkmodedetector.windows.setWindowsAdaptiveTitleBar
26+
import io.writeopia.auth.di.AuthInjection
27+
import io.writeopia.auth.navigation.authNavigation
28+
import io.writeopia.common.utils.Destinations
1729
import io.writeopia.common.utils.keyboard.KeyboardCommands
1830
import io.writeopia.common.utils.keyboard.isMultiSelectionTrigger
1931
import io.writeopia.common.utils.ui.GlobalToastBox
32+
import io.writeopia.model.isDarkTheme
2033
import io.writeopia.notemenu.di.UiConfigurationInjector
2134
import io.writeopia.notes.desktop.components.DesktopApp
2235
import io.writeopia.resources.CommonImages
36+
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
2337
import io.writeopia.sqldelight.database.DatabaseCreation
2438
import io.writeopia.sqldelight.database.DatabaseFactory
2539
import io.writeopia.sqldelight.database.driver.DriverFactory
2640
import io.writeopia.sqldelight.di.WriteopiaDbInjector
41+
import io.writeopia.theme.WrieopiaTheme
42+
import io.writeopia.theme.WriteopiaTheme
2743
import io.writeopia.ui.image.ImageLoadConfig
2844
import io.writeopia.ui.keyboard.KeyboardEvent
2945
import kotlinx.coroutines.Dispatchers
@@ -192,6 +208,7 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
192208
val database = databaseState.writeopiaDb
193209

194210
WriteopiaDbInjector.initialize(database)
211+
WriteopiaConnectionInjector.setBaseUrl("http://localhost:8080")
195212

196213
val uiConfigurationInjector = UiConfigurationInjector.singleton()
197214

@@ -201,16 +218,43 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication)
201218
val colorTheme =
202219
uiConfigurationViewModel.listenForColorTheme { "disconnected_user" }
203220

204-
GlobalToastBox {
205-
DesktopApp(
206-
writeopiaDb = database,
207-
selectionState = selectionState,
208-
keyboardEventFlow = keyboardEventFlow.filterNotNull(),
209-
coroutineScope = coroutineScope,
210-
colorThemeOption = colorTheme,
211-
selectColorTheme = uiConfigurationViewModel::changeColorTheme,
212-
toggleMaxScreen = topDoubleBarClick
213-
)
221+
val navigationController = rememberNavController()
222+
223+
WrieopiaTheme(darkTheme = colorTheme.value.isDarkTheme()) {
224+
GlobalToastBox(
225+
modifier = Modifier
226+
.background(WriteopiaTheme.colorScheme.globalBackground)
227+
) {
228+
NavHost(
229+
navController = navigationController,
230+
startDestination = Destinations.START_APP.id
231+
) {
232+
composable(route = Destinations.START_APP.id) {
233+
DesktopApp(
234+
writeopiaDb = database,
235+
selectionState = selectionState,
236+
keyboardEventFlow = keyboardEventFlow.filterNotNull(),
237+
coroutineScope = coroutineScope,
238+
colorThemeOption = colorTheme,
239+
selectColorTheme = uiConfigurationViewModel::changeColorTheme,
240+
toggleMaxScreen = topDoubleBarClick,
241+
navigateToRegister = {
242+
navigationController.navigate(
243+
Destinations.AUTH_MENU_INNER_NAVIGATION.id
244+
)
245+
}
246+
)
247+
}
248+
249+
authNavigation(
250+
navController = navigationController,
251+
authInjection = AuthInjection(),
252+
colorThemeOption = colorTheme
253+
) {
254+
navigationController.navigate(Destinations.START_APP.id)
255+
}
256+
}
257+
}
214258
}
215259
}
216260

application/core/auth_core/build.gradle.kts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ plugins {
33
alias(libs.plugins.androidLibrary)
44
kotlin("multiplatform")
55
alias(libs.plugins.ktlint)
6+
alias(libs.plugins.kotlinSerialization)
67
}
78

89
kotlin {
@@ -28,10 +29,21 @@ kotlin {
2829
sourceSets {
2930
val commonMain by getting {
3031
dependencies {
32+
implementation(project(":writeopia_models"))
33+
3134
implementation(project(":application:core:utils"))
35+
implementation(project(":application:core:persistence_bridge"))
36+
implementation(project(":plugins:writeopia_persistence_sqldelight"))
37+
3238
implementation(project(":plugins:writeopia_network"))
33-
// implementation(libs.kotlinx.coroutines.flow)
39+
implementation(project(":plugins:writeopia_serialization"))
40+
41+
implementation(project(":application:core:connection"))
42+
3443
implementation(libs.kotlinx.coroutines.core)
44+
implementation(libs.kotlinx.serialization.json)
45+
46+
implementation(libs.ktor.client.core)
3547
}
3648
}
3749

application/core/auth_core/src/androidMain/kotlin/io/writeopia/auth/core/di/AuthCoreInjectionNeo.android.kt

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
package io.writeopia.auth.core.di
22

3-
import android.content.SharedPreferences
4-
import com.google.firebase.auth.FirebaseAuth
5-
import com.google.firebase.auth.ktx.auth
6-
import com.google.firebase.ktx.Firebase
7-
import io.writeopia.auth.core.manager.AuthManager
8-
import io.writeopia.auth.core.manager.FirebaseAuthManager
9-
import io.writeopia.auth.core.repository.AuthRepository
10-
import io.writeopia.auth.core.repository.SharedPrefsAuthRepository
11-
import io.writeopia.common.utils.di.SharedPreferencesInjector
3+
import io.writeopia.auth.core.data.AuthApi
4+
import io.writeopia.auth.core.manager.AuthRepository
5+
import io.writeopia.auth.core.manager.SqlDelightRepository
6+
import io.writeopia.di.AppConnectionInjection
7+
import io.writeopia.sdk.network.injector.WriteopiaConnectionInjector
8+
import io.writeopia.sql.WriteopiaDb
9+
import io.writeopia.sqldelight.di.WriteopiaDbInjector
1210

13-
actual class AuthCoreInjectionNeo private constructor(
14-
private val sharedPreferences: SharedPreferences
11+
actual class AuthCoreInjectionNeo(
12+
// Change this to use a different persistence
13+
private val writeopiaDb: WriteopiaDb? = WriteopiaDbInjector.singleton()?.database,
14+
private val appConnectionInjection: AppConnectionInjection = AppConnectionInjection.singleton(),
15+
private val connectionInjector: WriteopiaConnectionInjector =
16+
WriteopiaConnectionInjector.singleton()
1517
) {
1618

17-
private val auth: FirebaseAuth = Firebase.auth
19+
actual fun provideAuthRepository(): AuthRepository = SqlDelightRepository(writeopiaDb)
1820

19-
actual fun provideAccountManager(): AuthManager = FirebaseAuthManager(auth)
20-
21-
actual fun provideAuthRepository(): AuthRepository =
22-
SharedPrefsAuthRepository(sharedPreferences)
21+
actual fun provideAuthApi(): AuthApi =
22+
AuthApi(
23+
client = appConnectionInjection.provideHttpClient(),
24+
baseUrl = connectionInjector.baseUrl()
25+
)
2326

2427
actual companion object {
2528
private var instance: AuthCoreInjectionNeo? = null
2629

2730
actual fun singleton(): AuthCoreInjectionNeo =
28-
instance ?: AuthCoreInjectionNeo(
29-
SharedPreferencesInjector.singleton().sharedPreferences
30-
).also {
31+
instance ?: AuthCoreInjectionNeo().also {
3132
instance = it
3233
}
3334
}

0 commit comments

Comments
 (0)