Files
catalyst/openapi.yml
2025-09-02 21:58:08 +02:00

1132 lines
50 KiB
YAML

openapi: 3.0.3
info:
title: Ticketing System API
version: 1.0.0
servers:
- description: Ticketing System API
url: '{scheme}://{address}:{port}'
variables:
address:
default: localhost
port:
default: "8081"
scheme:
default: http
enum:
- https
- http
paths:
/tickets:
get:
summary: List all tickets
operationId: listTickets
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of tickets", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedTicket" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tickets" } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
post:
summary: Create a new ticket
operationId: createTicket
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTicket" } } } }
responses:
"200": { "description": "Ticket created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ticket" } } } }
security: [ { "OAuth2": [ "ticket:write" ] } ]
/tickets/{id}:
get:
summary: Get a single ticket by ID
operationId: getTicket
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single ticket", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedTicket" } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
patch:
summary: Update a ticket by ID
operationId: updateTicket
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TicketUpdate" } } } }
responses:
"200": { "description": "Tickets updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Ticket" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
delete:
summary: Delete a ticket by ID
operationId: deleteTicket
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Tickets deleted" }
security: [ { OAuth2: [ "ticket:write" ] } ]
/comments:
get:
summary: List all comments
operationId: listComments
parameters:
- { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of comments", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedComment" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of comments" } } }
security: [ { "OAuth2": [ "ticket:read" ] } ]
post:
summary: Create a new comment
operationId: createComment
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewComment" } } } }
responses:
"200": { "description": "Comment created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Comment" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
/comments/{id}:
get:
summary: Get a single comment by ID
operationId: getComment
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single comment", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedComment" } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
patch:
summary: Update a comment by ID
operationId: updateComment
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommentUpdate" } } } }
responses:
"200": { "description": "Comment updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Comment" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
delete:
summary: Delete a comment by ID
operationId: deleteComment
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Comment deleted" }
security: [ { OAuth2: [ "ticket:write" ] } ]
/files:
get:
summary: List all files
operationId: listFiles
parameters:
- { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of files", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/File" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of files" } } }
security: [ { OAuth2: [ "file:read" ] } ]
post:
summary: Create a new file
operationId: createFile
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewFile" } } } }
responses:
"200": { "description": "File created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/File" } } } }
security: [ { OAuth2: [ "file:write" ] } ]
/files/{id}:
get:
summary: Get a single file by ID
operationId: getFile
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single file", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/File" } } } }
security: [ { OAuth2: [ "file:read" ] } ]
delete:
summary: Delete a file by ID
operationId: deleteFile
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "File deleted" }
security: [ { OAuth2: [ "file:write" ] } ]
/files/{id}/download:
get:
summary: Download a file by ID
operationId: downloadFile
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "File content", "content": { "application/octet-stream": { } }, "headers": { "Content-Disposition": { "schema": { "type": "string" } }, "Content-Type": { "schema": { "type": "string" } } } }
security: [ { OAuth2: [ "file:read" ] } ]
/links:
get:
summary: List all links
operationId: listLinks
parameters:
- { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of links", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Link" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of links" } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
post:
summary: Create a new link
operationId: createLink
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewLink" } } } }
responses:
"200": { "description": "Link created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
/links/{id}:
get:
summary: Get a single link by ID
operationId: getLink
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single link", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
patch:
summary: Update a link by ID
operationId: updateLink
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LinkUpdate" } } } }
responses:
"200": { "description": "Link updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Link" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
delete:
summary: Delete a link by ID
operationId: deleteLink
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Link deleted" }
security: [ { OAuth2: [ "ticket:write" ] } ]
/tasks:
get:
summary: List all tasks
operationId: listTasks
parameters:
- { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of tasks", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/ExtendedTask" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tasks" } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
post:
summary: Create a new task
operationId: createTask
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTask" } } } }
responses:
"200": { "description": "Task created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Task" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
/tasks/{id}:
get:
summary: Get a single task by ID
operationId: getTask
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single task", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ExtendedTask" } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
patch:
summary: Update a task by ID
operationId: updateTask
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskUpdate" } } } }
responses:
"200": { "description": "Task updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Task" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
delete:
summary: Delete a task by ID
operationId: deleteTask
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Task deleted" }
security: [ { OAuth2: [ "ticket:write" ] } ]
/timeline:
get:
summary: List all timeline items
operationId: listTimeline
parameters:
- { "name": "ticket", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of timeline items", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/TimelineEntry" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of timeline items" } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
post:
summary: Create a new timeline item
operationId: createTimeline
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewTimelineEntry" } } } }
responses:
"200": { "description": "Timeline item created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
/timeline/{id}:
get:
summary: Get a single timeline item by ID
operationId: getTimeline
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single timeline item", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
patch:
summary: Update a timeline item by ID
operationId: updateTimeline
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntryUpdate" } } } }
responses:
"200": { "description": "Timeline item updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TimelineEntry" } } } }
security: [ { OAuth2: [ "ticket:write" ] } ]
delete:
summary: Delete a timeline item by ID
operationId: deleteTimeline
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Timeline item deleted" }
security: [ { OAuth2: [ "ticket:write" ] } ]
/reactions:
get:
summary: List all reactions
operationId: listReactions
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of reactions", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Reaction" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of reactions" } } }
security: [ { OAuth2: [ "reaction:read" ] } ]
post:
summary: Create a new reaction
operationId: createReaction
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewReaction" } } } }
responses:
"200": { "description": "Reactions created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } }
security: [ { OAuth2: [ "reaction:write" ] } ]
/reactions/{id}:
get:
summary: Get a single reaction by ID
operationId: getReaction
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single reaction", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } }
security: [ { OAuth2: [ "reaction:read" ] } ]
patch:
summary: Update a reaction by ID
operationId: updateReaction
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ReactionUpdate" } } } }
responses:
"200": { "description": "Reactions updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Reaction" } } } }
security: [ { OAuth2: [ "reaction:write" ] } ]
delete:
summary: Delete a reaction by ID
operationId: deleteReaction
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Reactions deleted" }
security: [ { OAuth2: [ "reaction:write" ] } ]
/types:
get:
summary: List all types
operationId: listTypes
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of types", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Type" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of types" } } }
security: [ { OAuth2: [ "type:read" ] } ]
post:
summary: Create a new type
operationId: createType
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewType" } } } }
responses:
"200": { "description": "Types created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } }
security: [ { OAuth2: [ "type:write" ] } ]
/types/{id}:
get:
summary: Get a single type by ID
operationId: getType
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single type", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } }
security: [ { OAuth2: [ "type:read" ] } ]
patch:
summary: Update a type by ID
operationId: updateType
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TypeUpdate" } } } }
responses:
"200": { "description": "Types updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Type" } } } }
security: [ { OAuth2: [ "type:write" ] } ]
delete:
summary: Delete a type by ID
operationId: deleteType
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Types deleted" }
security: [ { OAuth2: [ "type:write" ] } ]
/users:
get:
summary: List all users
operationId: listUsers
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/User" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of users" } } }
security: [ { OAuth2: [ "user:read" ] } ]
post:
summary: Create a new user
operationId: createUser
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewUser" } } } }
responses:
"200": { "description": "Users created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } }
security: [ { OAuth2: [ "user:write" ] } ]
/users/{id}:
get:
summary: Get a single user by ID
operationId: getUser
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single user", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } }
security: [ { OAuth2: [ "user:read" ] } ]
patch:
summary: Update a user by ID
operationId: updateUser
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/UserUpdate" } } } }
responses:
"200": { "description": "Users updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/User" } } } }
security: [ { OAuth2: [ "user:write" ] } ]
delete:
summary: Delete a user by ID
operationId: deleteUser
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Users deleted" }
security: [ { OAuth2: [ "user:write" ] } ]
/users/{id}/groups:
get:
summary: List all groups for a user
operationId: listUserGroups
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of user groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } }
security: [ { OAuth2: [ "user:read" ] } ]
post:
summary: Add a group to a user
operationId: addUserGroup
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupRelation" } } } }
responses:
"201": { "description": "Group added to user" }
security: [ { OAuth2: [ "user:write" ] } ]
/users/{id}/permissions:
get:
summary: List all permissions for a user
operationId: listUserPermissions
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of user permissions", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } }
security: [ { OAuth2: [ "user:read" ] } ]
/users/{id}/groups/{groupId}:
delete:
summary: Remove a group from a user
operationId: removeUserGroup
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
- { "name": "groupId", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Group removed from user" }
security: [ { OAuth2: [ "user:write" ] } ]
/groups:
get:
summary: List all groups
operationId: listGroups
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Group" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of groups" } } }
security: [ { OAuth2: [ "group:read" ] } ]
post:
summary: Create a new group
operationId: createGroup
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewGroup" } } } }
responses:
"200": { "description": "Groups created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } }
security: [ { OAuth2: [ "group:write" ] } ]
/groups/{id}:
get:
summary: Get a single group by ID
operationId: getGroup
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single group", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } }
security: [ { OAuth2: [ "group:read" ] } ]
patch:
summary: Update a group by ID
operationId: updateGroup
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupUpdate" } } } }
responses:
"200": { "description": "Groups updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Group" } } } }
security: [ { OAuth2: [ "group:write" ] } ]
delete:
summary: Delete a group by ID
operationId: deleteGroup
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Groups deleted" }
security: [ { OAuth2: [ "group:write" ] } ]
/groups/{id}/parents:
get:
summary: List all parent groups for a group
operationId: listParentGroups
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of group groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } }
security: [ { OAuth2: [ "group:read" ] } ]
post:
summary: Add a parent group to another group
operationId: addGroupParent
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/GroupRelation" } } } }
responses:
"201": { "description": "Group added to group" }
security: [ { OAuth2: [ "group:write" ] } ]
/groups/{id}/children:
get:
summary: List all child groups for a group
operationId: listChildGroups
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of group groups", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/UserGroup" } } } } }
security: [ { OAuth2: [ "group:read" ] } ]
/groups/{id}/users:
get:
summary: List all users for a group
operationId: listGroupUsers
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of group users", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/GroupUser" } } } } }
security: [ { OAuth2: [ "group:read" ] } ]
/groups/{id}/permissions:
get:
summary: List all permissions for a group
operationId: listParentPermissions
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A list of group permissions", "content": { "application/json": { "schema": { "type": "array", "items": { "type": "string" } } } } }
security: [ { OAuth2: [ "group:read" ] } ]
/groups/{id}/groups/{parentGroupId}:
delete:
summary: Remove a parent group from another group
operationId: removeGroupParent
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
- { "name": "parentGroupId", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Group removed from group" }
security: [ { OAuth2: [ "group:write" ] } ]
/webhooks:
get:
summary: List all webhooks
operationId: listWebhooks
parameters:
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "A list of webhooks", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Webhook" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of webhooks" } } }
security: [ { OAuth2: [ "webhook:read" ] } ]
post:
summary: Create a new webhook
operationId: createWebhook
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/NewWebhook" } } } }
responses:
"200": { "description": "Webhooks created", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } }
security: [ { OAuth2: [ "webhook:write" ] } ]
/webhooks/{id}:
get:
summary: Get a single webhook by ID
operationId: getWebhook
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"200": { "description": "A single webhook", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } }
security: [ { OAuth2: [ "webhook:read" ] } ]
patch:
summary: Update a webhook by ID
operationId: updateWebhook
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/WebhookUpdate" } } } }
responses:
"200": { "description": "Webhooks updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Webhook" } } } }
security: [ { OAuth2: [ "webhook:write" ] } ]
delete:
summary: Delete a webhook by ID
operationId: deleteWebhook
parameters:
- { "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }
responses:
"204": { "description": "Webhooks deleted" }
security: [ { OAuth2: [ "webhook:write" ] } ]
/dashboard_counts:
get:
summary: Get dashboard summary counts
operationId: getDashboardCounts
responses:
"200": { "description": "Dashboard count data", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/DashboardCounts" } } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
/sidebar:
get:
summary: Get sidebar data
operationId: getSidebar
responses:
"200": { "description": "Sidebar content", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/Sidebar" } } } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
/ticket_search:
get:
summary: Search tickets with full join data
operationId: searchTickets
parameters:
- { "name": "query", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "type", "in": "query", "required": false, "schema": { "type": "string" } }
- { "name": "open", "in": "query", "required": false, "schema": { "type": "boolean" } }
- { "name": "offset", "in": "query", "required": false, "schema": { "type": "integer", "default": 0 } }
- { "name": "limit", "in": "query", "required": false, "schema": { "type": "integer", "default": 10 } }
responses:
"200": { "description": "Search results with aggregated data", "content": { "application/json": { "schema": { "type": "array", "items": { "$ref": "#/components/schemas/TicketSearch" } } } }, "headers": { "X-Total-Count": { "schema": { "type": "integer" }, "description": "Total number of tickets" } } }
security: [ { OAuth2: [ "ticket:read" ] } ]
/settings:
get:
summary: Get system settings
operationId: getSettings
responses:
"200": { "description": "System settings", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } }
security: [ { OAuth2: [ "settings:read" ] } ]
post:
summary: Update system settings
operationId: updateSettings
requestBody: { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } }
responses:
"200": { "description": "Settings updated", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Settings" } } } }
security: [ { OAuth2: [ "settings:write" ] } ]
/config:
get:
summary: Get the configuration
operationId: getConfig
responses:
"200": { "description": "The configuration", "content": { "application/json": { "schema": { "$ref": "#/components/schemas/Config" } } } }
components:
schemas:
NewComment:
type: object
properties:
ticket: { "type": "string" }
author: { "type": "string" }
message: { "type": "string" }
required: [ "ticket", "author", "message" ]
CommentUpdate:
type: object
properties:
author: { "type": "string" }
message: { "type": "string" }
Comment:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
author: { "type": "string" }
message: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "author", "message", "created", "updated" ]
ExtendedComment:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
author: { "type": "string" }
message: { "type": "string" }
author_name: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "author", "message", "author_name", "created", "updated" ]
NewFeature:
type: object
properties:
name: { "type": "string" }
required: [ "name" ]
Feature:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "name", "created", "updated" ]
NewFile:
type: object
properties:
ticket: { "type": "string" }
blob: { "type": "string" }
name: { "type": "string" }
required: [ "ticket", "blob", "name" ]
FileUpdate:
type: object
properties:
name: { "type": "string" }
File:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
name: { "type": "string" }
size: { "type": "number", "format": "double" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "name", "size", "created", "updated" ]
NewLink:
type: object
properties:
ticket: { "type": "string" }
name: { "type": "string" }
url: { "type": "string" }
required: [ "ticket", "name", "url" ]
LinkUpdate:
type: object
properties:
name: { "type": "string" }
url: { "type": "string" }
Link:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
name: { "type": "string" }
url: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "name", "url", "created", "updated" ]
NewReaction:
type: object
properties:
name: { "type": "string" }
action: { "type": "string" }
actiondata: { "type": "object" }
trigger: { "type": "string" }
triggerdata: { "type": "object" }
required: [ "name", "action", "actiondata", "trigger", "triggerdata" ]
ReactionUpdate:
type: object
properties:
name: { "type": "string" }
action: { "type": "string" }
actiondata: { "type": "object" }
trigger: { "type": "string" }
triggerdata: { "type": "object" }
Reaction:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
action: { "type": "string" }
actiondata: { "type": "object" }
trigger: { "type": "string" }
triggerdata: { "type": "object" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "name", "action", "actiondata", "trigger", "triggerdata", "created", "updated" ]
NewTask:
type: object
properties:
ticket: { "type": "string" }
name: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
required: [ "ticket", "name", "open" ]
TaskUpdate:
type: object
properties:
name: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
Task:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
name: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "name", "open", "created", "updated" ]
ExtendedTask:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
name: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
owner_name: { "type": "string" }
ticket_name: { "type": "string" }
ticket_type: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "name", "open", "ticket_name", "ticket_type", "created", "updated" ]
NewTicket:
type: object
properties:
type: { "type": "string" }
name: { "type": "string" }
description: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
resolution: { "type": "string" }
schema: { "type": "object" }
state: { "type": "object" }
required: [ "type", "name", "description", "open", "schema", "state" ]
TicketUpdate:
type: object
properties:
type: { "type": "string" }
name: { "type": "string" }
description: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
resolution: { "type": "string" }
schema: { "type": "object" }
state: { "type": "object" }
Ticket:
type: object
properties:
id: { "type": "string" }
type: { "type": "string" }
name: { "type": "string" }
description: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
resolution: { "type": "string" }
schema: { "type": "object" }
state: { "type": "object" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "type", "name", "description", "open", "schema", "state", "created", "updated" ]
ExtendedTicket:
type: object
properties:
id: { "type": "string" }
type: { "type": "string" }
name: { "type": "string" }
description: { "type": "string" }
open: { "type": "boolean" }
owner: { "type": "string" }
resolution: { "type": "string" }
schema: { "type": "object" }
state: { "type": "object" }
owner_name: { "type": "string" }
type_singular: { "type": "string" }
type_plural: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "type", "name", "description", "open", "schema", "state", "type_singular", "type_plural", "created", "updated" ]
NewTimelineEntry:
type: object
properties:
ticket: { "type": "string" }
message: { "type": "string" }
time: { "type": "string", "format": "date-time" }
required: [ "ticket", "message", "time" ]
TimelineEntryUpdate:
type: object
properties:
message: { "type": "string" }
time: { "type": "string", "format": "date-time" }
TimelineEntry:
type: object
properties:
id: { "type": "string" }
ticket: { "type": "string" }
message: { "type": "string" }
time: { "type": "string", "format": "date-time" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "ticket", "message", "time", "created", "updated" ]
NewType:
type: object
properties:
icon: { "type": "string" }
plural: { "type": "string" }
schema: { "type": "object" }
singular: { "type": "string" }
required: [ "singular", "plural", "schema" ]
TypeUpdate:
type: object
properties:
icon: { "type": "string" }
plural: { "type": "string" }
schema: { "type": "object" }
singular: { "type": "string" }
Type:
type: object
properties:
id: { "type": "string" }
icon: { "type": "string" }
plural: { "type": "string" }
schema: { "type": "object" }
singular: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "plural", "schema", "singular", "created", "updated" ]
NewUser:
type: object
properties:
username: { "type": "string" }
avatar: { "type": "string" }
email: { "type": "string" }
name: { "type": "string" }
active: { "type": "boolean" }
required: [ "username", "active" ]
UserUpdate:
type: object
properties:
username: { "type": "string" }
avatar: { "type": "string" }
email: { "type": "string" }
name: { "type": "string" }
password: { "type": "string" }
passwordConfirm: { "type": "string" }
active: { "type": "boolean" }
User:
type: object
properties:
id: { "type": "string" }
username: { "type": "string" }
avatar: { "type": "string" }
email: { "type": "string" }
lastResetSentAt: { "type": "string", "format": "date-time" }
lastVerificationSentAt: { "type": "string", "format": "date-time" }
name: { "type": "string" }
active: { "type": "boolean" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "username", "active", "created", "updated" ]
NewGroup:
type: object
properties:
name: { "type": "string" }
permissions: { "type": "array", "items": { "type": "string" } }
required: [ "name", "permissions" ]
GroupUpdate:
type: object
properties:
name: { "type": "string" }
permissions: { "type": "array", "items": { "type": "string" } }
Group:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
permissions: { "type": "array", "items": { "type": "string" } }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "name", "permissions", "created", "updated" ]
UserGroup:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
permissions: { "type": "array", "items": { "type": "string" } }
type: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "name", "permissions", "type", "created", "updated" ]
GroupUser:
type: object
properties:
id: { "type": "string" }
username: { "type": "string" }
avatar: { "type": "string" }
email: { "type": "string" }
lastResetSentAt: { "type": "string", "format": "date-time" }
lastVerificationSentAt: { "type": "string", "format": "date-time" }
name: { "type": "string" }
active: { "type": "boolean" }
type: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "username", "active", "type", "created", "updated" ]
GroupRelation:
type: object
properties:
group_id: { "type": "string" }
required: [ "group_id" ]
NewWebhook:
type: object
properties:
name: { "type": "string" }
collection: { "type": "string" }
destination: { "type": "string" }
required: [ "name", "collection", "destination" ]
WebhookUpdate:
type: object
properties:
name: { "type": "string" }
collection: { "type": "string" }
destination: { "type": "string" }
Webhook:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
collection: { "type": "string" }
destination: { "type": "string" }
created: { "type": "string", "format": "date-time" }
updated: { "type": "string", "format": "date-time" }
required: [ "id", "name", "collection", "destination", "created", "updated" ]
DashboardCounts:
type: object
properties:
id: { "type": "string" }
count: { "type": "integer" }
required: [ "id", "count" ]
Sidebar:
type: object
properties:
id: { "type": "string" }
singular: { "type": "string" }
plural: { "type": "string" }
icon: { "type": "string" }
count: { "type": "integer" }
required: [ "id", "singular", "plural", "count" ]
TicketSearch:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
description: { "type": "string" }
open: { "type": "boolean" }
type: { "type": "string" }
state: { "type": "object" }
owner_name: { "type": "string" }
created: { "type": "string", "format": "date-time" }
required: [ "id", "name", "description", "open", "type", "state", "owner_name", "created" ]
Config:
type: object
properties:
flags: { "type": "array", "items": { "type": "string" } }
permissions: { "type": "array", "items": { "type": "string" } }
tables: { "type": "array", "items": { "$ref": "#/components/schemas/Table" } }
required: [ "flags", "permissions", "tables" ]
Table:
type: object
properties:
id: { "type": "string" }
name: { "type": "string" }
required: [ "id", "name" ]
Settings:
type: object
properties:
meta:
$ref: '#/components/schemas/SettingsMeta'
smtp:
$ref: '#/components/schemas/SettingsSmtp'
required: [ "meta", "smtp" ]
SettingsMeta:
type: object
properties:
app_name:
type: string
app_url:
type: string
sender_name:
type: string
sender_address:
type: string
reset_password_template:
$ref: '#/components/schemas/EmailTemplate'
required: [ "app_name", "app_url", "sender_name", "sender_address", "reset_password_template" ]
SettingsSmtp:
type: object
properties:
enabled:
type: boolean
host:
type: string
port:
type: integer
username:
type: string
password:
type: string
auth_method:
type: string
tls:
type: boolean
local_name:
type: string
required: [ "enabled", "host", "port", "username", "password", "auth_method", "tls", "local_name" ]
EmailTemplate:
type: object
properties:
body:
type: string
subject:
type: string
required: [ "body", "subject" ]
Error:
type: object
properties:
status: { "type": "integer" }
error: { "type": "string" }
message: { "type": "string" }
required: [ "status", "error", "message" ]
securitySchemes:
OAuth2:
type: oauth2
flows:
authorizationCode:
authorizationUrl: /oauth/authorize
tokenUrl: /oauth/token
scopes:
user:read: Read user data
user:write: Write user data
group:read: Read group data
group:write: Write group data
ticket:read: Read ticket data
ticket:write: Write ticket data
comment:read: Read comment data
comment:write: Write comment data
file:read: Read file data
file:write: Write file data
link:read: Read link data
link:write: Write link data
reaction:read: Read reaction data
reaction:write: Write reaction data
task:read: Read task data
task:write: Write task data
feature:read: Read feature data
feature:write: Write feature data
webhook:read: Read webhook data
webhook:write: Write webhook data
settings:read: Read settings data
settings:write: Write settings data