diff --git a/application/androidApp/build.gradle.kts b/application/androidApp/build.gradle.kts index 0bff4daeb..e60030477 100644 --- a/application/androidApp/build.gradle.kts +++ b/application/androidApp/build.gradle.kts @@ -10,7 +10,7 @@ android { compileSdk = libs.versions.compileSdk.get().toInt() defaultConfig { - val baseUrl = "https://writeopia.dev" + val baseUrl = "https://writeopia.io" buildConfigField("String", "BASE_URL", "\"$baseUrl\"") applicationId = "io.writeopia" diff --git a/application/composeApp/src/iosMain/kotlin/io/writeopia/MainViewController.kt b/application/composeApp/src/iosMain/kotlin/io/writeopia/MainViewController.kt index f6e0787bd..999a4d322 100644 --- a/application/composeApp/src/iosMain/kotlin/io/writeopia/MainViewController.kt +++ b/application/composeApp/src/iosMain/kotlin/io/writeopia/MainViewController.kt @@ -44,7 +44,7 @@ fun MainViewController() = ComposeUIViewController { WriteopiaDbInjector.initialize(database) RepositoryInjector.initialize(SqlDelightDaoInjector.singleton()) WriteopiaConnectionInjector.setBaseUrl( - "https://writeopia.dev" + "https://writeopia.io" // "http://localhost:8080" ) diff --git a/application/composeApp/src/jvmMain/kotlin/io/writeopia/desktop/MainDesktop.kt b/application/composeApp/src/jvmMain/kotlin/io/writeopia/desktop/MainDesktop.kt index 93dbd2f67..5aa5dd417 100644 --- a/application/composeApp/src/jvmMain/kotlin/io/writeopia/desktop/MainDesktop.kt +++ b/application/composeApp/src/jvmMain/kotlin/io/writeopia/desktop/MainDesktop.kt @@ -225,7 +225,7 @@ private fun ApplicationScope.App(onCloseRequest: () -> Unit = ::exitApplication) WriteopiaDbInjector.initialize(database) RepositoryInjector.initialize(SqlDelightDaoInjector.singleton()) WriteopiaConnectionInjector.setBaseUrl( - "https://writeopia.dev" + "https://writeopia.io" // "http://localhost:8080" ) diff --git a/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt b/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt index 91c1c4f0c..a93b519ad 100644 --- a/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt +++ b/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/AuthApi.kt @@ -24,7 +24,7 @@ import io.writeopia.sdk.serialization.data.auth.ResetPasswordRequest class AuthApi(private val client: HttpClient, private val baseUrl: String) { suspend fun login(email: String, password: String): ResultData = try { - val response = client.post("$baseUrl/api/login") { + val response = client.post("$baseUrl/api/auth/login") { contentType(ContentType.Application.Json) setBody(LoginRequest(email, password)) }.body() @@ -42,7 +42,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { workspaceName: String, password: String ): ResultData = try { - val response = client.post("$baseUrl/api/register") { + val response = client.post("$baseUrl/api/auth/register") { contentType(ContentType.Application.Json) setBody(RegisterRequest(name, email, workspaceName, password)) }.body() @@ -54,7 +54,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { } suspend fun resetPassword(newPassword: String, token: String): ResultData = try { - val response = client.put("$baseUrl/api/password/reset") { + val response = client.put("$baseUrl/api/auth/password/reset") { contentType(ContentType.Application.Json) setBody(ResetPasswordRequest(newPassword)) header(HttpHeaders.Authorization, "Bearer $token") @@ -71,7 +71,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { } suspend fun deleteAccount(token: String): ResultData = try { - val response = client.delete("$baseUrl/api/account") { + val response = client.delete("$baseUrl/api/auth/account") { header(HttpHeaders.Authorization, "Bearer $token") }.body() @@ -81,7 +81,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { } suspend fun enableUser(email: String, adminKey: String): ResultData = try { - val response = client.post("$baseUrl/admin/enable-user") { + val response = client.post("$baseUrl/api/auth/admin/enable-user") { contentType(ContentType.Application.Json) header("X-Admin-Key", adminKey) setBody(ManageUserRequest(email)) @@ -99,7 +99,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { } suspend fun confirmEmail(email: String, code: String): ResultData = try { - val response = client.post("$baseUrl/api/email/confirm") { + val response = client.post("$baseUrl/api/auth/email/confirm") { contentType(ContentType.Application.Json) setBody(EmailConfirmRequest(email, code)) }.body() @@ -116,7 +116,7 @@ class AuthApi(private val client: HttpClient, private val baseUrl: String) { } suspend fun resendConfirmationEmail(email: String): ResultData = try { - val response = client.post("$baseUrl/api/email/resend") { + val response = client.post("$baseUrl/api/auth/email/resend") { contentType(ContentType.Application.Json) setBody(EmailResendRequest(email)) }.body() diff --git a/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt b/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt index 4b1bf26cb..e92030af7 100644 --- a/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt +++ b/application/core/auth_core/src/commonMain/kotlin/io/writeopia/auth/core/data/WorkspaceApi.kt @@ -81,7 +81,7 @@ class WorkspaceApi(private val client: HttpClient, private val baseUrl: String) try { workspaceUsersCache.value = ResultData.Loading() - val response = client.get("$baseUrl/api/user/workspaces/$workspaceId") { + val response = client.get("$baseUrl/api/workspaces/$workspaceId/users") { header(HttpHeaders.Authorization, "Bearer $token") } diff --git a/application/core/auth_core/src/jvmTest/kotlin/io/writeopia/auth/core/data/AuthApiTest.kt b/application/core/auth_core/src/jvmTest/kotlin/io/writeopia/auth/core/data/AuthApiTest.kt index 13e03510e..c5342815a 100644 --- a/application/core/auth_core/src/jvmTest/kotlin/io/writeopia/auth/core/data/AuthApiTest.kt +++ b/application/core/auth_core/src/jvmTest/kotlin/io/writeopia/auth/core/data/AuthApiTest.kt @@ -52,7 +52,7 @@ class AuthApiTest { // Verify the request val request = capturedRequest!! assertEquals(HttpMethod.Post, request.method) - assertEquals("https://api.example.com/admin/enable-user", request.url.toString()) + assertEquals("https://api.example.com/api/auth/admin/enable-user", request.url.toString()) assertEquals("my-admin-key", request.headers["X-Admin-Key"]) // Verify the body contains the email diff --git a/application/web/src/jsMain/kotlin/io/writeopia/web/MainWeb.kt b/application/web/src/jsMain/kotlin/io/writeopia/web/MainWeb.kt index 29af8d3e7..0a511c1f6 100644 --- a/application/web/src/jsMain/kotlin/io/writeopia/web/MainWeb.kt +++ b/application/web/src/jsMain/kotlin/io/writeopia/web/MainWeb.kt @@ -36,7 +36,7 @@ fun CreateAppInMemory() { // WriteopiaDbInjector.initialize(null) RepositoryInjector.initialize(SqlDelightDaoInjector.singleton()) WriteopiaConnectionInjector.setBaseUrl( - "https://writeopia.dev" + "https://writeopia.io" // "http://localhost:8080" ) diff --git a/application/web/src/wasmJsMain/kotlin/io/writeopia/web/MainWeb.kt b/application/web/src/wasmJsMain/kotlin/io/writeopia/web/MainWeb.kt index cd1e04c33..f222a88c2 100644 --- a/application/web/src/wasmJsMain/kotlin/io/writeopia/web/MainWeb.kt +++ b/application/web/src/wasmJsMain/kotlin/io/writeopia/web/MainWeb.kt @@ -39,7 +39,7 @@ fun CreateAppInMemory() { // WriteopiaDbInjector.initialize(null) RepositoryInjector.initialize(SqlDelightDaoInjector.singleton()) WriteopiaConnectionInjector.setBaseUrl( - "https://writeopia.dev" + "https://writeopia.io" // "http://localhost:8080" ) diff --git a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AdminRouting.kt b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AdminRouting.kt index 2eb05cafa..28cb56f9f 100644 --- a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AdminRouting.kt +++ b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AdminRouting.kt @@ -17,7 +17,7 @@ fun Route.adminProtectedRoute( writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = false, ) { - route("/admin") { + route("api/auth/admin") { post("/enable-user") { request -> val providedKey = if (debugMode) "debug" else call.request.header("X-Admin-Key") adminUserFn(apiKey, providedKey, debugMode) { diff --git a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AuthRouting.kt b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AuthRouting.kt index d2256af04..79f7d42d6 100644 --- a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AuthRouting.kt +++ b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/AuthRouting.kt @@ -37,7 +37,7 @@ import io.writeopia.sql.WriteopiaDbBackend fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = false) { - post("/api/login") { + post("/api/auth/login") { try { val credentials = call.receive() // Always get user by email first to check if they exist but are unconfirmed @@ -78,7 +78,7 @@ fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = fals } } - post("/api/register") { + post("/api/auth/register") { try { logger.info("register request received") val request = call.receive() @@ -137,7 +137,7 @@ fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = fals } authenticate("auth-jwt", optional = debugMode) { - delete("/api/account") { + delete("/api/auth/account") { val userId = getUserId() if (userId != null) { @@ -150,7 +150,7 @@ fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = fals } authenticate("auth-jwt", optional = debugMode) { - put("/api/password/reset") { + put("/api/auth/password/reset") { val request = call.receive() val userId = getUserId() val user = userId?.let(writeopiaDb::getUserById) @@ -165,7 +165,7 @@ fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = fals } authenticate("auth-jwt", optional = debugMode) { - get("/api/user/current") { + get("/api/auth/user/current") { val userId = getUserId() val user = userId?.let(writeopiaDb::getUserById) @@ -179,7 +179,7 @@ fun Routing.authRoute(writeopiaDb: WriteopiaDbBackend, debugMode: Boolean = fals } authenticate("auth-jwt", optional = debugMode) { - get("/api/hello-auth") { + get("/api/auth/hello-auth") { val principal = call.principal() val username = principal!!.payload.getClaim("username").asString() val expiresAt = principal.expiresAt?.time?.minus(System.currentTimeMillis()) diff --git a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/WorkspaceRouting.kt b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/WorkspaceRouting.kt index d8ddac9f2..542548d61 100644 --- a/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/WorkspaceRouting.kt +++ b/backend/core/auth/src/main/java/io/writeopia/api/core/auth/routing/WorkspaceRouting.kt @@ -91,7 +91,7 @@ fun Routing.workspaceRoute( } authenticate("auth-jwt", optional = debugMode) { - get("/api/user/workspaces/{workspaceId}") { + get("/api/workspace/{workspaceId}/users") { val currentUserId = getUserId() ?: "" val workspaceId = call.pathParameters["workspaceId"] ?: throw IllegalArgumentException("Workspace id is required") diff --git a/backend/core/connection/build.gradle.kts b/backend/core/connection/build.gradle.kts index 38c58bef5..9b1af24be 100644 --- a/backend/core/connection/build.gradle.kts +++ b/backend/core/connection/build.gradle.kts @@ -16,6 +16,7 @@ dependencies { implementation(project(":plugins:writeopia_serialization")) implementation(libs.ktor.client.core) + implementation(libs.ktor.client.cio) implementation(libs.ktor.client.logging) implementation(libs.ktor.client.content.negotiation) implementation(libs.ktor.serialization.json) diff --git a/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/AuthIntegrationTest.kt b/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/AuthIntegrationTest.kt index 3159059af..a512ba810 100644 --- a/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/AuthIntegrationTest.kt +++ b/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/AuthIntegrationTest.kt @@ -54,7 +54,7 @@ class AuthIntegrationTest { val client = defaultClient() - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -79,7 +79,7 @@ class AuthIntegrationTest { val email = Random.nextInt().toString() val workspace = Random.nextInt().toString() - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -91,7 +91,7 @@ class AuthIntegrationTest { ) } - val response1 = client.post("/api/register") { + val response1 = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -116,7 +116,7 @@ class AuthIntegrationTest { val client = defaultClient() val password = "lasjbdalsdq08w9y&" - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -130,7 +130,7 @@ class AuthIntegrationTest { assertEquals(response.status, HttpStatusCode.Created) - val response1 = client.post("api/login") { + val response1 = client.post("api/auth/login") { contentType(ContentType.Application.Json) setBody(LoginRequest("email@gmail.com", password)) } @@ -139,7 +139,7 @@ class AuthIntegrationTest { val token = response1.body().token!! - val response2 = client.delete("api/account") { + val response2 = client.delete("api/auth/account") { contentType(ContentType.Application.Json) header(HttpHeaders.Authorization, "Bearer $token") } @@ -154,7 +154,7 @@ class AuthIntegrationTest { module(db, debugMode = true) } - val response2 = client.delete("api/account") { + val response2 = client.delete("api/auth/account") { contentType(ContentType.Application.Json) header(HttpHeaders.Authorization, "Bearer asdasdasd") } @@ -172,7 +172,7 @@ class AuthIntegrationTest { val password = "lasjbdalsdq08w9y&" - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -186,7 +186,7 @@ class AuthIntegrationTest { assertEquals(response.status, HttpStatusCode.Created) - val response1 = client.post("api/login") { + val response1 = client.post("api/auth/login") { contentType(ContentType.Application.Json) setBody(LoginRequest("email@gmail.com", password)) } @@ -195,7 +195,7 @@ class AuthIntegrationTest { val token = response1.body().token!! - val response2 = client.put("api/password/reset") { + val response2 = client.put("api/auth/password/reset") { contentType(ContentType.Application.Json) header(HttpHeaders.Authorization, "Bearer $token") setBody(ResetPasswordRequest(newPassword = "newpassword")) @@ -203,7 +203,7 @@ class AuthIntegrationTest { assertEquals(response2.status, HttpStatusCode.OK) - val response3 = client.get("api/user/current") { + val response3 = client.get("api/auth/user/current") { contentType(ContentType.Application.Json) header(HttpHeaders.Authorization, "Bearer $token") } @@ -219,7 +219,7 @@ class AuthIntegrationTest { val client = defaultClient() - val response = client.post("admin/enable-user") { + val response = client.post("api/auth/admin/enable-user") { contentType(ContentType.Application.Json) setBody(ManageUserRequest(email = "lehen01@gmail.com")) headers { @@ -238,7 +238,7 @@ class AuthIntegrationTest { val client = defaultClient() - val response = client.post("admin/disable-user") { + val response = client.post("api/auth/admin/disable-user") { contentType(ContentType.Application.Json) setBody(ManageUserRequest(email = "lehen01@gmail.com")) headers { @@ -257,7 +257,7 @@ class AuthIntegrationTest { val client = defaultClient() - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -281,7 +281,7 @@ class AuthIntegrationTest { val client = defaultClient() - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -296,7 +296,7 @@ class AuthIntegrationTest { assertEquals(HttpStatusCode.Created, response.status) assertNotNull(response.body().writeopiaUser) - val response1 = client.post("api/login") { + val response1 = client.post("api/auth/login") { contentType(ContentType.Application.Json) setBody(LoginRequest("email@gmail.com", "lasjbdalsdq08w9y&")) } @@ -315,7 +315,7 @@ class AuthIntegrationTest { val email1 = Random.nextInt().toString() - val response1 = client.post("/api/register") { + val response1 = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -331,7 +331,7 @@ class AuthIntegrationTest { val email2 = Random.nextInt().toString() - val response2 = client.post("/api/register") { + val response2 = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -383,7 +383,7 @@ class AuthIntegrationTest { val email1 = Random.nextInt().toString() - val response1 = client.post("/api/register") { + val response1 = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -399,7 +399,7 @@ class AuthIntegrationTest { val email2 = Random.nextInt().toString() - val response2 = client.post("/api/register") { + val response2 = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( diff --git a/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/WorkspacesTest.kt b/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/WorkspacesTest.kt index 1059a3558..30436e489 100644 --- a/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/WorkspacesTest.kt +++ b/backend/gateway/src/test/kotlin/io/writeopia/api/gateway/WorkspacesTest.kt @@ -49,7 +49,7 @@ class WorkspacesTest { val email = Random.nextInt(10000).toString() val workspaceName1 = "workspace name" - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest( @@ -100,7 +100,7 @@ class WorkspacesTest { val email = Random.nextInt(10000).toString() val workspaceName1 = "workspace name" - val response = client.post("/api/register") { + val response = client.post("/api/auth/register") { contentType(ContentType.Application.Json) setBody( RegisterRequest(