617 lines
19 KiB
YAML
617 lines
19 KiB
YAML
openapi: 3.0.3
|
|
info:
|
|
title: Insforge Functions API
|
|
version: 1.0.0
|
|
description: Serverless functions running in Deno runtime
|
|
|
|
paths:
|
|
/api/functions:
|
|
get:
|
|
summary: List all functions
|
|
description: Get all functions with their metadata
|
|
tags:
|
|
- Admin
|
|
security:
|
|
- bearerAuth: []
|
|
responses:
|
|
'200':
|
|
description: List of functions
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: array
|
|
items:
|
|
$ref: '#/components/schemas/FunctionMetadata'
|
|
example:
|
|
- id: "123e4567-e89b-12d3-a456-426614174000"
|
|
slug: "hello-world"
|
|
name: "Hello World Function"
|
|
description: "Returns a greeting message"
|
|
status: "active"
|
|
created_at: "2024-01-21T10:30:00Z"
|
|
updated_at: "2024-01-21T10:35:00Z"
|
|
deployed_at: "2024-01-21T10:35:00Z"
|
|
- id: "223e4567-e89b-12d3-a456-426614174001"
|
|
slug: "process-webhook"
|
|
name: "Webhook Processor"
|
|
description: "Processes incoming webhooks"
|
|
status: "draft"
|
|
created_at: "2024-01-22T14:20:00Z"
|
|
updated_at: "2024-01-22T14:20:00Z"
|
|
deployed_at: null
|
|
'401':
|
|
description: Unauthorized
|
|
'403':
|
|
description: Forbidden - Admin only
|
|
'500':
|
|
description: Failed to list functions
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
post:
|
|
summary: Create new function
|
|
description: Create a new function with code that runs in Deno runtime
|
|
tags:
|
|
- Admin
|
|
security:
|
|
- bearerAuth: []
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
required:
|
|
- name
|
|
- code
|
|
properties:
|
|
name:
|
|
type: string
|
|
minLength: 1
|
|
description: Display name for the function
|
|
example: "Hello World Function"
|
|
slug:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: URL-friendly identifier (auto-generated from name if not provided)
|
|
example: "hello-world"
|
|
code:
|
|
type: string
|
|
minLength: 1
|
|
description: JavaScript/TypeScript code that exports an async function
|
|
example: |
|
|
export default async function(request) {
|
|
const { name = 'World' } = await request.json();
|
|
return new Response(
|
|
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
{ headers: { 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
description:
|
|
type: string
|
|
description: Description of what the function does
|
|
example: "Returns a personalized greeting message"
|
|
status:
|
|
type: string
|
|
enum: ["draft", "active"]
|
|
default: "active"
|
|
description: Initial status (draft or active/deployed)
|
|
responses:
|
|
'201':
|
|
description: Function created successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
function:
|
|
$ref: '#/components/schemas/FunctionMetadata'
|
|
example:
|
|
success: true
|
|
function:
|
|
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
slug: "hello-world"
|
|
name: "Hello World Function"
|
|
description: "Returns a greeting message"
|
|
status: "active"
|
|
created_at: "2024-01-21T10:30:00Z"
|
|
'400':
|
|
description: Invalid request
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
examples:
|
|
validation:
|
|
value:
|
|
error: "Invalid request"
|
|
details:
|
|
- code: "too_small"
|
|
minimum: 1
|
|
path: ["name"]
|
|
message: "Name is required"
|
|
dangerousCode:
|
|
value:
|
|
error: "Code contains potentially dangerous patterns"
|
|
pattern: "/Deno\\.run/i"
|
|
'409':
|
|
description: Function slug already exists
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function with this slug already exists"
|
|
details: "duplicate key value violates unique constraint"
|
|
'500':
|
|
description: Failed to create function
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
/api/functions/{slug}:
|
|
get:
|
|
summary: Get function details
|
|
description: Get a specific function including its code
|
|
tags:
|
|
- Admin
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
responses:
|
|
'200':
|
|
description: Function details with code
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/FunctionDetails'
|
|
example:
|
|
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
slug: "hello-world"
|
|
name: "Hello World Function"
|
|
description: "Returns a greeting message"
|
|
code: |
|
|
export default async function(request) {
|
|
const { name = 'World' } = await request.json();
|
|
return new Response(
|
|
JSON.stringify({ message: `Hello, ${name}!` }),
|
|
{ headers: { 'Content-Type': 'application/json' } }
|
|
);
|
|
}
|
|
status: "active"
|
|
created_at: "2024-01-21T10:30:00Z"
|
|
updated_at: "2024-01-21T10:35:00Z"
|
|
deployed_at: "2024-01-21T10:35:00Z"
|
|
'404':
|
|
description: Function not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function not found"
|
|
'401':
|
|
description: Unauthorized
|
|
'403':
|
|
description: Forbidden - Admin only
|
|
'500':
|
|
description: Failed to get function
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
put:
|
|
summary: Update function
|
|
description: Update an existing function's code or metadata
|
|
tags:
|
|
- Admin
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
requestBody:
|
|
required: true
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
name:
|
|
type: string
|
|
description: New display name
|
|
code:
|
|
type: string
|
|
description: Updated function code
|
|
description:
|
|
type: string
|
|
description: Updated description
|
|
status:
|
|
type: string
|
|
enum: ["draft", "active", "error"]
|
|
description: Function status
|
|
responses:
|
|
'200':
|
|
description: Function updated successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
function:
|
|
$ref: '#/components/schemas/FunctionMetadata'
|
|
example:
|
|
success: true
|
|
function:
|
|
id: "123e4567-e89b-12d3-a456-426614174000"
|
|
slug: "hello-world"
|
|
name: "Hello World Function v2"
|
|
description: "Returns a greeting message"
|
|
status: "active"
|
|
updated_at: "2024-01-21T11:00:00Z"
|
|
'400':
|
|
description: Invalid request
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
'404':
|
|
description: Function not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function not found"
|
|
'500':
|
|
description: Failed to update function
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
delete:
|
|
summary: Delete function
|
|
description: Permanently delete a function
|
|
tags:
|
|
- Admin
|
|
security:
|
|
- bearerAuth: []
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
responses:
|
|
'200':
|
|
description: Function deleted successfully
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
properties:
|
|
success:
|
|
type: boolean
|
|
message:
|
|
type: string
|
|
example:
|
|
success: true
|
|
message: "Function hello-world deleted successfully"
|
|
'404':
|
|
description: Function not found
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function not found"
|
|
'500':
|
|
description: Failed to delete function
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
/functions/{slug}:
|
|
get:
|
|
summary: Execute function (GET)
|
|
description: Execute a function using GET method. Proxied to Deno runtime.
|
|
tags:
|
|
- Client
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
responses:
|
|
'200':
|
|
description: Function executed successfully
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
example:
|
|
message: "Hello, World!"
|
|
'404':
|
|
description: Function not found or not active
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function not found or not active"
|
|
'502':
|
|
description: Failed to proxy to Deno runtime
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Failed to connect to Deno runtime"
|
|
|
|
post:
|
|
summary: Execute function (POST)
|
|
description: Execute a function using POST method with JSON body. Proxied to Deno runtime.
|
|
tags:
|
|
- Client
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
requestBody:
|
|
required: false
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
example:
|
|
name: "John"
|
|
age: 30
|
|
responses:
|
|
'200':
|
|
description: Function executed successfully
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
example:
|
|
message: "Hello, John!"
|
|
'404':
|
|
description: Function not found or not active
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Function not found or not active"
|
|
'502':
|
|
description: Failed to proxy to Deno runtime
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
example:
|
|
error: "Failed to connect to Deno runtime"
|
|
|
|
put:
|
|
summary: Execute function (PUT)
|
|
description: Execute a function using PUT method. Proxied to Deno runtime.
|
|
tags:
|
|
- Client
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
requestBody:
|
|
required: false
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
responses:
|
|
'200':
|
|
description: Function executed successfully
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
'502':
|
|
description: Failed to proxy to Deno runtime
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
patch:
|
|
summary: Execute function (PATCH)
|
|
description: Execute a function using PATCH method. Proxied to Deno runtime.
|
|
tags:
|
|
- Client
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
requestBody:
|
|
required: false
|
|
content:
|
|
application/json:
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
responses:
|
|
'200':
|
|
description: Function executed successfully
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
'502':
|
|
description: Failed to proxy to Deno runtime
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
delete:
|
|
summary: Execute function (DELETE)
|
|
description: Execute a function using DELETE method. Proxied to Deno runtime.
|
|
tags:
|
|
- Client
|
|
parameters:
|
|
- name: slug
|
|
in: path
|
|
required: true
|
|
schema:
|
|
type: string
|
|
pattern: '^[a-zA-Z0-9_-]+$'
|
|
description: Function slug identifier
|
|
example: "hello-world"
|
|
responses:
|
|
'200':
|
|
description: Function executed successfully
|
|
content:
|
|
'*/*':
|
|
schema:
|
|
type: object
|
|
additionalProperties: true
|
|
'502':
|
|
description: Failed to proxy to Deno runtime
|
|
content:
|
|
application/json:
|
|
schema:
|
|
$ref: '#/components/schemas/ErrorResponse'
|
|
|
|
components:
|
|
securitySchemes:
|
|
bearerAuth:
|
|
type: http
|
|
scheme: bearer
|
|
bearerFormat: JWT
|
|
|
|
schemas:
|
|
FunctionMetadata:
|
|
type: object
|
|
properties:
|
|
id:
|
|
type: string
|
|
format: uuid
|
|
description: Unique identifier for the function
|
|
slug:
|
|
type: string
|
|
description: URL-friendly identifier
|
|
example: "hello-world"
|
|
name:
|
|
type: string
|
|
description: Display name for the function
|
|
example: "Hello World Function"
|
|
description:
|
|
type: string
|
|
nullable: true
|
|
description: Description of what the function does
|
|
status:
|
|
type: string
|
|
enum: ["draft", "active", "error"]
|
|
description: Current status of the function
|
|
created_at:
|
|
type: string
|
|
format: date-time
|
|
description: When the function was created
|
|
updated_at:
|
|
type: string
|
|
format: date-time
|
|
description: When the function was last updated
|
|
deployed_at:
|
|
type: string
|
|
format: date-time
|
|
nullable: true
|
|
description: When the function was last deployed (null if never deployed)
|
|
required:
|
|
- id
|
|
- slug
|
|
- name
|
|
- status
|
|
- created_at
|
|
- updated_at
|
|
|
|
FunctionDetails:
|
|
allOf:
|
|
- $ref: '#/components/schemas/FunctionMetadata'
|
|
- type: object
|
|
properties:
|
|
code:
|
|
type: string
|
|
description: The function's JavaScript/TypeScript code
|
|
required:
|
|
- code
|
|
|
|
ErrorResponse:
|
|
type: object
|
|
properties:
|
|
error:
|
|
type: string
|
|
description: Error message
|
|
details:
|
|
oneOf:
|
|
- type: string
|
|
- type: array
|
|
items:
|
|
type: object
|
|
- type: object
|
|
description: Additional error details
|
|
message:
|
|
type: string
|
|
description: Detailed error message
|
|
pattern:
|
|
type: string
|
|
description: Pattern that caused validation failure (for dangerous code detection) |