Files
jormun-db/open_api_doc.yaml

885 lines
27 KiB
YAML
Raw Permalink Normal View History

openapi: 3.0.3
info:
title: JormunDB DynamoDB Wire API
version: 0.1.0
description: |
DynamoDB-compatible JSON-over-HTTP API implemented by JormunDB.
Requests are POSTed to a single endpoint (/) and routed by the required `X-Amz-Target` header.
servers:
- url: http://localhost:8002
paths:
/:
post:
summary: DynamoDB JSON API endpoint
description: |
Send DynamoDB JSON protocol requests to this endpoint and set `X-Amz-Target` to the operation name,
e.g. `DynamoDB_20120810.GetItem`. The request and response media type is typically
`application/x-amz-json-1.0`.
parameters:
- $ref: '#/components/parameters/XAmzTarget'
- $ref: '#/components/parameters/XAmzDate'
- $ref: '#/components/parameters/Authorization'
- $ref: '#/components/parameters/XAmzSecurityToken'
- $ref: '#/components/parameters/XAmzContentSha256'
requestBody:
required: true
content:
application/x-amz-json-1.0:
schema:
oneOf:
- $ref: '#/components/schemas/CreateTableRequest'
- $ref: '#/components/schemas/DeleteTableRequest'
- $ref: '#/components/schemas/DescribeTableRequest'
- $ref: '#/components/schemas/ListTablesRequest'
- $ref: '#/components/schemas/PutItemRequest'
- $ref: '#/components/schemas/GetItemRequest'
- $ref: '#/components/schemas/DeleteItemRequest'
- $ref: '#/components/schemas/UpdateItemRequest'
- $ref: '#/components/schemas/QueryRequest'
- $ref: '#/components/schemas/ScanRequest'
- $ref: '#/components/schemas/BatchWriteItemRequest'
- $ref: '#/components/schemas/BatchGetItemRequest'
- $ref: '#/components/schemas/TransactWriteItemsRequest'
- $ref: '#/components/schemas/TransactGetItemsRequest'
examples:
CreateTable:
summary: Create a table with a HASH key
value:
TableName: ExampleTable
KeySchema:
- AttributeName: pk
KeyType: HASH
AttributeDefinitions:
- AttributeName: pk
AttributeType: S
responses:
'200':
description: Successful operation response
content:
application/x-amz-json-1.0:
schema:
oneOf:
- $ref: '#/components/schemas/CreateTableResponse'
- $ref: '#/components/schemas/DeleteTableResponse'
- $ref: '#/components/schemas/DescribeTableResponse'
- $ref: '#/components/schemas/ListTablesResponse'
- $ref: '#/components/schemas/PutItemResponse'
- $ref: '#/components/schemas/GetItemResponseUnion'
- $ref: '#/components/schemas/DeleteItemResponse'
- $ref: '#/components/schemas/UpdateItemResponseUnion'
- $ref: '#/components/schemas/QueryResponse'
- $ref: '#/components/schemas/ScanResponse'
- $ref: '#/components/schemas/BatchWriteItemResponse'
- $ref: '#/components/schemas/BatchGetItemResponse'
- $ref: '#/components/schemas/TransactWriteItemsResponse'
- $ref: '#/components/schemas/TransactGetItemsResponse'
'400':
description: Client error (ValidationException, SerializationException, etc.)
content:
application/x-amz-json-1.0:
schema:
oneOf:
- $ref: '#/components/schemas/DynamoDbError'
- $ref: '#/components/schemas/TransactionCanceledException'
'500':
description: Server error
content:
application/x-amz-json-1.0:
schema:
$ref: '#/components/schemas/DynamoDbError'
components:
parameters:
XAmzTarget:
name: X-Amz-Target
in: header
required: true
description: |
DynamoDB JSON protocol operation selector.
JormunDB recognizes targets with the `DynamoDB_20120810.` prefix.
Note: `UpdateTable` may be recognized but not implemented.
schema:
type: string
enum:
- DynamoDB_20120810.CreateTable
- DynamoDB_20120810.DeleteTable
- DynamoDB_20120810.DescribeTable
- DynamoDB_20120810.ListTables
- DynamoDB_20120810.UpdateTable
- DynamoDB_20120810.PutItem
- DynamoDB_20120810.GetItem
- DynamoDB_20120810.DeleteItem
- DynamoDB_20120810.UpdateItem
- DynamoDB_20120810.Query
- DynamoDB_20120810.Scan
- DynamoDB_20120810.BatchGetItem
- DynamoDB_20120810.BatchWriteItem
- DynamoDB_20120810.TransactGetItems
- DynamoDB_20120810.TransactWriteItems
example: DynamoDB_20120810.GetItem
XAmzDate:
name: X-Amz-Date
in: header
required: false
schema:
type: string
description: Optional SigV4 timestamp header (kept for SDK compatibility).
Authorization:
name: Authorization
in: header
required: false
schema:
type: string
description: Optional SigV4 Authorization header (kept for SDK compatibility).
XAmzSecurityToken:
name: X-Amz-Security-Token
in: header
required: false
schema:
type: string
description: Optional SigV4 session token header (kept for SDK compatibility).
XAmzContentSha256:
name: X-Amz-Content-Sha256
in: header
required: false
schema:
type: string
description: Optional SigV4 payload hash header (kept for SDK compatibility).
schemas:
EmptyObject:
type: object
description: Empty JSON object.
additionalProperties: false
# -------------------------
# AttributeValue & helpers
# -------------------------
AttributeValue:
description: DynamoDB AttributeValue (JSON wire format).
type: object
minProperties: 1
maxProperties: 1
oneOf:
- $ref: '#/components/schemas/AttrS'
- $ref: '#/components/schemas/AttrN'
- $ref: '#/components/schemas/AttrB'
- $ref: '#/components/schemas/AttrBOOL'
- $ref: '#/components/schemas/AttrNULL'
- $ref: '#/components/schemas/AttrSS'
- $ref: '#/components/schemas/AttrNS'
- $ref: '#/components/schemas/AttrBS'
- $ref: '#/components/schemas/AttrL'
- $ref: '#/components/schemas/AttrM'
AttrS:
type: object
additionalProperties: false
required: [S]
properties:
S:
type: string
example: hello
AttrN:
type: object
additionalProperties: false
required: [N]
properties:
N:
type: string
description: Numeric values are encoded as strings in DynamoDB's JSON protocol.
example: "42"
AttrB:
type: object
additionalProperties: false
required: [B]
properties:
B:
type: string
description: Base64-encoded binary value.
example: AAECAwQ=
AttrBOOL:
type: object
additionalProperties: false
required: [BOOL]
properties:
BOOL:
type: boolean
example: true
AttrNULL:
type: object
additionalProperties: false
required: [NULL]
properties:
NULL:
type: boolean
enum: [true]
example: true
AttrSS:
type: object
additionalProperties: false
required: [SS]
properties:
SS:
type: array
items: { type: string }
example: [a, b]
AttrNS:
type: object
additionalProperties: false
required: [NS]
properties:
NS:
type: array
description: Numeric set values are encoded as strings.
items: { type: string }
example: ["1", "2"]
AttrBS:
type: object
additionalProperties: false
required: [BS]
properties:
BS:
type: array
description: Base64-encoded binary set values.
items: { type: string }
example: [AAE=, AgM=]
AttrL:
type: object
additionalProperties: false
required: [L]
properties:
L:
type: array
items:
$ref: '#/components/schemas/AttributeValue'
AttrM:
type: object
additionalProperties: false
required: [M]
properties:
M:
$ref: '#/components/schemas/AttributeMap'
AttributeMap:
type: object
additionalProperties:
$ref: '#/components/schemas/AttributeValue'
example:
pk: { S: "user#1" }
sk: { S: "meta" }
age: { N: "30" }
ExpressionAttributeNames:
type: object
additionalProperties: { type: string }
example:
"#pk": "pk"
ExpressionAttributeValues:
type: object
additionalProperties:
$ref: '#/components/schemas/AttributeValue'
example:
":v": { S: "user#1" }
Key:
allOf:
- $ref: '#/components/schemas/AttributeMap'
description: Primary key map (HASH, optionally RANGE) encoded as an AttributeMap.
ReturnValues:
type: string
description: ReturnValues selector used by UpdateItem.
enum: [NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW]
example: ALL_NEW
# -------------------------
# Table shapes
# -------------------------
ScalarAttributeType:
type: string
enum: [S, N, B]
example: S
AttributeDefinition:
type: object
additionalProperties: false
required: [AttributeName, AttributeType]
properties:
AttributeName: { type: string }
AttributeType: { $ref: '#/components/schemas/ScalarAttributeType' }
KeyType:
type: string
enum: [HASH, RANGE]
example: HASH
KeySchemaElement:
type: object
additionalProperties: false
required: [AttributeName, KeyType]
properties:
AttributeName: { type: string }
KeyType: { $ref: '#/components/schemas/KeyType' }
ProjectionType:
type: string
enum: [KEYS_ONLY, INCLUDE, ALL]
example: ALL
Projection:
type: object
additionalProperties: false
required: [ProjectionType]
properties:
ProjectionType: { $ref: '#/components/schemas/ProjectionType' }
NonKeyAttributes:
type: array
items: { type: string }
GlobalSecondaryIndex:
type: object
additionalProperties: false
required: [IndexName, KeySchema, Projection]
properties:
IndexName: { type: string }
KeySchema:
type: array
items: { $ref: '#/components/schemas/KeySchemaElement' }
minItems: 1
Projection: { $ref: '#/components/schemas/Projection' }
TableStatus:
type: string
enum: [CREATING, UPDATING, DELETING, ACTIVE, ARCHIVING, ARCHIVED]
example: ACTIVE
TableDescription:
type: object
additionalProperties: false
required: [TableName, TableStatus]
properties:
TableName: { type: string }
TableStatus: { $ref: '#/components/schemas/TableStatus' }
CreationDateTime:
type: integer
format: int64
description: Unix epoch seconds.
KeySchema:
type: array
items: { $ref: '#/components/schemas/KeySchemaElement' }
AttributeDefinitions:
type: array
items: { $ref: '#/components/schemas/AttributeDefinition' }
GlobalSecondaryIndexes:
type: array
items:
allOf:
- $ref: '#/components/schemas/GlobalSecondaryIndex'
- type: object
properties:
IndexStatus:
type: string
enum: [ACTIVE]
# -------------------------
# Error shapes
# -------------------------
DynamoDbError:
type: object
additionalProperties: false
required: [__type, message]
properties:
__type:
type: string
description: DynamoDB error type identifier.
example: com.amazonaws.dynamodb.v20120810#ValidationException
message:
type: string
example: Invalid request
TransactionCanceledException:
type: object
additionalProperties: false
required: [__type, message, CancellationReasons]
properties:
__type:
type: string
enum: [com.amazonaws.dynamodb.v20120810#TransactionCanceledException]
message:
type: string
CancellationReasons:
type: array
items:
type: object
additionalProperties: false
required: [Code, Message]
properties:
Code: { type: string, example: ConditionalCheckFailed }
Message: { type: string, example: The conditional request failed }
# -------------------------
# API: CreateTable
# -------------------------
CreateTableRequest:
type: object
additionalProperties: true
required: [TableName, KeySchema, AttributeDefinitions]
properties:
TableName: { type: string }
KeySchema:
type: array
items: { $ref: '#/components/schemas/KeySchemaElement' }
minItems: 1
AttributeDefinitions:
type: array
items: { $ref: '#/components/schemas/AttributeDefinition' }
minItems: 1
GlobalSecondaryIndexes:
type: array
items: { $ref: '#/components/schemas/GlobalSecondaryIndex' }
description: |
CreateTable request. JormunDB focuses on TableName, KeySchema, AttributeDefinitions, and optional GSI definitions.
CreateTableResponse:
type: object
additionalProperties: false
required: [TableDescription]
properties:
TableDescription:
type: object
additionalProperties: false
required: [TableName, TableStatus, CreationDateTime]
properties:
TableName: { type: string }
TableStatus: { $ref: '#/components/schemas/TableStatus' }
CreationDateTime: { type: integer, format: int64 }
# -------------------------
# API: DeleteTable / DescribeTable / ListTables
# -------------------------
DeleteTableRequest:
type: object
additionalProperties: true
required: [TableName]
properties:
TableName: { type: string }
DeleteTableResponse:
type: object
additionalProperties: false
required: [TableDescription]
properties:
TableDescription:
type: object
additionalProperties: false
required: [TableName, TableStatus]
properties:
TableName: { type: string }
TableStatus:
type: string
enum: [DELETING]
DescribeTableRequest:
type: object
additionalProperties: true
required: [TableName]
properties:
TableName: { type: string }
DescribeTableResponse:
type: object
additionalProperties: false
required: [Table]
properties:
Table: { $ref: '#/components/schemas/TableDescription' }
ListTablesRequest:
type: object
additionalProperties: true
description: ListTables request. JormunDB ignores request fields for this operation.
ListTablesResponse:
type: object
additionalProperties: false
required: [TableNames]
properties:
TableNames:
type: array
items: { type: string }
# -------------------------
# API: PutItem / GetItem / DeleteItem
# -------------------------
PutItemRequest:
type: object
additionalProperties: true
required: [TableName, Item]
properties:
TableName: { type: string }
Item: { $ref: '#/components/schemas/AttributeMap' }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
PutItemResponse:
$ref: '#/components/schemas/EmptyObject'
GetItemRequest:
type: object
additionalProperties: true
required: [TableName, Key]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
ProjectionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
GetItemResponse:
type: object
additionalProperties: false
required: [Item]
properties:
Item: { $ref: '#/components/schemas/AttributeMap' }
GetItemResponseUnion:
oneOf:
- $ref: '#/components/schemas/EmptyObject'
- $ref: '#/components/schemas/GetItemResponse'
DeleteItemRequest:
type: object
additionalProperties: true
required: [TableName, Key]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
DeleteItemResponse:
$ref: '#/components/schemas/EmptyObject'
# -------------------------
# API: UpdateItem
# -------------------------
UpdateItemRequest:
type: object
additionalProperties: true
required: [TableName, Key, UpdateExpression]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
UpdateExpression: { type: string }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
ReturnValues: { $ref: '#/components/schemas/ReturnValues' }
UpdateItemResponse:
type: object
additionalProperties: false
required: [Attributes]
properties:
Attributes: { $ref: '#/components/schemas/AttributeMap' }
UpdateItemResponseUnion:
oneOf:
- $ref: '#/components/schemas/EmptyObject'
- $ref: '#/components/schemas/UpdateItemResponse'
# -------------------------
# API: Query / Scan
# -------------------------
QueryRequest:
type: object
additionalProperties: true
required: [TableName, KeyConditionExpression]
properties:
TableName: { type: string }
IndexName: { type: string }
KeyConditionExpression: { type: string }
FilterExpression: { type: string }
ProjectionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
Limit:
type: integer
format: int32
minimum: 1
description: Maximum items to return (default 100 if omitted/0 in JormunDB).
ExclusiveStartKey: { $ref: '#/components/schemas/Key' }
ScanIndexForward:
type: boolean
description: Sort order for RANGE key queries (if applicable).
ScanRequest:
type: object
additionalProperties: true
required: [TableName]
properties:
TableName: { type: string }
IndexName: { type: string }
FilterExpression: { type: string }
ProjectionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
Limit:
type: integer
format: int32
minimum: 1
description: Maximum items to return (default 100 if omitted/0 in JormunDB).
ExclusiveStartKey: { $ref: '#/components/schemas/Key' }
ItemsPage:
type: object
additionalProperties: false
required: [Items, Count, ScannedCount]
properties:
Items:
type: array
items: { $ref: '#/components/schemas/AttributeMap' }
Count:
type: integer
format: int32
ScannedCount:
type: integer
format: int32
LastEvaluatedKey:
$ref: '#/components/schemas/Key'
QueryResponse:
allOf:
- $ref: '#/components/schemas/ItemsPage'
ScanResponse:
allOf:
- $ref: '#/components/schemas/ItemsPage'
# -------------------------
# API: BatchWriteItem
# -------------------------
WriteRequest:
type: object
additionalProperties: false
properties:
PutRequest:
type: object
additionalProperties: false
required: [Item]
properties:
Item: { $ref: '#/components/schemas/AttributeMap' }
DeleteRequest:
type: object
additionalProperties: false
required: [Key]
properties:
Key: { $ref: '#/components/schemas/Key' }
oneOf:
- required: [PutRequest]
- required: [DeleteRequest]
BatchWriteItemRequest:
type: object
additionalProperties: true
required: [RequestItems]
properties:
RequestItems:
type: object
description: Map of table name to write requests.
additionalProperties:
type: array
items: { $ref: '#/components/schemas/WriteRequest' }
BatchWriteItemResponse:
type: object
additionalProperties: false
required: [UnprocessedItems]
properties:
UnprocessedItems:
type: object
additionalProperties:
type: array
items: { $ref: '#/components/schemas/WriteRequest' }
# -------------------------
# API: BatchGetItem
# -------------------------
KeysAndAttributes:
type: object
additionalProperties: true
required: [Keys]
properties:
Keys:
type: array
items: { $ref: '#/components/schemas/Key' }
ProjectionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
BatchGetItemRequest:
type: object
additionalProperties: true
required: [RequestItems]
properties:
RequestItems:
type: object
additionalProperties:
$ref: '#/components/schemas/KeysAndAttributes'
BatchGetItemResponse:
type: object
additionalProperties: false
required: [Responses, UnprocessedKeys]
properties:
Responses:
type: object
additionalProperties:
type: array
items: { $ref: '#/components/schemas/AttributeMap' }
UnprocessedKeys:
type: object
additionalProperties:
$ref: '#/components/schemas/KeysAndAttributes'
# -------------------------
# API: TransactWriteItems / TransactGetItems
# -------------------------
TransactWriteItemsRequest:
type: object
additionalProperties: true
required: [TransactItems]
properties:
TransactItems:
type: array
minItems: 1
maxItems: 100
items:
$ref: '#/components/schemas/TransactWriteItem'
TransactWriteItem:
type: object
additionalProperties: false
oneOf:
- required: [Put]
- required: [Delete]
- required: [Update]
- required: [ConditionCheck]
properties:
Put:
$ref: '#/components/schemas/TransactPut'
Delete:
$ref: '#/components/schemas/TransactDelete'
Update:
$ref: '#/components/schemas/TransactUpdate'
ConditionCheck:
$ref: '#/components/schemas/TransactConditionCheck'
TransactPut:
type: object
additionalProperties: true
required: [TableName, Item]
properties:
TableName: { type: string }
Item: { $ref: '#/components/schemas/AttributeMap' }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
TransactDelete:
type: object
additionalProperties: true
required: [TableName, Key]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
TransactUpdate:
type: object
additionalProperties: true
required: [TableName, Key, UpdateExpression]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
UpdateExpression: { type: string }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
TransactConditionCheck:
type: object
additionalProperties: true
required: [TableName, Key, ConditionExpression]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
ConditionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
ExpressionAttributeValues: { $ref: '#/components/schemas/ExpressionAttributeValues' }
TransactWriteItemsResponse:
$ref: '#/components/schemas/EmptyObject'
TransactGetItemsRequest:
type: object
additionalProperties: true
required: [TransactItems]
properties:
TransactItems:
type: array
minItems: 1
maxItems: 100
items:
type: object
additionalProperties: false
required: [Get]
properties:
Get:
$ref: '#/components/schemas/TransactGet'
TransactGet:
type: object
additionalProperties: true
required: [TableName, Key]
properties:
TableName: { type: string }
Key: { $ref: '#/components/schemas/Key' }
ProjectionExpression: { type: string }
ExpressionAttributeNames: { $ref: '#/components/schemas/ExpressionAttributeNames' }
TransactGetItemResult:
oneOf:
- $ref: '#/components/schemas/EmptyObject'
- type: object
additionalProperties: false
required: [Item]
properties:
Item: { $ref: '#/components/schemas/AttributeMap' }
TransactGetItemsResponse:
type: object
additionalProperties: false
required: [Responses]
properties:
Responses:
type: array
items: { $ref: '#/components/schemas/TransactGetItemResult' }