import gleam/http
import gleam/http/request
import gleam/json
import gleam/dynamic
import d1_gleamflare/types.{type Client, type Database, type DatabaseInfo, Client, Database, DatabaseInfo}
import d1_gleamflare/internal
pub fn new(account_id: String, api_token: String) -> Client {
Client(account_id: account_id, api_token: api_token)
}
pub fn database(client: Client, uuid: String, name: String) -> Database {
Database(client: client, uuid: uuid, name: name)
}
pub fn database_info_decoder() -> dynamic.Decoder(DatabaseInfo) {
dynamic.decode4(
DatabaseInfo,
dynamic.field("uuid", dynamic.string),
dynamic.field("name", dynamic.string),
dynamic.field("created_at", dynamic.string),
dynamic.field("version", dynamic.string),
)
}
pub fn list_databases(client: Client) -> Result(List(DatabaseInfo), types.Error) {
let req =
internal.base_request(client)
|> request.set_method(http.Get)
|> request.set_path("/client/v4/accounts/" <> client.account_id <> "/d1/database")
internal.send_request(req, dynamic.list(database_info_decoder()))
}
pub fn create_database(client: Client, name: String) -> Result(DatabaseInfo, types.Error) {
let body =
json.object([#("name", json.string(name))])
|> json.to_string
let req =
internal.base_request(client)
|> request.set_method(http.Post)
|> request.set_path("/client/v4/accounts/" <> client.account_id <> "/d1/database")
|> request.set_body(body)
internal.send_request(req, database_info_decoder())
}
pub fn get_database(client: Client, uuid: String) -> Result(DatabaseInfo, types.Error) {
let req =
internal.base_request(client)
|> request.set_method(http.Get)
|> request.set_path("/client/v4/accounts/" <> client.account_id <> "/d1/database/" <> uuid)
internal.send_request(req, database_info_decoder())
}