Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Databases resources updates #32

Merged
merged 1 commit into from
Jan 9, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 22 additions & 10 deletions src/main/kotlin/model/Database.kt
Original file line number Diff line number Diff line change
Expand Up @@ -13,27 +13,27 @@ data class Database(
@SerialName("Name") val name: String,
@SerialName("DbId") val dbId: String,
@SerialName("Hostname") val hostname: String,
@SerialName("is_schema") val isSchema: Boolean,
@SerialName("schema") val schema: String,
@SerialName("block_reads") val blockReads: Boolean,
@SerialName("block_writes") val blockWrites: Boolean,
@SerialName("allow_attach") val allowAttach: String,
@SerialName("allow_attach") val allowAttach: Boolean,
@SerialName("regions") val regions: List<String>,
@SerialName("primaryRegion") val primaryRegion: String,
@SerialName("is_schema") val isSchema: Boolean,
@SerialName("type") val type: String,
@SerialName("version") val version: String,
@SerialName("group") val group: String,
@SerialName("sleeping") val sleeping: Boolean,
@SerialName("schema") val schema: String,
@SerialName("archived") val archived: Boolean,
)

@Serializable
data class CreateDatabase(
@SerialName("name") val name: String,
@SerialName("group") val group: String,
@SerialName("size_limit") val sizeLimit: String? = null,
@SerialName("seed") val seed: Seed? = null,
@SerialName("schema") val schema: String? = null,
@SerialName("is_schema") val isSchema: Boolean = false,
@SerialName("schema") val schema: String? = null,
@SerialName("seed") val seed: Seed? = null,
@SerialName("size_limit") val sizeLimit: String? = null,
)

@Serializable
Expand Down Expand Up @@ -79,6 +79,20 @@ data class RetrieveDatabaseResponse(
@SerialName("database") val database: Database,
)

@Serializable
data class ConfigurationResponse(
@SerialName("size_limit") val sizeLimit: String,
@SerialName("allow_attach") val allowAttach: Boolean,
@SerialName("block_reads") val blockReads: Boolean,
@SerialName("block_writes") val blockWrites: Boolean,
)

@Serializable
data class UpdateConfigurationRequest(
@SerialName("size_limit") val sizeLimit: String,
@SerialName("allow_attach") val allowAttach: Boolean,
)

