diff options
Diffstat (limited to 'shared')
34 files changed, 325 insertions, 85 deletions
diff --git a/shared/build.gradle.kts b/shared/build.gradle.kts index 61c42f3..0ecd643 100644 --- a/shared/build.gradle.kts +++ b/shared/build.gradle.kts @@ -26,6 +26,7 @@ kotlin { implementation("io.ktor:ktor-client-core:$ktor_version") implementation("io.ktor:ktor-client-logging:$ktor_version") implementation("io.ktor:ktor-client-serialization:$ktor_version") + implementation("io.insert-koin:koin-core:3.1.4") implementation("ch.qos.logback:logback-classic:1.2.6") implementation("com.russhwolf:multiplatform-settings:$settings_version") @@ -60,7 +61,6 @@ kotlin { iosArm64Main.dependsOn(this) //iosSimulatorArm64Main.dependsOn(this) dependencies { - implementation("io.insert-koin:koin-ios:3.1.4") implementation("io.ktor:ktor-client-ios:$ktor_version") } } diff --git a/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt new file mode 100644 index 0000000..8b43d20 --- /dev/null +++ b/shared/src/androidMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt @@ -0,0 +1,10 @@ +package mx.trackermap.TrackerMap.client.infrastructure + +import io.ktor.client.* +import io.ktor.client.engine.cio.* + +actual class HttpClientProvider { + actual fun getHttpClient(): HttpClient { + return HttpClient(CIO) + } +}
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/Injectable.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/Injectable.kt new file mode 100644 index 0000000..a7467d6 --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/Injectable.kt @@ -0,0 +1,3 @@ +package mx.trackermap.TrackerMap + +interface Injectable
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/AttributesApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/AttributesApi.kt index 2a67fd0..1da9831 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/AttributesApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/AttributesApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Attribute import mx.trackermap.TrackerMap.client.infrastructure.* -class AttributesApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class AttributesApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Attributes diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CalendarsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CalendarsApi.kt index 8dd2da8..c666dc3 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CalendarsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CalendarsApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Calendar import mx.trackermap.TrackerMap.client.infrastructure.* -class CalendarsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class CalendarsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Calendars diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CommandsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CommandsApi.kt index 8ee7436..eb1718c 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CommandsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/CommandsApi.kt @@ -11,12 +11,13 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Command import mx.trackermap.TrackerMap.client.models.CommandType import mx.trackermap.TrackerMap.client.infrastructure.* -class CommandsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class CommandsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Saved Commands diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DevicesApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DevicesApi.kt index 74d105f..8b839aa 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DevicesApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DevicesApi.kt @@ -11,12 +11,13 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Device import mx.trackermap.TrackerMap.client.models.DeviceAccumulators import mx.trackermap.TrackerMap.client.infrastructure.* -class DevicesApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class DevicesApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Devices diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DriversApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DriversApi.kt index a9f47b8..bff61c2 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DriversApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/DriversApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Driver import mx.trackermap.TrackerMap.client.infrastructure.* -class DriversApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class DriversApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Drivers diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/EventsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/EventsApi.kt index 360d6e1..87f8dce 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/EventsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/EventsApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Event import mx.trackermap.TrackerMap.client.infrastructure.* -class EventsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class EventsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GeofencesApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GeofencesApi.kt index d7174e5..049aee9 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GeofencesApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GeofencesApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Geofence import mx.trackermap.TrackerMap.client.infrastructure.* -class GeofencesApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class GeofencesApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Geofences diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GroupsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GroupsApi.kt index 620a25e..07b3b05 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GroupsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/GroupsApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Group import mx.trackermap.TrackerMap.client.infrastructure.* -class GroupsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class GroupsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Groups diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/MaintenanceApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/MaintenanceApi.kt index 5b10e9e..e28a728 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/MaintenanceApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/MaintenanceApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Maintenance import mx.trackermap.TrackerMap.client.infrastructure.* -class MaintenanceApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class MaintenanceApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Maintenance diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/NotificationsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/NotificationsApi.kt index 290a14d..f311fdb 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/NotificationsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/NotificationsApi.kt @@ -11,12 +11,13 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Notification import mx.trackermap.TrackerMap.client.models.NotificationType import mx.trackermap.TrackerMap.client.infrastructure.* -class NotificationsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class NotificationsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Notifications diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PermissionsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PermissionsApi.kt index 33aab48..76fd4a8 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PermissionsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PermissionsApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Permission import mx.trackermap.TrackerMap.client.infrastructure.* -class PermissionsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class PermissionsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Unlink an Object from another Object diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PositionsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PositionsApi.kt index 61285e9..6ad74cb 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PositionsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/PositionsApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.infrastructure.* -class PositionsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class PositionsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetches a list of Positions diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ReportsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ReportsApi.kt index eff40ad..64ef8ea 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ReportsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ReportsApi.kt @@ -13,6 +13,7 @@ package mx.trackermap.TrackerMap.client.apis import io.ktor.content.* import kotlinx.datetime.LocalDateTime +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Event import mx.trackermap.TrackerMap.client.models.Position import mx.trackermap.TrackerMap.client.models.Stop @@ -21,7 +22,7 @@ import mx.trackermap.TrackerMap.client.models.ReportTrips import mx.trackermap.TrackerMap.client.infrastructure.* -class ReportsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class ReportsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Events within the time period for the Devices or Groups diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ServerApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ServerApi.kt index bf65dfe..5672543 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ServerApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/ServerApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Server import mx.trackermap.TrackerMap.client.infrastructure.* -class ServerApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class ServerApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch Server information diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt index 3f90c4c..a22d2d9 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/SessionApi.kt @@ -11,14 +11,11 @@ */ package mx.trackermap.TrackerMap.client.apis -import com.russhwolf.settings.Settings +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.User import mx.trackermap.TrackerMap.client.infrastructure.* -const val SERVER_URL_KEY = "server_url" -const val ACCESS_TOKEN_KEY = "access_token" - -class SessionApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class SessionApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Close the Session @@ -36,8 +33,7 @@ class SessionApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { return when (response.responseType) { ResponseType.Success -> { - val settings = Settings() - settings.remove(ACCESS_TOKEN_KEY) + sessionManager.clearSession() } ResponseType.Informational -> TODO() ResponseType.Redirection -> TODO() @@ -102,14 +98,13 @@ class SessionApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { return when (response.responseType) { ResponseType.Success -> { + print("Response headers = ${response.headers.values}\n") val cookie = response.headers .values .flatten() .find { it.contains("JSESSIONID") }!! .replace("; Path=/", "") - this.token = cookie - val settings = Settings() - settings.putString(ACCESS_TOKEN_KEY, cookie) + this.sessionManager.token = cookie (response as Success<*>).data as User } ResponseType.Informational -> TODO() diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/StatisticsApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/StatisticsApi.kt index 296e589..0b9c766 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/StatisticsApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/StatisticsApi.kt @@ -12,11 +12,12 @@ package mx.trackermap.TrackerMap.client.apis import kotlinx.datetime.LocalDateTime +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.Statistics import mx.trackermap.TrackerMap.client.infrastructure.* -class StatisticsApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class StatisticsApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch server Statistics diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/UsersApi.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/UsersApi.kt index 51f2138..90dd9f6 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/UsersApi.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/apis/UsersApi.kt @@ -11,11 +11,12 @@ */ package mx.trackermap.TrackerMap.client.apis +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.models.User import mx.trackermap.TrackerMap.client.infrastructure.* -class UsersApi(defaultBaseUrl: String) : ApiClient(defaultBaseUrl) { +class UsersApi(sessionManager: SessionManager) : ApiClient(sessionManager), Injectable { /** * Fetch a list of Users diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt index dd61893..78bcf3b 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/ApiClient.kt @@ -17,7 +17,6 @@ */ package mx.trackermap.TrackerMap.client.infrastructure -import com.russhwolf.settings.Settings import io.ktor.client.* import io.ktor.client.call.* import io.ktor.client.features.* @@ -32,12 +31,10 @@ import io.ktor.client.request.forms.FormDataContent import io.ktor.client.statement.* import io.ktor.http.* import io.ktor.util.* -import mx.trackermap.TrackerMap.client.apis.ACCESS_TOKEN_KEY -import mx.trackermap.TrackerMap.client.apis.SERVER_URL_KEY import kotlinx.serialization.json.Json as KotlinJson open class ApiClient( - defaultBaseUrl: String = "", + val sessionManager: SessionManager ) { companion object { protected const val ApiContentType = "Content-Type" @@ -47,7 +44,7 @@ open class ApiClient( protected const val ApiFormURLType = "application/x-www-form-urlencoded" protected const val ApiXmlMediaType = "application/xml" - val client: HttpClient = HttpClient { + val client: HttpClient = HttpClientProvider().getHttpClient().config { install(HttpTimeout) { connectTimeoutMillis = 20_000 requestTimeoutMillis = 20_000 @@ -56,6 +53,7 @@ open class ApiClient( serializer = KotlinxSerializer( KotlinJson { ignoreUnknownKeys = true + useAlternativeNames = false } ) } @@ -70,21 +68,6 @@ open class ApiClient( ApiContentType to ApiJsonMediaType, ApiAccept to ApiJsonMediaType ) - - val jsonHeaders: Map<String, String> = - mapOf( - ApiContentType to ApiJsonMediaType, - ApiAccept to ApiJsonMediaType - ) - } - - var baseUrl: String = "" - var token: String = "" - - init { - val settings = Settings() - baseUrl = settings.getString(SERVER_URL_KEY, defaultBaseUrl) - token = settings.getString(ACCESS_TOKEN_KEY, "") } protected inline fun <reified T> fillRequest( @@ -130,7 +113,7 @@ open class ApiClient( ): ApiInfrastructureResponse<T?> { val httpUrl: Url try { - httpUrl = Url(baseUrl) + httpUrl = Url(sessionManager.baseUrl) } catch (e: URLDecodeException) { throw IllegalStateException("baseUrl is invalid.") } @@ -147,11 +130,11 @@ open class ApiClient( val url = urlBuilder.build() val headers = defaultHeaders + requestConfig.headers - if (headers[ApiContentType] ?: "" == "") { + if ((headers[ApiContentType] ?: "") == "") { throw IllegalStateException("Missing Content-Type header. This is required.") } - if (headers[ApiAccept] ?: "" == "") { + if ((headers[ApiAccept] ?: "") == "") { throw IllegalStateException("Missing Accept header. This is required.") } @@ -190,8 +173,8 @@ open class ApiClient( } } - if (token.isNotEmpty()) { - request.headers["Cookie"] = token + if (sessionManager.token.isNotEmpty()) { + request.headers["Cookie"] = sessionManager.token } val response: HttpResponse = client.request(request) diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt new file mode 100644 index 0000000..873722f --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt @@ -0,0 +1,7 @@ +package mx.trackermap.TrackerMap.client.infrastructure + +import io.ktor.client.* + +expect class HttpClientProvider() { + fun getHttpClient(): HttpClient +}
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt new file mode 100644 index 0000000..caf2da1 --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/SessionManager.kt @@ -0,0 +1,35 @@ +package mx.trackermap.TrackerMap.client.infrastructure + +import com.russhwolf.settings.Settings +import com.russhwolf.settings.get +import com.russhwolf.settings.set +import mx.trackermap.TrackerMap.Injectable + +class SessionManager( + private val defaultBaseUrl: String +): Injectable { + + companion object { + const val SERVER_URL_KEY = "server_url" + const val ACCESS_TOKEN_KEY = "access_token" + } + + private val settings = Settings() + + var baseUrl: String + get() = settings[SERVER_URL_KEY] ?: defaultBaseUrl + set(baseUrl) { + settings[SERVER_URL_KEY] = baseUrl + } + + var token: String + get() = settings[ACCESS_TOKEN_KEY] ?: "" + set(token) { + settings[ACCESS_TOKEN_KEY] = token + } + + fun clearSession() { + settings.remove(ACCESS_TOKEN_KEY) + settings.remove(SERVER_URL_KEY) + } +}
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/EventInformation.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/EventInformation.kt index a008fa8..17682b8 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/EventInformation.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/EventInformation.kt @@ -1,3 +1,20 @@ +/** + * TrackerMap + * Copyright (C) 2021-2022 Iván Ávalos <avalos@disroot.org>, Henoch Ojeda <imhenoch@protonmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ package mx.trackermap.TrackerMap.client.models import kotlinx.serialization.Serializable diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt index ff0489e..3266c0b 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/MapLayer.kt @@ -1,3 +1,20 @@ +/** + * TrackerMap + * Copyright (C) 2021-2022 Iván Ávalos <avalos@disroot.org>, Henoch Ojeda <imhenoch@protonmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ package mx.trackermap.TrackerMap.client.models data class MapLayer( diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/Marker.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/Marker.kt new file mode 100644 index 0000000..ff3fb29 --- /dev/null +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/Marker.kt @@ -0,0 +1,102 @@ +/** + * TrackerMap + * Copyright (C) 2021-2022 Iván Ávalos <avalos@disroot.org>, Henoch Ojeda <imhenoch@protonmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ +package mx.trackermap.TrackerMap.client.models + + +data class Marker( + val id: Int, + val name: String, + val latitude: Double, + val longitude: Double, + val type: Type = Type.DEFAULT +) { + enum class Type { + ANIMAL, BICYCLE, BOAT, BUS, CAR, CRANE, DEFAULT, HELICOPTER, MOTORCYCLE, OFFROAD, PERSON, + PICKUP, PLANE, SCOOTER, SHIP, TRACTOR, TRAIN, TRAM, TROLLEYBUS, TRUCK, VAN, + + REPORT_POSITION, REPORT_START, REPORT_END + } + + companion object { + fun fromUnit(unit: UnitInformation): Marker? { + if (unit.position?.latitude == null || unit.position.longitude == null) { + return null + } + + return Marker( + unit.position.id!!, + unit.device.name, + unit.position.latitude, + unit.position.longitude, + categoryToMarkerType(unit.device.category ?: "") + ) + } + + fun fromPosition(position: Position): Marker? { + if (position.latitude == null || position.longitude == null) { + return null + } + + return Marker( + position.id!!, + "", + position.latitude, + position.longitude + ) + } + + fun fromStop(stop: Stop): Marker? { + if (stop.latitude == null || stop.longitude == null) { + return null + } + + return Marker( + stop.deviceId!!, + stop.deviceName!!, + stop.latitude, + stop.longitude + ) + } + + fun categoryToMarkerType(category: String?): Type { + return when (category?.lowercase()) { + "animal" -> Type.ANIMAL + "bicycle" -> Type.BICYCLE + "boat" -> Type.BOAT + "bus" -> Type.BUS + "car" -> Type.CAR + "crane" -> Type.CRANE + "helicopter" -> Type.HELICOPTER + "motorcycle" -> Type.MOTORCYCLE + "offroad" -> Type.OFFROAD + "person" -> Type.PERSON + "pickup" -> Type.PICKUP + "plane" -> Type.PLANE + "scooter" -> Type.SCOOTER + "ship" -> Type.SHIP + "tractor" -> Type.TRACTOR + "train" -> Type.TRAIN + "tram" -> Type.TRAM + "trolleybus" -> Type.TROLLEYBUS + "truck" -> Type.TRUCK + "van" -> Type.VAN + else -> Type.DEFAULT + } + } + } +}
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/UnitInformation.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/UnitInformation.kt index edebff0..a276fda 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/UnitInformation.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/client/models/UnitInformation.kt @@ -1,6 +1,54 @@ +/** + * TrackerMap + * Copyright (C) 2021-2022 Iván Ávalos <avalos@disroot.org>, Henoch Ojeda <imhenoch@protonmail.com> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ package mx.trackermap.TrackerMap.client.models data class UnitInformation( val device: Device, val position: Position? -)
\ No newline at end of file +) { + enum class Status { + ONLINE, OFFLINE, UNKNOWN + } + + enum class EngineStop { + ON, OFF, UNKNOWN + } + + /** + * Status is calculated from speed, because status based on + * the actual connection to the server is useless for our clients. + */ + fun getStatus() = position?.speed?.let { + if (it >= 2) { + Status.ONLINE + } else { + Status.OFFLINE + } + } ?: Status.UNKNOWN + + /* Many GPS devices reserve pin 1 for engine stop */ + fun getEngineStop() = if (position?.attributes?.containsKey("out1") == true) { + position.attributes["out1"]?.toString()?.let { + when (it) { + "true" -> EngineStop.ON + "false" -> EngineStop.OFF + else -> EngineStop.UNKNOWN + } + } ?: EngineStop.UNKNOWN + } else EngineStop.UNKNOWN +}
\ No newline at end of file diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/GeofencesController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/GeofencesController.kt index 0e4c5c9..e16bb72 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/GeofencesController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/GeofencesController.kt @@ -21,13 +21,14 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.apis.GeofencesApi import mx.trackermap.TrackerMap.client.models.Geofence @DelicateCoroutinesApi class GeofencesController( private val geofencesApi: GeofencesApi -) { +): Injectable { val geofencesFlow = MutableStateFlow<Map<Int,Geofence>>(emptyMap()) init { diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt index b60a034..46bc445 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/ReportController.kt @@ -21,6 +21,7 @@ import kotlinx.coroutines.DelicateCoroutinesApi import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.apis.GeofencesApi import mx.trackermap.TrackerMap.client.apis.ReportsApi import mx.trackermap.TrackerMap.client.models.EventInformation @@ -32,7 +33,7 @@ import mx.trackermap.TrackerMap.utils.ReportDates class ReportController( private val reportsApi: ReportsApi, private val geofencesApi: GeofencesApi -) { +): Injectable { sealed class Report { class PositionsReport(val positions: Array<Position>) : Report() diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt index a945ee9..d3deca1 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/SessionController.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.GlobalScope import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch import kotlinx.serialization.json.JsonPrimitive +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.apis.SessionApi import mx.trackermap.TrackerMap.client.apis.UsersApi import mx.trackermap.TrackerMap.client.models.SessionBody @@ -31,7 +32,7 @@ import mx.trackermap.TrackerMap.client.models.User class SessionController( private val sessionApi: SessionApi, private val usersApi: UsersApi -) { +): Injectable { sealed class LoginState { object Nothing: LoginState() object Loading: LoginState() @@ -65,6 +66,7 @@ class SessionController( userFlow.value = sessionApi.sessionGet() loginStateFlow.value = LoginState.Success } catch (e: Exception) { + e.printStackTrace() loginStateFlow.value = LoginState.Nothing } } @@ -94,14 +96,13 @@ class SessionController( loginStateFlow.value = LoginState.Loading GlobalScope.launch { try { - sessionApi.baseUrl = url - usersApi.baseUrl = sessionApi.baseUrl + sessionApi.sessionManager.baseUrl = url val session = sessionApi.sessionPost(email, password) userFlow.value = session - usersApi.token = sessionApi.token token?.let { registerFcmToken(it) } loginStateFlow.value = LoginState.Success } catch (e: Exception) { + e.printStackTrace() loginStateFlow.value = LoginState.Failure } } diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt index a5d5bd7..8c36d50 100644 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt +++ b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/controllers/UnitsController.kt @@ -25,6 +25,7 @@ import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.* import kotlinx.coroutines.launch +import mx.trackermap.TrackerMap.Injectable import mx.trackermap.TrackerMap.client.apis.DevicesApi import mx.trackermap.TrackerMap.client.apis.PositionsApi import mx.trackermap.TrackerMap.client.models.Position @@ -39,7 +40,7 @@ import kotlinx.coroutines.Job class UnitsController( private val devicesApi: DevicesApi, private val positionsApi: PositionsApi -) { +): Injectable { private companion object { const val UPDATE_TIME = 20 } diff --git a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt b/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt deleted file mode 100644 index fc2abf1..0000000 --- a/shared/src/commonMain/kotlin/mx/trackermap/TrackerMap/utils/MarkerType.kt +++ /dev/null @@ -1,25 +0,0 @@ -/** - * TrackerMap - * Copyright (C) 2021-2022 Iván Ávalos <avalos@disroot.org>, Henoch Ojeda <imhenoch@protonmail.com> - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ -package mx.trackermap.TrackerMap.utils - -enum class MarkerType { - ANIMAL, BICYCLE, BOAT, BUS, CAR, CRANE, DEFAULT, HELICOPTER, MOTORCYCLE, OFFROAD, PERSON, - PICKUP, PLANE, SCOOTER, SHIP, TRACTOR, TRAIN, TRAM, TROLLEYBUS, TRUCK, VAN, - - REPORT_POSITION, REPORT_START, REPORT_END -}
\ No newline at end of file diff --git a/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt new file mode 100644 index 0000000..1ccb2e6 --- /dev/null +++ b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/client/infrastructure/HttpClientProvider.kt @@ -0,0 +1,16 @@ +package mx.trackermap.TrackerMap.client.infrastructure + +import io.ktor.client.* +import io.ktor.client.engine.ios.* + +actual class HttpClientProvider { + actual fun getHttpClient(): HttpClient { + return HttpClient(Ios) { + engine { + configureSession { + HTTPCookieStorage = null + } + } + } + } +}
\ No newline at end of file diff --git a/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/utils/Serialization.kt b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/utils/Serialization.kt new file mode 100644 index 0000000..be26416 --- /dev/null +++ b/shared/src/iosMain/kotlin/mx/trackermap/TrackerMap/utils/Serialization.kt @@ -0,0 +1,12 @@ +package mx.trackermap.TrackerMap.utils + +import kotlinx.serialization.json.JsonPrimitive +import kotlinx.serialization.json.longOrNull + +class Serialization { + companion object { + fun longOrNull(json: JsonPrimitive) = json.longOrNull + + fun toString(json: JsonPrimitive) = json.toString() + } +}
\ No newline at end of file |