Feat triggers v0.2.2 (#6)
All checks were successful
CI/CD / detect-changes (push) Successful in 5s
CI/CD / test-frontend (push) Has been skipped
CI/CD / test-go-pg (push) Successful in 2m18s
CI/CD / test-sqlite (push) Successful in 2m37s
CI/CD / build-and-deploy (push) Successful in 1m26s

Co-authored-by: Jeffrey Smith <jasafpro@gmail.com>
Co-committed-by: Jeffrey Smith <jasafpro@gmail.com>
This commit was merged in pull request #6.
This commit is contained in:
2026-03-26 22:47:31 +00:00
committed by xcaliber
parent 342f9e3eb4
commit 57ccf19efb
29 changed files with 3237 additions and 3 deletions

View File

@@ -59,6 +59,10 @@ tags:
- name: 'Admin: Packages'
- name: 'Admin: System'
- name: 'Admin: Workflows'
- name: Triggers
- name: Schedules
- name: 'Admin: Triggers'
- name: 'Admin: Schedules'
security:
- BearerAuth: []
@@ -82,6 +86,56 @@ components:
type: string
required: [error]
Trigger:
type: object
properties:
id: { type: string, format: uuid }
package_id: { type: string }
type: { type: string, enum: [webhook, event] }
enabled: { type: boolean }
slug: { type: string }
event_pattern: { type: string }
entry_point: { type: string }
config: { type: object }
fire_count: { type: integer }
last_fire_at: { type: string, format: date-time, nullable: true }
last_error: { type: string }
created_at: { type: string, format: date-time }
updated_at: { type: string, format: date-time }
ScheduledTask:
type: object
properties:
id: { type: string, format: uuid }
name: { type: string }
description: { type: string }
creator_id: { type: string, format: uuid }
run_as: { type: string, enum: [creator, system] }
cron_expr: { type: string }
next_fire_at: { type: string, format: date-time, nullable: true }
last_fire_at: { type: string, format: date-time, nullable: true }
enabled: { type: boolean }
script: { type: string }
template_id: { type: string, nullable: true }
template_params: { type: object }
fire_count: { type: integer }
last_error: { type: string }
last_duration_ms: { type: integer, nullable: true }
created_at: { type: string, format: date-time }
updated_at: { type: string, format: date-time }
TriggerLog:
type: object
properties:
id: { type: string, format: uuid }
trigger_id: { type: string, format: uuid, nullable: true }
scheduled_task_id: { type: string, format: uuid, nullable: true }
fired_at: { type: string, format: date-time }
duration_ms: { type: integer, nullable: true }
success: { type: boolean }
error: { type: string }
output: { type: string }
TokenResponse:
type: object
properties:
@@ -4205,3 +4259,347 @@ paths:
application/json:
schema:
$ref: '#/components/schemas/ErrorResponse'
# ──────────────────────────────────────────────
# Webhook Inbound (v0.2.2)
# ──────────────────────────────────────────────
/api/v1/hooks/{package_id}/{slug}:
post:
summary: Inbound webhook trigger
description: Public endpoint. HMAC-SHA256 verified via X-Switchboard-Signature header.
operationId: webhookInbound
tags: [Triggers]
security: []
parameters:
- name: package_id
in: path
required: true
schema: { type: string }
- name: slug
in: path
required: true
schema: { type: string }
requestBody:
content:
application/json:
schema: { type: object }
responses:
'200':
description: Webhook processed
content:
application/json:
schema: { type: object }
'401':
description: Invalid signature
'404':
description: Webhook not found
# ──────────────────────────────────────────────
# Scheduled Tasks — User (v0.2.2)
# ──────────────────────────────────────────────
/api/v1/schedules:
get:
summary: List my scheduled tasks
operationId: listMySchedules
tags: [Schedules]
responses:
'200':
description: Schedules list
content:
application/json:
schema:
type: object
properties:
schedules:
type: array
items: { $ref: '#/components/schemas/ScheduledTask' }
post:
summary: Create a scheduled task
operationId: createSchedule
tags: [Schedules]
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [name, cron_expr]
properties:
name: { type: string }
description: { type: string }
cron_expr: { type: string, example: '0 9 * * 1-5' }
script: { type: string }
template_id: { type: string }
template_params: { type: object }
responses:
'201':
description: Created
content:
application/json:
schema: { $ref: '#/components/schemas/ScheduledTask' }
/api/v1/schedules/{id}:
get:
summary: Get a scheduled task
operationId: getSchedule
tags: [Schedules]
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Schedule details
content:
application/json:
schema: { $ref: '#/components/schemas/ScheduledTask' }
put:
summary: Update a scheduled task
operationId: updateSchedule
tags: [Schedules]
parameters:
- $ref: '#/components/parameters/idPath'
requestBody:
content:
application/json:
schema:
type: object
properties:
name: { type: string }
description: { type: string }
cron_expr: { type: string }
script: { type: string }
enabled: { type: boolean }
responses:
'200':
description: Updated
delete:
summary: Delete a scheduled task
operationId: deleteSchedule
tags: [Schedules]
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Deleted
/api/v1/schedules/{id}/run:
post:
summary: Manually trigger a scheduled task
operationId: runSchedule
tags: [Schedules]
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'202':
description: Task queued
/api/v1/schedules/{id}/logs:
get:
summary: List execution logs for a scheduled task
operationId: listScheduleLogs
tags: [Schedules]
parameters:
- $ref: '#/components/parameters/idPath'
- name: limit
in: query
schema: { type: integer, default: 50 }
responses:
'200':
description: Execution logs
content:
application/json:
schema:
type: object
properties:
logs:
type: array
items: { $ref: '#/components/schemas/TriggerLog' }
# ──────────────────────────────────────────────
# Admin: Triggers (v0.2.2)
# ──────────────────────────────────────────────
/api/v1/admin/triggers:
get:
summary: List all extension triggers
operationId: adminListTriggers
tags: ['Admin: Triggers']
parameters:
- name: package_id
in: query
schema: { type: string }
- name: type
in: query
schema: { type: string, enum: [webhook, event] }
- name: enabled
in: query
schema: { type: string, enum: ['true', 'false'] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: offset
in: query
schema: { type: integer, default: 0 }
responses:
'200':
description: Trigger list
content:
application/json:
schema:
type: object
properties:
triggers:
type: array
items: { $ref: '#/components/schemas/Trigger' }
total: { type: integer }
/api/v1/admin/triggers/{id}:
get:
summary: Get a single trigger
operationId: adminGetTrigger
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Trigger details
content:
application/json:
schema: { $ref: '#/components/schemas/Trigger' }
delete:
summary: Delete a trigger
operationId: adminDeleteTrigger
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Deleted
/api/v1/admin/triggers/{id}/enable:
put:
summary: Enable a trigger
operationId: adminEnableTrigger
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Enabled
/api/v1/admin/triggers/{id}/disable:
put:
summary: Disable a trigger
operationId: adminDisableTrigger
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Disabled
/api/v1/admin/triggers/{id}/logs:
get:
summary: List trigger execution logs
operationId: adminListTriggerLogs
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
- name: limit
in: query
schema: { type: integer, default: 50 }
responses:
'200':
description: Execution logs
content:
application/json:
schema:
type: object
properties:
logs:
type: array
items: { $ref: '#/components/schemas/TriggerLog' }
/api/v1/admin/packages/{id}/triggers:
get:
summary: List triggers for a package
operationId: adminListPackageTriggers
tags: ['Admin: Triggers']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Package triggers
content:
application/json:
schema:
type: object
properties:
triggers:
type: array
items: { $ref: '#/components/schemas/Trigger' }
# ──────────────────────────────────────────────
# Admin: Schedules (v0.2.2)
# ──────────────────────────────────────────────
/api/v1/admin/schedules:
get:
summary: List all scheduled tasks (admin view)
operationId: adminListSchedules
tags: ['Admin: Schedules']
parameters:
- name: creator_id
in: query
schema: { type: string }
- name: enabled
in: query
schema: { type: string, enum: ['true', 'false'] }
- name: limit
in: query
schema: { type: integer, default: 50 }
- name: offset
in: query
schema: { type: integer, default: 0 }
responses:
'200':
description: Schedules list
content:
application/json:
schema:
type: object
properties:
schedules:
type: array
items: { $ref: '#/components/schemas/ScheduledTask' }
total: { type: integer }
/api/v1/admin/schedules/{id}/enable:
put:
summary: Enable a scheduled task
operationId: adminEnableSchedule
tags: ['Admin: Schedules']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Enabled
/api/v1/admin/schedules/{id}/disable:
put:
summary: Disable a scheduled task
operationId: adminDisableSchedule
tags: ['Admin: Schedules']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Disabled
/api/v1/admin/schedules/{id}:
delete:
summary: Delete a scheduled task
operationId: adminDeleteSchedule
tags: ['Admin: Schedules']
parameters:
- $ref: '#/components/parameters/idPath'
responses:
'200':
description: Deleted