@Serializable
data class Usage(
@SerialName("rows_read") val rowsRead: Long,
Expand All @@ -96,7 +110,7 @@ data class InstanceUsage(
data class Instances<T>(
@SerialName("uuid") val uuid: String,
@SerialName("instances") val instances: List<T>,
@SerialName("usage") val usage: Usage,
@SerialName("total") val total: Usage,
)

@Serializable
Expand All @@ -111,8 +125,6 @@ data class Instance(
@Serializable
data class DatabaseUsageResponse(
@SerialName("database") val database: Instances<InstanceUsage>,
@SerialName("instances") val instances: Map<String, Usage>,
@SerialName("total") val total: Usage,
)

@Serializable
Expand Down
42 changes: 42 additions & 0 deletions src/main/kotlin/resource/Databases.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package com.jeliuc.turso.sdk.resource

import com.jeliuc.turso.sdk.TursoClient
import com.jeliuc.turso.sdk.model.Authorization
import com.jeliuc.turso.sdk.model.ConfigurationResponse
import com.jeliuc.turso.sdk.model.CreateDatabase
import com.jeliuc.turso.sdk.model.CreateDatabaseResponse
import com.jeliuc.turso.sdk.model.DatabaseUsageResponse
Expand All @@ -17,12 +18,14 @@ import com.jeliuc.turso.sdk.model.ListInstancesResponse
import com.jeliuc.turso.sdk.model.RetrieveDatabaseResponse
import com.jeliuc.turso.sdk.model.StatsResponse
import com.jeliuc.turso.sdk.model.TokenResponse
import com.jeliuc.turso.sdk.model.UpdateConfigurationRequest
import com.jeliuc.turso.sdk.model.UploadDumpResponse
import io.ktor.client.request.delete
import io.ktor.client.request.forms.MultiPartFormDataContent
import io.ktor.client.request.forms.formData
import io.ktor.client.request.get
import io.ktor.client.request.parameter
import io.ktor.client.request.patch
import io.ktor.client.request.post
import io.ktor.client.request.setBody
import io.ktor.http.ContentType
Expand Down Expand Up @@ -93,6 +96,40 @@ class Databases(private val client: TursoClient) : ResponseHandler() {
handleResponse<RetrieveDatabaseResponse>(it)
}

/**
* Retrieve Database Configuration
*
* @see <a href="https://docs.turso.tech/api-reference/databases/configuration">API Reference</a>
*/
suspend fun retrieveConfiguration(
organizationName: String,
databaseName: String,
): ConfigurationResponse =
client.httpClient.get(
Path.configuration(organizationName, databaseName),
) { contentType(ContentType.Application.Json) }.let { response ->
handleResponse<ConfigurationResponse>(response)
}

/**
* Update Database Configuration
*
* @see <a href="https://docs.turso.tech/api-reference/databases/update-configuration">API Reference</a>
*/
suspend fun updateConfiguration(
organizationName: String,
databaseName: String,
updateConfiguration: UpdateConfigurationRequest,
): ConfigurationResponse =
client.httpClient.patch(
Path.configuration(organizationName, databaseName),
) {
contentType(ContentType.Application.Json)
setBody(updateConfiguration)
}.let { response ->
handleResponse<ConfigurationResponse>(response)
}

/**
* Gets database usage
*
Expand Down Expand Up @@ -260,6 +297,11 @@ class Databases(private val client: TursoClient) : ResponseHandler() {
databaseName: String,
) = RESOURCE_PATH.replace("{organizationName}", organizationName) + "/$databaseName"

fun configuration(
organizationName: String,
databaseName: String,
) = databases(organizationName, databaseName) + "/configuration"

fun usage(
organizationName: String,
databaseName: String,
Expand Down
40 changes: 40 additions & 0 deletions src/test/kotlin/resource/DatabasesTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ package com.jeliuc.turso.sdk.resource

import com.jeliuc.turso.sdk.Fixture
import com.jeliuc.turso.sdk.client
import com.jeliuc.turso.sdk.model.ConfigurationResponse
import com.jeliuc.turso.sdk.model.CreateDatabase
import com.jeliuc.turso.sdk.model.CreateDatabaseResponse
import com.jeliuc.turso.sdk.model.DatabaseUsageResponse
Expand All @@ -17,6 +18,7 @@ import com.jeliuc.turso.sdk.model.ListInstancesResponse
import com.jeliuc.turso.sdk.model.RetrieveDatabaseResponse
import com.jeliuc.turso.sdk.model.StatsResponse
import com.jeliuc.turso.sdk.model.TokenResponse
import com.jeliuc.turso.sdk.model.UpdateConfigurationRequest
import com.jeliuc.turso.sdk.model.UploadDumpResponse
import io.ktor.client.engine.HttpClientEngine
import io.ktor.client.engine.mock.MockEngine
Expand Down Expand Up @@ -79,6 +81,27 @@ private fun mockEngine(): HttpClientEngine =
}
}

Databases.Path.configuration("test", "test-database") -> {
when (method) {
HttpMethod.Get -> {
val data = Fixture.content("$fixturesBasePath/retrieve_configuration.json")
respond(
data,
headers = headersOf("Content-Type" to listOf(ContentType.Application.Json.toString())),
)
}
HttpMethod.Patch -> {
val data = Fixture.content("$fixturesBasePath/retrieve_configuration.json")
respond(
data,
headers = headersOf("Content-Type" to listOf(ContentType.Application.Json.toString())),
)
}

else -> error("Unhandled ${method.value} ${url.encodedPath}")
}
}

Databases.Path.usage("test", "test-database") -> {
val data = Fixture.content("$fixturesBasePath/usage.json")
respond(data, headers = headersOf("Content-Type" to listOf(ContentType.Application.Json.toString())))
Expand Down Expand Up @@ -196,6 +219,23 @@ class DatabasesTest {
}
}

@Test
fun `can retrieve database configuration`() {
runBlocking {
val configuration = client(mockEngine()).databases.retrieveConfiguration("test", "test-database")
assertIs<ConfigurationResponse>(configuration)
}
}

@Test
fun `can update database configuration`() {
runBlocking {
val configurationUpdate = UpdateConfigurationRequest(sizeLimit = "20M", allowAttach = true)
val configuration = client(mockEngine()).databases.updateConfiguration("test", "test-database", configurationUpdate)
assertIs<ConfigurationResponse>(configuration)
}
}

@Test
fun `can get a database usage`() {
runBlocking {
Expand Down
36 changes: 9 additions & 27 deletions src/test/resources/fixtures/database/list.json
Original file line number Diff line number Diff line change
@@ -1,42 +1,24 @@
{
"databases": [
{
"Name": "example-database",
"DbId": "a2f1d1c8-bfd7-11ee-897f-822b15a0bd8c",
"Hostname": "example-database-a2xchip.turso.io",
"is_schema": false,
"schema": "",
"Name": "my-db",
"DbId": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"Hostname": "[databaseName]-[organizationSlug].turso.io",
"block_reads": false,
"block_writes": false,
"allow_attach": false,
"regions": [
"otp"
"lhr",
"bos",
"nrt"
],
"primaryRegion": "otp",
"primaryRegion": "lhr",
"type": "logical",
"hostname": "example-database-a2xchip.turso.io",
"version": "0.22.19",
"version": "0.22.22",
"group": "default",
"sleeping": false
},
{
"Name": "new-database",
"DbId": "ec97c157-5c8e-47ad-abe3-2b0af4079af8",
"Hostname": "new-database-a2xchip.turso.io",
"is_schema": false,
"schema": "",
"block_reads": false,
"block_writes": false,
"allow_attach": false,
"regions": [
"otp"
],
"primaryRegion": "otp",
"type": "logical",
"hostname": "new-database-a2xchip.turso.io",
"version": "0.22.19",
"group": "default",
"sleeping": false
"archived": false
}
]
}
21 changes: 11 additions & 10 deletions src/test/resources/fixtures/database/retrieve.json
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
{
"database": {
"Name": "new-database",
"DbId": "ec97c157-5c8e-47ad-abe3-2b0af4079af8",
"Hostname": "new-database-a2xchip.turso.io",
"is_schema": false,
"schema": "",
"Name": "my-db",
"DbId": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"Hostname": "[databaseName]-[organizationSlug].turso.io",
"block_reads": false,
"block_writes": false,
"allow_attach": false,
"regions": [
"otp"
"lhr",
"bos",
"nrt"
],
"primaryRegion": "otp",
"primaryRegion": "lhr",
"type": "logical",
"hostname": "new-database-a2xchip.turso.io",
"version": "0.24.2",
"version": "0.22.22",
"group": "default",
"sleeping": false
"is_schema": false,
"schema": "",
"archived": false
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"size_limit": "10000",
"allow_attach": true,
"block_reads": false,
"block_writes": false
}
28 changes: 12 additions & 16 deletions src/test/resources/fixtures/database/usage.json
Original file line number Diff line number Diff line change
@@ -1,32 +1,28 @@
{
"database": {
"uuid": "8e78c7e0-c517-11ee-9386-e26d5524e301",
"uuid": "0eb771dd-6906-11ee-8553-eaa7715aeaf2",
"instances": [
{
"uuid": "9f182703-bfd7-11ee-897f-822b15a0bd8c",
"uuid": "cd831986-94e5-11ee-a6fe-7a52e1f7759a",
"usage": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 4096
}
},
{
"uuid": "0be90471-6906-11ee-8553-eaa7715aeaf2",
"usage": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 4096
}
}
],
"usage": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 4096
}
},
"instances": {
"9f182703-bfd7-11ee-897f-822b15a0bd8c": {
"total": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 4096
"storage_bytes": 8192
}
},
"total": {
"rows_read": 0,
"rows_written": 0,
"storage_bytes": 4096
}
}
Loading