feat(owner): land owner-controlled packet sharing (rescued VPS WIP) (#101)

* feat(owner): add owner-controlled packet sharing

* docs: record B3 packet-sharing handoff

* docs(api): regenerate openapi for packet-sharing routes

* test(db): extend migration registry expectation to 052-054

---------

Co-authored-by: gadgethd <111318106+gadgethd@users.noreply.github.com>
This commit is contained in:
hermes-gadgetandgadgethd authored and GitHub committed 2026-10-01 00:39:40 +01:00
1 parent 029cc6ac33
commit 24206957bb
25 files changed
+2065 -34

No files matched your search

+403
View File
@@ -3419,6 +3419,409 @@
]
}
},
"/api/owner/packet-sharing": {
"get": {
"summary": "Read owner packet-sharing settings",
"operationId": "get-owner-packet-sharing",
"tags": [
"owner"
],
"x-access": "owner",
"parameters": [
{
"name": "nodeId",
"in": "query",
"required": false,
"schema": {
"type": "string",
"pattern": "^[0-9A-Fa-f]{64}$"
}
}
],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"nodeId",
"featureEnabled",
"enabled",
"destinations"
],
"properties": {
"nodeId": {
"type": "string",
"pattern": "^[0-9A-Fa-f]{64}$"
},
"featureEnabled": {
"type": "boolean"
},
"enabled": {
"type": "boolean"
},
"destinations": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"name",
"websiteUrl",
"description",
"configured",
"selected",
"lastForwardedAt"
],
"properties": {
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,63}$"
},
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120
},
"websiteUrl": {
"type": [
"string",
"null"
],
"format": "uri",
"maxLength": 2048
},
"description": {
"type": [
"string",
"null"
],
"maxLength": 160
},
"configured": {
"type": "boolean"
},
"selected": {
"type": "boolean"
},
"lastForwardedAt": {
"type": [
"string",
"null"
],
"format": "date-time"
}
},
"additionalProperties": false
}
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid or out-of-bounds request",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Authentication required",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"403": {
"description": "Authentication or CSRF validation failed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "Rate limit exceeded",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
}
},
"security": [
{
"ownerSession": []
}
]
},
"post": {
"summary": "Update owner packet-sharing settings",
"operationId": "post-owner-packet-sharing",
"tags": [
"owner"
],
"x-access": "owner",
"parameters": [],
"responses": {
"200": {
"description": "Successful response",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"nodeId",
"enabled",
"destinationIds"
],
"properties": {
"nodeId": {
"type": "string",
"pattern": "^[0-9A-Fa-f]{64}$"
},
"enabled": {
"type": "boolean"
},
"destinationIds": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,63}$"
}
}
},
"additionalProperties": false
}
}
}
},
"400": {
"description": "Invalid or out-of-bounds request",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"401": {
"description": "Authentication required",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"403": {
"description": "Authentication or CSRF validation failed",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"409": {
"description": "One or more selected destinations are not configured",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"429": {
"description": "Rate limit exceeded",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
},
"500": {
"description": "Internal server error",
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"error"
],
"properties": {
"error": {
"type": "string"
}
},
"additionalProperties": false
}
}
}
}
},
"security": [
{
"ownerSession": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"required": [
"nodeId",
"enabled",
"destinationIds"
],
"properties": {
"nodeId": {
"type": "string",
"pattern": "^[0-9A-Fa-f]{64}$"
},
"enabled": {
"type": "boolean"
},
"destinationIds": {
"type": "array",
"maxItems": 32,
"items": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9_-]{0,63}$"
}
}
},
"additionalProperties": false
}
}
}
}
}
},
"/api/owner/session": {
"get": {
"summary": "Read owner session",