Skip to main content

src/d1_gleamflare.gleam

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())
}