Files
turborfq/bible-local/api.md

6.7 KiB

API Reference

All endpoints are under the /api prefix. Responses are JSON unless noted. Authentication is required for all endpoints except /api/login, /api/session, and /api/logout.


Authentication

POST /api/login

Test MariaDB credentials and store them in the session. The database host and port are taken from server-side environment variables (DB_HOST, DB_PORT) — they are not part of the request.

Request body (JSON)

{ "user": "dbuser", "pass": "secret" }

Response

{ "ok": true }

On failure: HTTP 401 with { "ok": false, "error": "..." }.


GET /api/session

Returns current session authentication status. Does not require authentication.

Response

{ "authenticated": true, "user": "dbuser" }

POST /api/logout

Destroys the server-side session and clears the session cookie.

Response

{ "ok": true }

Schema Tree

GET /api/tree

Returns the list of schemas (databases) and their tables that the session user can access. System schemas (information_schema, mysql, performance_schema, sys) are excluded.

Response

[
  {
    "name": "mydb",
    "tables": ["orders", "products", "customers"]
  }
]

Table Metadata

GET /api/table/meta

Returns column definitions, primary key info, and foreign key relationships for one table.

Query params

Param Required Description
schema yes Database name
table yes Table name

Response

{
  "columns": [
    {
      "COLUMN_NAME": "id",
      "DATA_TYPE": "int",
      "COLUMN_TYPE": "int(11)",
      "COLUMN_KEY": "PRI",
      "IS_NULLABLE": false,
      "COLUMN_DEFAULT": null,
      "HAS_DEFAULT": false,
      "EXTRA": "auto_increment",
      "COLUMN_COMMENT": "",
      "IS_AUTO_INCREMENT": true,
      "ORDINAL_POSITION": 1,
      "IS_REQUIRED": false,
      "EDITOR_TYPE": "number",
      "IS_FOREIGN_KEY": false,
      "FOREIGN_KEY": null
    }
  ],
  "primaryKey": ["id"],
  "totalColumns": 5,
  "foreignKeys": [
    {
      "COLUMN_NAME": "customer_id",
      "REFERENCED_TABLE_SCHEMA": "mydb",
      "REFERENCED_TABLE_NAME": "customers",
      "REFERENCED_COLUMN_NAME": "id"
    }
  ]
}

EDITOR_TYPE values: "number", "datetime", "time", "tickCross", "input".


Data Operations

POST /api/table/data

Paginated, filtered, optionally sorted SELECT.

Request body (JSON)

Field Required Description
schema yes Database name
table yes Table name
page no Page number (default 1)
size no Rows per page (default 50, max 5000)
filters no Array of { "field": "col", "value": "val" } — matched with LIKE %val%
sort no Array with one element: [{ "field": "col", "dir": "ASC" }]

Response

{ "data": [ {}, {} ], "total": 342, "last_page": 7, "current_page": 1 }

POST /api/table/insert

Insert a new row. auto_increment columns are ignored even if present.

Request body

{ "schema": "mydb", "table": "orders", "row": { "name": "Test", "qty": 5 } }

Response

{ "inserted": true, "id": "123" }

On failure: HTTP 400 with { "error": true, "message": "..." }.


POST /api/table/update

Update a row. The primary key is read from table metadata on the server; row must include PK field(s).

Request body

{ "schema": "mydb", "table": "orders", "row": { "id": 123, "name": "Updated", "qty": 10 } }

Response

{ "updated": 1 }

On failure: HTTP 400 with { "error": true, "message": "..." }.


POST /api/table/delete

Delete a single row. row must include PK field(s).

Request body

{ "schema": "mydb", "table": "orders", "row": { "id": 123 } }

Response

{ "deleted": 1 }

POST /api/table/delete-batch

Delete multiple rows in a single transaction. For single-column PKs uses batched WHERE … IN (…) (batch size 500). For composite PKs deletes row by row within the same transaction.

Request body

{
  "schema": "mydb",
  "table": "orders",
  "rows": [ { "id": 1 }, { "id": 2 }, { "id": 5 } ]
}

Response

{ "deleted": 3, "errors": 0, "errorMessages": [] }

CSV

POST /api/table/import-csv

Bulk-insert pre-parsed rows into the target table. CSV parsing is done on the frontend; the backend receives an array of row objects. Runs inside a single transaction — if a critical error occurs the whole import is rolled back; per-row errors are collected and reported without stopping the import.

Request body (JSON)

{ "schema": "mydb", "table": "orders", "rows": [ { "name": "A", "qty": 1 },  ] }

Response

{
  "inserted": 98,
  "errors": 2,
  "errorMessages": ["Row CSV #5: …"],
  "failedRows": [ { "row": {}, "error": "…", "line": 5 } ]
}

On critical failure: HTTP 500 with { "error": "…", "inserted": 0, "errors": 1 }.


POST /api/table/export-csv

Export table data as a CSV string. Active filters and sort are applied. Only the columns listed in the columns field are exported. CSV uses ; as delimiter.

Request body (JSON)

Field Required Description
schema yes Database name
table yes Table name
columns yes Array of column objects (same shape as from /api/table/meta)
filters no Same format as /api/table/data
sort no Same format as /api/table/data

Response

{ "csv": "col1;col2\r\nval1;val2\r\n…", "rowCount": 342 }

Foreign Key Values

GET /api/fk-values

Returns distinct values from a referenced column for autocomplete. Without search: returns up to 1000 values. With search: returns all matching values (no limit).

Query params

Param Required Description
schema yes Referenced schema
table yes Referenced table
column yes Referenced column
search no Filter string — matched with LIKE %search%

Response

{ "values": ["foo", "bar"], "total": 500, "loaded": 42 }

total — total distinct count before filtering. loaded — count of values returned.


Backup

GET /api/backup/database/{name}

Download a gzip-compressed mysqldump of a single database.

URL param: name — database name.

Response: application/gzip attachment, filename YYYY-MM-DD-{name}.sql.gz.


GET /api/backup/all

Download a gzip-compressed mysqldump of all databases the user can access (system schemas excluded).

Response: application/gzip attachment, filename YYYY-MM-DD-backup_all.sql.gz.