# Kotlin Client for PostgREST Kotlin JVM client for [PostgREST](https://postgrest.org/) ![Java CI with Gradle](https://img.shields.io/github/workflow/status/supabase/postgrest-kt/Java%20CI%20with%20Gradle?label=BUILD&style=for-the-badge) ![Gradle Package](https://img.shields.io/github/workflow/status/supabase/postgrest-kt/Gradle%20Package?label=PUBLISH&style=for-the-badge) ![Bintray](https://img.shields.io/bintray/v/supabase/supabase/postgrest-kt?style=for-the-badge) ## Installation Maven ```xml io.supabase postgrest-kt {version} pom ``` Gradle ``` implementation 'io.supabase:postgrest-kt:{version}' ``` ## Usage ### Initializing the client ```kotlin val postgrestClient = PostgrestDefaultClient( uri = URI("http://localhost:3111"), headers = mapOf("Authorization" to "foobar") ) ``` You can also pass in a custom schema using the `schema` parameter. ### Entry points There are two methods to start any call on the PostgresClient. #### from The `from` function is used for querying. It takes a generic parameter to allow for auto-completion when defining column names. However, you can always use `Any` if you are unsure about the data type. ```kotlin postgresClient.from("messages") .select() .neq("content", "abc") .execute() postgresClient.from("messages") .select() .neq(Message::content, "abc") .execute() ``` #### rpc The `rpc` function executes a stored procedure. ```kotlin postgresClient.rpc("get_status", mapOf("foo" to "bar")) .execute() ``` ### Executing requests There are three ways to execute requests and read the response. #### execute The `execute` method returns a [PostgrestHttpResponse](src/main/kotlin/io/supabase/postgrest/http/PostgrestHttpResponse.kt). The HttpResponse contains the status code, body as string and the count (if you request the count). ```kotlin val response = postgresClient.from("messages") .select() .execute() println(response.body) println(response.status) println(response.count) ``` #### executeAndGetSingle The `executeAndGetSingle` function returns `T`. The JSON converter is used to convert the response to the DTO. ```kotlin data class Message( val id: Long, val content: String ) val message = postgresClient.from("messages") .select() .eq(Message::id, 123L) .limit(1) .single() .executeAndGetSingle() println(message.content) ``` You can also use this function to convert your data to a Map, rather than a separate DTO. ```kotlin val message = postgresClient.from("messages") .select() .eq(Message::id, 123L) .limit(1) .single() .executeAndGetSingle>() println(message["content"]) ``` #### executeAndGetList The `executeAndGetList` function is pretty much the same as the `executeAndGetSingle` function, however, this functions returns a list of `T`. ```kotlin val messages = postgresClient.from("messages") .select() .executeAndGetList() messages.forEach { message -> println(messege.content) } ``` ### CRUD #### Selecting data The `select` function is used for selecting data. ```kotlin val response = postgresClient.from("messages") .select(count = Count.EXACT) // will allow accessing data AND count .eq("content", "foobar") .execute() ``` #### Inserting data The `insert` function is used for inserting or upserting data. ```kotlin val message = Message( id = 123L, content = "foobar" ) val response = postgresClient.from("messages") .insert(message) .execute() val response = postgresClient.from("messages") .insert( value = mapOf("id" to 123L, "content" to "foobar"), upsert = true ) ``` #### Updating data The `update` function is used for updating data. ```kotlin val response = postgresClient.from("messages") .update(mapOf("content" to "hello")) .eq("id", 123L) .execute() ``` #### Deleting data The `delete` function is used for deleting data. ```kotlin val response = postgresClient.from("messages") .delete() .eq("id", 123L) .execute() ``` ## HTTP / (De)-Serialization The Apache Http-Client (5.x) is used for executing HTTP calls, Jackson is used to convert responses to DTOs. If you want to change that, you need to implement the `PostgrestHttpClient` and the `PostgrestJsonConverter` interface. See [PostgrestHttpClientApache](src/main/kotlin/io/supabase/postgrest/http/PostgrestHttpClientApache.kt) and [PostgrestsonConverterJackson](src/main/kotlin/io/supabase/postgrest/json/PostgrestJsonConverterJackson.kt). ```kotlin val postgrestClient = PostgrestClient( httpClient = customHttpClient(), jsonConverter = customConverter() ) ```