diff --git a/.gitignore b/.gitignore index 075044273..fb0b1b84b 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,10 @@ cx # Test sources live in the adjacent private core-tests repository and are # overlaid onto this checkout by its runners. *_test.go +!/internal/database/gitlab_schema_test.go +!/internal/scm/gitlab_test.go +!/internal/services/planning_milestones_release_test.go +!/internal/utils/repository_path_test.go *_test.sh *.test.js *.test.ts diff --git a/api/openapi-v2.json b/api/openapi-v2.json index bc40107f2..a28f4b7e3 100644 --- a/api/openapi-v2.json +++ b/api/openapi-v2.json @@ -7911,6 +7911,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -7936,6 +7975,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -7944,6 +7988,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -7968,9 +8021,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -7996,6 +8059,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -8021,6 +8123,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -8029,6 +8136,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -8053,9 +8169,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -8954,6 +9080,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -8979,6 +9144,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -8987,6 +9157,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -9011,9 +9190,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -9039,6 +9228,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -9064,6 +9292,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -9072,6 +9305,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -9096,9 +9338,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -10116,6 +10368,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -10141,6 +10432,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -10149,6 +10445,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -10173,9 +10478,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -10201,6 +10516,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -10226,6 +10580,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -10234,6 +10593,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -10258,9 +10626,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -11024,6 +11402,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -11049,6 +11466,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -11057,6 +11479,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -11081,9 +11512,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -11109,6 +11550,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -11134,6 +11614,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -11142,6 +11627,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -11166,9 +11660,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -11765,6 +12269,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -11790,6 +12333,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -11798,6 +12346,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -11822,9 +12379,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -11850,6 +12417,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -11875,6 +12481,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -11883,6 +12494,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -11907,9 +12527,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -12550,6 +13180,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -12575,6 +13244,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -12583,6 +13257,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -12607,9 +13290,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -12635,6 +13328,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -12660,6 +13392,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -12668,6 +13405,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -12692,9 +13438,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -13392,6 +14148,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -13417,6 +14212,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -13425,6 +14225,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -13449,9 +14258,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -13477,6 +14296,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -13502,6 +14360,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -13510,6 +14373,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -13534,9 +14406,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -16117,6 +16999,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -16142,6 +17063,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -16150,6 +17076,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -16174,9 +17109,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -16202,6 +17147,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -16227,6 +17211,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -16235,6 +17224,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -16259,9 +17257,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -17070,6 +18078,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -17095,6 +18142,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -17103,6 +18155,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -17127,9 +18188,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -17155,6 +18226,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -17180,6 +18290,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -17188,6 +18303,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -17212,9 +18336,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -18180,6 +19314,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -18205,6 +19378,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -18213,6 +19391,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -18237,9 +19424,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -18265,6 +19462,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -18290,6 +19526,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -18298,6 +19539,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -18322,9 +19572,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -18946,6 +20206,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -18971,6 +20270,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -18979,6 +20283,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -19003,9 +20316,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -19031,6 +20354,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -19056,6 +20418,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -19064,6 +20431,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -19088,9 +20464,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -20723,6 +22109,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -20748,6 +22173,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -20756,6 +22186,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -20780,9 +22219,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -20808,6 +22257,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -20833,6 +22321,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -20841,6 +22334,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -20865,9 +22367,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -21019,6 +22531,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -21044,6 +22595,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -21052,6 +22608,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -21076,9 +22641,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -21104,6 +22679,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -21129,6 +22743,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -21137,6 +22756,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -21161,9 +22789,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -27162,6 +28800,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -27187,6 +28864,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -27195,6 +28877,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -27219,9 +28910,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -27247,6 +28948,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -27272,6 +29012,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -27280,6 +29025,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -27304,9 +29058,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -27410,6 +29174,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -27435,6 +29238,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -27443,6 +29251,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -27467,9 +29284,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -27495,6 +29322,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -27520,6 +29386,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -27528,6 +29399,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -27552,9 +29432,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -31185,6 +33075,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -31210,6 +33139,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -31218,6 +33152,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -31242,9 +33185,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -31270,6 +33223,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -31295,6 +33287,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -31303,6 +33300,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -31327,9 +33333,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -33046,6 +35062,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -33071,6 +35126,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -33079,6 +35139,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -33103,9 +35172,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -33131,6 +35210,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -33156,6 +35274,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -33164,6 +35287,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -33188,9 +35320,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -33831,6 +35973,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -33856,6 +36037,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -33864,6 +36050,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -33888,9 +36083,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -33916,6 +36121,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -33941,6 +36185,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -33949,6 +36198,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -33973,9 +36231,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -34673,6 +36941,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -34698,6 +37005,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -34706,6 +37018,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -34730,9 +37051,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -34758,6 +37089,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -34783,6 +37153,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -34791,6 +37166,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -34815,9 +37199,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -36552,6 +38946,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -36577,6 +39010,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -36585,6 +39023,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -36609,9 +39056,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -36637,6 +39094,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -36662,6 +39158,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -36670,6 +39171,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -36694,9 +39204,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -41368,6 +43888,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -41393,6 +43952,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -41401,6 +43965,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -41425,9 +43998,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -41453,6 +44036,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -41478,6 +44100,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -41486,6 +44113,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -41510,9 +44146,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -42313,6 +44959,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -42338,6 +45023,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -42346,6 +45036,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -42370,9 +45069,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -42398,6 +45107,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -42423,6 +45171,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -42431,6 +45184,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -42455,9 +45217,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -43124,6 +45896,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -43149,6 +45960,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -43157,6 +45973,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -43181,9 +46006,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -43209,6 +46044,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -43234,6 +46108,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -43242,6 +46121,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -43266,9 +46154,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -45262,6 +48160,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -45287,6 +48224,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -45295,6 +48237,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -45319,9 +48270,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -45347,6 +48308,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -45372,6 +48372,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -45380,6 +48385,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -45404,9 +48418,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -51482,6 +54506,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -51507,6 +54570,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -51515,6 +54583,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -51539,9 +54616,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -51567,6 +54654,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -51592,6 +54718,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -51600,6 +54731,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -51624,9 +54764,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -52248,6 +55398,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -52273,6 +55462,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -52281,6 +55475,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -52305,9 +55508,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -52333,6 +55546,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -52358,6 +55610,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -52366,6 +55623,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -52390,9 +55656,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -53028,6 +56304,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -53053,6 +56368,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -53061,6 +56381,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -53085,9 +56414,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -53113,6 +56452,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -53138,6 +56516,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -53146,6 +56529,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -53170,9 +56562,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -53820,6 +57222,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -53845,6 +57286,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -53853,6 +57299,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -53877,9 +57332,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -53905,6 +57370,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -53930,6 +57434,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -53938,6 +57447,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -53962,9 +57480,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -54704,6 +58232,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -54729,6 +58296,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -54737,6 +58309,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -54761,9 +58342,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -54789,6 +58380,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -54814,6 +58444,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -54822,6 +58457,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -54846,9 +58490,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -55545,6 +59199,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -55570,6 +59263,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -55578,6 +59276,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -55602,9 +59309,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -55630,6 +59347,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -55655,6 +59411,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -55663,6 +59424,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -55687,9 +59457,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -56728,6 +60508,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -56753,6 +60572,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -56761,6 +60585,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -56785,9 +60618,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -56813,6 +60656,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -56838,6 +60720,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -56846,6 +60733,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -56870,9 +60766,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -57990,6 +61896,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -58015,6 +61960,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -58023,6 +61973,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -58047,9 +62006,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -58075,6 +62044,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -58100,6 +62108,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -58108,6 +62121,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -58132,9 +62154,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -58875,6 +62907,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -58900,6 +62971,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -58908,6 +62984,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -58932,9 +63017,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -58960,6 +63055,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -58985,6 +63119,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -58993,6 +63132,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -59017,9 +63165,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -59709,6 +63867,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -59734,6 +63931,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -59742,6 +63944,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -59766,9 +63977,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -59794,6 +64015,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -59819,6 +64079,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -59827,6 +64092,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -59851,9 +64125,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -61059,6 +65343,10 @@ "description": "The is prerelease value.", "type": "boolean" }, + "mode": { + "description": "The mode value.", + "type": "string" + }, "name": { "description": "The name value.", "type": "string" @@ -61085,6 +65373,7 @@ "connection_id", "is_draft", "is_prerelease", + "mode", "name", "repository", "repository_id", @@ -61139,6 +65428,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -61164,6 +65492,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -61172,6 +65505,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -61196,9 +65538,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -61224,6 +65576,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -61249,6 +65640,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -61257,6 +65653,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -61281,9 +65686,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -61462,6 +65877,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -61487,6 +65941,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -61495,6 +65954,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -61519,9 +65987,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -61547,6 +66025,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -61572,6 +66089,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -61580,6 +66102,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -61604,9 +66135,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -64540,6 +69081,45 @@ "description": "The latest release value.", "nullable": true, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -64565,6 +69145,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -64573,6 +69158,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -64597,9 +69191,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ @@ -64625,6 +69229,45 @@ "items": { "additionalProperties": false, "properties": { + "assets": { + "description": "The assets value.", + "items": { + "additionalProperties": false, + "properties": { + "direct_url": { + "description": "The direct url value.", + "type": "string" + }, + "format": { + "description": "The format value.", + "type": "string" + }, + "kind": { + "description": "The kind value.", + "type": "string" + }, + "link_type": { + "description": "The link type value.", + "type": "string" + }, + "name": { + "description": "The name value.", + "type": "string" + }, + "url": { + "description": "The url value.", + "type": "string" + } + }, + "required": [ + "kind", + "name", + "url" + ], + "type": "object" + }, + "type": "array" + }, "body": { "description": "The body value.", "type": "string" @@ -64650,6 +69293,11 @@ "description": "The is prerelease value.", "type": "boolean" }, + "last_synced_at": { + "description": "The last synced at value.", + "nullable": true, + "type": "string" + }, "milestone_id": { "description": "The milestone id value.", "type": "integer" @@ -64658,6 +69306,15 @@ "description": "The name value.", "type": "string" }, + "release_status": { + "description": "The release status value.", + "type": "string" + }, + "released_at": { + "description": "The released at value.", + "nullable": true, + "type": "string" + }, "scm_connection_id": { "description": "The scm connection id value.", "nullable": true, @@ -64682,9 +69339,19 @@ "description": "The tag name value.", "type": "string" }, + "tag_url": { + "description": "The tag url value.", + "nullable": true, + "type": "string" + }, "target_commitish": { "description": "The target commitish value.", "type": "string" + }, + "workspace_repository_id": { + "description": "The workspace repository id value.", + "nullable": true, + "type": "integer" } }, "required": [ diff --git a/api/openapi.json b/api/openapi.json index f9675e4be..7f28ff57a 100644 --- a/api/openapi.json +++ b/api/openapi.json @@ -15,115 +15,208 @@ }, "type": "object" }, - "health.livenessResponse": { + "dto.AssetCategoryResponse": { "properties": { - "status": { + "asset_count": { + "type": "integer" + }, + "children_count": { + "type": "integer" + }, + "created_at": { + "type": "string" + }, + "descendants_count": { + "type": "integer" + }, + "description": { + "type": "string" + }, + "has_children": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "parent_id": { + "type": "integer" + }, + "path": { + "type": "string" + }, + "set_id": { + "type": "integer" + }, + "updated_at": { "type": "string" } }, "type": "object" }, - "health.readinessResponse": { + "dto.AssetCategorySummary": { "properties": { - "database": { + "id": { + "type": "integer" + }, + "name": { "type": "string" }, - "status": { + "path": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.AdminGroupCreateRequest": { + "dto.AssetCreateRequest": { "properties": { + "asset_tag": { + "type": "string" + }, + "asset_type_id": { + "type": "integer" + }, + "category_id": { + "type": "integer" + }, + "custom_field_values": { + "additionalProperties": {}, + "type": "object" + }, "description": { "type": "string" }, - "name": { + "status_id": { + "type": "integer" + }, + "title": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.AdminGroupResponse": { + "dto.AssetImportJobResponse": { "properties": { + "asset_type_id": { + "type": "integer" + }, + "completed_at": { + "type": "string" + }, "created_at": { "type": "string" }, - "description": { + "created_rows": { + "type": "integer" + }, + "error_message": { "type": "string" }, + "error_rows": { + "type": "integer" + }, "id": { "type": "integer" }, - "member_count": { + "processed_rows": { "type": "integer" }, - "name": { + "set_id": { + "type": "integer" + }, + "started_at": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" + "status": { + "type": "string" + }, + "total_rows": { + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.AdminGroupUpdateRequest": { + "dto.AssetLinks": { "properties": { - "description": { + "self": { "type": "string" }, - "name": { + "set": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.AdminUserResponse": { + "dto.AssetResponse": { "properties": { - "avatar_url": { + "_links": { + "$ref": "#/components/schemas/dto.AssetLinks" + }, + "asset_tag": { "type": "string" }, + "asset_type": { + "$ref": "#/components/schemas/dto.AssetTypeSummary" + }, + "asset_type_id": { + "type": "integer" + }, + "category": { + "$ref": "#/components/schemas/dto.AssetCategorySummary" + }, + "category_id": { + "type": "integer" + }, "created_at": { "type": "string" }, - "email": { - "type": "string" + "created_by": { + "type": "integer" }, - "first_name": { - "type": "string" + "creator": { + "$ref": "#/components/schemas/dto.UserSummary" }, - "full_name": { - "type": "string" + "custom_field_values": { + "additionalProperties": {}, + "type": "object" }, - "group_ids": { - "items": { - "type": "integer" - }, - "type": "array" + "description": { + "type": "string" }, "id": { "type": "integer" }, - "is_active": { - "type": "boolean" + "linked_item_count": { + "description": "LinkedItemCount is the number of item↔asset links for this asset\n(0 when the underlying query didn't ask for the rollup).", + "type": "integer" }, - "language": { - "type": "string" + "set": { + "allOf": [ + { + "$ref": "#/components/schemas/dto.AssetSetSummary" + } + ], + "description": "Nested summaries — populated from the row's joined columns when the\nunderlying query asks for them, otherwise omitted." }, - "last_name": { - "type": "string" + "set_id": { + "type": "integer" }, - "timezone": { + "status": { + "$ref": "#/components/schemas/dto.AssetStatusSummary" + }, + "status_id": { + "type": "integer" + }, + "title": { "type": "string" }, - "username": { + "updated_at": { "type": "string" }, "warnings": { + "description": "Warnings carries non-fatal anomalies surfaced by the query layer\n(e.g. corrupt custom_field_values JSON). Always serialized as an\narray (never null) so CLI consumers don't need to null-check.", "items": { "type": "string" }, @@ -132,311 +225,307 @@ }, "type": "object" }, - "internal_restapi_v1_handlers.AdminUserUpdateRequest": { + "dto.AssetSetLinks": { "properties": { - "email": { + "assets": { "type": "string" }, - "first_name": { + "categories": { "type": "string" }, - "is_active": { - "type": "boolean" + "self": { + "type": "string" }, - "last_name": { + "statuses": { + "type": "string" + }, + "types": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.AgentRunResponse": { + "dto.AssetSetResponse": { "properties": { - "ended_at": { + "_links": { + "$ref": "#/components/schemas/dto.AssetSetLinks" + }, + "asset_count": { + "type": "integer" + }, + "asset_type_count": { + "type": "integer" + }, + "created_at": { "type": "string" }, - "error": { + "created_by": { + "type": "integer" + }, + "description": { "type": "string" }, "id": { "type": "integer" }, - "item_id": { - "type": "integer" + "is_default": { + "type": "boolean" }, - "job_kind": { + "name": { "type": "string" }, - "queued_at": { + "updated_at": { "type": "string" }, - "started_at": { + "user_permission": { "type": "string" + } + }, + "type": "object" + }, + "dto.AssetSetSummary": { + "properties": { + "id": { + "type": "integer" }, - "status": { + "name": { "type": "string" - }, - "workspace_id": { - "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.AuditLogEntryResponse": { + "dto.AssetStatusResponse": { "properties": { - "action_type": { + "color": { "type": "string" }, - "details": { - "additionalProperties": {}, - "type": "object" - }, - "error_message": { + "created_at": { "type": "string" }, - "id": { - "type": "integer" - }, - "ip_address": { + "description": { "type": "string" }, - "resource_id": { + "display_order": { "type": "integer" }, - "resource_name": { - "type": "string" - }, - "resource_type": { - "type": "string" + "id": { + "type": "integer" }, - "success": { + "is_default": { "type": "boolean" }, - "timestamp": { - "type": "string" - }, - "user_agent": { + "name": { "type": "string" }, - "user_id": { + "set_id": { "type": "integer" }, - "username": { + "updated_at": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.AuditLogStreamResponse": { + "dto.AssetStatusSummary": { "properties": { - "entries": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AuditLogEntryResponse" - }, - "type": "array" - }, - "has_more": { - "type": "boolean" + "color": { + "type": "string" }, - "next_after_id": { + "id": { "type": "integer" + }, + "name": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.CollectionListResponse": { + "dto.AssetTypeFieldResponse": { "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.CollectionResponse" - }, - "type": "array" - }, - "total": { + "custom_field_id": { "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.CollectionResponse": { - "properties": { - "created_at": { - "type": "string" }, - "description": { - "type": "string" - }, - "id": { + "display_order": { "type": "integer" }, - "name": { + "field_description": { "type": "string" }, - "slug": { + "field_name": { "type": "string" }, - "updated_at": { + "field_type": { "type": "string" }, - "workspace_id": { + "id": { "type": "integer" + }, + "is_required": { + "type": "boolean" + }, + "options": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.CustomFieldResponse": { + "dto.AssetTypeResponse": { "properties": { + "asset_count": { + "type": "integer" + }, + "color": { + "type": "string" + }, + "created_at": { + "type": "string" + }, "description": { "type": "string" }, "display_order": { "type": "integer" }, - "field_type": { + "fields": { + "items": { + "$ref": "#/components/schemas/dto.AssetTypeFieldResponse" + }, + "type": "array" + }, + "icon": { "type": "string" }, "id": { "type": "integer" }, + "is_active": { + "type": "boolean" + }, "name": { "type": "string" }, - "options": { - "description": "JSON string", - "type": "string" + "set_id": { + "type": "integer" }, - "required": { - "type": "boolean" + "updated_at": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.ErrorResponse": { + "dto.AssetTypeSummary": { "properties": { - "code": { - "description": "Machine-readable error code", + "color": { "type": "string" }, - "details": { - "description": "Additional error details" - }, - "error": { - "description": "Human-readable message", + "icon": { "type": "string" }, - "request_id": { - "description": "Request correlation ID", + "id": { + "type": "integer" + }, + "name": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.ItemTypeResponse": { + "dto.AssetUpdateRequest": { "properties": { - "builtin_key": { - "type": "string" - }, - "color": { - "type": "string" - }, - "description": { - "type": "string" - }, - "display_description": { - "type": "string" - }, - "display_name": { + "asset_tag": { "type": "string" }, - "hierarchy_level": { + "asset_type_id": { "type": "integer" }, - "icon": { - "type": "string" - }, - "id": { + "category_id": { "type": "integer" }, - "is_default": { - "type": "boolean" + "custom_field_values": { + "additionalProperties": {}, + "type": "object" }, - "name": { + "description": { "type": "string" }, - "sort_order": { + "status_id": { "type": "integer" + }, + "title": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.IterationCreateRequest": { + "dto.AttachmentResponse": { "properties": { - "description": { + "created_at": { "type": "string" }, - "end_date": { + "download_url": { "type": "string" }, - "is_global": { - "type": "boolean" + "file_size": { + "type": "integer" }, - "name": { + "filename": { "type": "string" }, - "start_date": { + "has_thumbnail": { + "type": "boolean" + }, + "id": { + "type": "integer" + }, + "item_id": { + "type": "integer" + }, + "mime_type": { "type": "string" }, - "status": { + "original_filename": { "type": "string" }, - "type_id": { - "type": "integer" + "thumbnail_url": { + "type": "string" }, - "workspace_id": { - "type": "integer" + "uploader": { + "$ref": "#/components/schemas/dto.UserSummary" + } + }, + "type": "object" + }, + "dto.CommentCreateRequest": { + "properties": { + "content": { + "type": "string" } }, "required": [ - "end_date", - "name", - "start_date" + "content" ], "type": "object" }, - "internal_restapi_v1_handlers.IterationResponse": { + "dto.CommentResponse": { "properties": { - "created_at": { + "author": { + "$ref": "#/components/schemas/dto.UserSummary" + }, + "content": { "type": "string" }, - "description": { + "content_html": { "type": "string" }, - "end_date": { + "created_at": { "type": "string" }, "id": { "type": "integer" }, - "is_global": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "start_date": { - "type": "string" - }, - "status": { - "type": "string" - }, - "type_color": { - "type": "string" - }, - "type_id": { + "item_id": { "type": "integer" }, - "type_name": { - "type": "string" - }, "updated_at": { "type": "string" }, @@ -445,253 +534,322 @@ "type": "string" }, "type": "array" - }, - "workspace_id": { - "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.IterationUpdateRequest": { + "dto.CommentUpdateRequest": { "properties": { - "description": { - "type": "string" - }, - "end_date": { - "type": "string" - }, - "name": { - "type": "string" - }, - "start_date": { - "type": "string" - }, - "status": { + "content": { "type": "string" - }, - "type_id": { - "nullable": true, - "type": "integer" } }, + "required": [ + "content" + ], "type": "object" }, - "internal_restapi_v1_handlers.MilestoneCreateRequest": { + "dto.EnforcedTemplateSummary": { "properties": { - "category_id": { - "type": "integer" - }, - "description": { - "type": "string" + "applied": { + "type": "boolean" }, "name": { "type": "string" }, - "status": { - "type": "string" - }, - "target_date": { - "type": "string" + "template_id": { + "type": "integer" } }, - "required": [ - "name" - ], "type": "object" }, - "internal_restapi_v1_handlers.MilestoneProgressItemResponse": { + "dto.HistoryResponse": { "properties": { - "assignee_avatar": { + "changed_at": { "type": "string" }, - "assignee_name": { + "field_name": { "type": "string" }, "id": { "type": "integer" }, - "item_number": { + "item_id": { "type": "integer" }, - "priority_builtin_key": { - "type": "string" - }, - "priority_color": { - "type": "string" - }, - "priority_name": { - "type": "string" - }, - "status_builtin_key": { + "new_value": { "type": "string" }, - "status_color": { + "old_value": { "type": "string" }, - "status_name": { + "resolved_new_value": { "type": "string" }, - "title": { + "resolved_old_value": { "type": "string" }, - "workspace_id": { - "type": "integer" - }, - "workspace_key": { - "type": "string" + "user": { + "$ref": "#/components/schemas/dto.UserSummary" } }, "type": "object" }, - "internal_restapi_v1_handlers.MilestoneProgressResponse": { + "dto.ItemCreateRequest": { "properties": { - "category_color": { - "type": "string" - }, - "completed_items": { + "assignee_id": { "type": "integer" }, + "custom_fields": { + "additionalProperties": {}, + "type": "object" + }, "description": { "type": "string" }, - "items_by_category": { - "additionalProperties": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneProgressItemResponse" - }, - "type": "array" - }, - "type": "object" - }, - "milestone_id": { - "type": "integer" + "due_date": { + "type": "string" }, - "milestone_name": { + "end_date": { "type": "string" }, - "percent_complete": { - "type": "number" + "is_task": { + "type": "boolean" }, - "status": { - "type": "string" + "item_type_id": { + "type": "integer" }, - "status_breakdown": { + "iteration_id": { + "type": "integer" + }, + "milestone_ids": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneStatusBreakdownResponse" + "type": "integer" }, "type": "array" }, - "target_date": { + "parent_id": { + "type": "integer" + }, + "priority_id": { + "type": "integer" + }, + "project_id": { + "type": "integer" + }, + "start_date": { "type": "string" }, - "total_items": { + "status_id": { + "description": "Optional create-time placement. If omitted, the item uses the workflow initial status.\nIf provided, it must be the initial status or directly reachable from the initial status\nwithout workflow conditions, validators, or approval gates.", + "type": "integer" + }, + "title": { + "maxLength": 255, + "type": "string" + }, + "workspace_id": { "type": "integer" } }, + "required": [ + "title", + "workspace_id" + ], "type": "object" }, - "internal_restapi_v1_handlers.MilestoneResponse": { + "dto.ItemLinks": { "properties": { - "category_color": { + "attachments": { "type": "string" }, - "category_id": { - "type": "integer" + "children": { + "type": "string" }, - "category_name": { + "comments": { "type": "string" }, - "created_at": { + "history": { "type": "string" }, - "description": { + "parent": { "type": "string" }, - "id": { - "type": "integer" + "self": { + "type": "string" }, - "is_global": { - "type": "boolean" + "transitions": { + "type": "string" }, - "name": { + "workspace": { "type": "string" + } + }, + "type": "object" + }, + "dto.ItemResponse": { + "properties": { + "_links": { + "allOf": [ + { + "$ref": "#/components/schemas/dto.ItemLinks" + } + ], + "description": "HATEOAS links" }, - "position": { - "type": "integer" + "assignee": { + "$ref": "#/components/schemas/dto.UserSummary" }, - "status": { + "attachments": { + "items": { + "$ref": "#/components/schemas/dto.AttachmentResponse" + }, + "type": "array" + }, + "children": { + "items": { + "$ref": "#/components/schemas/dto.ItemResponse" + }, + "type": "array" + }, + "comments": { + "description": "Expanded collections (populated based on ?expand= parameter)", + "items": { + "$ref": "#/components/schemas/dto.CommentResponse" + }, + "type": "array" + }, + "completed_at": { "type": "string" }, - "target_date": { + "created_at": { + "description": "Timestamps", "type": "string" }, - "updated_at": { + "creator": { + "$ref": "#/components/schemas/dto.UserSummary" + }, + "custom_fields": { + "additionalProperties": {}, + "type": "object" + }, + "description": { "type": "string" }, - "warnings": { + "description_html": { + "type": "string" + }, + "due_date": { + "type": "string" + }, + "end_date": { + "type": "string" + }, + "enforced_template": { + "allOf": [ + { + "$ref": "#/components/schemas/dto.EnforcedTemplateSummary" + } + ], + "description": "EnforcedTemplate echoes the mandatory work item template the item's type\nenforces (WI-438), populated only on the create response so non-UI callers\nlearn the expected structure even when they supplied their own\ndescription. Omitted when the type enforces no mandatory template." + }, + "history": { "items": { - "type": "string" + "$ref": "#/components/schemas/dto.HistoryResponse" }, "type": "array" }, - "workspace_id": { + "id": { "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.MilestoneStatusBreakdownResponse": { - "properties": { - "category_builtin_key": { - "type": "string" }, - "category_color": { - "type": "string" + "is_task": { + "type": "boolean" }, - "category_name": { + "item_type": { + "$ref": "#/components/schemas/dto.ItemTypeSummary" + }, + "iteration": { + "$ref": "#/components/schemas/dto.IterationSummary" + }, + "key": { + "description": "e.g., \"PROJ-123\"", "type": "string" }, - "is_completed": { - "type": "boolean" + "milestones": { + "items": { + "$ref": "#/components/schemas/dto.MilestoneSummary" + }, + "type": "array" }, - "item_count": { - "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.MilestoneUpdateRequest": { - "properties": { - "category_id": { - "nullable": true, + "parent_id": { + "description": "Hierarchy. ParentID is the raw DB id. ParentKey is the parent's\nready-to-display key (e.g. \"WI-120\"), computed server-side from the\nparent's own workspace — clients must render this rather than building a\nkey from ParentID, which is a DB id in a different namespace and may even\npoint into another workspace. ParentKey and ParentTitle are populated\nonly on permission-checked single-item reads, and only when the caller\nmay view the parent (see ItemHandler.setParentSummary); they are omitted\nfrom list responses and withheld across a workspace boundary the caller\ncannot see.", "type": "integer" }, - "description": { + "parent_key": { "type": "string" }, - "name": { + "parent_title": { + "type": "string" + }, + "priority": { + "$ref": "#/components/schemas/dto.PrioritySummary" + }, + "project": { + "$ref": "#/components/schemas/dto.ProjectSummary" + }, + "start_date": { "type": "string" }, "status": { + "allOf": [ + { + "$ref": "#/components/schemas/dto.StatusSummary" + } + ], + "description": "Related entities (populated based on ?expand= parameter)" + }, + "title": { "type": "string" }, - "target_date": { - "nullable": true, + "transitions": { + "items": { + "$ref": "#/components/schemas/dto.TransitionResponse" + }, + "type": "array" + }, + "updated_at": { + "type": "string" + }, + "workspace": { + "$ref": "#/components/schemas/dto.WorkspaceSummary" + }, + "workspace_id": { + "type": "integer" + }, + "workspace_item_number": { + "type": "integer" + }, + "workspace_key": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.PaginatedResponse": { + "dto.ItemTypeChangeRequest": { "properties": { - "data": {}, - "pagination": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginationMeta" + "target_item_type_id": { + "type": "integer" + }, + "target_status_id": { + "type": "integer" } }, + "required": [ + "target_item_type_id" + ], "type": "object" }, - "internal_restapi_v1_handlers.PriorityResponse": { + "dto.ItemTypeSummary": { "properties": { "builtin_key": { "type": "string" @@ -699,14 +857,8 @@ "color": { "type": "string" }, - "description": { - "type": "string" - }, - "display_description": { - "type": "string" - }, - "display_name": { - "type": "string" + "hierarchy_level": { + "type": "integer" }, "icon": { "type": "string" @@ -714,284 +866,244 @@ "id": { "type": "integer" }, - "is_default": { - "type": "boolean" - }, "name": { "type": "string" - }, - "sort_order": { - "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.StatusCategoryResponse": { + "dto.ItemUpdateRequest": { "properties": { - "builtin_key": { - "type": "string" + "assignee_id": { + "type": "integer" }, - "color": { - "type": "string" + "custom_fields": { + "additionalProperties": {}, + "type": "object" }, "description": { "type": "string" }, - "display_description": { + "due_date": { "type": "string" }, - "display_name": { + "end_date": { "type": "string" }, - "id": { - "type": "integer" - }, - "is_completed": { + "is_task": { "type": "boolean" }, - "is_default": { - "type": "boolean" + "item_type_id": { + "type": "integer" }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.StatusResponse": { - "properties": { - "builtin_key": { - "type": "string" + "iteration_id": { + "type": "integer" }, - "category_builtin_key": { - "type": "string" + "milestone_ids": { + "items": { + "type": "integer" + }, + "type": "array" }, - "category_color": { - "type": "string" + "parent_id": { + "type": "integer" }, - "category_id": { + "priority_id": { "type": "integer" }, - "category_name": { - "type": "string" + "project_id": { + "type": "integer" }, - "description": { + "start_date": { "type": "string" }, - "display_description": { + "title": { + "maxLength": 255, "type": "string" - }, - "display_name": { + } + }, + "type": "object" + }, + "dto.IterationSummary": { + "properties": { + "end_date": { "type": "string" }, "id": { "type": "integer" }, - "is_completed": { - "type": "boolean" + "name": { + "type": "string" }, - "is_default": { - "type": "boolean" + "start_date": { + "type": "string" }, - "name": { + "status": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.TranslationResolveRequest": { + "dto.MilestoneSummary": { "properties": { - "locale": { + "id": { + "type": "integer" + }, + "name": { "type": "string" }, - "targets": { - "items": { - "$ref": "#/components/schemas/objecttranslation.Target" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.TranslationUpsertRequest": { - "properties": { - "value": { + "status": { + "type": "string" + }, + "target_date": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.UserResponse": { + "dto.PageLinks": { "properties": { - "agent_presence": { - "type": "string" - }, - "avatar_url": { + "history": { "type": "string" }, - "created_at": { + "permissions": { "type": "string" }, - "email": { + "self": { "type": "string" }, - "first_name": { + "workspace": { "type": "string" + } + }, + "type": "object" + }, + "dto.PageResponse": { + "properties": { + "_links": { + "$ref": "#/components/schemas/dto.PageLinks" }, - "full_name": { + "archived_at": { "type": "string" }, - "id": { + "archived_by": { "type": "integer" }, - "is_active": { - "type": "boolean" - }, - "is_agent": { - "type": "boolean" - }, - "language": { - "type": "string" - }, - "last_name": { + "content": { "type": "string" }, - "timezone": { + "content_hash": { "type": "string" }, - "username": { + "created_at": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.WorkflowResponse": { - "properties": { - "builtin_key": { - "type": "string" + "created_by": { + "type": "integer" }, - "created_at": { - "type": "string" + "depth": { + "type": "integer" }, - "description": { + "excerpt": { "type": "string" }, "id": { "type": "integer" }, - "is_default": { + "inherit_permissions": { "type": "boolean" }, - "name": { - "type": "string" + "is_home": { + "type": "boolean" }, - "transitions": { + "labels": { + "description": "Labels carries the workspace page-labels currently attached to the\npage. Populated by the service layer when the page-label repository\nis wired; always serialized as an array (never null) so CLI/JSON\nconsumers don't need to null-check.", "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResponse" + "$ref": "#/components/schemas/models.PageLabel" }, "type": "array" }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.WorkspaceCreateRequest": { - "properties": { - "color": { - "type": "string" + "metadata": { + "additionalProperties": {}, + "type": "object" }, - "description": { + "parent_id": { + "type": "integer" + }, + "path": { "type": "string" }, - "icon": { + "slug": { "type": "string" }, - "key": { - "maxLength": 10, - "minLength": 2, + "title": { "type": "string" }, - "name": { - "maxLength": 100, + "updated_at": { "type": "string" }, - "template_workspace_id": { + "updated_by": { + "type": "integer" + }, + "workspace_id": { "type": "integer" } }, - "required": [ - "key", - "name" - ], "type": "object" }, - "internal_restapi_v1_handlers.WorkspaceResponse": { + "dto.PageRevisionResponse": { "properties": { - "active": { - "type": "boolean" - }, - "color": { + "change_summary": { "type": "string" }, - "created_at": { + "change_type": { "type": "string" }, - "description": { + "content": { "type": "string" }, - "icon": { + "created_at": { "type": "string" }, - "id": { + "created_by": { "type": "integer" }, - "internal_comments_enabled": { - "type": "boolean" + "depth": { + "type": "integer" }, - "is_personal": { - "type": "boolean" + "excerpt": { + "type": "string" }, - "is_template": { - "type": "boolean" + "id": { + "type": "integer" }, - "key": { - "type": "string" + "page_id": { + "type": "integer" }, - "name": { + "parent_id": { + "type": "integer" + }, + "path": { "type": "string" }, - "time_project_id": { + "revision_number": { "type": "integer" }, - "updated_at": { + "slug": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" + "title": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.WorkspaceTemplateSummaryResponse": { + "dto.PrioritySummary": { "properties": { - "color": { - "type": "string" - }, - "configuration_set_name": { + "builtin_key": { "type": "string" }, - "description": { + "color": { "type": "string" }, "icon": { @@ -1000,33 +1112,44 @@ "id": { "type": "integer" }, - "item_count": { + "name": { + "type": "string" + } + }, + "type": "object" + }, + "dto.ProjectSummary": { + "properties": { + "id": { "type": "integer" }, "name": { "type": "string" - }, - "template_count": { - "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.WorkspaceUpdateRequest": { + "dto.StatusSummary": { "properties": { - "active": { - "type": "boolean" + "builtin_key": { + "type": "string" }, - "color": { + "category_builtin_key": { "type": "string" }, - "description": { + "category_color": { "type": "string" }, - "icon": { + "category_id": { + "type": "integer" + }, + "category_name": { "type": "string" }, - "is_template": { + "id": { + "type": "integer" + }, + "is_completed": { "type": "boolean" }, "name": { @@ -1035,178 +1158,137 @@ }, "type": "object" }, - "internal_restapi_v1_handlers.actionDefinitionRequest": { + "dto.TransitionRequest": { "properties": { - "description": { - "type": "string" - }, - "edges": { - "items": { - "$ref": "#/components/schemas/models.ActionEdge" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "nodes": { - "items": { - "$ref": "#/components/schemas/models.ActionNode" - }, - "type": "array" - }, - "trigger_config": { - "type": "string" - }, - "trigger_type": { - "$ref": "#/components/schemas/models.ActionTriggerType" + "to_status_id": { + "type": "integer" } }, + "required": [ + "to_status_id" + ], "type": "object" }, - "internal_restapi_v1_handlers.agentSkillListResponse": { + "dto.TransitionResponse": { "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.agentSkillSummary" - }, - "type": "array" + "from_all_statuses": { + "type": "boolean" + }, + "from_status": { + "$ref": "#/components/schemas/dto.StatusSummary" + }, + "from_status_id": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "to_status": { + "$ref": "#/components/schemas/dto.StatusSummary" + }, + "to_status_id": { + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.agentSkillSummary": { + "dto.TransitionResultResponse": { "properties": { - "description": { - "type": "string" + "item": { + "$ref": "#/components/schemas/dto.ItemResponse" }, - "enabled": { + "new_status_id": { + "type": "integer" + }, + "no_op": { "type": "boolean" }, - "id": { + "old_status_id": { "type": "integer" - }, - "name": { - "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.batchItemLinksResponse": { + "dto.UserSummary": { "properties": { - "has_more_links": { - "type": "boolean" + "avatar_url": { + "type": "string" }, - "incoming": { - "items": { - "$ref": "#/components/schemas/models.ItemLink" - }, - "type": "array" + "email": { + "type": "string" }, - "item_id": { - "type": "integer" + "first_name": { + "type": "string" }, - "next_after_link_id": { + "full_name": { + "type": "string" + }, + "id": { "type": "integer" }, - "outgoing": { - "items": { - "$ref": "#/components/schemas/models.ItemLink" - }, - "type": "array" + "last_name": { + "type": "string" + }, + "username": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.capabilityDTO": { + "dto.WorkspaceSummary": { "properties": { - "capability_type": { - "$ref": "#/components/schemas/models.CapabilityType" - }, "id": { "type": "integer" }, + "key": { + "type": "string" + }, "name": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.catalogResponse": { + "handlers.AdminGroupCreateRequest": { "properties": { - "capabilities": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.capabilityDTO" - }, - "type": "array" - }, - "nodes": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.nodeTypeDTO" - }, - "type": "array" - }, - "scope": { + "description": { "type": "string" }, - "triggers": { - "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.triggerTypeDTO" - }, - "type": "array" + "name": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.createWorklogRequest": { + "handlers.AdminGroupResponse": { "properties": { - "date": { + "created_at": { "type": "string" }, "description": { "type": "string" }, - "duration": { - "type": "string" - }, - "duration_minutes": { - "type": "integer" - }, - "end_time": { - "type": "string" - }, - "item_id": { + "id": { "type": "integer" }, - "item_key": { - "type": "string" - }, - "project_id": { + "member_count": { "type": "integer" }, - "start_time": { + "name": { "type": "string" }, - "timezone": { - "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.diagramListResponse": { - "properties": { - "items": { + "warnings": { "items": { - "$ref": "#/components/schemas/models.ItemDiagram" + "type": "string" }, "type": "array" } }, "type": "object" }, - "internal_restapi_v1_handlers.diagramWriteRequest": { + "handlers.AdminGroupUpdateRequest": { "properties": { - "diagram_data": { + "description": { "type": "string" }, "name": { @@ -1215,3486 +1297,1676 @@ }, "type": "object" }, - "internal_restapi_v1_handlers.itemChangeResponse": { + "handlers.AdminUserResponse": { "properties": { - "change_type": { + "avatar_url": { "type": "string" }, - "item_id": { - "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.itemChangesResponse": { - "properties": { - "changes": { + "created_at": { + "type": "string" + }, + "email": { + "type": "string" + }, + "first_name": { + "type": "string" + }, + "full_name": { + "type": "string" + }, + "group_ids": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.itemChangeResponse" + "type": "integer" }, "type": "array" }, - "has_more": { + "id": { + "type": "integer" + }, + "is_active": { "type": "boolean" }, - "next_cursor": { + "language": { "type": "string" }, - "reset_required": { - "type": "boolean" + "last_name": { + "type": "string" }, - "watermark": { + "timezone": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.itemLabelAddRequest": { - "properties": { - "label_id": { - "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.itemLabelSetRequest": { - "properties": { - "label_ids": { + }, + "username": { + "type": "string" + }, + "warnings": { "items": { - "type": "integer" + "type": "string" }, "type": "array" } }, "type": "object" }, - "internal_restapi_v1_handlers.labelCreateRequest": { + "handlers.AdminUserUpdateRequest": { "properties": { - "color": { + "email": { "type": "string" }, - "name": { + "first_name": { + "type": "string" + }, + "is_active": { + "type": "boolean" + }, + "last_name": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.labelListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.Label" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.labelUpdateRequest": { + "handlers.AgentRunResponse": { "properties": { - "color": { + "ended_at": { "type": "string" }, - "name": { + "error": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.linkCreateRequest": { - "properties": { - "link_type_id": { + }, + "id": { "type": "integer" }, - "source_id": { + "item_id": { "type": "integer" }, - "source_type": { + "job_kind": { "type": "string" }, - "target_id": { - "type": "integer" + "queued_at": { + "type": "string" }, - "target_type": { + "started_at": { + "type": "string" + }, + "status": { "type": "string" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.milestoneReorderRequest": { + "handlers.AuditLogEntryResponse": { "properties": { - "category_id": { - "type": "integer" + "action_type": { + "type": "string" }, - "ordered_ids": { - "items": { - "type": "integer" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.nodeTypeDTO": { - "properties": { - "category": { - "type": "string" - }, - "config_schema": { + "details": { + "additionalProperties": {}, "type": "object" }, - "description": { + "error_message": { "type": "string" }, - "is_iterator": { - "type": "boolean" + "id": { + "type": "integer" }, - "label": { + "ip_address": { "type": "string" }, - "outputs": { - "items": { - "type": "string" - }, - "type": "array" + "resource_id": { + "type": "integer" }, - "type": { - "$ref": "#/components/schemas/models.ActionNodeType" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageCreateRequest": { - "properties": { - "content": { + "resource_name": { "type": "string" }, - "is_home": { + "resource_type": { + "type": "string" + }, + "success": { "type": "boolean" }, - "metadata": { - "additionalProperties": {}, - "type": "object" + "timestamp": { + "type": "string" }, - "parent_id": { + "user_agent": { + "type": "string" + }, + "user_id": { "type": "integer" }, - "title": { + "username": { "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageDiagramListResponse": { + "handlers.CollectionListResponse": { "properties": { "items": { "items": { - "$ref": "#/components/schemas/services.PageDiagram" + "$ref": "#/components/schemas/handlers.CollectionResponse" }, "type": "array" + }, + "total": { + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageGrantPermissionRequest": { + "handlers.CollectionResponse": { "properties": { - "permission_level": { + "created_at": { "type": "string" }, - "principal_id": { + "description": { + "type": "string" + }, + "id": { "type": "integer" }, - "principal_type": { + "name": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageHistoryListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageRevisionResponse" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageLabelAddRequest": { - "properties": { - "label_id": { + }, + "slug": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "workspace_id": { "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageLabelCreateRequest": { + "handlers.CustomFieldResponse": { "properties": { - "color": { + "description": { + "type": "string" + }, + "display_order": { + "type": "integer" + }, + "field_type": { "type": "string" }, + "id": { + "type": "integer" + }, "name": { "type": "string" + }, + "options": { + "description": "JSON string", + "type": "string" + }, + "required": { + "type": "boolean" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageLabelListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.PageLabel" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageLabelSetRequest": { + "handlers.ErrorResponse": { "properties": { - "label_ids": { - "items": { - "type": "integer" - }, - "type": "array" + "code": { + "description": "Machine-readable error code", + "type": "string" + }, + "details": { + "description": "Additional error details" + }, + "error": { + "description": "Human-readable message", + "type": "string" + }, + "request_id": { + "description": "Request correlation ID", + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageLabelUpdateRequest": { + "handlers.ItemTypeResponse": { "properties": { + "builtin_key": { + "type": "string" + }, "color": { "type": "string" }, - "name": { + "description": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageListWithLabelsResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.PageLabel" - }, - "type": "array" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageMoveRequest": { - "properties": { - "destination_workspace_id": { - "type": "integer" }, - "next_sibling_id": { - "type": "integer" + "display_description": { + "type": "string" }, - "parent_id": { - "type": "integer" + "display_name": { + "type": "string" }, - "prev_sibling_id": { + "hierarchy_level": { "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pagePermissionsResponse": { - "properties": { - "acl": { - "items": { - "$ref": "#/components/schemas/models.PagePermission" - }, - "type": "array" }, - "effective_level": { + "icon": { "type": "string" }, - "inherit_permissions": { + "id": { + "type": "integer" + }, + "is_default": { "type": "boolean" }, - "page_id": { + "name": { + "type": "string" + }, + "sort_order": { "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.pageSetInheritanceRequest": { - "properties": { - "inherit_permissions": { - "type": "boolean" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.pageUpdateRequest": { + "handlers.IterationCreateRequest": { "properties": { - "content": { + "description": { "type": "string" }, - "expected_content_hash": { + "end_date": { "type": "string" }, - "metadata": { - "additionalProperties": {}, - "type": "object" + "is_global": { + "type": "boolean" }, - "title": { + "name": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.recurrenceForceGenerateResponse": { - "properties": { - "instances_generated": { - "type": "integer" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.recurrenceInstanceListResponse": { - "properties": { - "instances": { - "items": { - "$ref": "#/components/schemas/models.RecurrenceInstance" - }, - "type": "array" }, - "pagination": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginationMeta" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.startTimerRequest": { - "properties": { - "description": { + "start_date": { "type": "string" }, - "item_id": { - "type": "integer" + "status": { + "type": "string" }, - "project_id": { + "type_id": { "type": "integer" }, "workspace_id": { "type": "integer" } }, - "type": "object" - }, - "internal_restapi_v1_handlers.templateCreateRequest": { - "properties": { - "description_body": { + "required": [ + "end_date", + "name", + "start_date" + ], + "type": "object" + }, + "handlers.IterationResponse": { + "properties": { + "created_at": { "type": "string" }, - "is_active": { + "description": { + "type": "string" + }, + "end_date": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "is_global": { "type": "boolean" }, - "item_type_ids": { - "items": { - "type": "integer" - }, - "type": "array" + "name": { + "type": "string" }, - "mode": { + "start_date": { "type": "string" }, - "name": { + "status": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.templateListResponse": { - "properties": { - "items": { + }, + "type_color": { + "type": "string" + }, + "type_id": { + "type": "integer" + }, + "type_name": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "warnings": { "items": { - "$ref": "#/components/schemas/models.ItemTemplate" + "type": "string" }, "type": "array" }, - "mandatory_template_id": { - "description": "MandatoryTemplateID is set when the request filtered by item_type_id and\nthat type has an active mandatory template, so callers (create modal, CLI)\ncan flag it without re-deriving the invariant.", + "workspace_id": { "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.templateUpdateRequest": { + "handlers.IterationUpdateRequest": { "properties": { - "description_body": { + "description": { "type": "string" }, - "is_active": { - "type": "boolean" - }, - "item_type_ids": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "mode": { + "end_date": { "type": "string" }, "name": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.testResultUpdateRequest": { - "properties": { - "actual_result": { - "type": "string" }, - "notes": { + "start_date": { "type": "string" }, "status": { "type": "string" + }, + "type_id": { + "nullable": true, + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.testRunCreateRequest": { + "handlers.MilestoneCreateRequest": { "properties": { - "assignee_id": { + "category_id": { "type": "integer" }, + "description": { + "type": "string" + }, "name": { "type": "string" }, - "set_id": { - "type": "integer" + "status": { + "type": "string" }, - "template_id": { - "type": "integer" + "target_date": { + "type": "string" } }, + "required": [ + "name" + ], "type": "object" }, - "internal_restapi_v1_handlers.timeProjectResponse": { + "handlers.MilestoneProgressItemResponse": { "properties": { - "category_color": { + "assignee_avatar": { "type": "string" }, - "category_id": { - "type": "integer" - }, - "category_name": { + "assignee_name": { "type": "string" }, - "color": { - "type": "string" + "id": { + "type": "integer" }, - "customer_id": { + "item_number": { "type": "integer" }, - "customer_name": { + "priority_builtin_key": { "type": "string" }, - "description": { + "priority_color": { "type": "string" }, - "hourly_rate": { - "type": "number" + "priority_name": { + "type": "string" }, - "id": { - "type": "integer" + "status_builtin_key": { + "type": "string" }, - "name": { + "status_color": { "type": "string" }, - "settings": { - "additionalProperties": {}, - "type": "object" + "status_name": { + "type": "string" }, - "status": { + "title": { "type": "string" }, - "total_hours": { - "type": "number" + "workspace_id": { + "type": "integer" + }, + "workspace_key": { + "type": "string" } }, "type": "object" }, - "internal_restapi_v1_handlers.triggerTypeDTO": { + "handlers.MilestoneProgressResponse": { "properties": { - "config_schema": { - "type": "object" + "category_color": { + "type": "string" + }, + "completed_items": { + "type": "integer" }, "description": { "type": "string" }, - "label": { + "items_by_category": { + "additionalProperties": { + "items": { + "$ref": "#/components/schemas/handlers.MilestoneProgressItemResponse" + }, + "type": "array" + }, + "type": "object" + }, + "milestone_id": { + "type": "integer" + }, + "milestone_name": { "type": "string" }, - "type": { - "$ref": "#/components/schemas/models.ActionTriggerType" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.updateWorklogRequest": { - "properties": { - "description": { + "percent_complete": { + "type": "number" + }, + "status": { "type": "string" - } - }, - "type": "object" - }, - "internal_restapi_v1_handlers.validateActionResponse": { - "properties": { - "errors": { + }, + "status_breakdown": { "items": { - "$ref": "#/components/schemas/actioncatalog.ValidationError" + "$ref": "#/components/schemas/handlers.MilestoneStatusBreakdownResponse" }, "type": "array" + }, + "target_date": { + "type": "string" + }, + "total_items": { + "type": "integer" } }, "type": "object" }, - "internal_restapi_v1_handlers.worklogResponse": { + "handlers.MilestoneResponse": { "properties": { - "created_at": { - "type": "integer" + "category_color": { + "type": "string" }, - "customer_id": { + "category_id": { "type": "integer" }, - "customer_name": { + "category_name": { "type": "string" }, - "date": { - "type": "integer" + "created_at": { + "type": "string" }, "description": { "type": "string" }, - "duration_minutes": { - "type": "integer" - }, - "end_time": { - "type": "integer" - }, "id": { "type": "integer" }, - "item_id": { - "type": "integer" + "is_global": { + "type": "boolean" }, - "item_title": { + "name": { "type": "string" }, - "project_id": { + "position": { "type": "integer" }, - "project_max_hours": { - "type": "number" - }, - "project_name": { + "status": { "type": "string" }, - "project_total_hours": { - "type": "number" - }, - "start_time": { - "type": "integer" + "target_date": { + "type": "string" }, "updated_at": { - "type": "integer" + "type": "string" }, - "workspace_id": { - "type": "integer" + "warnings": { + "items": { + "type": "string" + }, + "type": "array" }, - "workspace_item_number": { + "workspace_id": { "type": "integer" - }, - "workspace_key": { - "type": "string" } }, "type": "object" }, - "models.APIToken": { + "handlers.MilestoneStatusBreakdownResponse": { "properties": { - "created_at": { + "category_builtin_key": { "type": "string" }, - "expires_at": { + "category_color": { "type": "string" }, - "id": { - "type": "integer" + "category_name": { + "type": "string" }, - "is_temporary": { - "description": "True for SSH session tokens", + "is_completed": { "type": "boolean" }, - "last_used_at": { - "type": "string" - }, - "name": { - "description": "Human-readable name for the token", - "type": "string" + "item_count": { + "type": "integer" + } + }, + "type": "object" + }, + "handlers.MilestoneUpdateRequest": { + "properties": { + "category_id": { + "nullable": true, + "type": "integer" }, - "permissions": { - "description": "JSON array of permissions", + "description": { "type": "string" }, - "token_prefix": { - "description": "First few characters for identification", + "name": { "type": "string" }, - "updated_at": { + "status": { "type": "string" }, - "user_email": { - "description": "Joined fields", + "target_date": { + "nullable": true, + "type": "string" + } + }, + "type": "object" + }, + "handlers.PaginatedResponse": { + "properties": { + "data": {}, + "pagination": { + "$ref": "#/components/schemas/restapi.PaginationMeta" + } + }, + "type": "object" + }, + "handlers.PriorityResponse": { + "properties": { + "builtin_key": { "type": "string" }, - "user_id": { + "color": { + "type": "string" + }, + "description": { + "type": "string" + }, + "display_description": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "id": { "type": "integer" }, - "user_name": { + "is_default": { + "type": "boolean" + }, + "name": { "type": "string" + }, + "sort_order": { + "type": "integer" } }, "type": "object" }, - "models.Action": { + "handlers.StatusCategoryResponse": { "properties": { - "actor_name": { + "builtin_key": { "type": "string" }, - "actor_user_id": { - "description": "ActorUserID overrides the execution actor. NULL means the action runs under\nthe triggering user's permissions. Setting this field requires the global\naction.set_actor permission because it grants cross-workspace impersonation.", + "color": { + "type": "string" + }, + "description": { + "type": "string" + }, + "display_description": { + "type": "string" + }, + "display_name": { + "type": "string" + }, + "id": { "type": "integer" }, - "allowed_role_ids": { - "description": "AllowedRoleIDs restricts a manual action to members of these workspace\nroles. An empty list means every workspace editor may trigger it.", - "items": { - "type": "integer" - }, - "type": "array" + "is_completed": { + "type": "boolean" }, - "created_at": { + "is_default": { + "type": "boolean" + }, + "name": { + "type": "string" + } + }, + "type": "object" + }, + "handlers.StatusResponse": { + "properties": { + "builtin_key": { "type": "string" }, - "created_by": { + "category_builtin_key": { + "type": "string" + }, + "category_color": { + "type": "string" + }, + "category_id": { "type": "integer" }, - "creator_name": { - "description": "Joined fields for API responses", + "category_name": { "type": "string" }, "description": { "type": "string" }, - "edges": { - "items": { - "$ref": "#/components/schemas/models.ActionEdge" - }, - "type": "array" + "display_description": { + "type": "string" + }, + "display_name": { + "type": "string" }, "id": { "type": "integer" }, - "is_enabled": { + "is_completed": { + "type": "boolean" + }, + "is_default": { "type": "boolean" }, "name": { "type": "string" + } + }, + "type": "object" + }, + "handlers.TranslationResolveRequest": { + "properties": { + "locale": { + "type": "string" }, - "nodes": { + "targets": { "items": { - "$ref": "#/components/schemas/models.ActionNode" + "$ref": "#/components/schemas/objecttranslation.Target" }, "type": "array" - }, - "trigger_config": { - "description": "JSON with trigger-specific conditions", - "type": "string" - }, - "trigger_type": { - "$ref": "#/components/schemas/models.ActionTriggerType" - }, - "updated_at": { + } + }, + "type": "object" + }, + "handlers.TranslationUpsertRequest": { + "properties": { + "value": { "type": "string" - }, - "workspace_id": { - "type": "integer" } }, "type": "object" }, - "models.ActionEdge": { + "handlers.WorkflowResponse": { "properties": { - "action_id": { - "type": "integer" + "builtin_key": { + "type": "string" }, "created_at": { "type": "string" }, - "edge_type": { - "description": "default, true, false (for conditions)", + "description": { "type": "string" }, "id": { "type": "integer" }, - "source_handle": { + "is_default": { + "type": "boolean" + }, + "name": { "type": "string" }, - "source_node_id": { - "type": "integer" + "transitions": { + "items": { + "$ref": "#/components/schemas/dto.TransitionResponse" + }, + "type": "array" }, - "target_handle": { + "updated_at": { + "type": "string" + } + }, + "type": "object" + }, + "handlers.WorkspaceCreateRequest": { + "properties": { + "color": { "type": "string" }, - "target_node_id": { + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, + "key": { + "maxLength": 10, + "minLength": 2, + "type": "string" + }, + "name": { + "maxLength": 100, + "type": "string" + }, + "template_workspace_id": { "type": "integer" } }, + "required": [ + "key", + "name" + ], "type": "object" }, - "models.ActionNode": { + "handlers.WorkspaceResponse": { "properties": { - "action_id": { - "type": "integer" + "active": { + "type": "boolean" + }, + "color": { + "type": "string" }, "created_at": { "type": "string" }, + "description": { + "type": "string" + }, + "icon": { + "type": "string" + }, "id": { "type": "integer" }, - "node_config": { - "description": "JSON configuration for the node", - "type": "string" + "internal_comments_enabled": { + "type": "boolean" }, - "node_type": { - "$ref": "#/components/schemas/models.ActionNodeType" + "is_personal": { + "type": "boolean" }, - "position_x": { - "type": "number" + "is_template": { + "type": "boolean" }, - "position_y": { - "type": "number" + "key": { + "type": "string" + }, + "name": { + "type": "string" + }, + "time_project_id": { + "type": "integer" }, "updated_at": { "type": "string" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" } }, "type": "object" }, - "models.ActionNodeType": { - "enum": [ - "trigger", - "set_field", - "set_status", - "add_comment", - "notify_user", - "condition", - "update_asset", - "create_asset", - "round_robin_assign", - "ai_extract", - "ai_agent", - "container_run", - "http_request", - "transition_item", - "related_items", - "create_milestone" - ], - "type": "string", - "x-enum-varnames": [ - "ActionNodeTrigger", - "ActionNodeSetField", - "ActionNodeSetStatus", - "ActionNodeAddComment", - "ActionNodeNotifyUser", - "ActionNodeCondition", - "ActionNodeUpdateAsset", - "ActionNodeCreateAsset", - "ActionNodeRoundRobinAssign", - "ActionNodeAIExtract", - "ActionNodeAIAgent", - "ActionNodeContainerRun", - "ActionNodeHTTPRequest", - "ActionNodeTransitionItem", - "ActionNodeRelatedItems", - "ActionNodeCreateMilestone" - ] - }, - "models.ActionTriggerType": { - "enum": [ - "status_transition", - "item_created", - "item_updated", - "item_linked", - "manual", - "scm_tag_created", - "scm_release_branch_created", - "scm_pr_linked", - "scm_pr_merged" - ], - "type": "string", - "x-enum-varnames": [ - "ActionTriggerStatusTransition", - "ActionTriggerItemCreated", - "ActionTriggerItemUpdated", - "ActionTriggerItemLinked", - "ActionTriggerManual", - "ActionTriggerSCMTagCreated", - "ActionTriggerSCMReleaseBranchCreated", - "ActionTriggerSCMPRLinked", - "ActionTriggerSCMPRMerged" - ] - }, - "models.ActiveTimer": { - "properties": { - "created_at": { - "description": "Unix timestamp", - "type": "integer" - }, - "customer_name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "item_id": { - "description": "Optional link to work item", - "type": "integer" - }, - "item_title": { - "type": "string" - }, - "project_id": { - "type": "integer" - }, - "project_name": { - "type": "string" - }, - "start_time_utc": { - "description": "Unix timestamp in UTC", - "type": "integer" - }, - "user_id": { - "type": "integer" - }, - "workspace_id": { - "type": "integer" - }, - "workspace_item_number": { - "type": "integer" - }, - "workspace_key": { - "type": "string" - }, - "workspace_name": { - "type": "string" - } - }, - "type": "object" - }, - "models.Attachment": { - "properties": { - "created_at": { - "type": "string" - }, - "file_size": { - "type": "integer" - }, - "filename": { - "description": "Stored filename (UUID-based)", - "type": "string" - }, - "has_thumbnail": { - "description": "Whether thumbnail was generated", - "type": "boolean" - }, - "id": { - "type": "integer" - }, - "item_id": { - "type": "integer" - }, - "mime_type": { - "type": "string" - }, - "original_filename": { - "description": "Original user filename", - "type": "string" - }, - "uploaded_by": { - "type": "integer" - }, - "uploader_email": { - "type": "string" - }, - "uploader_name": { - "description": "Joined fields for API responses", - "type": "string" - } - }, - "type": "object" - }, - "models.AttachmentUploadResponse": { - "properties": { - "attachment": { - "$ref": "#/components/schemas/models.Attachment" - }, - "message": { - "type": "string" - }, - "success": { - "type": "boolean" - } - }, - "type": "object" - }, - "models.CalendarScheduleEntry": { - "properties": { - "created_at": { - "type": "string" - }, - "duration_minutes": { - "description": "Duration in minutes, optional", - "type": "integer" - }, - "notes": { - "type": "string" - }, - "scheduled_date": { - "description": "YYYY-MM-DD format", - "type": "string" - }, - "scheduled_time": { - "description": "HH:MM format, optional", - "type": "string" - }, - "user_id": { - "type": "integer" - }, - "workspace_id": { - "description": "User's personal workspace ID", - "type": "integer" - } - }, - "type": "object" - }, - "models.CapabilityType": { - "enum": [ - "docker_environment", - "http_client", - "llm_connection", - "runner_pool" - ], - "type": "string", - "x-enum-varnames": [ - "CapabilityDockerEnvironment", - "CapabilityHTTPClient", - "CapabilityLLMConnection", - "CapabilityRunnerPool" - ] - }, - "models.CreateRecurrenceRequest": { - "properties": { - "copy_assignee": { - "type": "boolean" - }, - "copy_custom_fields": { - "type": "boolean" - }, - "copy_description": { - "type": "boolean" - }, - "copy_priority": { - "type": "boolean" - }, - "dtend": { - "type": "string" - }, - "dtstart": { - "description": "ISO 8601 format", - "type": "string" - }, - "lead_time_days": { - "type": "integer" - }, - "rrule": { - "type": "string" - }, - "status_on_create": { - "type": "integer" - }, - "template_item_id": { - "type": "integer" - }, - "timezone": { - "type": "string" - } - }, - "type": "object" - }, - "models.Item": { - "properties": { - "assignee_avatar": { - "description": "Avatar URL of assigned user", - "type": "string" - }, - "assignee_email": { - "description": "Email of assigned user", - "type": "string" - }, - "assignee_id": { - "description": "User assignment fields", - "type": "integer" - }, - "assignee_name": { - "description": "User information for API responses", - "type": "string" - }, - "calendar_data": { - "items": { - "$ref": "#/components/schemas/models.CalendarScheduleEntry" - }, - "type": "array" - }, - "channel_id": { - "description": "Portal submission tracking fields (immutable once set)", - "type": "integer" - }, - "channel_name": { - "description": "Portal submission tracking joined fields", - "type": "string" - }, - "children": { - "description": "For tree representations", - "items": { - "$ref": "#/components/schemas/models.Item" - }, - "type": "array" - }, - "completed_at": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "creator_email": { - "description": "Email of creator (internal user or portal customer)", - "type": "string" - }, - "creator_id": { - "description": "Internal user who created this item", - "type": "integer" - }, - "creator_name": { - "description": "Full name of creator (internal user or portal customer)", - "type": "string" - }, - "creator_portal_customer_email": { - "description": "Email of portal customer creator", - "type": "string" - }, - "creator_portal_customer_id": { - "description": "Portal customer who created this item (for portal submissions)", - "type": "integer" - }, - "creator_portal_customer_name": { - "description": "Name of portal customer creator", - "type": "string" - }, - "custom_field_values": { - "additionalProperties": {}, - "type": "object" - }, - "description": { - "type": "string" - }, - "description_html": { - "type": "string" - }, - "due_date": { - "description": "Due date for item completion", - "type": "string" - }, - "effective_project_id": { - "description": "EffectiveProjectID is the resolved project after walking InheritProject\nup the parent chain. Consumers that need \"which time-tracking project\napplies to this item\" should read this, not ProjectID directly.", - "type": "integer" - }, - "effective_project_name": { - "type": "string" - }, - "end_date": { - "description": "End date for item", - "type": "string" - }, - "estimate_minutes": { - "description": "Time estimate in minutes (compared against logged worklog time)", - "type": "integer" - }, - "frac_index": { - "description": "Manual sorting field", - "type": "string" - }, - "id": { - "type": "integer" - }, - "inherit_project": { - "description": "If true, ProjectID is ignored and the parent item's effective project is used", - "type": "boolean" - }, - "is_task": { - "description": "Flag to mark this item as a task (checklist item)", - "type": "boolean" - }, - "item_type_builtin_key": { - "type": "string" - }, - "item_type_id": { - "description": "Optional, defaults to workspace's default item type", - "type": "integer" - }, - "item_type_name": { - "type": "string" - }, - "iteration_end_date": { - "type": "string" - }, - "iteration_id": { - "description": "Optional iteration assignment", - "type": "integer" - }, - "iteration_name": { - "type": "string" - }, - "labels": { - "description": "Global item labels", - "items": { - "$ref": "#/components/schemas/models.Label" - }, - "type": "array" - }, - "last_active_at": { - "description": "Recency for the board \"Bubble Mode\" sort. Bumped on activity (comments,\nedits, transitions) but not on manual frac_index reorder.", - "type": "string" - }, - "milestones": { - "items": { - "$ref": "#/components/schemas/models.Milestone" - }, - "type": "array" - }, - "parent_id": { - "description": "Hierarchy fields", - "type": "integer" - }, - "parent_title": { - "type": "string" - }, - "parent_workspace_item_number": { - "description": "Parent's workspace-scoped number, for rendering the parent key", - "type": "integer" - }, - "personal_labels": { - "items": { - "$ref": "#/components/schemas/models.PersonalLabel" - }, - "type": "array" - }, - "priority_builtin_key": { - "type": "string" - }, - "priority_color": { - "type": "string" - }, - "priority_icon": { - "type": "string" - }, - "priority_id": { - "description": "Foreign key to priorities table", - "type": "integer" - }, - "priority_name": { - "type": "string" - }, - "project_id": { - "description": "Time-tracking project membership. \"Project\" in Windshift always refers\nto a row in time_projects; both ProjectID and TimeProjectID below are\nFKs to that table, serving different roles:\n ProjectID - the project this item belongs to (the bucket\n worklogs default to). Can be inherited from the\n parent item; see InheritProject.\n TimeProjectID - overrides the project used when logging time on\n this specific item (independent of the bucket the\n item belongs to).\nEffectiveProjectID (below) is the resolved value after applying\ninheritance, and is what consumers should read.", - "type": "integer" - }, - "project_inheritance_mode": { - "description": "\"none\" | \"inherit\" | \"direct\"", - "type": "string" - }, - "project_name": { - "description": "Name of the time-tracking project this item belongs to (joined from time_projects via ProjectID)", - "type": "string" - }, - "related_work_item_id": { - "description": "Personal task relationship (for linking personal workspace tasks to work items)", - "type": "integer" - }, - "related_work_item_number": { - "type": "integer" - }, - "related_work_item_title": { - "description": "Related work item joined fields (for personal tasks)", - "type": "string" - }, - "related_work_item_workspace_id": { - "type": "integer" - }, - "related_work_item_workspace_key": { - "type": "string" - }, - "reporter_avatar": { - "description": "Avatar URL of reporter", - "type": "string" - }, - "reporter_email": { - "description": "Email of reporter", - "type": "string" - }, - "reporter_id": { - "description": "User who reported this item (from Jira import)", - "type": "integer" - }, - "reporter_name": { - "description": "Full name of reporter", - "type": "string" - }, - "request_type_id": { - "description": "Request type used for submission", - "type": "integer" - }, - "request_type_name": { - "description": "Name of the request type", - "type": "string" - }, - "start_date": { - "description": "Start date for item", - "type": "string" - }, - "status_builtin_key": { - "description": "Stable key for translating built-in statuses", - "type": "string" - }, - "status_color": { - "description": "Color from the status category (joined field)", - "type": "string" - }, - "status_id": { - "description": "Foreign key to statuses table", - "type": "integer" - }, - "status_name": { - "description": "Name from statuses table (joined field)", - "type": "string" - }, - "status_since": { - "description": "StatusSince is when the item last entered its current status, derived from\nitem_history (falls back to created_at when there is no recorded change).", - "type": "string" - }, - "story_points": { - "description": "Estimation", - "type": "number" - }, - "time_project_id": { - "type": "integer" - }, - "time_project_name": { - "description": "Name of the time-tracking project overriding worklog defaults (joined from time_projects via TimeProjectID)", - "type": "string" - }, - "title": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "virtual_field_data": { - "additionalProperties": {}, - "type": "object" - }, - "workspace_id": { - "type": "integer" - }, - "workspace_item_number": { - "description": "Workspace-specific sequential number for display keys", - "type": "integer" - }, - "workspace_key": { - "type": "string" - }, - "workspace_name": { - "description": "Joined fields for API responses", - "type": "string" - } - }, - "type": "object" - }, - "models.ItemDiagram": { - "properties": { - "created_at": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "creator_email": { - "type": "string" - }, - "creator_name": { - "description": "Joined fields for API responses", - "type": "string" - }, - "diagram_data": { - "description": "JSON with elements, appState, files", - "type": "string" - }, - "id": { - "type": "integer" - }, - "item_id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "updated_by": { - "type": "integer" - }, - "updated_by_email": { - "type": "string" - }, - "updated_by_name": { - "type": "string" - } - }, - "type": "object" - }, - "models.ItemLink": { - "properties": { - "created_at": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "created_by_name": { - "type": "string" - }, - "custom_field_id": { - "type": "integer" - }, - "custom_field_name": { - "description": "Custom field link metadata", - "type": "string" - }, - "id": { - "type": "integer" - }, - "link_type_color": { - "type": "string" - }, - "link_type_forward_label": { - "type": "string" - }, - "link_type_id": { - "type": "integer" - }, - "link_type_name": { - "description": "Joined fields for API responses", - "type": "string" - }, - "link_type_reverse_label": { - "type": "string" - }, - "source_id": { - "type": "integer" - }, - "source_item_number": { - "description": "SourceItemNumber is the workspace-scoped item number (the \"74\" in\n\"WI-74\"). Display the user-facing key as\nSourceWorkspaceKey + \"-\" + SourceItemNumber, never SourceID — that\nfield is the global DB id and looks wrong (e.g. \"WI-149\") in UI.", - "type": "integer" - }, - "source_item_type_color": { - "type": "string" - }, - "source_item_type_icon": { - "type": "string" - }, - "source_item_type_id": { - "type": "integer" - }, - "source_item_type_name": { - "type": "string" - }, - "source_status_color": { - "type": "string" - }, - "source_status_id": { - "description": "Source item details", - "type": "integer" - }, - "source_status_name": { - "type": "string" - }, - "source_title": { - "type": "string" - }, - "source_type": { - "description": "\"item\" or \"test_case\"", - "type": "string" - }, - "source_workspace_id": { - "type": "integer" - }, - "source_workspace_key": { - "type": "string" - }, - "target_id": { - "type": "integer" - }, - "target_item_number": { - "description": "TargetItemNumber: see SourceItemNumber.", - "type": "integer" - }, - "target_item_type_color": { - "type": "string" - }, - "target_item_type_icon": { - "type": "string" - }, - "target_item_type_id": { - "type": "integer" - }, - "target_item_type_name": { - "type": "string" - }, - "target_status_color": { - "type": "string" - }, - "target_status_id": { - "description": "Target item details", - "type": "integer" - }, - "target_status_name": { - "type": "string" - }, - "target_title": { - "type": "string" - }, - "target_type": { - "description": "\"item\" or \"test_case\"", - "type": "string" - }, - "target_workspace_id": { - "type": "integer" - }, - "target_workspace_key": { - "type": "string" - } - }, - "type": "object" - }, - "models.ItemTemplate": { - "properties": { - "created_at": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "description_body": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "is_active": { - "type": "boolean" - }, - "item_type_ids": { - "items": { - "type": "integer" - }, - "type": "array" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "updated_by": { - "type": "integer" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.Label": { - "properties": { - "color": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "models.LinkType": { - "properties": { - "active": { - "type": "boolean" - }, - "allowed_entity_types": { - "description": "nil = all types allowed; e.g. [\"item\",\"test_case\"]", - "items": { - "type": "string" - }, - "type": "array" - }, - "builtin_key": { - "type": "string" - }, - "color": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "display_description": { - "type": "string" - }, - "display_name": { - "type": "string" - }, - "forward_label": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "is_system": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "reverse_label": { - "type": "string" - }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "models.Milestone": { - "properties": { - "category_color": { - "type": "string" - }, - "category_id": { - "type": "integer" - }, - "category_name": { - "description": "Joined fields for API responses", - "type": "string" - }, - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "external_key": { - "description": "Stable upsert key set by automation (e.g. tag short-name); unique per workspace when set", - "type": "string" - }, - "id": { - "type": "integer" - }, - "is_global": { - "description": "false=local to workspace, true=global (shared)", - "type": "boolean" - }, - "latest_release": { - "$ref": "#/components/schemas/models.MilestoneRelease" - }, - "name": { - "type": "string" - }, - "position": { - "description": "Manual sort order (drag-and-drop), scoped per (is_global, workspace_id, category_id)", - "type": "integer" - }, - "releases": { - "items": { - "$ref": "#/components/schemas/models.MilestoneRelease" - }, - "type": "array" - }, - "status": { - "description": "planning, in-progress, completed, cancelled", - "type": "string" - }, - "target_date": { - "description": "Date in YYYY-MM-DD format, nullable", - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "description": "NULL if global, set if local to workspace", - "type": "integer" - }, - "workspace_name": { - "type": "string" - } - }, - "type": "object" - }, - "models.MilestoneRelease": { - "properties": { - "body": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "is_draft": { - "type": "boolean" - }, - "is_prerelease": { - "type": "boolean" - }, - "milestone_id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "scm_connection_id": { - "description": "Visible only to users with connection workspace access", - "type": "integer" - }, - "scm_release_id": { - "type": "string" - }, - "scm_release_url": { - "type": "string" - }, - "scm_repository": { - "description": "\"owner/repo\"; same visibility as SCMConnectionID", - "type": "string" - }, - "tag_name": { - "type": "string" - }, - "target_commitish": { - "type": "string" - } - }, - "type": "object" - }, - "models.PageLabel": { - "properties": { - "color": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.PagePermission": { - "properties": { - "granted_at": { - "type": "string" - }, - "granted_by": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "page_id": { - "type": "integer" - }, - "permission_level": { - "type": "string" - }, - "principal_id": { - "type": "integer" - }, - "principal_type": { - "type": "string" - } - }, - "type": "object" - }, - "models.PersonalLabel": { - "properties": { - "color": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "user_id": { - "description": "NULL for global labels, user_id for user-specific labels", - "type": "integer" - } - }, - "type": "object" - }, - "models.RRulePreviewRequest": { - "properties": { - "count": { - "description": "Number of occurrences to preview (default 10)", - "type": "integer" - }, - "dtstart": { - "type": "string" - }, - "rrule": { - "type": "string" - } - }, - "type": "object" - }, - "models.RecurrenceInstance": { - "properties": { - "created_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "instance_item_id": { - "type": "integer" - }, - "item_status": { - "type": "string" - }, - "item_title": { - "type": "string" - }, - "recurrence_rule_id": { - "type": "integer" - }, - "scheduled_date": { - "type": "string" - }, - "sequence_number": { - "type": "integer" - } - }, - "type": "object" - }, - "models.RecurrenceRule": { - "properties": { - "copy_assignee": { - "type": "boolean" - }, - "copy_custom_fields": { - "type": "boolean" - }, - "copy_description": { - "type": "boolean" - }, - "copy_priority": { - "type": "boolean" - }, - "created_at": { - "type": "string" - }, - "created_by": { - "type": "integer" - }, - "creator_name": { - "type": "string" - }, - "dtend": { - "type": "string" - }, - "dtstart": { - "description": "Recurrence start date", - "type": "string" - }, - "id": { - "type": "integer" - }, - "instance_count": { - "type": "integer" - }, - "is_active": { - "type": "boolean" - }, - "last_generated_until": { - "type": "string" - }, - "lead_time_days": { - "type": "integer" - }, - "next_generation_check": { - "type": "string" - }, - "next_occurrence": { - "type": "string" - }, - "rrule": { - "description": "e.g., \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"", - "type": "string" - }, - "status_on_create": { - "type": "integer" - }, - "template_item_id": { - "type": "integer" - }, - "template_title": { - "type": "string" - }, - "timezone": { - "description": "IANA timezone", - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - }, - "workspace_key": { - "type": "string" - }, - "workspace_name": { - "type": "string" - } - }, - "type": "object" - }, - "models.SkillActivationUsage": { - "properties": { - "bytes": { - "type": "integer" - }, - "estimated_tokens": { - "type": "integer" - }, - "max_bytes": { - "type": "integer" - }, - "max_tokens": { - "type": "integer" - }, - "page_prefix_bytes": { - "type": "integer" - }, - "page_prefix_runes": { - "type": "integer" - } - }, - "type": "object" - }, - "models.SkillPageReference": { - "properties": { - "activation_bytes": { - "type": "integer" - }, - "activation_runes": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "page_updated_at": { - "type": "string" - }, - "snapshot_at": { - "type": "string" - }, - "snapshot_title": { - "type": "string" - }, - "stale": { - "type": "boolean" - }, - "title": { - "type": "string" - } - }, - "type": "object" - }, - "models.TestCase": { - "properties": { - "created_at": { - "type": "string" - }, - "estimated_duration": { - "description": "in seconds", - "type": "integer" - }, - "folder_id": { - "type": "integer" - }, - "folder_name": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "labels": { - "items": { - "$ref": "#/components/schemas/models.TestLabel" - }, - "type": "array" - }, - "name": { - "type": "string" - }, - "preconditions": { - "type": "string" - }, - "priority": { - "description": "low, medium, high, critical", - "type": "string" - }, - "sort_order": { - "type": "integer" - }, - "status": { - "description": "active, inactive, draft", - "type": "string" - }, - "test_steps": { - "items": { - "$ref": "#/components/schemas/models.TestStep" - }, - "type": "array" - }, - "title": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestFolder": { - "properties": { - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "parent_id": { - "type": "integer" - }, - "sort_order": { - "type": "integer" - }, - "test_case_count": { - "type": "integer" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestLabel": { - "properties": { - "color": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestRun": { - "properties": { - "assignee_avatar": { - "type": "string" - }, - "assignee_email": { - "type": "string" - }, - "assignee_id": { - "description": "User assigned to execute this run", - "type": "integer" - }, - "assignee_name": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "ended_at": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "set_id": { - "type": "integer" - }, - "started_at": { - "type": "string" - }, - "template_id": { - "description": "Optional reference to template", - "type": "integer" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestRunTemplate": { - "properties": { - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "set_id": { - "type": "integer" - }, - "set_name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestSet": { - "properties": { - "created_at": { - "type": "string" - }, - "description": { - "type": "string" - }, - "failed_runs": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "last_run_date": { - "type": "string" - }, - "last_run_status": { - "type": "string" - }, - "milestone_id": { - "type": "integer" - }, - "milestone_name": { - "type": "string" - }, - "name": { - "type": "string" - }, - "successful_runs": { - "type": "integer" - }, - "test_case_count": { - "type": "integer" - }, - "total_runs": { - "type": "integer" - }, - "updated_at": { - "type": "string" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "models.TestStep": { - "properties": { - "action": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "data": { - "type": "string" - }, - "expected": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "step_number": { - "type": "integer" - }, - "test_case_id": { - "type": "integer" - }, - "updated_at": { - "type": "string" - } - }, - "type": "object" - }, - "models.UpdateRecurrenceRequest": { - "properties": { - "copy_assignee": { - "type": "boolean" - }, - "copy_custom_fields": { - "type": "boolean" - }, - "copy_description": { - "type": "boolean" - }, - "copy_priority": { - "type": "boolean" - }, - "dtend": { - "type": "string" - }, - "dtstart": { - "type": "string" - }, - "is_active": { - "type": "boolean" - }, - "lead_time_days": { - "type": "integer" - }, - "rrule": { - "type": "string" - }, - "status_on_create": { - "type": "integer" - }, - "timezone": { - "type": "string" - } - }, - "type": "object" - }, - "models.UserTUIPreferences": { - "properties": { - "last_workspace_id": { - "type": "integer" - }, - "split_ratio": { - "type": "number" - }, - "theme": { - "type": "string" - } - }, - "type": "object" - }, - "models.WorkspaceAgentSkill": { - "properties": { - "body": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "created_by_user_id": { - "description": "CreatedByUserID is a soft audit ref; nil when the creator was deleted.", - "type": "integer" - }, - "description": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" - }, - "pages": { - "description": "Pages are the workspace pages referenced by this skill (WI-517). On the\nadmin surface they round-trip with snapshot review state; the exact saved\ncontent is rendered into a run grant. nil/omitted when there are none.", - "items": { - "$ref": "#/components/schemas/models.SkillPageReference" - }, - "type": "array" - }, - "updated_at": { - "type": "string" - }, - "usage": { - "$ref": "#/components/schemas/models.SkillActivationUsage" - }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "objecttranslation.CanonicalDifference": { - "properties": { - "builtin_key": { - "type": "string" - }, - "canonical": { - "type": "string" - }, - "field": { - "type": "string" - }, - "object_id": { - "type": "integer" - }, - "object_type": { - "type": "string" - }, - "system": { - "type": "string" - } - }, - "type": "object" - }, - "objecttranslation.ObjectDefinition": { - "properties": { - "fields": { - "items": { - "type": "string" - }, - "type": "array" - }, - "object_type": { - "type": "string" - } - }, - "type": "object" - }, - "objecttranslation.ResolvedValue": { - "properties": { - "field": { - "type": "string" - }, - "locale": { - "type": "string" - }, - "object_id": { - "type": "integer" - }, - "object_type": { - "type": "string" - }, - "source": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "objecttranslation.Target": { - "properties": { - "fallback": { - "type": "string" - }, - "field": { - "type": "string" - }, - "object_id": { - "type": "integer" - }, - "object_type": { - "type": "string" - } - }, - "type": "object" - }, - "objecttranslation.Translation": { - "properties": { - "created_at": { - "type": "string" - }, - "field": { - "type": "string" - }, - "locale": { - "type": "string" - }, - "object_id": { - "type": "integer" - }, - "object_type": { - "type": "string" - }, - "source": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "value": { - "type": "string" - } - }, - "type": "object" - }, - "services.CreatePageDiagramInput": { - "properties": { - "excalidraw": { - "type": "object" - }, - "expected_content_hash": { - "type": "string" - }, - "mermaid": { - "type": "string" - }, - "name": { - "type": "string" - }, - "placement": { - "type": "string" - } - }, - "type": "object" - }, - "services.PageDiagram": { - "properties": { - "attachment_id": { - "type": "integer" - }, - "content_hash": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "kind": { - "type": "string" - }, - "name": { - "type": "string" - }, - "page_id": { - "type": "integer" - }, - "payload": { - "type": "object" - }, - "revision_number": { - "type": "integer" - } - }, - "type": "object" - }, - "services.RecurrencePreview": { + "handlers.WorkspaceTemplateSummaryResponse": { "properties": { - "dtstart": { - "type": "string" - }, - "occurrences": { - "items": { - "type": "string" - }, - "type": "array" - }, - "rrule": { + "color": { "type": "string" - } - }, - "type": "object" - }, - "services.TestRunDetail": { - "properties": { - "results": { - "items": { - "$ref": "#/components/schemas/services.TestRunResultWithCaseTitle" - }, - "type": "array" - }, - "run": { - "$ref": "#/components/schemas/models.TestRun" }, - "step_results": { - "additionalProperties": { - "$ref": "#/components/schemas/services.TestRunStepResult" - }, - "type": "object" - }, - "test_cases": { - "items": { - "$ref": "#/components/schemas/models.TestCase" - }, - "type": "array" - } - }, - "type": "object" - }, - "services.TestRunResultWithCaseTitle": { - "properties": { - "actual_result": { + "configuration_set_name": { "type": "string" }, - "created_at": { + "description": { "type": "string" }, - "executed_at": { + "icon": { "type": "string" }, "id": { "type": "integer" }, - "notes": { - "type": "string" - }, - "run_id": { + "item_count": { "type": "integer" }, - "status": { - "description": "\"passed\", \"failed\", \"blocked\", \"skipped\", \"not_run\"", + "name": { "type": "string" }, - "test_case_id": { + "template_count": { "type": "integer" - }, - "test_case_title": { - "type": "string" - }, - "updated_at": { - "type": "string" } }, "type": "object" }, - "services.TestRunStepResult": { + "handlers.WorkspaceUpdateRequest": { "properties": { - "actual_result": { - "type": "string" + "active": { + "type": "boolean" }, - "executed_at": { + "color": { "type": "string" }, - "item_id": { - "type": "integer" - }, - "notes": { + "description": { "type": "string" }, - "status": { + "icon": { "type": "string" }, - "step_id": { - "type": "integer" + "is_template": { + "type": "boolean" }, - "test_case_id": { - "type": "integer" + "name": { + "type": "string" } }, "type": "object" }, - "services.UpdatePageDiagramInput": { + "handlers.actionDefinitionRequest": { "properties": { - "excalidraw": { - "type": "object" - }, - "expected_content_hash": { + "description": { "type": "string" }, - "mermaid": { - "type": "string" + "edges": { + "items": { + "$ref": "#/components/schemas/models.ActionEdge" + }, + "type": "array" }, "name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi.ErrorResponse": { - "properties": { - "code": { - "description": "Machine-readable error code", - "type": "string" }, - "details": { - "description": "Additional error details" + "nodes": { + "items": { + "$ref": "#/components/schemas/models.ActionNode" + }, + "type": "array" }, - "error": { - "description": "Human-readable message", + "trigger_config": { "type": "string" }, - "request_id": { - "description": "Request correlation ID", - "type": "string" + "trigger_type": { + "$ref": "#/components/schemas/models.ActionTriggerType" } }, "type": "object" }, - "windshift_internal_restapi.PaginatedResponse": { + "handlers.agentSkillListResponse": { "properties": { - "data": {}, - "pagination": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginationMeta" + "items": { + "items": { + "$ref": "#/components/schemas/handlers.agentSkillSummary" + }, + "type": "array" } }, "type": "object" }, - "windshift_internal_restapi.PaginationMeta": { + "handlers.agentSkillSummary": { "properties": { - "has_more": { - "type": "boolean" - }, - "limit": { - "type": "integer" + "description": { + "type": "string" }, - "page": { - "type": "integer" + "enabled": { + "type": "boolean" }, - "total": { + "id": { "type": "integer" }, - "total_pages": { - "type": "integer" + "name": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetCategoryResponse": { + "handlers.batchItemLinksResponse": { "properties": { - "asset_count": { - "type": "integer" - }, - "children_count": { - "type": "integer" - }, - "created_at": { - "type": "string" - }, - "descendants_count": { - "type": "integer" - }, - "description": { - "type": "string" - }, - "has_children": { + "has_more_links": { "type": "boolean" }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" + "incoming": { + "items": { + "$ref": "#/components/schemas/models.ItemLink" + }, + "type": "array" }, - "parent_id": { + "item_id": { "type": "integer" }, - "path": { - "type": "string" - }, - "set_id": { + "next_after_link_id": { "type": "integer" }, - "updated_at": { - "type": "string" + "outgoing": { + "items": { + "$ref": "#/components/schemas/models.ItemLink" + }, + "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetCategorySummary": { + "handlers.capabilityDTO": { "properties": { + "capability_type": { + "$ref": "#/components/schemas/models.CapabilityType" + }, "id": { "type": "integer" }, "name": { "type": "string" - }, - "path": { - "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetCreateRequest": { + "handlers.catalogResponse": { "properties": { - "asset_tag": { - "type": "string" - }, - "asset_type_id": { - "type": "integer" - }, - "category_id": { - "type": "integer" - }, - "custom_field_values": { - "additionalProperties": {}, - "type": "object" - }, - "description": { - "type": "string" + "capabilities": { + "items": { + "$ref": "#/components/schemas/handlers.capabilityDTO" + }, + "type": "array" }, - "status_id": { - "type": "integer" + "nodes": { + "items": { + "$ref": "#/components/schemas/handlers.nodeTypeDTO" + }, + "type": "array" }, - "title": { + "scope": { "type": "string" + }, + "triggers": { + "items": { + "$ref": "#/components/schemas/handlers.triggerTypeDTO" + }, + "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetImportJobResponse": { + "handlers.createWorklogRequest": { "properties": { - "asset_type_id": { - "type": "integer" + "date": { + "type": "string" }, - "completed_at": { + "description": { "type": "string" }, - "created_at": { + "duration": { "type": "string" }, - "created_rows": { + "duration_minutes": { "type": "integer" }, - "error_message": { + "end_time": { "type": "string" }, - "error_rows": { - "type": "integer" - }, - "id": { + "item_id": { "type": "integer" }, - "processed_rows": { - "type": "integer" + "item_key": { + "type": "string" }, - "set_id": { + "project_id": { "type": "integer" }, - "started_at": { + "start_time": { "type": "string" }, - "status": { + "timezone": { "type": "string" - }, - "total_rows": { - "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetLinks": { + "handlers.diagramListResponse": { "properties": { - "self": { + "items": { + "items": { + "$ref": "#/components/schemas/models.ItemDiagram" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.diagramWriteRequest": { + "properties": { + "diagram_data": { "type": "string" }, - "set": { + "name": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetResponse": { + "handlers.itemChangeResponse": { "properties": { - "_links": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetLinks" - }, - "asset_tag": { + "change_type": { "type": "string" }, - "asset_type": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetTypeSummary" - }, - "asset_type_id": { + "item_id": { "type": "integer" + } + }, + "type": "object" + }, + "handlers.itemChangesResponse": { + "properties": { + "changes": { + "items": { + "$ref": "#/components/schemas/handlers.itemChangeResponse" + }, + "type": "array" }, - "category": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetCategorySummary" - }, - "category_id": { - "type": "integer" + "has_more": { + "type": "boolean" }, - "created_at": { + "next_cursor": { "type": "string" }, - "created_by": { - "type": "integer" - }, - "creator": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" - }, - "custom_field_values": { - "additionalProperties": {}, - "type": "object" + "reset_required": { + "type": "boolean" }, - "description": { + "watermark": { "type": "string" - }, - "id": { - "type": "integer" - }, - "linked_item_count": { - "description": "LinkedItemCount is the number of item↔asset links for this asset\n(0 when the underlying query didn't ask for the rollup).", - "type": "integer" - }, - "set": { - "allOf": [ - { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetSetSummary" - } - ], - "description": "Nested summaries — populated from the row's joined columns when the\nunderlying query asks for them, otherwise omitted." - }, - "set_id": { - "type": "integer" - }, - "status": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetStatusSummary" - }, - "status_id": { + } + }, + "type": "object" + }, + "handlers.itemLabelAddRequest": { + "properties": { + "label_id": { "type": "integer" - }, - "title": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "warnings": { - "description": "Warnings carries non-fatal anomalies surfaced by the query layer\n(e.g. corrupt custom_field_values JSON). Always serialized as an\narray (never null) so CLI consumers don't need to null-check.", + } + }, + "type": "object" + }, + "handlers.itemLabelSetRequest": { + "properties": { + "label_ids": { "items": { - "type": "string" + "type": "integer" }, "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetSetLinks": { + "handlers.labelCreateRequest": { "properties": { - "assets": { - "type": "string" - }, - "categories": { + "color": { "type": "string" }, - "self": { + "name": { "type": "string" - }, - "statuses": { + } + }, + "type": "object" + }, + "handlers.labelListResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/models.Label" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.labelUpdateRequest": { + "properties": { + "color": { "type": "string" }, - "types": { + "name": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetSetResponse": { + "handlers.linkCreateRequest": { "properties": { - "_links": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetSetLinks" - }, - "asset_count": { - "type": "integer" - }, - "asset_type_count": { + "link_type_id": { "type": "integer" }, - "created_at": { - "type": "string" - }, - "created_by": { + "source_id": { "type": "integer" }, - "description": { + "source_type": { "type": "string" }, - "id": { + "target_id": { "type": "integer" }, - "is_default": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "updated_at": { - "type": "string" - }, - "user_permission": { + "target_type": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetSetSummary": { + "handlers.milestoneReorderRequest": { "properties": { - "id": { + "category_id": { "type": "integer" }, - "name": { - "type": "string" + "ordered_ids": { + "items": { + "type": "integer" + }, + "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetStatusResponse": { + "handlers.nodeTypeDTO": { "properties": { - "color": { + "category": { "type": "string" }, - "created_at": { - "type": "string" + "config_schema": { + "type": "object" }, "description": { "type": "string" }, - "display_order": { - "type": "integer" + "is_iterator": { + "type": "boolean" }, - "id": { - "type": "integer" + "label": { + "type": "string" }, - "is_default": { + "outputs": { + "items": { + "type": "string" + }, + "type": "array" + }, + "type": { + "$ref": "#/components/schemas/models.ActionNodeType" + } + }, + "type": "object" + }, + "handlers.pageCreateRequest": { + "properties": { + "content": { + "type": "string" + }, + "is_home": { "type": "boolean" }, - "name": { + "metadata": { + "additionalProperties": {}, + "type": "object" + }, + "parent_id": { + "type": "integer" + }, + "title": { + "type": "string" + } + }, + "type": "object" + }, + "handlers.pageDiagramListResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/services.PageDiagram" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.pageGrantPermissionRequest": { + "properties": { + "permission_level": { "type": "string" }, - "set_id": { + "principal_id": { "type": "integer" }, - "updated_at": { + "principal_type": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetStatusSummary": { + "handlers.pageHistoryListResponse": { "properties": { - "color": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "name": { - "type": "string" + "items": { + "items": { + "$ref": "#/components/schemas/dto.PageRevisionResponse" + }, + "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetTypeFieldResponse": { + "handlers.pageLabelAddRequest": { "properties": { - "custom_field_id": { - "type": "integer" - }, - "display_order": { - "type": "integer" - }, - "field_description": { - "type": "string" - }, - "field_name": { - "type": "string" - }, - "field_type": { - "type": "string" - }, - "id": { + "label_id": { "type": "integer" - }, - "is_required": { - "type": "boolean" - }, - "options": { - "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetTypeResponse": { + "handlers.pageLabelCreateRequest": { "properties": { - "asset_count": { - "type": "integer" - }, "color": { "type": "string" }, - "created_at": { - "type": "string" - }, - "description": { + "name": { "type": "string" - }, - "display_order": { - "type": "integer" - }, - "fields": { + } + }, + "type": "object" + }, + "handlers.pageLabelListResponse": { + "properties": { + "items": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetTypeFieldResponse" + "$ref": "#/components/schemas/models.PageLabel" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.pageLabelSetRequest": { + "properties": { + "label_ids": { + "items": { + "type": "integer" }, "type": "array" - }, - "icon": { - "type": "string" - }, - "id": { - "type": "integer" - }, - "is_active": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "set_id": { - "type": "integer" - }, - "updated_at": { - "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetTypeSummary": { + "handlers.pageLabelUpdateRequest": { "properties": { "color": { "type": "string" }, - "icon": { - "type": "string" - }, - "id": { - "type": "integer" - }, "name": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AssetUpdateRequest": { + "handlers.pageListResponse": { "properties": { - "asset_tag": { - "type": "string" - }, - "asset_type_id": { + "items": { + "items": { + "$ref": "#/components/schemas/dto.PageResponse" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.pageListWithLabelsResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/models.PageLabel" + }, + "type": "array" + } + }, + "type": "object" + }, + "handlers.pageMoveRequest": { + "properties": { + "destination_workspace_id": { "type": "integer" }, - "category_id": { + "next_sibling_id": { "type": "integer" }, - "custom_field_values": { - "additionalProperties": {}, - "type": "object" - }, - "description": { - "type": "string" - }, - "status_id": { + "parent_id": { "type": "integer" }, - "title": { - "type": "string" + "prev_sibling_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.AttachmentResponse": { + "handlers.pagePermissionsResponse": { "properties": { - "created_at": { - "type": "string" - }, - "download_url": { - "type": "string" - }, - "file_size": { - "type": "integer" + "acl": { + "items": { + "$ref": "#/components/schemas/models.PagePermission" + }, + "type": "array" }, - "filename": { + "effective_level": { "type": "string" }, - "has_thumbnail": { + "inherit_permissions": { "type": "boolean" }, - "id": { - "type": "integer" - }, - "item_id": { + "page_id": { "type": "integer" - }, - "mime_type": { - "type": "string" - }, - "original_filename": { - "type": "string" - }, - "thumbnail_url": { - "type": "string" - }, - "uploader": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.CommentCreateRequest": { + "handlers.pageSetInheritanceRequest": { "properties": { - "content": { - "type": "string" + "inherit_permissions": { + "type": "boolean" } }, - "required": [ - "content" - ], "type": "object" }, - "windshift_internal_restapi_v1_dto.CommentResponse": { + "handlers.pageUpdateRequest": { "properties": { - "author": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" - }, "content": { "type": "string" }, - "content_html": { - "type": "string" - }, - "created_at": { + "expected_content_hash": { "type": "string" }, - "id": { - "type": "integer" - }, - "item_id": { - "type": "integer" + "metadata": { + "additionalProperties": {}, + "type": "object" }, - "updated_at": { + "title": { "type": "string" - }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.CommentUpdateRequest": { + "handlers.recurrenceForceGenerateResponse": { "properties": { - "content": { - "type": "string" + "instances_generated": { + "type": "integer" } }, - "required": [ - "content" - ], "type": "object" }, - "windshift_internal_restapi_v1_dto.EnforcedTemplateSummary": { + "handlers.recurrenceInstanceListResponse": { "properties": { - "applied": { - "type": "boolean" - }, - "name": { - "type": "string" + "instances": { + "items": { + "$ref": "#/components/schemas/models.RecurrenceInstance" + }, + "type": "array" }, - "template_id": { - "type": "integer" + "pagination": { + "$ref": "#/components/schemas/restapi.PaginationMeta" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.HistoryResponse": { + "handlers.startTimerRequest": { "properties": { - "changed_at": { - "type": "string" - }, - "field_name": { + "description": { "type": "string" }, - "id": { + "item_id": { "type": "integer" }, - "item_id": { + "project_id": { "type": "integer" }, - "new_value": { + "workspace_id": { + "type": "integer" + } + }, + "type": "object" + }, + "handlers.templateCreateRequest": { + "properties": { + "description_body": { "type": "string" }, - "old_value": { - "type": "string" + "is_active": { + "type": "boolean" }, - "resolved_new_value": { + "item_type_ids": { + "items": { + "type": "integer" + }, + "type": "array" + }, + "mode": { "type": "string" }, - "resolved_old_value": { + "name": { "type": "string" + } + }, + "type": "object" + }, + "handlers.templateListResponse": { + "properties": { + "items": { + "items": { + "$ref": "#/components/schemas/models.ItemTemplate" + }, + "type": "array" }, - "user": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" + "mandatory_template_id": { + "description": "MandatoryTemplateID is set when the request filtered by item_type_id and\nthat type has an active mandatory template, so callers (create modal, CLI)\ncan flag it without re-deriving the invariant.", + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.ItemCreateRequest": { + "handlers.templateUpdateRequest": { "properties": { - "assignee_id": { - "type": "integer" - }, - "custom_fields": { - "additionalProperties": {}, - "type": "object" - }, - "description": { - "type": "string" - }, - "due_date": { - "type": "string" - }, - "end_date": { + "description_body": { "type": "string" }, - "is_task": { + "is_active": { "type": "boolean" }, - "item_type_id": { - "type": "integer" - }, - "iteration_id": { - "type": "integer" - }, - "milestone_ids": { + "item_type_ids": { "items": { "type": "integer" }, "type": "array" }, - "parent_id": { - "type": "integer" - }, - "priority_id": { - "type": "integer" - }, - "project_id": { - "type": "integer" - }, - "start_date": { + "mode": { "type": "string" }, - "status_id": { - "description": "Optional create-time placement. If omitted, the item uses the workflow initial status.\nIf provided, it must be the initial status or directly reachable from the initial status\nwithout workflow conditions, validators, or approval gates.", - "type": "integer" - }, - "title": { - "maxLength": 255, + "name": { "type": "string" - }, - "workspace_id": { - "type": "integer" } }, - "required": [ - "title", - "workspace_id" - ], "type": "object" }, - "windshift_internal_restapi_v1_dto.ItemLinks": { + "handlers.testResultUpdateRequest": { "properties": { - "attachments": { - "type": "string" - }, - "children": { - "type": "string" - }, - "comments": { + "actual_result": { "type": "string" }, - "history": { + "notes": { "type": "string" }, - "parent": { + "status": { "type": "string" + } + }, + "type": "object" + }, + "handlers.testRunCreateRequest": { + "properties": { + "assignee_id": { + "type": "integer" }, - "self": { + "name": { "type": "string" }, - "transitions": { - "type": "string" + "set_id": { + "type": "integer" }, - "workspace": { - "type": "string" + "template_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.ItemResponse": { + "handlers.timeProjectResponse": { "properties": { - "_links": { - "allOf": [ - { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemLinks" - } - ], - "description": "HATEOAS links" + "category_color": { + "type": "string" }, - "assignee": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" + "category_id": { + "type": "integer" }, - "attachments": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AttachmentResponse" - }, - "type": "array" + "category_name": { + "type": "string" }, - "children": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" - }, - "type": "array" + "color": { + "type": "string" }, - "comments": { - "description": "Expanded collections (populated based on ?expand= parameter)", - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentResponse" - }, - "type": "array" + "customer_id": { + "type": "integer" }, - "completed_at": { + "customer_name": { "type": "string" }, - "created_at": { - "description": "Timestamps", + "description": { "type": "string" }, - "creator": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.UserSummary" + "hourly_rate": { + "type": "number" }, - "custom_fields": { + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "settings": { "additionalProperties": {}, "type": "object" }, - "description": { + "status": { "type": "string" }, - "description_html": { - "type": "string" + "total_hours": { + "type": "number" + } + }, + "type": "object" + }, + "handlers.triggerTypeDTO": { + "properties": { + "config_schema": { + "type": "object" }, - "due_date": { + "description": { "type": "string" }, - "end_date": { + "label": { "type": "string" }, - "enforced_template": { - "allOf": [ - { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.EnforcedTemplateSummary" - } - ], - "description": "EnforcedTemplate echoes the mandatory work item template the item's type\nenforces (WI-438), populated only on the create response so non-UI callers\nlearn the expected structure even when they supplied their own\ndescription. Omitted when the type enforces no mandatory template." - }, - "history": { + "type": { + "$ref": "#/components/schemas/models.ActionTriggerType" + } + }, + "type": "object" + }, + "handlers.updateWorklogRequest": { + "properties": { + "description": { + "type": "string" + } + }, + "type": "object" + }, + "handlers.validateActionResponse": { + "properties": { + "errors": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.HistoryResponse" + "$ref": "#/components/schemas/actioncatalog.ValidationError" }, "type": "array" - }, - "id": { + } + }, + "type": "object" + }, + "handlers.worklogResponse": { + "properties": { + "created_at": { "type": "integer" }, - "is_task": { - "type": "boolean" + "customer_id": { + "type": "integer" }, - "item_type": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemTypeSummary" + "customer_name": { + "type": "string" }, - "iteration": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.IterationSummary" + "date": { + "type": "integer" }, - "key": { - "description": "e.g., \"PROJ-123\"", + "description": { "type": "string" }, - "milestones": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.MilestoneSummary" - }, - "type": "array" + "duration_minutes": { + "type": "integer" }, - "parent_id": { - "description": "Hierarchy. ParentID is the raw DB id. ParentKey is the parent's\nready-to-display key (e.g. \"WI-120\"), computed server-side from the\nparent's own workspace — clients must render this rather than building a\nkey from ParentID, which is a DB id in a different namespace and may even\npoint into another workspace. ParentKey and ParentTitle are populated\nonly on permission-checked single-item reads, and only when the caller\nmay view the parent (see ItemHandler.setParentSummary); they are omitted\nfrom list responses and withheld across a workspace boundary the caller\ncannot see.", + "end_time": { "type": "integer" }, - "parent_key": { - "type": "string" + "id": { + "type": "integer" }, - "parent_title": { + "item_id": { + "type": "integer" + }, + "item_title": { "type": "string" }, - "priority": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PrioritySummary" + "project_id": { + "type": "integer" }, - "project": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ProjectSummary" + "project_max_hours": { + "type": "number" }, - "start_date": { + "project_name": { "type": "string" }, - "status": { - "allOf": [ - { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.StatusSummary" - } - ], - "description": "Related entities (populated based on ?expand= parameter)" - }, - "title": { - "type": "string" + "project_total_hours": { + "type": "number" }, - "transitions": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResponse" - }, - "type": "array" + "start_time": { + "type": "integer" }, "updated_at": { - "type": "string" - }, - "workspace": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.WorkspaceSummary" + "type": "integer" }, "workspace_id": { "type": "integer" @@ -4708,1019 +2980,957 @@ }, "type": "object" }, - "windshift_internal_restapi_v1_dto.ItemTypeChangeRequest": { + "health.livenessResponse": { "properties": { - "target_item_type_id": { - "type": "integer" + "status": { + "type": "string" + } + }, + "type": "object" + }, + "health.readinessResponse": { + "properties": { + "database": { + "type": "string" }, - "target_status_id": { - "type": "integer" + "status": { + "type": "string" } }, - "required": [ - "target_item_type_id" - ], "type": "object" }, - "windshift_internal_restapi_v1_dto.ItemTypeSummary": { + "models.APIToken": { "properties": { - "builtin_key": { + "created_at": { "type": "string" }, - "color": { + "expires_at": { "type": "string" }, - "hierarchy_level": { + "id": { "type": "integer" }, - "icon": { - "type": "string" + "is_temporary": { + "description": "True for SSH session tokens", + "type": "boolean" }, - "id": { - "type": "integer" + "last_used_at": { + "type": "string" }, "name": { + "description": "Human-readable name for the token", "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.ItemUpdateRequest": { - "properties": { - "assignee_id": { - "type": "integer" }, - "custom_fields": { - "additionalProperties": {}, - "type": "object" - }, - "description": { + "permissions": { + "description": "JSON array of permissions", "type": "string" }, - "due_date": { + "token_prefix": { + "description": "First few characters for identification", "type": "string" }, - "end_date": { + "updated_at": { "type": "string" }, - "is_task": { - "type": "boolean" + "user_email": { + "description": "Joined fields", + "type": "string" }, - "item_type_id": { + "user_id": { "type": "integer" }, - "iteration_id": { + "user_name": { + "type": "string" + } + }, + "type": "object" + }, + "models.Action": { + "properties": { + "actor_name": { + "type": "string" + }, + "actor_user_id": { + "description": "ActorUserID overrides the execution actor. NULL means the action runs under\nthe triggering user's permissions. Setting this field requires the global\naction.set_actor permission because it grants cross-workspace impersonation.", "type": "integer" }, - "milestone_ids": { + "allowed_role_ids": { + "description": "AllowedRoleIDs restricts a manual action to members of these workspace\nroles. An empty list means every workspace editor may trigger it.", "items": { "type": "integer" }, "type": "array" }, - "parent_id": { - "type": "integer" - }, - "priority_id": { - "type": "integer" + "created_at": { + "type": "string" }, - "project_id": { + "created_by": { "type": "integer" }, - "start_date": { + "creator_name": { + "description": "Joined fields for API responses", "type": "string" }, - "title": { - "maxLength": 255, - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.IterationSummary": { - "properties": { - "end_date": { + "description": { "type": "string" }, + "edges": { + "items": { + "$ref": "#/components/schemas/models.ActionEdge" + }, + "type": "array" + }, "id": { "type": "integer" }, + "is_enabled": { + "type": "boolean" + }, "name": { "type": "string" }, - "start_date": { + "nodes": { + "items": { + "$ref": "#/components/schemas/models.ActionNode" + }, + "type": "array" + }, + "trigger_config": { + "description": "JSON with trigger-specific conditions", "type": "string" }, - "status": { + "trigger_type": { + "$ref": "#/components/schemas/models.ActionTriggerType" + }, + "updated_at": { "type": "string" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.MilestoneSummary": { + "models.ActionEdge": { "properties": { - "id": { + "action_id": { "type": "integer" }, - "name": { + "created_at": { "type": "string" }, - "status": { + "edge_type": { + "description": "default, true, false (for conditions)", "type": "string" }, - "target_date": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.PageLinks": { - "properties": { - "history": { - "type": "string" + "id": { + "type": "integer" }, - "permissions": { + "source_handle": { "type": "string" }, - "self": { - "type": "string" + "source_node_id": { + "type": "integer" }, - "workspace": { + "target_handle": { "type": "string" + }, + "target_node_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.PageResponse": { + "models.ActionNode": { "properties": { - "_links": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageLinks" - }, - "archived_at": { - "type": "string" - }, - "archived_by": { + "action_id": { "type": "integer" }, - "content": { - "type": "string" - }, - "content_hash": { - "type": "string" - }, "created_at": { "type": "string" }, - "created_by": { - "type": "integer" - }, - "depth": { - "type": "integer" - }, - "excerpt": { - "type": "string" - }, "id": { "type": "integer" }, - "inherit_permissions": { - "type": "boolean" + "node_config": { + "description": "JSON configuration for the node", + "type": "string" }, - "is_home": { - "type": "boolean" + "node_type": { + "$ref": "#/components/schemas/models.ActionNodeType" }, - "labels": { - "description": "Labels carries the workspace page-labels currently attached to the\npage. Populated by the service layer when the page-label repository\nis wired; always serialized as an array (never null) so CLI/JSON\nconsumers don't need to null-check.", - "items": { - "$ref": "#/components/schemas/models.PageLabel" - }, - "type": "array" + "position_x": { + "type": "number" }, - "metadata": { - "additionalProperties": {}, - "type": "object" + "position_y": { + "type": "number" }, - "parent_id": { + "updated_at": { + "type": "string" + } + }, + "type": "object" + }, + "models.ActionNodeType": { + "enum": [ + "trigger", + "set_field", + "set_status", + "add_comment", + "notify_user", + "condition", + "update_asset", + "create_asset", + "round_robin_assign", + "ai_extract", + "ai_agent", + "container_run", + "http_request", + "transition_item", + "related_items", + "create_milestone" + ], + "type": "string", + "x-enum-varnames": [ + "ActionNodeTrigger", + "ActionNodeSetField", + "ActionNodeSetStatus", + "ActionNodeAddComment", + "ActionNodeNotifyUser", + "ActionNodeCondition", + "ActionNodeUpdateAsset", + "ActionNodeCreateAsset", + "ActionNodeRoundRobinAssign", + "ActionNodeAIExtract", + "ActionNodeAIAgent", + "ActionNodeContainerRun", + "ActionNodeHTTPRequest", + "ActionNodeTransitionItem", + "ActionNodeRelatedItems", + "ActionNodeCreateMilestone" + ] + }, + "models.ActionTriggerType": { + "enum": [ + "status_transition", + "item_created", + "item_updated", + "item_linked", + "manual", + "scm_tag_created", + "scm_release_branch_created", + "scm_pr_linked", + "scm_pr_merged" + ], + "type": "string", + "x-enum-varnames": [ + "ActionTriggerStatusTransition", + "ActionTriggerItemCreated", + "ActionTriggerItemUpdated", + "ActionTriggerItemLinked", + "ActionTriggerManual", + "ActionTriggerSCMTagCreated", + "ActionTriggerSCMReleaseBranchCreated", + "ActionTriggerSCMPRLinked", + "ActionTriggerSCMPRMerged" + ] + }, + "models.ActiveTimer": { + "properties": { + "created_at": { + "description": "Unix timestamp", "type": "integer" }, - "path": { - "type": "string" - }, - "slug": { - "type": "string" - }, - "title": { + "customer_name": { "type": "string" }, - "updated_at": { + "description": { "type": "string" }, - "updated_by": { + "id": { "type": "integer" }, - "workspace_id": { + "item_id": { + "description": "Optional link to work item", "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.PageRevisionResponse": { - "properties": { - "change_summary": { - "type": "string" }, - "change_type": { - "type": "string" - }, - "content": { - "type": "string" - }, - "created_at": { + "item_title": { "type": "string" }, - "created_by": { - "type": "integer" - }, - "depth": { + "project_id": { "type": "integer" }, - "excerpt": { + "project_name": { "type": "string" }, - "id": { + "start_time_utc": { + "description": "Unix timestamp in UTC", "type": "integer" }, - "page_id": { + "user_id": { "type": "integer" }, - "parent_id": { + "workspace_id": { "type": "integer" }, - "path": { - "type": "string" - }, - "revision_number": { + "workspace_item_number": { "type": "integer" }, - "slug": { + "workspace_key": { "type": "string" }, - "title": { + "workspace_name": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.PrioritySummary": { + "models.Attachment": { "properties": { - "builtin_key": { + "created_at": { "type": "string" }, - "color": { - "type": "string" + "file_size": { + "type": "integer" }, - "icon": { + "filename": { + "description": "Stored filename (UUID-based)", "type": "string" }, - "id": { - "type": "integer" + "has_thumbnail": { + "description": "Whether thumbnail was generated", + "type": "boolean" }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.ProjectSummary": { - "properties": { "id": { "type": "integer" }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.StatusSummary": { - "properties": { - "builtin_key": { - "type": "string" + "item_id": { + "type": "integer" }, - "category_builtin_key": { + "mime_type": { "type": "string" }, - "category_color": { + "original_filename": { + "description": "Original user filename", "type": "string" }, - "category_id": { + "uploaded_by": { "type": "integer" }, - "category_name": { + "uploader_email": { "type": "string" }, - "id": { - "type": "integer" - }, - "is_completed": { - "type": "boolean" - }, - "name": { + "uploader_name": { + "description": "Joined fields for API responses", "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.TransitionRequest": { - "properties": { - "to_status_id": { - "type": "integer" - } - }, - "required": [ - "to_status_id" - ], - "type": "object" - }, - "windshift_internal_restapi_v1_dto.TransitionResponse": { - "properties": { - "from_all_statuses": { - "type": "boolean" - }, - "from_status": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.StatusSummary" - }, - "from_status_id": { - "type": "integer" - }, - "id": { - "type": "integer" - }, - "to_status": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.StatusSummary" - }, - "to_status_id": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_dto.TransitionResultResponse": { + "models.AttachmentUploadResponse": { "properties": { - "item": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "attachment": { + "$ref": "#/components/schemas/models.Attachment" }, - "new_status_id": { - "type": "integer" + "message": { + "type": "string" }, - "no_op": { + "success": { "type": "boolean" - }, - "old_status_id": { - "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.UserSummary": { + "models.CalendarScheduleEntry": { "properties": { - "avatar_url": { + "created_at": { "type": "string" }, - "email": { + "duration_minutes": { + "description": "Duration in minutes, optional", + "type": "integer" + }, + "notes": { "type": "string" }, - "first_name": { + "scheduled_date": { + "description": "YYYY-MM-DD format", "type": "string" }, - "full_name": { + "scheduled_time": { + "description": "HH:MM format, optional", "type": "string" }, - "id": { + "user_id": { "type": "integer" }, - "last_name": { - "type": "string" - }, - "username": { - "type": "string" + "workspace_id": { + "description": "User's personal workspace ID", + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_dto.WorkspaceSummary": { + "models.CapabilityType": { + "enum": [ + "docker_environment", + "http_client", + "llm_connection", + "runner_pool" + ], + "type": "string", + "x-enum-varnames": [ + "CapabilityDockerEnvironment", + "CapabilityHTTPClient", + "CapabilityLLMConnection", + "CapabilityRunnerPool" + ] + }, + "models.CreateRecurrenceRequest": { "properties": { - "id": { - "type": "integer" + "copy_assignee": { + "type": "boolean" }, - "key": { - "type": "string" + "copy_custom_fields": { + "type": "boolean" }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AdminGroupCreateRequest": { - "properties": { - "description": { - "type": "string" + "copy_description": { + "type": "boolean" }, - "name": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AdminGroupResponse": { - "properties": { - "created_at": { - "type": "string" + "copy_priority": { + "type": "boolean" }, - "description": { + "dtend": { "type": "string" }, - "id": { - "type": "integer" + "dtstart": { + "description": "ISO 8601 format", + "type": "string" }, - "member_count": { + "lead_time_days": { "type": "integer" }, - "name": { + "rrule": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AdminGroupUpdateRequest": { - "properties": { - "description": { - "type": "string" + "status_on_create": { + "type": "integer" }, - "name": { + "template_item_id": { + "type": "integer" + }, + "timezone": { "type": "string" } }, "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AdminUserResponse": { - "properties": { - "avatar_url": { - "type": "string" - }, - "created_at": { + }, + "models.Item": { + "properties": { + "assignee_avatar": { + "description": "Avatar URL of assigned user", "type": "string" }, - "email": { + "assignee_email": { + "description": "Email of assigned user", "type": "string" }, - "first_name": { - "type": "string" + "assignee_id": { + "description": "User assignment fields", + "type": "integer" }, - "full_name": { + "assignee_name": { + "description": "User information for API responses", "type": "string" }, - "group_ids": { + "calendar_data": { "items": { - "type": "integer" + "$ref": "#/components/schemas/models.CalendarScheduleEntry" }, "type": "array" }, - "id": { + "channel_id": { + "description": "Portal submission tracking fields (immutable once set)", "type": "integer" }, - "is_active": { - "type": "boolean" - }, - "language": { - "type": "string" - }, - "last_name": { - "type": "string" - }, - "timezone": { - "type": "string" - }, - "username": { + "channel_name": { + "description": "Portal submission tracking joined fields", "type": "string" }, - "warnings": { + "children": { + "description": "For tree representations", "items": { - "type": "string" + "$ref": "#/components/schemas/models.Item" }, "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AdminUserUpdateRequest": { - "properties": { - "email": { - "type": "string" }, - "first_name": { + "completed_at": { "type": "string" }, - "is_active": { - "type": "boolean" - }, - "last_name": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AgentRunResponse": { - "properties": { - "ended_at": { + "created_at": { "type": "string" }, - "error": { + "creator_email": { + "description": "Email of creator (internal user or portal customer)", "type": "string" }, - "id": { + "creator_id": { + "description": "Internal user who created this item", "type": "integer" }, - "item_id": { + "creator_name": { + "description": "Full name of creator (internal user or portal customer)", + "type": "string" + }, + "creator_portal_customer_email": { + "description": "Email of portal customer creator", + "type": "string" + }, + "creator_portal_customer_id": { + "description": "Portal customer who created this item (for portal submissions)", "type": "integer" }, - "job_kind": { + "creator_portal_customer_name": { + "description": "Name of portal customer creator", "type": "string" }, - "queued_at": { + "custom_field_values": { + "additionalProperties": {}, + "type": "object" + }, + "description": { "type": "string" }, - "started_at": { + "description_html": { "type": "string" }, - "status": { + "due_date": { + "description": "Due date for item completion", "type": "string" }, - "workspace_id": { + "effective_project_id": { + "description": "EffectiveProjectID is the resolved project after walking InheritProject\nup the parent chain. Consumers that need \"which time-tracking project\napplies to this item\" should read this, not ProjectID directly.", "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AuditLogEntryResponse": { - "properties": { - "action_type": { - "type": "string" }, - "details": { - "additionalProperties": {}, - "type": "object" + "effective_project_name": { + "type": "string" }, - "error_message": { + "end_date": { + "description": "End date for item", "type": "string" }, - "id": { + "estimate_minutes": { + "description": "Time estimate in minutes (compared against logged worklog time)", "type": "integer" }, - "ip_address": { + "frac_index": { + "description": "Manual sorting field", "type": "string" }, - "resource_id": { + "id": { "type": "integer" }, - "resource_name": { - "type": "string" + "inherit_project": { + "description": "If true, ProjectID is ignored and the parent item's effective project is used", + "type": "boolean" }, - "resource_type": { + "is_task": { + "description": "Flag to mark this item as a task (checklist item)", + "type": "boolean" + }, + "item_type_builtin_key": { "type": "string" }, - "success": { - "type": "boolean" + "item_type_id": { + "description": "Optional, defaults to workspace's default item type", + "type": "integer" }, - "timestamp": { + "item_type_name": { "type": "string" }, - "user_agent": { + "iteration_end_date": { "type": "string" }, - "user_id": { + "iteration_id": { + "description": "Optional iteration assignment", "type": "integer" }, - "username": { + "iteration_name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.AuditLogStreamResponse": { - "properties": { - "entries": { + }, + "key": { + "description": "Ready-to-display workspace key and item number", + "type": "string" + }, + "labels": { + "description": "Global item labels", "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.AuditLogEntryResponse" + "$ref": "#/components/schemas/models.Label" }, "type": "array" }, - "has_more": { - "type": "boolean" + "last_active_at": { + "description": "Recency for the board \"Bubble Mode\" sort. Bumped on activity (comments,\nedits, transitions) but not on manual frac_index reorder.", + "type": "string" }, - "next_after_id": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.CollectionListResponse": { - "properties": { - "items": { + "milestones": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.CollectionResponse" + "$ref": "#/components/schemas/models.Milestone" }, "type": "array" }, - "total": { + "parent_id": { + "description": "Hierarchy fields", "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.CollectionResponse": { - "properties": { - "created_at": { + }, + "parent_key": { "type": "string" }, - "description": { + "parent_title": { "type": "string" }, - "id": { + "parent_workspace_item_number": { + "description": "Parent's workspace-scoped number, for rendering the parent key", "type": "integer" }, - "name": { - "type": "string" + "personal_labels": { + "items": { + "$ref": "#/components/schemas/models.PersonalLabel" + }, + "type": "array" }, - "slug": { + "priority_builtin_key": { "type": "string" }, - "updated_at": { + "priority_color": { "type": "string" }, - "workspace_id": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.CustomFieldResponse": { - "properties": { - "description": { + "priority_icon": { "type": "string" }, - "display_order": { + "priority_id": { + "description": "Foreign key to priorities table", "type": "integer" }, - "field_type": { + "priority_name": { "type": "string" }, - "id": { + "project_id": { + "description": "Time-tracking project membership. \"Project\" in Windshift always refers\nto a row in time_projects; both ProjectID and TimeProjectID below are\nFKs to that table, serving different roles:\n ProjectID - the project this item belongs to (the bucket\n worklogs default to). Can be inherited from the\n parent item; see InheritProject.\n TimeProjectID - overrides the project used when logging time on\n this specific item (independent of the bucket the\n item belongs to).\nEffectiveProjectID (below) is the resolved value after applying\ninheritance, and is what consumers should read.", "type": "integer" }, - "name": { - "type": "string" - }, - "options": { - "description": "JSON string", + "project_inheritance_mode": { + "description": "\"none\" | \"inherit\" | \"direct\"", "type": "string" }, - "required": { - "type": "boolean" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.ErrorResponse": { - "properties": { - "code": { - "description": "Machine-readable error code", + "project_name": { + "description": "Name of the time-tracking project this item belongs to (joined from time_projects via ProjectID)", "type": "string" }, - "details": { - "description": "Additional error details" - }, - "error": { - "description": "Human-readable message", - "type": "string" + "related_work_item_id": { + "description": "Personal task relationship (for linking personal workspace tasks to work items)", + "type": "integer" }, - "request_id": { - "description": "Request correlation ID", - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.ItemTypeResponse": { - "properties": { - "builtin_key": { - "type": "string" + "related_work_item_number": { + "type": "integer" }, - "color": { + "related_work_item_title": { + "description": "Related work item joined fields (for personal tasks)", "type": "string" }, - "description": { + "related_work_item_workspace_id": { + "type": "integer" + }, + "related_work_item_workspace_key": { "type": "string" }, - "display_description": { + "reporter_avatar": { + "description": "Avatar URL of reporter", "type": "string" }, - "display_name": { + "reporter_email": { + "description": "Email of reporter", "type": "string" }, - "hierarchy_level": { + "reporter_id": { + "description": "User who reported this item (from Jira import)", "type": "integer" }, - "icon": { + "reporter_name": { + "description": "Full name of reporter", "type": "string" }, - "id": { + "request_type_id": { + "description": "Request type used for submission", "type": "integer" }, - "is_default": { - "type": "boolean" + "request_type_name": { + "description": "Name of the request type", + "type": "string" }, - "name": { + "start_date": { + "description": "Start date for item", "type": "string" }, - "sort_order": { + "status_builtin_key": { + "description": "Stable key for translating built-in statuses", + "type": "string" + }, + "status_color": { + "description": "Color from the status category (joined field)", + "type": "string" + }, + "status_id": { + "description": "Foreign key to statuses table", "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.IterationCreateRequest": { - "properties": { - "description": { + }, + "status_name": { + "description": "Name from statuses table (joined field)", "type": "string" }, - "end_date": { + "status_since": { + "description": "StatusSince is when the item last entered its current status, derived from\nitem_history (falls back to created_at when there is no recorded change).", "type": "string" }, - "is_global": { - "type": "boolean" + "story_points": { + "description": "Estimation", + "type": "number" }, - "name": { + "time_project_id": { + "type": "integer" + }, + "time_project_name": { + "description": "Name of the time-tracking project overriding worklog defaults (joined from time_projects via TimeProjectID)", "type": "string" }, - "start_date": { + "title": { "type": "string" }, - "status": { + "updated_at": { "type": "string" }, - "type_id": { - "type": "integer" + "virtual_field_data": { + "additionalProperties": {}, + "type": "object" }, "workspace_id": { "type": "integer" + }, + "workspace_item_number": { + "description": "Workspace-specific sequential number for display keys", + "type": "integer" + }, + "workspace_key": { + "type": "string" + }, + "workspace_name": { + "description": "Joined fields for API responses", + "type": "string" } }, - "required": [ - "end_date", - "name", - "start_date" - ], "type": "object" }, - "windshift_internal_restapi_v1_handlers.IterationResponse": { + "models.ItemDiagram": { "properties": { "created_at": { "type": "string" }, - "description": { + "created_by": { + "type": "integer" + }, + "creator_email": { "type": "string" }, - "end_date": { + "creator_name": { + "description": "Joined fields for API responses", + "type": "string" + }, + "diagram_data": { + "description": "JSON with elements, appState, files", "type": "string" }, "id": { "type": "integer" }, - "is_global": { - "type": "boolean" + "item_id": { + "type": "integer" }, "name": { "type": "string" }, - "start_date": { - "type": "string" - }, - "status": { - "type": "string" - }, - "type_color": { + "updated_at": { "type": "string" }, - "type_id": { + "updated_by": { "type": "integer" }, - "type_name": { + "updated_by_email": { "type": "string" }, - "updated_at": { + "updated_by_name": { "type": "string" - }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" - }, - "workspace_id": { - "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.IterationUpdateRequest": { + "models.ItemLink": { "properties": { - "description": { + "created_at": { "type": "string" }, - "end_date": { - "type": "string" + "created_by": { + "type": "integer" }, - "name": { + "created_by_name": { "type": "string" }, - "start_date": { - "type": "string" + "custom_field_id": { + "type": "integer" }, - "status": { + "custom_field_name": { + "description": "Custom field link metadata", "type": "string" }, - "type_id": { - "nullable": true, - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.MilestoneCreateRequest": { - "properties": { - "category_id": { + "id": { "type": "integer" }, - "description": { + "link_type_color": { "type": "string" }, - "name": { + "link_type_forward_label": { "type": "string" }, - "status": { - "type": "string" + "link_type_id": { + "type": "integer" }, - "target_date": { - "type": "string" - } - }, - "required": [ - "name" - ], - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.MilestoneProgressItemResponse": { - "properties": { - "assignee_avatar": { + "link_type_name": { + "description": "Joined fields for API responses", "type": "string" }, - "assignee_name": { + "link_type_reverse_label": { "type": "string" }, - "id": { + "source_id": { "type": "integer" }, - "item_number": { + "source_item_number": { + "description": "SourceItemNumber is the workspace-scoped item number (the \"74\" in\n\"WI-74\"). Display the user-facing key as\nSourceWorkspaceKey + \"-\" + SourceItemNumber, never SourceID — that\nfield is the global DB id and looks wrong (e.g. \"WI-149\") in UI.", "type": "integer" }, - "priority_builtin_key": { + "source_item_type_color": { "type": "string" }, - "priority_color": { + "source_item_type_icon": { "type": "string" }, - "priority_name": { + "source_item_type_id": { + "type": "integer" + }, + "source_item_type_name": { "type": "string" }, - "status_builtin_key": { + "source_status_color": { "type": "string" }, - "status_color": { + "source_status_id": { + "description": "Source item details", + "type": "integer" + }, + "source_status_name": { "type": "string" }, - "status_name": { + "source_title": { "type": "string" }, - "title": { + "source_type": { + "description": "\"item\" or \"test_case\"", "type": "string" }, - "workspace_id": { + "source_workspace_id": { "type": "integer" }, - "workspace_key": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.MilestoneProgressResponse": { - "properties": { - "category_color": { + "source_workspace_key": { "type": "string" }, - "completed_items": { + "target_id": { "type": "integer" }, - "description": { + "target_item_number": { + "description": "TargetItemNumber: see SourceItemNumber.", + "type": "integer" + }, + "target_item_type_color": { "type": "string" }, - "items_by_category": { - "additionalProperties": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.MilestoneProgressItemResponse" - }, - "type": "array" - }, - "type": "object" + "target_item_type_icon": { + "type": "string" }, - "milestone_id": { + "target_item_type_id": { "type": "integer" }, - "milestone_name": { + "target_item_type_name": { "type": "string" }, - "percent_complete": { - "type": "number" + "target_status_color": { + "type": "string" }, - "status": { + "target_status_id": { + "description": "Target item details", + "type": "integer" + }, + "target_status_name": { "type": "string" }, - "status_breakdown": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.MilestoneStatusBreakdownResponse" - }, - "type": "array" + "target_title": { + "type": "string" }, - "target_date": { + "target_type": { + "description": "\"item\" or \"test_case\"", "type": "string" }, - "total_items": { + "target_workspace_id": { "type": "integer" + }, + "target_workspace_key": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.MilestoneResponse": { + "models.ItemTemplate": { "properties": { - "category_color": { + "created_at": { "type": "string" }, - "category_id": { + "created_by": { "type": "integer" }, - "category_name": { - "type": "string" - }, - "created_at": { - "type": "string" - }, - "description": { + "description_body": { "type": "string" }, "id": { "type": "integer" }, - "is_global": { + "is_active": { "type": "boolean" }, - "name": { - "type": "string" - }, - "position": { - "type": "integer" + "item_type_ids": { + "items": { + "type": "integer" + }, + "type": "array" }, - "status": { + "mode": { "type": "string" }, - "target_date": { + "name": { "type": "string" }, "updated_at": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" + "updated_by": { + "type": "integer" }, "workspace_id": { "type": "integer" @@ -5728,65 +3938,47 @@ }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.MilestoneStatusBreakdownResponse": { + "models.Label": { "properties": { - "category_builtin_key": { - "type": "string" - }, - "category_color": { + "color": { "type": "string" }, - "category_name": { + "created_at": { "type": "string" }, - "is_completed": { - "type": "boolean" - }, - "item_count": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.MilestoneUpdateRequest": { - "properties": { - "category_id": { - "nullable": true, + "id": { "type": "integer" }, - "description": { - "type": "string" - }, "name": { "type": "string" }, - "status": { - "type": "string" - }, - "target_date": { - "nullable": true, + "updated_at": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.PaginatedResponse": { - "properties": { - "data": {}, - "pagination": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginationMeta" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.PriorityResponse": { + "models.LinkType": { "properties": { + "active": { + "type": "boolean" + }, + "allowed_entity_types": { + "description": "nil = all types allowed; e.g. [\"item\",\"test_case\"]", + "items": { + "type": "string" + }, + "type": "array" + }, "builtin_key": { "type": "string" }, "color": { "type": "string" }, + "created_at": { + "type": "string" + }, "description": { "type": "string" }, @@ -5796,1126 +3988,1187 @@ "display_name": { "type": "string" }, - "icon": { + "forward_label": { "type": "string" }, "id": { "type": "integer" }, - "is_default": { + "is_system": { "type": "boolean" }, "name": { "type": "string" }, - "sort_order": { - "type": "integer" + "reverse_label": { + "type": "string" + }, + "updated_at": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.StatusCategoryResponse": { + "models.Milestone": { "properties": { - "builtin_key": { + "category_color": { "type": "string" }, - "color": { + "category_id": { + "type": "integer" + }, + "category_name": { + "description": "Joined fields for API responses", "type": "string" }, - "description": { + "created_at": { "type": "string" }, - "display_description": { + "description": { "type": "string" }, - "display_name": { + "external_key": { + "description": "Stable upsert key set by automation (e.g. tag short-name); unique per workspace when set", "type": "string" }, "id": { "type": "integer" }, - "is_completed": { + "is_global": { + "description": "false=local to workspace, true=global (shared)", "type": "boolean" }, - "is_default": { - "type": "boolean" + "latest_release": { + "$ref": "#/components/schemas/models.MilestoneRelease" }, "name": { "type": "string" + }, + "position": { + "description": "Manual sort order (drag-and-drop), scoped per (is_global, workspace_id, category_id)", + "type": "integer" + }, + "releases": { + "items": { + "$ref": "#/components/schemas/models.MilestoneRelease" + }, + "type": "array" + }, + "status": { + "description": "planning, in-progress, completed, cancelled", + "type": "string" + }, + "target_date": { + "description": "Date in YYYY-MM-DD format, nullable", + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "workspace_id": { + "description": "NULL if global, set if local to workspace", + "type": "integer" + }, + "workspace_name": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.StatusResponse": { + "models.MilestoneRelease": { "properties": { - "builtin_key": { - "type": "string" + "assets": { + "items": { + "$ref": "#/components/schemas/models.SCMReleaseAsset" + }, + "type": "array" }, - "category_builtin_key": { + "body": { "type": "string" }, - "category_color": { + "created_at": { "type": "string" }, - "category_id": { + "created_by": { "type": "integer" }, - "category_name": { + "id": { + "type": "integer" + }, + "is_draft": { + "type": "boolean" + }, + "is_prerelease": { + "type": "boolean" + }, + "last_synced_at": { "type": "string" }, - "description": { + "milestone_id": { + "type": "integer" + }, + "name": { "type": "string" }, - "display_description": { + "release_status": { "type": "string" }, - "display_name": { + "released_at": { "type": "string" }, - "id": { + "scm_connection_id": { + "description": "Visible only to users with connection workspace access", "type": "integer" }, - "is_completed": { - "type": "boolean" + "scm_release_id": { + "type": "string" }, - "is_default": { - "type": "boolean" + "scm_release_url": { + "type": "string" }, - "name": { + "scm_repository": { + "description": "\"owner/repo\"; same visibility as SCMConnectionID", "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.TranslationResolveRequest": { - "properties": { - "locale": { + }, + "tag_name": { "type": "string" }, - "targets": { - "items": { - "$ref": "#/components/schemas/objecttranslation.Target" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.TranslationUpsertRequest": { - "properties": { - "value": { + "tag_url": { "type": "string" + }, + "target_commitish": { + "type": "string" + }, + "workspace_repository_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.UserResponse": { + "models.PageLabel": { "properties": { - "agent_presence": { - "type": "string" - }, - "avatar_url": { + "color": { "type": "string" }, "created_at": { "type": "string" }, - "email": { - "type": "string" + "id": { + "type": "integer" }, - "first_name": { + "name": { "type": "string" }, - "full_name": { + "updated_at": { "type": "string" }, - "id": { + "workspace_id": { "type": "integer" + } + }, + "type": "object" + }, + "models.PagePermission": { + "properties": { + "granted_at": { + "type": "string" }, - "is_active": { - "type": "boolean" + "granted_by": { + "type": "integer" }, - "is_agent": { - "type": "boolean" + "id": { + "type": "integer" }, - "language": { - "type": "string" + "page_id": { + "type": "integer" }, - "last_name": { + "permission_level": { "type": "string" }, - "timezone": { - "type": "string" + "principal_id": { + "type": "integer" }, - "username": { + "principal_type": { "type": "string" - }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.WorkflowResponse": { + "models.PersonalLabel": { "properties": { - "builtin_key": { + "color": { "type": "string" }, "created_at": { "type": "string" }, - "description": { - "type": "string" - }, "id": { "type": "integer" }, - "is_default": { - "type": "boolean" - }, "name": { "type": "string" }, - "transitions": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResponse" - }, - "type": "array" - }, "updated_at": { "type": "string" + }, + "user_id": { + "description": "NULL for global labels, user_id for user-specific labels", + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.WorkspaceCreateRequest": { + "models.RRulePreviewRequest": { "properties": { - "color": { + "count": { + "description": "Number of occurrences to preview (default 10)", + "type": "integer" + }, + "dtstart": { "type": "string" }, - "description": { + "rrule": { + "type": "string" + } + }, + "type": "object" + }, + "models.RecurrenceInstance": { + "properties": { + "created_at": { "type": "string" }, - "icon": { + "id": { + "type": "integer" + }, + "instance_item_id": { + "type": "integer" + }, + "item_status": { "type": "string" }, - "key": { - "maxLength": 10, - "minLength": 2, + "item_title": { "type": "string" }, - "name": { - "maxLength": 100, + "recurrence_rule_id": { + "type": "integer" + }, + "scheduled_date": { "type": "string" }, - "template_workspace_id": { + "sequence_number": { "type": "integer" } }, - "required": [ - "key", - "name" - ], "type": "object" }, - "windshift_internal_restapi_v1_handlers.WorkspaceResponse": { + "models.RecurrenceRule": { "properties": { - "active": { + "copy_assignee": { "type": "boolean" }, - "color": { - "type": "string" + "copy_custom_fields": { + "type": "boolean" + }, + "copy_description": { + "type": "boolean" + }, + "copy_priority": { + "type": "boolean" }, "created_at": { "type": "string" }, - "description": { + "created_by": { + "type": "integer" + }, + "creator_name": { "type": "string" }, - "icon": { + "dtend": { + "type": "string" + }, + "dtstart": { + "description": "Recurrence start date", "type": "string" }, "id": { "type": "integer" }, - "internal_comments_enabled": { - "type": "boolean" + "instance_count": { + "type": "integer" }, - "is_personal": { + "is_active": { "type": "boolean" }, - "is_template": { - "type": "boolean" + "last_generated_until": { + "type": "string" }, - "key": { + "lead_time_days": { + "type": "integer" + }, + "next_generation_check": { "type": "string" }, - "name": { + "next_occurrence": { "type": "string" }, - "time_project_id": { + "rrule": { + "description": "e.g., \"FREQ=WEEKLY;BYDAY=MO,WE,FR\"", + "type": "string" + }, + "status_on_create": { + "type": "integer" + }, + "template_item_id": { "type": "integer" }, + "template_title": { + "type": "string" + }, + "timezone": { + "description": "IANA timezone", + "type": "string" + }, "updated_at": { "type": "string" }, - "warnings": { - "items": { - "type": "string" - }, - "type": "array" + "workspace_id": { + "type": "integer" + }, + "workspace_key": { + "type": "string" + }, + "workspace_name": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.WorkspaceTemplateSummaryResponse": { + "models.SCMReleaseAsset": { "properties": { - "color": { + "direct_url": { "type": "string" }, - "configuration_set_name": { + "format": { "type": "string" }, - "description": { + "kind": { "type": "string" }, - "icon": { + "link_type": { "type": "string" }, - "id": { + "name": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "models.SkillActivationUsage": { + "properties": { + "bytes": { "type": "integer" }, - "item_count": { + "estimated_tokens": { "type": "integer" }, - "name": { - "type": "string" + "max_bytes": { + "type": "integer" }, - "template_count": { + "max_tokens": { + "type": "integer" + }, + "page_prefix_bytes": { + "type": "integer" + }, + "page_prefix_runes": { "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.WorkspaceUpdateRequest": { + "models.SkillPageReference": { "properties": { - "active": { - "type": "boolean" + "activation_bytes": { + "type": "integer" }, - "color": { + "activation_runes": { + "type": "integer" + }, + "id": { + "type": "integer" + }, + "page_updated_at": { "type": "string" }, - "description": { + "snapshot_at": { "type": "string" }, - "icon": { + "snapshot_title": { "type": "string" }, - "is_template": { + "stale": { "type": "boolean" }, - "name": { + "title": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.actionDefinitionRequest": { + "models.TestCase": { "properties": { - "description": { + "created_at": { "type": "string" }, - "edges": { + "estimated_duration": { + "description": "in seconds", + "type": "integer" + }, + "folder_id": { + "type": "integer" + }, + "folder_name": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "labels": { "items": { - "$ref": "#/components/schemas/models.ActionEdge" + "$ref": "#/components/schemas/models.TestLabel" }, "type": "array" }, "name": { "type": "string" }, - "nodes": { - "items": { - "$ref": "#/components/schemas/models.ActionNode" - }, - "type": "array" + "preconditions": { + "type": "string" }, - "trigger_config": { + "priority": { + "description": "low, medium, high, critical", "type": "string" }, - "trigger_type": { - "$ref": "#/components/schemas/models.ActionTriggerType" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.agentSkillListResponse": { - "properties": { - "items": { + "sort_order": { + "type": "integer" + }, + "status": { + "description": "active, inactive, draft", + "type": "string" + }, + "test_steps": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.agentSkillSummary" + "$ref": "#/components/schemas/models.TestStep" }, "type": "array" + }, + "title": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.agentSkillSummary": { + "models.TestFolder": { "properties": { - "description": { + "created_at": { "type": "string" }, - "enabled": { - "type": "boolean" + "description": { + "type": "string" }, "id": { "type": "integer" }, "name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.batchItemLinksResponse": { - "properties": { - "has_more_links": { - "type": "boolean" }, - "incoming": { - "items": { - "$ref": "#/components/schemas/models.ItemLink" - }, - "type": "array" + "parent_id": { + "type": "integer" }, - "item_id": { + "sort_order": { "type": "integer" }, - "next_after_link_id": { + "test_case_count": { "type": "integer" }, - "outgoing": { - "items": { - "$ref": "#/components/schemas/models.ItemLink" - }, - "type": "array" + "updated_at": { + "type": "string" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.capabilityDTO": { + "models.TestLabel": { "properties": { - "capability_type": { - "$ref": "#/components/schemas/models.CapabilityType" + "color": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "description": { + "type": "string" }, "id": { "type": "integer" }, "name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.catalogResponse": { - "properties": { - "capabilities": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.capabilityDTO" - }, - "type": "array" }, - "nodes": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.nodeTypeDTO" - }, - "type": "array" - }, - "scope": { + "updated_at": { "type": "string" }, - "triggers": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.triggerTypeDTO" - }, - "type": "array" + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.createWorklogRequest": { + "models.TestRun": { "properties": { - "date": { + "assignee_avatar": { "type": "string" }, - "description": { + "assignee_email": { "type": "string" }, - "duration": { + "assignee_id": { + "description": "User assigned to execute this run", + "type": "integer" + }, + "assignee_name": { "type": "string" }, - "duration_minutes": { - "type": "integer" + "created_at": { + "type": "string" }, - "end_time": { + "ended_at": { "type": "string" }, - "item_id": { + "id": { "type": "integer" }, - "item_key": { + "name": { "type": "string" }, - "project_id": { + "set_id": { "type": "integer" }, - "start_time": { + "started_at": { "type": "string" }, - "timezone": { - "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.diagramListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.ItemDiagram" - }, - "type": "array" + "template_id": { + "description": "Optional reference to template", + "type": "integer" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.diagramWriteRequest": { + "models.TestRunTemplate": { "properties": { - "diagram_data": { + "created_at": { + "type": "string" + }, + "description": { "type": "string" }, + "id": { + "type": "integer" + }, "name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.itemChangeResponse": { - "properties": { - "change_type": { + }, + "set_id": { + "type": "integer" + }, + "set_name": { "type": "string" }, - "item_id": { + "updated_at": { + "type": "string" + }, + "workspace_id": { "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.itemChangesResponse": { + "models.TestSet": { "properties": { - "changes": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.itemChangeResponse" - }, - "type": "array" - }, - "has_more": { - "type": "boolean" + "created_at": { + "type": "string" }, - "next_cursor": { + "description": { "type": "string" }, - "reset_required": { - "type": "boolean" + "failed_runs": { + "type": "integer" }, - "watermark": { + "id": { + "type": "integer" + }, + "last_run_date": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.itemLabelAddRequest": { - "properties": { - "label_id": { + }, + "last_run_status": { + "type": "string" + }, + "milestone_id": { "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.itemLabelSetRequest": { - "properties": { - "label_ids": { - "items": { - "type": "integer" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.labelCreateRequest": { - "properties": { - "color": { + }, + "milestone_name": { "type": "string" }, "name": { "type": "string" + }, + "successful_runs": { + "type": "integer" + }, + "test_case_count": { + "type": "integer" + }, + "total_runs": { + "type": "integer" + }, + "updated_at": { + "type": "string" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.labelListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.Label" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.labelUpdateRequest": { + "models.TestStep": { "properties": { - "color": { + "action": { "type": "string" }, - "name": { + "created_at": { + "type": "string" + }, + "data": { + "type": "string" + }, + "expected": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "step_number": { + "type": "integer" + }, + "test_case_id": { + "type": "integer" + }, + "updated_at": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.linkCreateRequest": { + "models.UpdateRecurrenceRequest": { "properties": { - "link_type_id": { - "type": "integer" + "copy_assignee": { + "type": "boolean" + }, + "copy_custom_fields": { + "type": "boolean" + }, + "copy_description": { + "type": "boolean" + }, + "copy_priority": { + "type": "boolean" + }, + "dtend": { + "type": "string" + }, + "dtstart": { + "type": "string" + }, + "is_active": { + "type": "boolean" }, - "source_id": { + "lead_time_days": { "type": "integer" }, - "source_type": { + "rrule": { "type": "string" }, - "target_id": { + "status_on_create": { "type": "integer" }, - "target_type": { + "timezone": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.milestoneReorderRequest": { + "models.UserTUIPreferences": { "properties": { - "category_id": { + "last_workspace_id": { "type": "integer" }, - "ordered_ids": { - "items": { - "type": "integer" - }, - "type": "array" + "split_ratio": { + "type": "number" + }, + "theme": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.nodeTypeDTO": { + "models.WorkspaceAgentSkill": { "properties": { - "category": { + "body": { "type": "string" }, - "config_schema": { - "type": "object" + "created_at": { + "type": "string" + }, + "created_by_user_id": { + "description": "CreatedByUserID is a soft audit ref; nil when the creator was deleted.", + "type": "integer" }, "description": { "type": "string" }, - "is_iterator": { + "enabled": { "type": "boolean" }, - "label": { + "id": { + "type": "integer" + }, + "name": { "type": "string" }, - "outputs": { + "pages": { + "description": "Pages are the workspace pages referenced by this skill (WI-517). On the\nadmin surface they round-trip with snapshot review state; the exact saved\ncontent is rendered into a run grant. nil/omitted when there are none.", "items": { - "type": "string" + "$ref": "#/components/schemas/models.SkillPageReference" }, "type": "array" }, - "type": { - "$ref": "#/components/schemas/models.ActionNodeType" + "updated_at": { + "type": "string" + }, + "usage": { + "$ref": "#/components/schemas/models.SkillActivationUsage" + }, + "workspace_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageCreateRequest": { + "objecttranslation.CanonicalDifference": { "properties": { - "content": { + "builtin_key": { "type": "string" }, - "is_home": { - "type": "boolean" + "canonical": { + "type": "string" }, - "metadata": { - "additionalProperties": {}, - "type": "object" + "field": { + "type": "string" }, - "parent_id": { + "object_id": { "type": "integer" }, - "title": { + "object_type": { + "type": "string" + }, + "system": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageDiagramListResponse": { + "objecttranslation.ObjectDefinition": { "properties": { - "items": { + "fields": { "items": { - "$ref": "#/components/schemas/services.PageDiagram" + "type": "string" }, "type": "array" + }, + "object_type": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageGrantPermissionRequest": { + "objecttranslation.ResolvedValue": { "properties": { - "permission_level": { + "field": { "type": "string" }, - "principal_id": { + "locale": { + "type": "string" + }, + "object_id": { "type": "integer" }, - "principal_type": { + "object_type": { + "type": "string" + }, + "source": { + "type": "string" + }, + "value": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageHistoryListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageRevisionResponse" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pageLabelAddRequest": { + "objecttranslation.Target": { "properties": { - "label_id": { + "fallback": { + "type": "string" + }, + "field": { + "type": "string" + }, + "object_id": { "type": "integer" + }, + "object_type": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageLabelCreateRequest": { + "objecttranslation.Translation": { "properties": { - "color": { + "created_at": { "type": "string" }, - "name": { + "field": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pageLabelListResponse": { - "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.PageLabel" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pageLabelSetRequest": { - "properties": { - "label_ids": { - "items": { - "type": "integer" - }, - "type": "array" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pageLabelUpdateRequest": { - "properties": { - "color": { + }, + "locale": { "type": "string" }, - "name": { + "object_id": { + "type": "integer" + }, + "object_type": { + "type": "string" + }, + "source": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "value": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageListResponse": { + "restapi.ErrorResponse": { "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" - }, - "type": "array" + "code": { + "description": "Machine-readable error code", + "type": "string" + }, + "details": { + "description": "Additional error details" + }, + "error": { + "description": "Human-readable message", + "type": "string" + }, + "request_id": { + "description": "Request correlation ID", + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageListWithLabelsResponse": { + "restapi.PaginatedResponse": { "properties": { - "items": { - "items": { - "$ref": "#/components/schemas/models.PageLabel" - }, - "type": "array" + "data": {}, + "pagination": { + "$ref": "#/components/schemas/restapi.PaginationMeta" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageMoveRequest": { + "restapi.PaginationMeta": { "properties": { - "destination_workspace_id": { - "type": "integer" + "has_more": { + "type": "boolean" }, - "next_sibling_id": { + "limit": { "type": "integer" }, - "parent_id": { + "page": { "type": "integer" }, - "prev_sibling_id": { + "total": { "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pagePermissionsResponse": { - "properties": { - "acl": { - "items": { - "$ref": "#/components/schemas/models.PagePermission" - }, - "type": "array" - }, - "effective_level": { - "type": "string" - }, - "inherit_permissions": { - "type": "boolean" }, - "page_id": { + "total_pages": { "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.pageSetInheritanceRequest": { - "properties": { - "inherit_permissions": { - "type": "boolean" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.pageUpdateRequest": { + "services.CreatePageDiagramInput": { "properties": { - "content": { - "type": "string" + "excalidraw": { + "type": "object" }, "expected_content_hash": { "type": "string" }, - "metadata": { - "additionalProperties": {}, - "type": "object" - }, - "title": { + "mermaid": { + "type": "string" + }, + "name": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.recurrenceForceGenerateResponse": { - "properties": { - "instances_generated": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.recurrenceInstanceListResponse": { - "properties": { - "instances": { - "items": { - "$ref": "#/components/schemas/models.RecurrenceInstance" - }, - "type": "array" }, - "pagination": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginationMeta" + "placement": { + "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.startTimerRequest": { + "services.PageDiagram": { "properties": { - "description": { + "attachment_id": { + "type": "integer" + }, + "content_hash": { "type": "string" }, - "item_id": { - "type": "integer" + "created_at": { + "type": "string" }, - "project_id": { + "kind": { + "type": "string" + }, + "name": { + "type": "string" + }, + "page_id": { "type": "integer" }, - "workspace_id": { + "payload": { + "type": "object" + }, + "revision_number": { "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.templateCreateRequest": { + "services.RecurrencePreview": { "properties": { - "description_body": { + "dtstart": { "type": "string" }, - "is_active": { - "type": "boolean" - }, - "item_type_ids": { + "occurrences": { "items": { - "type": "integer" + "type": "string" }, "type": "array" }, - "mode": { - "type": "string" - }, - "name": { + "rrule": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.templateListResponse": { + "services.TestRunDetail": { "properties": { - "items": { + "results": { "items": { - "$ref": "#/components/schemas/models.ItemTemplate" + "$ref": "#/components/schemas/services.TestRunResultWithCaseTitle" }, "type": "array" }, - "mandatory_template_id": { - "description": "MandatoryTemplateID is set when the request filtered by item_type_id and\nthat type has an active mandatory template, so callers (create modal, CLI)\ncan flag it without re-deriving the invariant.", - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.templateUpdateRequest": { - "properties": { - "description_body": { - "type": "string" + "run": { + "$ref": "#/components/schemas/models.TestRun" }, - "is_active": { - "type": "boolean" + "step_results": { + "additionalProperties": { + "$ref": "#/components/schemas/services.TestRunStepResult" + }, + "type": "object" }, - "item_type_ids": { + "test_cases": { "items": { - "type": "integer" + "$ref": "#/components/schemas/models.TestCase" }, "type": "array" - }, - "mode": { - "type": "string" - }, - "name": { - "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.testResultUpdateRequest": { + "services.TestRunResultWithCaseTitle": { "properties": { "actual_result": { "type": "string" }, - "notes": { + "created_at": { "type": "string" }, - "status": { + "executed_at": { "type": "string" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.testRunCreateRequest": { - "properties": { - "assignee_id": { + }, + "id": { "type": "integer" }, - "name": { + "notes": { "type": "string" }, - "set_id": { + "run_id": { "type": "integer" }, - "template_id": { - "type": "integer" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.timeProjectResponse": { - "properties": { - "category_color": { + "status": { + "description": "\"passed\", \"failed\", \"blocked\", \"skipped\", \"not_run\"", "type": "string" }, - "category_id": { + "test_case_id": { "type": "integer" }, - "category_name": { + "test_case_title": { "type": "string" }, - "color": { + "updated_at": { "type": "string" - }, - "customer_id": { - "type": "integer" - }, - "customer_name": { + } + }, + "type": "object" + }, + "services.TestRunStepResult": { + "properties": { + "actual_result": { "type": "string" }, - "description": { + "executed_at": { "type": "string" }, - "hourly_rate": { - "type": "number" - }, - "id": { + "item_id": { "type": "integer" }, - "name": { + "notes": { "type": "string" }, - "settings": { - "additionalProperties": {}, - "type": "object" - }, "status": { "type": "string" }, - "total_hours": { - "type": "number" + "step_id": { + "type": "integer" + }, + "test_case_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.triggerTypeDTO": { + "services.UpdatePageDiagramInput": { "properties": { - "config_schema": { + "excalidraw": { "type": "object" }, - "description": { + "expected_content_hash": { "type": "string" }, - "label": { + "mermaid": { "type": "string" }, - "type": { - "$ref": "#/components/schemas/models.ActionTriggerType" - } - }, - "type": "object" - }, - "windshift_internal_restapi_v1_handlers.updateWorklogRequest": { - "properties": { - "description": { + "name": { "type": "string" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.validateActionResponse": { + "windshift_internal_restapi_v1_handlers.AuditLogStreamResponse": { "properties": { - "errors": { + "entries": { "items": { - "$ref": "#/components/schemas/actioncatalog.ValidationError" + "$ref": "#/components/schemas/handlers.AuditLogEntryResponse" }, "type": "array" + }, + "has_more": { + "type": "boolean" + }, + "next_after_id": { + "type": "integer" } }, "type": "object" }, - "windshift_internal_restapi_v1_handlers.worklogResponse": { + "windshift_internal_restapi_v1_handlers.UserResponse": { "properties": { - "created_at": { - "type": "integer" - }, - "customer_id": { - "type": "integer" + "agent_presence": { + "type": "string" }, - "customer_name": { + "avatar_url": { "type": "string" }, - "date": { - "type": "integer" + "created_at": { + "type": "string" }, - "description": { + "email": { "type": "string" }, - "duration_minutes": { - "type": "integer" + "first_name": { + "type": "string" }, - "end_time": { - "type": "integer" + "full_name": { + "type": "string" }, "id": { "type": "integer" }, - "item_id": { - "type": "integer" - }, - "item_title": { - "type": "string" - }, - "project_id": { - "type": "integer" + "is_active": { + "type": "boolean" }, - "project_max_hours": { - "type": "number" + "is_agent": { + "type": "boolean" }, - "project_name": { + "language": { "type": "string" }, - "project_total_hours": { - "type": "number" - }, - "start_time": { - "type": "integer" - }, - "updated_at": { - "type": "integer" - }, - "workspace_id": { - "type": "integer" + "last_name": { + "type": "string" }, - "workspace_item_number": { - "type": "integer" + "timezone": { + "type": "string" }, - "workspace_key": { + "username": { "type": "string" + }, + "warnings": { + "items": { + "type": "string" + }, + "type": "array" } }, "type": "object" @@ -6974,7 +5227,7 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { @@ -6997,7 +5250,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7007,7 +5260,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7017,7 +5270,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7027,7 +5280,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7067,7 +5320,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7077,7 +5330,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7087,7 +5340,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7097,7 +5350,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7183,13 +5436,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AuditLogEntryResponse" + "$ref": "#/components/schemas/handlers.AuditLogEntryResponse" }, "type": "array" } @@ -7206,7 +5459,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7216,7 +5469,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7226,7 +5479,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7236,7 +5489,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7280,7 +5533,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AuditLogStreamResponse" + "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.AuditLogStreamResponse" } } }, @@ -7290,7 +5543,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7300,7 +5553,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7310,7 +5563,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7320,7 +5573,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7366,13 +5619,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminGroupResponse" + "$ref": "#/components/schemas/handlers.AdminGroupResponse" }, "type": "array" } @@ -7389,7 +5642,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7399,7 +5652,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7409,7 +5662,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7432,7 +5685,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminGroupCreateRequest" + "$ref": "#/components/schemas/handlers.AdminGroupCreateRequest" } } }, @@ -7445,7 +5698,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminGroupResponse" + "$ref": "#/components/schemas/handlers.AdminGroupResponse" } } }, @@ -7455,7 +5708,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7465,7 +5718,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7475,7 +5728,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7485,7 +5738,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7525,7 +5778,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7535,7 +5788,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7545,7 +5798,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7555,7 +5808,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7565,7 +5818,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7599,7 +5852,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminGroupUpdateRequest" + "$ref": "#/components/schemas/handlers.AdminGroupUpdateRequest" } } }, @@ -7615,7 +5868,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7625,7 +5878,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7635,7 +5888,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7645,7 +5898,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7655,7 +5908,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7694,7 +5947,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7704,7 +5957,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7744,7 +5997,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7754,7 +6007,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7794,7 +6047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7804,7 +6057,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7830,7 +6083,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.TranslationResolveRequest" + "$ref": "#/components/schemas/handlers.TranslationResolveRequest" } } }, @@ -7856,7 +6109,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7866,7 +6119,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7876,7 +6129,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7936,7 +6189,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7946,7 +6199,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7956,7 +6209,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -7966,7 +6219,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8034,7 +6287,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8044,7 +6297,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8054,7 +6307,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8064,7 +6317,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8126,7 +6379,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.TranslationUpsertRequest" + "$ref": "#/components/schemas/handlers.TranslationUpsertRequest" } } }, @@ -8149,7 +6402,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8159,7 +6412,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8169,7 +6422,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8179,7 +6432,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8226,13 +6479,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminUserResponse" + "$ref": "#/components/schemas/handlers.AdminUserResponse" }, "type": "array" } @@ -8249,7 +6502,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8259,7 +6512,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8269,7 +6522,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8305,7 +6558,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.AdminUserUpdateRequest" + "$ref": "#/components/schemas/handlers.AdminUserUpdateRequest" } } }, @@ -8318,7 +6571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.UserResponse" + "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.UserResponse" } } }, @@ -8328,7 +6581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8338,7 +6591,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8348,7 +6601,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8358,7 +6611,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8368,7 +6621,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -8404,7 +6657,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetCategoryResponse" + "$ref": "#/components/schemas/dto.AssetCategoryResponse" } } }, @@ -8414,7 +6667,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8440,7 +6693,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetSetResponse" + "$ref": "#/components/schemas/dto.AssetSetResponse" }, "type": "array" } @@ -8452,7 +6705,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8488,7 +6741,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetSetResponse" + "$ref": "#/components/schemas/dto.AssetSetResponse" } } }, @@ -8498,7 +6751,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8583,7 +6836,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.PaginatedResponse" + "$ref": "#/components/schemas/restapi.PaginatedResponse" } } }, @@ -8593,7 +6846,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8603,7 +6856,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8636,7 +6889,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetCreateRequest" + "$ref": "#/components/schemas/dto.AssetCreateRequest" } } }, @@ -8649,7 +6902,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetResponse" + "$ref": "#/components/schemas/dto.AssetResponse" } } }, @@ -8659,7 +6912,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8669,7 +6922,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8742,7 +6995,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetImportJobResponse" + "$ref": "#/components/schemas/dto.AssetImportJobResponse" } } }, @@ -8752,7 +7005,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8762,7 +7015,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8799,7 +7052,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetCategoryResponse" + "$ref": "#/components/schemas/dto.AssetCategoryResponse" }, "type": "array" } @@ -8811,7 +7064,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8848,7 +7101,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetStatusResponse" + "$ref": "#/components/schemas/dto.AssetStatusResponse" }, "type": "array" } @@ -8860,7 +7113,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8897,7 +7150,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetTypeResponse" + "$ref": "#/components/schemas/dto.AssetTypeResponse" }, "type": "array" } @@ -8909,7 +7162,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8945,7 +7198,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetStatusResponse" + "$ref": "#/components/schemas/dto.AssetStatusResponse" } } }, @@ -8955,7 +7208,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -8991,7 +7244,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetTypeResponse" + "$ref": "#/components/schemas/dto.AssetTypeResponse" } } }, @@ -9001,7 +7254,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -9040,7 +7293,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -9074,7 +7327,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetResponse" + "$ref": "#/components/schemas/dto.AssetResponse" } } }, @@ -9084,7 +7337,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -9117,7 +7370,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetUpdateRequest" + "$ref": "#/components/schemas/dto.AssetUpdateRequest" } } }, @@ -9130,7 +7383,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AssetResponse" + "$ref": "#/components/schemas/dto.AssetResponse" } } }, @@ -9140,7 +7393,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -9180,7 +7433,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9227,7 +7480,7 @@ "content": { "application/octet-stream": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9237,7 +7490,7 @@ "content": { "application/octet-stream": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9247,7 +7500,7 @@ "content": { "application/octet-stream": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9257,7 +7510,7 @@ "content": { "application/octet-stream": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9304,7 +7557,7 @@ "content": { "image/jpeg": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9314,7 +7567,7 @@ "content": { "image/jpeg": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9324,7 +7577,7 @@ "content": { "image/jpeg": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9334,7 +7587,7 @@ "content": { "image/jpeg": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9378,7 +7631,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.CollectionListResponse" + "$ref": "#/components/schemas/handlers.CollectionListResponse" } } }, @@ -9388,7 +7641,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9398,7 +7651,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9408,7 +7661,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9445,7 +7698,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.CollectionResponse" + "$ref": "#/components/schemas/handlers.CollectionResponse" } } }, @@ -9455,7 +7708,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9465,7 +7718,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9475,7 +7728,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9485,7 +7738,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9495,7 +7748,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9574,13 +7827,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -9597,7 +7850,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9607,7 +7860,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9617,7 +7870,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9627,7 +7880,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9637,7 +7890,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9677,7 +7930,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9687,7 +7940,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9697,7 +7950,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9707,7 +7960,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9717,7 +7970,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9752,7 +8005,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentResponse" + "$ref": "#/components/schemas/dto.CommentResponse" } } }, @@ -9762,7 +8015,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9772,7 +8025,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9782,7 +8035,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9792,7 +8045,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9802,7 +8055,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9836,7 +8089,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentUpdateRequest" + "$ref": "#/components/schemas/dto.CommentUpdateRequest" } } }, @@ -9849,7 +8102,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentResponse" + "$ref": "#/components/schemas/dto.CommentResponse" } } }, @@ -9859,7 +8112,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9869,7 +8122,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9879,7 +8132,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9889,7 +8142,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9899,7 +8152,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9925,7 +8178,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.CustomFieldResponse" + "$ref": "#/components/schemas/handlers.CustomFieldResponse" }, "type": "array" } @@ -9937,7 +8190,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9947,7 +8200,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9957,7 +8210,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -9993,7 +8246,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.CustomFieldResponse" + "$ref": "#/components/schemas/handlers.CustomFieldResponse" } } }, @@ -10003,7 +8256,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10013,7 +8266,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10023,7 +8276,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10033,7 +8286,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10043,7 +8296,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10082,7 +8335,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10092,7 +8345,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10102,7 +8355,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10112,7 +8365,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10122,7 +8375,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10167,7 +8420,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10177,7 +8430,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10187,7 +8440,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10197,7 +8450,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10207,7 +8460,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10241,7 +8494,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.diagramWriteRequest" + "$ref": "#/components/schemas/handlers.diagramWriteRequest" } } }, @@ -10264,7 +8517,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10274,7 +8527,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10284,7 +8537,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10294,7 +8547,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10304,7 +8557,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10356,7 +8609,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ItemTypeResponse" + "$ref": "#/components/schemas/handlers.ItemTypeResponse" }, "type": "array" } @@ -10368,7 +8621,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10378,7 +8631,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10388,7 +8641,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10424,7 +8677,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ItemTypeResponse" + "$ref": "#/components/schemas/handlers.ItemTypeResponse" } } }, @@ -10434,7 +8687,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10444,7 +8697,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10454,7 +8707,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10464,7 +8717,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10474,7 +8727,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10600,13 +8853,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -10623,7 +8876,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10633,7 +8886,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10643,7 +8896,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10653,7 +8906,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10676,7 +8929,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemCreateRequest" + "$ref": "#/components/schemas/dto.ItemCreateRequest" } } }, @@ -10689,7 +8942,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" } } }, @@ -10699,7 +8952,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10709,7 +8962,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10719,7 +8972,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10729,7 +8982,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10767,7 +9020,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -10779,7 +9032,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10789,7 +9042,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10799,7 +9052,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10809,7 +9062,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10870,7 +9123,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.itemChangesResponse" + "$ref": "#/components/schemas/handlers.itemChangesResponse" } } }, @@ -10880,7 +9133,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10890,7 +9143,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10900,7 +9153,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10910,7 +9163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10920,7 +9173,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10960,7 +9213,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10970,7 +9223,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10980,7 +9233,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -10990,17 +9243,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, "description": "Item not found or not visible to caller" }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/handlers.ErrorResponse" + } + } + }, + "description": "Item or descendant still has a protected integration link" + }, "500": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11043,7 +9306,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" } } }, @@ -11053,7 +9316,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11063,7 +9326,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11073,7 +9336,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11083,7 +9346,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11093,7 +9356,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11127,7 +9390,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemUpdateRequest" + "$ref": "#/components/schemas/dto.ItemUpdateRequest" } } }, @@ -11140,7 +9403,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" } } }, @@ -11150,7 +9413,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11160,7 +9423,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11170,7 +9433,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11180,7 +9443,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11190,7 +9453,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11244,7 +9507,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.AgentRunResponse" + "$ref": "#/components/schemas/handlers.AgentRunResponse" }, "type": "array" } @@ -11256,7 +9519,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11266,7 +9529,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11276,7 +9539,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11286,7 +9549,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11323,7 +9586,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.AttachmentResponse" + "$ref": "#/components/schemas/dto.AttachmentResponse" }, "type": "array" } @@ -11335,7 +9598,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11345,7 +9608,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11355,7 +9618,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11365,7 +9628,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11375,7 +9638,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11440,7 +9703,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11450,7 +9713,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11486,7 +9749,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemTypeChangeRequest" + "$ref": "#/components/schemas/dto.ItemTypeChangeRequest" } } }, @@ -11499,7 +9762,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" } } }, @@ -11509,7 +9772,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11519,7 +9782,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11529,7 +9792,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11539,7 +9802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11549,7 +9812,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11559,7 +9822,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11596,7 +9859,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -11608,7 +9871,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11618,7 +9881,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11628,7 +9891,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11638,7 +9901,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11648,7 +9911,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11710,13 +9973,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentResponse" + "$ref": "#/components/schemas/dto.CommentResponse" }, "type": "array" } @@ -11733,7 +9996,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11743,7 +10006,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11753,7 +10016,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11763,7 +10026,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11773,7 +10036,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11807,7 +10070,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentCreateRequest" + "$ref": "#/components/schemas/dto.CommentCreateRequest" } } }, @@ -11820,7 +10083,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.CommentResponse" + "$ref": "#/components/schemas/dto.CommentResponse" } } }, @@ -11830,7 +10093,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11840,7 +10103,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11850,7 +10113,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11860,7 +10123,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11870,7 +10133,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11908,7 +10171,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.diagramListResponse" + "$ref": "#/components/schemas/handlers.diagramListResponse" } } }, @@ -11918,7 +10181,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11928,7 +10191,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11938,7 +10201,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11948,7 +10211,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11958,7 +10221,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -11992,7 +10255,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.diagramWriteRequest" + "$ref": "#/components/schemas/handlers.diagramWriteRequest" } } }, @@ -12015,7 +10278,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12025,7 +10288,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12035,7 +10298,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12045,7 +10308,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12055,7 +10318,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12124,7 +10387,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.HistoryResponse" + "$ref": "#/components/schemas/dto.HistoryResponse" }, "type": "array" } @@ -12136,7 +10399,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12146,7 +10409,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12156,7 +10419,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12166,7 +10429,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12176,7 +10439,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12212,7 +10475,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelListResponse" + "$ref": "#/components/schemas/handlers.labelListResponse" } } }, @@ -12222,7 +10485,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12232,7 +10495,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12242,7 +10505,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12252,7 +10515,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12262,7 +10525,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12295,7 +10558,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.itemLabelAddRequest" + "$ref": "#/components/schemas/handlers.itemLabelAddRequest" } } }, @@ -12308,7 +10571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelListResponse" + "$ref": "#/components/schemas/handlers.labelListResponse" } } }, @@ -12318,7 +10581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12328,7 +10591,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12338,7 +10601,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12348,7 +10611,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12358,7 +10621,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12368,7 +10631,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12402,7 +10665,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.itemLabelSetRequest" + "$ref": "#/components/schemas/handlers.itemLabelSetRequest" } } }, @@ -12415,7 +10678,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelListResponse" + "$ref": "#/components/schemas/handlers.labelListResponse" } } }, @@ -12425,7 +10688,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12435,7 +10698,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12445,7 +10708,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12455,7 +10718,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12465,7 +10728,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12513,7 +10776,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12523,7 +10786,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12533,7 +10796,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12543,7 +10806,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12553,7 +10816,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12601,7 +10864,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12611,7 +10874,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12621,7 +10884,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12631,7 +10894,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12670,7 +10933,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12680,7 +10943,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12690,7 +10953,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12700,7 +10963,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12710,7 +10973,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12754,7 +11017,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12764,7 +11027,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12774,7 +11037,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12784,7 +11047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12794,7 +11057,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12850,7 +11113,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12860,7 +11123,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12870,7 +11133,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12880,7 +11143,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12890,7 +11153,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12900,7 +11163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12956,7 +11219,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12966,7 +11229,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12976,7 +11239,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12986,7 +11249,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -12996,7 +11259,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13032,7 +11295,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.recurrenceForceGenerateResponse" + "$ref": "#/components/schemas/handlers.recurrenceForceGenerateResponse" } } }, @@ -13042,7 +11305,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13052,7 +11315,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13062,7 +11325,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13072,7 +11335,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13082,7 +11345,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13134,7 +11397,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.recurrenceInstanceListResponse" + "$ref": "#/components/schemas/handlers.recurrenceInstanceListResponse" } } }, @@ -13144,7 +11407,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13154,7 +11417,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13164,7 +11427,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13174,7 +11437,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13184,7 +11447,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13220,7 +11483,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionRequest" + "$ref": "#/components/schemas/dto.TransitionRequest" } } }, @@ -13233,7 +11496,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResultResponse" + "$ref": "#/components/schemas/dto.TransitionResultResponse" } } }, @@ -13243,7 +11506,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13253,7 +11516,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13263,7 +11526,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13273,7 +11536,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13283,7 +11546,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13293,7 +11556,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13330,7 +11593,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResponse" + "$ref": "#/components/schemas/dto.TransitionResponse" }, "type": "array" } @@ -13342,7 +11605,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13352,7 +11615,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13362,7 +11625,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13372,7 +11635,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13382,7 +11645,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13444,13 +11707,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" }, "type": "array" } @@ -13467,7 +11730,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13477,7 +11740,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13487,7 +11750,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13510,7 +11773,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationCreateRequest" + "$ref": "#/components/schemas/handlers.IterationCreateRequest" } } }, @@ -13523,7 +11786,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -13533,7 +11796,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13543,7 +11806,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13553,7 +11816,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13563,7 +11826,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13602,7 +11865,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13612,7 +11875,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13622,7 +11885,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13632,7 +11895,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13642,7 +11905,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13677,7 +11940,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -13687,7 +11950,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13697,7 +11960,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13707,7 +11970,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13717,7 +11980,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13727,7 +11990,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13761,7 +12024,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationUpdateRequest" + "$ref": "#/components/schemas/handlers.IterationUpdateRequest" } } }, @@ -13774,7 +12037,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -13784,7 +12047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13794,7 +12057,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13804,7 +12067,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13814,7 +12077,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13824,7 +12087,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13863,7 +12126,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13873,7 +12136,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13898,7 +12161,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.linkCreateRequest" + "$ref": "#/components/schemas/handlers.linkCreateRequest" } } }, @@ -13921,7 +12184,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13931,7 +12194,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13941,7 +12204,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13951,7 +12214,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -13961,7 +12224,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14055,13 +12318,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.batchItemLinksResponse" + "$ref": "#/components/schemas/handlers.batchItemLinksResponse" }, "type": "array" } @@ -14078,7 +12341,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14088,7 +12351,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14098,7 +12361,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14108,7 +12371,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14147,7 +12410,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14157,7 +12420,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14167,7 +12430,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14177,7 +12440,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14270,13 +12533,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" }, "type": "array" } @@ -14293,7 +12556,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14303,7 +12566,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14313,7 +12576,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14336,7 +12599,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneCreateRequest" + "$ref": "#/components/schemas/handlers.MilestoneCreateRequest" } } }, @@ -14349,7 +12612,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -14359,7 +12622,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14369,7 +12632,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14379,7 +12642,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14389,7 +12652,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14414,7 +12677,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.milestoneReorderRequest" + "$ref": "#/components/schemas/handlers.milestoneReorderRequest" } } }, @@ -14440,7 +12703,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14450,7 +12713,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14460,7 +12723,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14470,7 +12733,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14509,7 +12772,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14519,7 +12782,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14529,7 +12792,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14539,7 +12802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14549,7 +12812,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14584,7 +12847,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -14594,7 +12857,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14604,7 +12867,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14614,7 +12877,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14624,7 +12887,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14634,7 +12897,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14668,7 +12931,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneUpdateRequest" + "$ref": "#/components/schemas/handlers.MilestoneUpdateRequest" } } }, @@ -14681,7 +12944,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -14691,7 +12954,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14701,7 +12964,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14711,7 +12974,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14721,7 +12984,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14731,7 +12994,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14802,13 +13065,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -14825,7 +13088,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14835,7 +13098,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14845,7 +13108,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14855,7 +13118,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14865,7 +13128,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14903,7 +13166,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneProgressResponse" + "$ref": "#/components/schemas/handlers.MilestoneProgressResponse" } } }, @@ -14913,7 +13176,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14923,7 +13186,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14933,7 +13196,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14943,7 +13206,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -14953,7 +13216,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15022,7 +13285,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15032,7 +13295,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15042,7 +13305,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15052,7 +13315,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15078,7 +13341,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PriorityResponse" + "$ref": "#/components/schemas/handlers.PriorityResponse" }, "type": "array" } @@ -15090,7 +13353,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15100,7 +13363,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15110,7 +13373,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15146,7 +13409,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PriorityResponse" + "$ref": "#/components/schemas/handlers.PriorityResponse" } } }, @@ -15156,7 +13419,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15166,7 +13429,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15176,7 +13439,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15186,7 +13449,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15196,7 +13459,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15279,7 +13542,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15289,7 +13552,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15299,7 +13562,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15309,7 +13572,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15395,13 +13658,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -15418,7 +13681,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15428,7 +13691,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15438,7 +13701,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15448,7 +13711,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15476,7 +13739,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.StatusCategoryResponse" + "$ref": "#/components/schemas/handlers.StatusCategoryResponse" }, "type": "array" } @@ -15488,7 +13751,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15498,7 +13761,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15508,7 +13771,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15544,7 +13807,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.StatusCategoryResponse" + "$ref": "#/components/schemas/handlers.StatusCategoryResponse" } } }, @@ -15554,7 +13817,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15564,7 +13827,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15574,7 +13837,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15584,7 +13847,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15594,7 +13857,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15621,7 +13884,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.StatusResponse" + "$ref": "#/components/schemas/handlers.StatusResponse" }, "type": "array" } @@ -15633,7 +13896,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15643,7 +13906,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15653,7 +13916,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15689,7 +13952,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.StatusResponse" + "$ref": "#/components/schemas/handlers.StatusResponse" } } }, @@ -15699,7 +13962,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15709,7 +13972,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15719,7 +13982,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15729,7 +13992,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15739,7 +14002,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15787,7 +14050,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15797,7 +14060,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15807,7 +14070,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15817,7 +14080,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15854,7 +14117,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.timeProjectResponse" + "$ref": "#/components/schemas/handlers.timeProjectResponse" }, "type": "array" } @@ -15866,7 +14129,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15876,7 +14139,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15913,7 +14176,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.timeProjectResponse" + "$ref": "#/components/schemas/handlers.timeProjectResponse" } } }, @@ -15923,7 +14186,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15933,7 +14196,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15943,7 +14206,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -15981,6 +14244,14 @@ "type": "string" } }, + { + "description": "IANA timezone used to interpret date_from/date_to (defaults to the profile timezone)", + "in": "query", + "name": "timezone", + "schema": { + "type": "string" + } + }, { "description": "Filter by time project ID", "in": "query", @@ -16013,13 +14284,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.worklogResponse" + "$ref": "#/components/schemas/handlers.worklogResponse" }, "type": "array" } @@ -16036,7 +14307,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16046,7 +14317,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16069,7 +14340,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.createWorklogRequest" + "$ref": "#/components/schemas/handlers.createWorklogRequest" } } }, @@ -16093,7 +14364,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16103,7 +14374,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16113,7 +14384,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16153,7 +14424,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16163,7 +14434,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16173,7 +14444,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16183,7 +14454,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16217,7 +14488,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.updateWorklogRequest" + "$ref": "#/components/schemas/handlers.updateWorklogRequest" } } }, @@ -16241,7 +14512,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16251,7 +14522,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16261,7 +14532,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16271,7 +14542,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16307,7 +14578,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16332,7 +14603,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.startTimerRequest" + "$ref": "#/components/schemas/handlers.startTimerRequest" } } }, @@ -16356,7 +14627,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16366,7 +14637,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16376,7 +14647,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16386,7 +14657,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16423,7 +14694,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16433,7 +14704,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi.ErrorResponse" + "$ref": "#/components/schemas/restapi.ErrorResponse" } } }, @@ -16495,7 +14766,7 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { @@ -16518,7 +14789,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16528,7 +14799,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16538,7 +14809,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16574,7 +14845,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16584,7 +14855,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16594,7 +14865,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16630,7 +14901,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16640,7 +14911,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16650,7 +14921,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16696,7 +14967,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16706,7 +14977,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16716,7 +14987,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16726,7 +14997,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16773,7 +15044,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16783,7 +15054,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16793,7 +15064,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16803,7 +15074,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16813,7 +15084,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16839,7 +15110,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.WorkflowResponse" + "$ref": "#/components/schemas/handlers.WorkflowResponse" }, "type": "array" } @@ -16851,7 +15122,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16861,7 +15132,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16871,7 +15142,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16916,7 +15187,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.WorkflowResponse" + "$ref": "#/components/schemas/handlers.WorkflowResponse" } } }, @@ -16926,7 +15197,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16936,7 +15207,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16946,7 +15217,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16956,7 +15227,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -16966,7 +15237,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17003,7 +15274,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.TransitionResponse" + "$ref": "#/components/schemas/dto.TransitionResponse" }, "type": "array" } @@ -17015,7 +15286,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17025,7 +15296,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17035,7 +15306,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17045,7 +15316,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17055,7 +15326,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17082,7 +15353,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceTemplateSummaryResponse" + "$ref": "#/components/schemas/handlers.WorkspaceTemplateSummaryResponse" }, "type": "array" } @@ -17094,7 +15365,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17104,7 +15375,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17114,7 +15385,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17175,13 +15446,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceResponse" + "$ref": "#/components/schemas/handlers.WorkspaceResponse" }, "type": "array" } @@ -17198,7 +15469,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17208,7 +15479,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17218,7 +15489,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17241,7 +15512,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceCreateRequest" + "$ref": "#/components/schemas/handlers.WorkspaceCreateRequest" } } }, @@ -17254,7 +15525,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceResponse" + "$ref": "#/components/schemas/handlers.WorkspaceResponse" } } }, @@ -17264,7 +15535,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17274,7 +15545,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17284,7 +15555,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17294,7 +15565,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17304,7 +15575,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17314,7 +15585,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17324,7 +15595,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17363,7 +15634,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17373,7 +15644,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17383,7 +15654,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17393,17 +15664,27 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, "description": "Workspace not found or caller cannot delete it" }, + "409": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/handlers.ErrorResponse" + } + } + }, + "description": "Workspace still has externally linked items" + }, "500": { "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17438,7 +15719,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceResponse" + "$ref": "#/components/schemas/handlers.WorkspaceResponse" } } }, @@ -17448,7 +15729,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17458,7 +15739,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17468,7 +15749,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17478,7 +15759,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17488,7 +15769,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17521,7 +15802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceUpdateRequest" + "$ref": "#/components/schemas/handlers.WorkspaceUpdateRequest" } } }, @@ -17534,7 +15815,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkspaceResponse" + "$ref": "#/components/schemas/handlers.WorkspaceResponse" } } }, @@ -17544,7 +15825,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17554,7 +15835,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17564,7 +15845,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17574,7 +15855,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17584,7 +15865,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17621,7 +15902,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.catalogResponse" + "$ref": "#/components/schemas/handlers.catalogResponse" } } }, @@ -17631,7 +15912,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17641,7 +15922,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17651,7 +15932,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17661,7 +15942,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17710,7 +15991,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17720,7 +16001,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17730,7 +16011,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17764,7 +16045,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.actionDefinitionRequest" + "$ref": "#/components/schemas/handlers.actionDefinitionRequest" } } }, @@ -17787,7 +16068,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17797,7 +16078,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17807,7 +16088,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17817,7 +16098,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17853,7 +16134,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.actionDefinitionRequest" + "$ref": "#/components/schemas/handlers.actionDefinitionRequest" } } }, @@ -17866,7 +16147,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.validateActionResponse" + "$ref": "#/components/schemas/handlers.validateActionResponse" } } }, @@ -17914,7 +16195,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -17967,7 +16248,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18010,7 +16291,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.actionDefinitionRequest" + "$ref": "#/components/schemas/handlers.actionDefinitionRequest" } } }, @@ -18033,7 +16314,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18043,7 +16324,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18079,7 +16360,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.agentSkillListResponse" + "$ref": "#/components/schemas/handlers.agentSkillListResponse" } } }, @@ -18089,7 +16370,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18099,7 +16380,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18109,7 +16390,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18119,7 +16400,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18174,7 +16455,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18184,7 +16465,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18194,7 +16475,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18204,7 +16485,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18214,7 +16495,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18264,7 +16545,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18274,7 +16555,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18284,7 +16565,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18294,7 +16575,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18331,7 +16612,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ItemTypeResponse" + "$ref": "#/components/schemas/handlers.ItemTypeResponse" }, "type": "array" } @@ -18343,7 +16624,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18353,7 +16634,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18363,7 +16644,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18373,7 +16654,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18383,7 +16664,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18439,13 +16720,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -18462,7 +16743,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18472,7 +16753,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18482,7 +16763,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18492,7 +16773,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18502,7 +16783,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18574,13 +16855,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" }, "type": "array" } @@ -18597,7 +16878,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18607,7 +16888,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18617,7 +16898,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18627,7 +16908,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18637,7 +16918,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18672,7 +16953,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationCreateRequest" + "$ref": "#/components/schemas/handlers.IterationCreateRequest" } } }, @@ -18685,7 +16966,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -18695,7 +16976,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18705,7 +16986,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18715,7 +16996,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18725,7 +17006,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18735,7 +17016,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18784,7 +17065,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18794,7 +17075,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18804,7 +17085,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18814,7 +17095,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18824,7 +17105,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18869,7 +17150,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -18879,7 +17160,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18889,7 +17170,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18899,7 +17180,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18909,7 +17190,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18919,7 +17200,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18963,7 +17244,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationUpdateRequest" + "$ref": "#/components/schemas/handlers.IterationUpdateRequest" } } }, @@ -18976,7 +17257,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.IterationResponse" + "$ref": "#/components/schemas/handlers.IterationResponse" } } }, @@ -18986,7 +17267,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -18996,7 +17277,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19006,7 +17287,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19016,7 +17297,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19026,7 +17307,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19064,7 +17345,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelListResponse" + "$ref": "#/components/schemas/handlers.labelListResponse" } } }, @@ -19074,7 +17355,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19084,7 +17365,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19094,7 +17375,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19104,7 +17385,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19114,7 +17395,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19148,7 +17429,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelCreateRequest" + "$ref": "#/components/schemas/handlers.labelCreateRequest" } } }, @@ -19171,7 +17452,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19181,7 +17462,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19191,7 +17472,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19201,7 +17482,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19211,7 +17492,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19221,7 +17502,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19270,7 +17551,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19280,7 +17561,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19290,7 +17571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19300,7 +17581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19310,7 +17591,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19363,7 +17644,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19373,7 +17654,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19383,7 +17664,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19393,7 +17674,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19403,7 +17684,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19446,7 +17727,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.labelUpdateRequest" + "$ref": "#/components/schemas/handlers.labelUpdateRequest" } } }, @@ -19469,7 +17750,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19479,7 +17760,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19489,7 +17770,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19499,7 +17780,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19509,7 +17790,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19519,7 +17800,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19590,13 +17871,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" }, "type": "array" } @@ -19613,7 +17894,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19623,7 +17904,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19633,7 +17914,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19643,7 +17924,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19653,7 +17934,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19688,7 +17969,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneCreateRequest" + "$ref": "#/components/schemas/handlers.MilestoneCreateRequest" } } }, @@ -19701,7 +17982,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -19711,7 +17992,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19721,7 +18002,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19731,7 +18012,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19741,7 +18022,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19751,7 +18032,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19788,7 +18069,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.milestoneReorderRequest" + "$ref": "#/components/schemas/handlers.milestoneReorderRequest" } } }, @@ -19814,7 +18095,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19824,7 +18105,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19834,7 +18115,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19844,7 +18125,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19854,7 +18135,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19903,7 +18184,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19913,7 +18194,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19923,7 +18204,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19933,7 +18214,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19943,7 +18224,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -19988,7 +18269,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -19998,7 +18279,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20008,7 +18289,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20018,7 +18299,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20028,7 +18309,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20038,7 +18319,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20082,7 +18363,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneUpdateRequest" + "$ref": "#/components/schemas/handlers.MilestoneUpdateRequest" } } }, @@ -20095,7 +18376,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneResponse" + "$ref": "#/components/schemas/handlers.MilestoneResponse" } } }, @@ -20105,7 +18386,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20115,7 +18396,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20125,7 +18406,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20135,7 +18416,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20145,7 +18426,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20226,13 +18507,13 @@ "schema": { "allOf": [ { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PaginatedResponse" + "$ref": "#/components/schemas/handlers.PaginatedResponse" }, { "properties": { "data": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" }, "type": "array" } @@ -20249,7 +18530,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20259,7 +18540,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20269,7 +18550,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20279,7 +18560,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20289,7 +18570,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20337,7 +18618,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.MilestoneProgressResponse" + "$ref": "#/components/schemas/handlers.MilestoneProgressResponse" } } }, @@ -20347,7 +18628,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20357,7 +18638,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20367,7 +18648,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20377,7 +18658,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20387,7 +18668,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20424,7 +18705,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageLabelListResponse" + "$ref": "#/components/schemas/handlers.pageLabelListResponse" } } }, @@ -20434,7 +18715,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20444,7 +18725,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20454,7 +18735,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20464,7 +18745,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20499,7 +18780,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageLabelCreateRequest" + "$ref": "#/components/schemas/handlers.pageLabelCreateRequest" } } }, @@ -20522,7 +18803,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20532,7 +18813,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20542,7 +18823,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20552,7 +18833,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20562,7 +18843,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20612,7 +18893,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20622,7 +18903,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20632,7 +18913,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20642,7 +18923,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20696,7 +18977,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20706,7 +18987,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20716,7 +18997,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20726,7 +19007,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20770,7 +19051,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageLabelUpdateRequest" + "$ref": "#/components/schemas/handlers.pageLabelUpdateRequest" } } }, @@ -20793,7 +19074,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20803,7 +19084,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20813,7 +19094,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20823,7 +19104,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20833,7 +19114,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20871,7 +19152,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageListResponse" + "$ref": "#/components/schemas/handlers.pageListResponse" } } }, @@ -20881,7 +19162,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20891,7 +19172,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20901,7 +19182,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20911,7 +19192,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20945,7 +19226,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageCreateRequest" + "$ref": "#/components/schemas/handlers.pageCreateRequest" } } }, @@ -20958,7 +19239,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -20968,7 +19249,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20978,7 +19259,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20988,7 +19269,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -20998,7 +19279,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21008,7 +19289,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21062,7 +19343,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageListResponse" + "$ref": "#/components/schemas/handlers.pageListResponse" } } }, @@ -21072,7 +19353,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21082,7 +19363,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21092,7 +19373,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21102,7 +19383,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21151,7 +19432,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21161,7 +19442,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21171,7 +19452,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21181,7 +19462,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21224,7 +19505,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -21234,7 +19515,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21244,7 +19525,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21254,7 +19535,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21264,7 +19545,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21307,7 +19588,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageUpdateRequest" + "$ref": "#/components/schemas/handlers.pageUpdateRequest" } } }, @@ -21320,7 +19601,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -21330,7 +19611,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21340,7 +19621,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21350,7 +19631,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21360,7 +19641,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21436,7 +19717,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21446,7 +19727,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21491,7 +19772,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.pageDiagramListResponse" + "$ref": "#/components/schemas/handlers.pageDiagramListResponse" } } }, @@ -21501,7 +19782,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21511,7 +19792,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21521,7 +19802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21586,7 +19867,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21596,7 +19877,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21606,7 +19887,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21616,7 +19897,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21626,7 +19907,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21690,7 +19971,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21700,7 +19981,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21710,7 +19991,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21785,7 +20066,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21795,7 +20076,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21805,7 +20086,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21815,7 +20096,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21825,7 +20106,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21887,7 +20168,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageHistoryListResponse" + "$ref": "#/components/schemas/handlers.pageHistoryListResponse" } } }, @@ -21897,7 +20178,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21907,7 +20188,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21917,7 +20198,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21927,7 +20208,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -21982,7 +20263,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageRevisionResponse" + "$ref": "#/components/schemas/dto.PageRevisionResponse" } } }, @@ -21992,7 +20273,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22002,7 +20283,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22012,7 +20293,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22022,7 +20303,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22077,7 +20358,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -22087,7 +20368,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22097,7 +20378,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22107,7 +20388,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22117,7 +20398,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22162,7 +20443,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageSetInheritanceRequest" + "$ref": "#/components/schemas/handlers.pageSetInheritanceRequest" } } }, @@ -22175,7 +20456,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -22185,7 +20466,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22195,7 +20476,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22205,7 +20486,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22215,7 +20496,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22260,7 +20541,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageListWithLabelsResponse" + "$ref": "#/components/schemas/handlers.pageListWithLabelsResponse" } } }, @@ -22270,7 +20551,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22280,7 +20561,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22290,7 +20571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22300,7 +20581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22343,7 +20624,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageLabelAddRequest" + "$ref": "#/components/schemas/handlers.pageLabelAddRequest" } } }, @@ -22356,7 +20637,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageListWithLabelsResponse" + "$ref": "#/components/schemas/handlers.pageListWithLabelsResponse" } } }, @@ -22366,7 +20647,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22376,7 +20657,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22386,7 +20667,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22396,7 +20677,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22406,7 +20687,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22450,7 +20731,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageLabelSetRequest" + "$ref": "#/components/schemas/handlers.pageLabelSetRequest" } } }, @@ -22463,7 +20744,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageListWithLabelsResponse" + "$ref": "#/components/schemas/handlers.pageListWithLabelsResponse" } } }, @@ -22473,7 +20754,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22483,7 +20764,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22493,7 +20774,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22503,7 +20784,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22561,7 +20842,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22571,7 +20852,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22581,7 +20862,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22591,7 +20872,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22637,7 +20918,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageMoveRequest" + "$ref": "#/components/schemas/handlers.pageMoveRequest" } } }, @@ -22650,7 +20931,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.PageResponse" + "$ref": "#/components/schemas/dto.PageResponse" } } }, @@ -22660,7 +20941,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22670,7 +20951,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22680,7 +20961,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22690,7 +20971,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22700,7 +20981,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22746,7 +21027,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pagePermissionsResponse" + "$ref": "#/components/schemas/handlers.pagePermissionsResponse" } } }, @@ -22756,7 +21037,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22766,7 +21047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22776,7 +21057,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22786,7 +21067,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22829,7 +21110,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.pageGrantPermissionRequest" + "$ref": "#/components/schemas/handlers.pageGrantPermissionRequest" } } }, @@ -22852,7 +21133,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22862,7 +21143,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22872,7 +21153,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22882,7 +21163,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22892,7 +21173,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22949,7 +21230,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22959,7 +21240,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22969,7 +21250,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -22979,7 +21260,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23017,7 +21298,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.PriorityResponse" + "$ref": "#/components/schemas/handlers.PriorityResponse" }, "type": "array" } @@ -23029,7 +21310,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23039,7 +21320,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23049,7 +21330,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23059,7 +21340,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23069,7 +21350,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23107,7 +21388,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.StatusSummary" + "$ref": "#/components/schemas/dto.StatusSummary" }, "type": "array" } @@ -23119,7 +21400,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23129,7 +21410,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23139,7 +21420,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23149,7 +21430,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23159,7 +21440,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23198,7 +21479,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.StatusSummary" + "$ref": "#/components/schemas/dto.StatusSummary" }, "type": "array" } @@ -23210,7 +21491,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23220,7 +21501,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23230,7 +21511,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23240,7 +21521,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23250,7 +21531,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23296,7 +21577,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.templateListResponse" + "$ref": "#/components/schemas/handlers.templateListResponse" } } }, @@ -23306,7 +21587,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23316,7 +21597,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23326,7 +21607,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23336,7 +21617,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23346,7 +21627,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23379,7 +21660,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.templateCreateRequest" + "$ref": "#/components/schemas/handlers.templateCreateRequest" } } }, @@ -23402,7 +21683,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23412,7 +21693,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23422,7 +21703,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23432,7 +21713,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23442,7 +21723,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23452,7 +21733,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23500,7 +21781,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23510,7 +21791,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23520,7 +21801,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23530,7 +21811,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23540,7 +21821,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23593,7 +21874,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23603,7 +21884,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23613,7 +21894,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23623,7 +21904,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23633,7 +21914,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23676,7 +21957,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.templateUpdateRequest" + "$ref": "#/components/schemas/handlers.templateUpdateRequest" } } }, @@ -23699,7 +21980,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23709,7 +21990,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23719,7 +22000,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23729,7 +22010,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23739,7 +22020,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23749,7 +22030,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23787,7 +22068,7 @@ "application/json": { "schema": { "items": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.WorkflowResponse" + "$ref": "#/components/schemas/handlers.WorkflowResponse" }, "type": "array" } @@ -23799,7 +22080,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23809,7 +22090,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23819,7 +22100,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23829,7 +22110,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23839,7 +22120,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23906,7 +22187,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23916,7 +22197,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23926,7 +22207,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23936,7 +22217,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -23946,7 +22227,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24002,7 +22283,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24012,7 +22293,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24022,7 +22303,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24032,7 +22313,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24042,7 +22323,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24091,7 +22372,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24101,7 +22382,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24111,7 +22392,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24121,7 +22402,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24174,7 +22455,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24184,7 +22465,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24194,7 +22475,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24204,7 +22485,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24214,7 +22495,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24262,7 +22543,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24272,7 +22553,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24282,7 +22563,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24292,7 +22573,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24302,7 +22583,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24355,7 +22636,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24365,7 +22646,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24375,7 +22656,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24385,7 +22666,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24395,7 +22676,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24460,7 +22741,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24470,7 +22751,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24480,7 +22761,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24490,7 +22771,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24500,7 +22781,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24556,7 +22837,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24566,7 +22847,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24576,7 +22857,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24586,7 +22867,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24596,7 +22877,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24658,7 +22939,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24668,7 +22949,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24678,7 +22959,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24688,7 +22969,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24698,7 +22979,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24756,7 +23037,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24766,7 +23047,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24776,7 +23057,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24786,7 +23067,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24796,7 +23077,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24858,7 +23139,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24868,7 +23149,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24878,7 +23159,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24888,7 +23169,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24898,7 +23179,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24955,7 +23236,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24965,7 +23246,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24975,7 +23256,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24985,7 +23266,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -24995,7 +23276,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25053,7 +23334,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25063,7 +23344,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25073,7 +23354,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25083,7 +23364,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25093,7 +23374,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25158,7 +23439,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25168,7 +23449,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25178,7 +23459,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25188,7 +23469,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25198,7 +23479,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25265,7 +23546,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25275,7 +23556,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25285,7 +23566,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25295,7 +23576,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25305,7 +23586,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25362,7 +23643,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25372,7 +23653,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25382,7 +23663,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25392,7 +23673,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25402,7 +23683,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25476,7 +23757,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25486,7 +23767,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25496,7 +23777,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25506,7 +23787,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25516,7 +23797,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25565,7 +23846,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25575,7 +23856,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25585,7 +23866,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25595,7 +23876,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25605,7 +23886,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25661,7 +23942,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25671,7 +23952,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25681,7 +23962,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25691,7 +23972,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25701,7 +23982,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25759,7 +24040,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25769,7 +24050,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25779,7 +24060,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25789,7 +24070,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25799,7 +24080,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25848,7 +24129,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25858,7 +24139,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25868,7 +24149,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25878,7 +24159,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25888,7 +24169,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25941,7 +24222,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25951,7 +24232,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25961,7 +24242,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25971,7 +24252,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -25981,7 +24262,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26046,7 +24327,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26056,7 +24337,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26066,7 +24347,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26076,7 +24357,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26086,7 +24367,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26135,7 +24416,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26145,7 +24426,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26155,7 +24436,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26165,7 +24446,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26175,7 +24456,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26231,7 +24512,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26241,7 +24522,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26251,7 +24532,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26261,7 +24542,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26271,7 +24552,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26319,7 +24600,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26329,7 +24610,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26339,7 +24620,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26349,7 +24630,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26359,7 +24640,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26424,7 +24705,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26434,7 +24715,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26444,7 +24725,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26454,7 +24735,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26464,7 +24745,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26514,7 +24795,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26524,7 +24805,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26534,7 +24815,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26544,7 +24825,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26554,7 +24835,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26611,7 +24892,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26621,7 +24902,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26631,7 +24912,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26641,7 +24922,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26651,7 +24932,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26699,7 +24980,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26709,7 +24990,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26719,7 +25000,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26729,7 +25010,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26739,7 +25020,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26792,7 +25073,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26802,7 +25083,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26812,7 +25093,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26822,7 +25103,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26832,7 +25113,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26897,7 +25178,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26907,7 +25188,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26917,7 +25198,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26927,7 +25208,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26937,7 +25218,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -26995,7 +25276,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27005,7 +25286,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27015,7 +25296,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27025,7 +25306,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27035,7 +25316,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27093,7 +25374,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27103,7 +25384,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27113,7 +25394,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27123,7 +25404,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27133,7 +25414,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27195,7 +25476,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27205,7 +25486,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27215,7 +25496,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27225,7 +25506,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27235,7 +25516,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27292,7 +25573,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27302,7 +25583,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27312,7 +25593,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27322,7 +25603,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27332,7 +25613,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27396,7 +25677,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27406,7 +25687,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27416,7 +25697,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27426,7 +25707,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27436,7 +25717,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27494,7 +25775,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27504,7 +25785,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27514,7 +25795,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27524,7 +25805,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27534,7 +25815,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27596,7 +25877,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27606,7 +25887,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27616,7 +25897,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27626,7 +25907,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27636,7 +25917,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27693,7 +25974,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27703,7 +25984,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27713,7 +25994,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27723,7 +26004,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27733,7 +26014,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27782,7 +26063,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27792,7 +26073,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27802,7 +26083,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27812,7 +26093,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27822,7 +26103,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27878,7 +26159,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27888,7 +26169,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27898,7 +26179,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27908,7 +26189,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27918,7 +26199,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27966,7 +26247,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27976,7 +26257,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27986,7 +26267,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -27996,7 +26277,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28006,7 +26287,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28059,7 +26340,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28069,7 +26350,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28079,7 +26360,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28089,7 +26370,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28099,7 +26380,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28164,7 +26445,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28174,7 +26455,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28184,7 +26465,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28194,7 +26475,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28204,7 +26485,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28260,7 +26541,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28270,7 +26551,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28280,7 +26561,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28290,7 +26571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28300,7 +26581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28358,7 +26639,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28368,7 +26649,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28378,7 +26659,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28388,7 +26669,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28398,7 +26679,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28456,7 +26737,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28466,7 +26747,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28476,7 +26757,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28486,7 +26767,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28496,7 +26777,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28530,7 +26811,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.testRunCreateRequest" + "$ref": "#/components/schemas/handlers.testRunCreateRequest" } } }, @@ -28553,7 +26834,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28563,7 +26844,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28573,7 +26854,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28583,7 +26864,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28593,7 +26874,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28641,7 +26922,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28651,7 +26932,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28661,7 +26942,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28671,7 +26952,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28681,7 +26962,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28734,7 +27015,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28744,7 +27025,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28754,7 +27035,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28764,7 +27045,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28774,7 +27055,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28833,7 +27114,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28843,7 +27124,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28853,7 +27134,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28863,7 +27144,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28873,7 +27154,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28928,7 +27209,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28938,7 +27219,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28948,7 +27229,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -28958,7 +27239,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29006,7 +27287,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29016,7 +27297,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29026,7 +27307,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29036,7 +27317,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29046,7 +27327,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29104,7 +27385,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29114,7 +27395,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29124,7 +27405,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29134,7 +27415,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29144,7 +27425,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29198,7 +27479,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.testResultUpdateRequest" + "$ref": "#/components/schemas/handlers.testResultUpdateRequest" } } }, @@ -29214,7 +27495,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29224,7 +27505,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29234,7 +27515,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29244,7 +27525,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29254,7 +27535,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29311,7 +27592,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29321,7 +27602,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29331,7 +27612,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29341,7 +27622,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29351,7 +27632,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29422,7 +27703,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29432,7 +27713,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29442,7 +27723,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29452,7 +27733,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29462,7 +27743,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29521,7 +27802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29531,7 +27812,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29541,7 +27822,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29551,7 +27832,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29561,7 +27842,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29610,7 +27891,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29620,7 +27901,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29630,7 +27911,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29640,7 +27921,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29650,7 +27931,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29706,7 +27987,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29716,7 +27997,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29726,7 +28007,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29736,7 +28017,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29746,7 +28027,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29794,7 +28075,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29804,7 +28085,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29814,7 +28095,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29824,7 +28105,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29834,7 +28115,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29887,7 +28168,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29897,7 +28178,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29907,7 +28188,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29917,7 +28198,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29927,7 +28208,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -29992,7 +28273,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30002,7 +28283,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30012,7 +28293,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30022,7 +28303,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30032,7 +28313,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30090,7 +28371,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30100,7 +28381,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30110,7 +28391,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30120,7 +28401,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30130,7 +28411,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30188,7 +28469,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30198,7 +28479,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30208,7 +28489,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30218,7 +28499,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30228,7 +28509,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30290,7 +28571,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30300,7 +28581,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30310,7 +28591,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30320,7 +28601,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30330,7 +28611,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30387,7 +28668,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30397,7 +28678,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30407,7 +28688,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30417,7 +28698,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30427,7 +28708,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30481,7 +28762,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_dto.ItemResponse" + "$ref": "#/components/schemas/dto.ItemResponse" } } }, @@ -30491,7 +28772,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30501,7 +28782,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30511,7 +28792,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30521,7 +28802,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, @@ -30531,7 +28812,7 @@ "content": { "application/json": { "schema": { - "$ref": "#/components/schemas/windshift_internal_restapi_v1_handlers.ErrorResponse" + "$ref": "#/components/schemas/handlers.ErrorResponse" } } }, diff --git a/frontend/src/lib/api/scm.js b/frontend/src/lib/api/scm.js index 3e1e6a9ff..4ff8b0146 100644 --- a/frontend/src/lib/api/scm.js +++ b/frontend/src/lib/api/scm.js @@ -104,6 +104,17 @@ export const workspaceSCM = { method: 'POST', }), + getReleaseCandidates: (repoId) => + fetchAPI(`/workspace-repositories/${repoId}/release-candidates`), + + getWebhookConfig: (repoId) => fetchAPI(`/workspace-repositories/${repoId}/webhook`), + + rotateWebhookSecret: (repoId) => + fetchAPI(`/workspace-repositories/${repoId}/webhook/rotate-secret`, { method: 'POST' }), + + deleteWebhookConfig: (repoId) => + fetchAPI(`/workspace-repositories/${repoId}/webhook`, { method: 'DELETE' }), + startOAuth: (workspaceId, connId) => fetchAPI(`/workspaces/${workspaceId}/scm-connections/${connId}/auth/start`, { method: 'POST', diff --git a/frontend/src/lib/dialogs/CreatePRFromBranchModal.svelte b/frontend/src/lib/dialogs/CreatePRFromBranchModal.svelte index 15667bde3..f664fac2d 100644 --- a/frontend/src/lib/dialogs/CreatePRFromBranchModal.svelte +++ b/frontend/src/lib/dialogs/CreatePRFromBranchModal.svelte @@ -21,6 +21,7 @@ // svelte-ignore state_referenced_locally let prBody = $state(itemKey ? `Linked to ${itemKey}` : ''); let baseBranch = $state(''); + const isGitLab = $derived(branchLink?.provider_type === 'gitlab'); async function submit() { if (!branchLink?.id) { @@ -39,7 +40,7 @@ }; const result = await api.itemSCMLinks.createPRFromBranch(branchLink.id, data); - successToast(t('scm.prCreatedSuccess', { prNumber: result.pr_number })); + successToast(t(isGitLab ? 'scm.mrCreatedSuccess' : 'scm.prCreatedSuccess', { prNumber: result.pr_number })); oncreated?.(result); } catch (err) { console.error('Failed to create PR:', err); @@ -55,9 +56,15 @@ } - + @@ -110,8 +117,9 @@ diff --git a/frontend/src/lib/features/items/ItemSCMLinks.svelte b/frontend/src/lib/features/items/ItemSCMLinks.svelte index 080869dbe..ec04e29f5 100644 --- a/frontend/src/lib/features/items/ItemSCMLinks.svelte +++ b/frontend/src/lib/features/items/ItemSCMLinks.svelte @@ -25,6 +25,7 @@ // Segmented buckets for the dev panel const pullRequests = $derived(links.filter(l => l.link_type === 'pull_request')); + const hasGitLabPullRequests = $derived(pullRequests.some(link => link.provider_type === 'gitlab')); const branchLinks = $derived(links.filter(l => l.link_type === 'branch')); const commitLinks = $derived(links.filter(l => l.link_type === 'commit')); // PR rollup follows Jira semantics: OPEN > MERGED > DECLINED @@ -293,7 +294,7 @@ {#if pullRequests.length > 0}
- {t('scm.pullRequests')} + {t(hasGitLabPullRequests ? 'scm.mergeRequests' : 'scm.pullRequests')} {pullRequests.length} @@ -413,7 +414,7 @@ class="p-1 rounded hover:bg-opacity-50" style="color: var(--ds-text-subtle);" onclick={() => openCreatePRModal(link)} - title={t('scm.createPullRequest')} + title={t(link.provider_type === 'gitlab' ? 'scm.createMergeRequest' : 'scm.createPullRequest')} > diff --git a/frontend/src/lib/features/milestones/MilestoneDetail.svelte b/frontend/src/lib/features/milestones/MilestoneDetail.svelte index f70d384f9..0570fa991 100644 --- a/frontend/src/lib/features/milestones/MilestoneDetail.svelte +++ b/frontend/src/lib/features/milestones/MilestoneDetail.svelte @@ -266,7 +266,7 @@ {/if} {#if milestone?.releases?.length > 0}
- {#each milestone.releases as release} + {#each milestone.releases as release (release.id)}
{release.tag_name} @@ -280,9 +280,14 @@ {#if release.is_prerelease} Pre-release {/if} - {#if release.scm_release_url} + {#if release.release_status && release.release_status !== 'released'} + + {release.release_status.replaceAll('_', ' ')} + + {/if} + {#if release.scm_release_url || release.tag_url} {/if} - {formatDateShort(release.created_at)} + {#if release.assets?.length} + {release.assets.length} assets + {/if} + {formatDateShort(release.released_at || release.created_at)}
{/each}
diff --git a/frontend/src/lib/features/milestones/MilestoneReleaseModal.svelte b/frontend/src/lib/features/milestones/MilestoneReleaseModal.svelte index ce5684082..0d81b0344 100644 --- a/frontend/src/lib/features/milestones/MilestoneReleaseModal.svelte +++ b/frontend/src/lib/features/milestones/MilestoneReleaseModal.svelte @@ -27,6 +27,10 @@ let repositories = $state([]); let selectedRepository = $state(''); // "owner/repo" full_name let loadingRepos = $state(false); + let releaseMode = $state('create'); + let releaseCandidates = $state([]); + let loadingCandidates = $state(false); + const selectedProviderType = $derived(connections.find(connection => connection.id === selectedConnectionId)?.provider_type); // Release form fields (snapshot of milestone at open; user-edited thereafter) // svelte-ignore state_referenced_locally @@ -64,6 +68,7 @@ if (connections.length === 1) { selectedConnectionId = connections[0].id; + await loadRepositories(selectedConnectionId); } } catch (err) { console.error('Failed to load SCM connections:', err); @@ -92,6 +97,7 @@ repositories = repos; if (repos.length === 1) { selectedRepository = repos[0].repository_name ?? ''; + await loadReleaseCandidates(selectedRepository); } else { selectedRepository = ''; } @@ -103,9 +109,34 @@ } } - $effect(() => { - loadRepositories(selectedConnectionId); - }); + async function loadReleaseCandidates(repositoryName) { + releaseCandidates = []; + if (releaseMode !== 'attach' || !repositoryName) return; + const repository = repositories.find(repo => repo.repository_name === repositoryName); + if (!repository?.id) return; + loadingCandidates = true; + try { + releaseCandidates = await api.workspaceSCM.getReleaseCandidates(repository.id) || []; + if (releaseCandidates.length === 1) tagName = releaseCandidates[0].tag_name; + } catch (err) { + console.error('Failed to load release candidates:', err); + error = err.message || 'Failed to load existing tags and releases.'; + } finally { + loadingCandidates = false; + } + } + + async function handleReleaseModeChange(mode) { + if (mode === 'attach') { + await loadReleaseCandidates(selectedRepository); + } else { + releaseCandidates = []; + } + } + + async function handleConnectionChange(connection) { + await loadRepositories(connection?.id ?? null); + } function getConnectionLabel(conn) { const base = conn.name ?? conn.provider_name ?? `Connection ${conn.id}`; @@ -115,7 +146,8 @@ const canSubmit = $derived( !submitting && tagName.trim().length > 0 && - (!selectedConnectionId || selectedRepository.length > 0) + (!selectedConnectionId || selectedRepository.length > 0) && + (releaseMode !== 'attach' || releaseCandidates.some(candidate => candidate.tag_name === tagName)) ); async function generateNotes() { @@ -141,11 +173,12 @@ try { const payload = { + mode: releaseMode, tag_name: tagName.trim(), name: releaseName.trim(), body: releaseBody.trim(), - is_draft: isDraft, - is_prerelease: isPrerelease, + is_draft: selectedProviderType === 'gitlab' ? false : isDraft, + is_prerelease: selectedProviderType === 'gitlab' ? false : isPrerelease, target_commitish: targetCommitish.trim() }; @@ -158,7 +191,9 @@ idempotencyKey ??= crypto.randomUUID(); const updatedMilestone = await api.milestones.release(milestone.id, payload, idempotencyKey); successToast( - updatedMilestone.latest_release?.scm_release_url + releaseMode === 'attach' + ? `Attached ${tagName.trim()} to the milestone.` + : updatedMilestone.latest_release?.scm_release_url ? `Release created at ${updatedMilestone.latest_release.scm_release_url}` : 'Milestone marked as completed.', 'Released' @@ -209,6 +244,7 @@ allowClear={true} getValue={(c) => c.id} getLabel={getConnectionLabel} + onSelect={handleConnectionChange} />
@@ -230,10 +266,27 @@ placeholder="Select a repository" getValue={(r) => r.repository_name ?? ''} getLabel={(r) => r.repository_name ?? ''} + onSelect={(repository) => loadReleaseCandidates(repository.repository_name)} /> {/if} {/if} + + {#if selectedConnectionId && selectedRepository} +
+ + item.value} + getLabel={(item) => item.label} + onSelect={(item) => handleReleaseModeChange(item.value)} + /> +
+ {/if} {:else}

No SCM connections available. The milestone will be marked as completed without creating a release. @@ -242,16 +295,36 @@

- - + + {#if releaseMode === 'attach'} + {#if loadingCandidates} +
+ + Loading tags and releases… +
+ {:else if releaseCandidates.length === 0} +

No tags or releases were found in this repository.

+ {:else} + candidate.tag_name} + getLabel={(candidate) => `${candidate.tag_name} Ā· ${candidate.release ? 'release' : 'tag'}`} + /> + {/if} + {:else} + + {/if}
+ {#if releaseMode === 'create'}
-
- - -
+ {#if selectedProviderType === 'gitlab'} +

GitLab Releases are published directly and do not expose draft or pre-release states.

+ {:else} +
+ + +
+ {/if} + {/if} {/if}
diff --git a/frontend/src/lib/locales/ar/admin.js b/frontend/src/lib/locales/ar/admin.js index b5347e35e..d8de11fcf 100644 --- a/frontend/src/lib/locales/ar/admin.js +++ b/frontend/src/lib/locales/ar/admin.js @@ -446,18 +446,18 @@ export default { }, scmProviders: { title: 'Ł…ŁˆŁŲ±Łˆ Ų„ŲÆŲ§Ų±Ų© Ų§Ł„ŁƒŁˆŲÆ Ų§Ł„Ł…ŲµŲÆŲ±ŁŠ', - subtitle: 'ŲŖŁƒŁˆŁŠŁ† ŲŖŁƒŲ§Ł…Ł„Ų§ŲŖ GitHub وGitea لربط Ų§Ł„Ł…Ų³ŲŖŁˆŲÆŲ¹Ų§ŲŖ.', + subtitle: 'ŲŖŁƒŁˆŁŠŁ† ŲŖŁƒŲ§Ł…Ł„Ų§ŲŖ GitHub وGitLab وGitea لربط Ų§Ł„Ł…Ų³ŲŖŁˆŲÆŲ¹Ų§ŲŖ.', addProvider: '؄ضافة Ł…ŁˆŁŲ±', connectionSuccessful: 'نجح الاتصال', connectionFailed: 'فؓل الاتصال', noProviders: 'لا يوجد Ł…ŁˆŁŲ±Łˆ Ų„ŲÆŲ§Ų±Ų© كود Ł…ŲµŲÆŲ±ŁŠ', - getStarted: 'Ų§ŲØŲÆŲ£ ب؄ضافة Ł…ŁˆŁŲ± GitHub أو Gitea.', + getStarted: 'Ų§ŲØŲÆŲ£ ب؄ضافة Ł…ŁˆŁŲ± GitHub أو GitLab أو Gitea.', enabled: 'مفعل', disabled: 'Ł…Ų¹Ų·Ł„', default: 'افتراضي', restricted: 'Ł…Ł‚ŁŠŲÆ', - patConfigured: 'PAT Ł…ŁƒŁˆŁ‘Ł†', - patNotConfigured: 'PAT غير Ł…ŁƒŁˆŁ‘Ł†', + patConfigured: 'ŲŖŁ… ŲŖŁƒŁˆŁŠŁ† رمز Ų§Ł„ŁˆŲµŁˆŁ„', + patNotConfigured: 'لم ŁŠŲŖŁ… ŲŖŁƒŁˆŁŠŁ† رمز Ų§Ł„ŁˆŲµŁˆŁ„', addSCMProvider: '؄ضافة Ł…ŁˆŁŲ± Ų„ŲÆŲ§Ų±Ų© Ų§Ł„ŁƒŁˆŲÆ Ų§Ł„Ł…ŲµŲÆŲ±ŁŠ', editSCMProvider: 'ŲŖŲ¹ŲÆŁŠŁ„ Ł…ŁˆŁŲ± Ų„ŲÆŲ§Ų±Ų© Ų§Ł„ŁƒŁˆŲÆ Ų§Ł„Ł…ŲµŲÆŲ±ŁŠ', failedToLoad: 'فؓل في ŲŖŲ­Ł…ŁŠŁ„ Ł…ŁˆŁŲ±ŁŠ Ų„ŲÆŲ§Ų±Ų© Ų§Ł„ŁƒŁˆŲÆ Ų§Ł„Ł…ŲµŲÆŲ±ŁŠ', @@ -470,7 +470,7 @@ export default { providerType: 'Ł†ŁˆŲ¹ Ų§Ł„Ł…ŁˆŁŲ±', authMethod: 'Ų·Ų±ŁŠŁ‚Ų© المصادقة', baseUrl: 'Ų¹Ł†ŁˆŲ§Ł† URL Ų§Ł„Ų£Ų³Ų§Ų³ŁŠ', - baseUrlPlaceholder: 'أدخل Ų¹Ł†ŁˆŲ§Ł† URL لخادم Gitea/Forgejo المستضاف Ų°Ų§ŲŖŁŠŲ§Ł‹', + baseUrlPlaceholder: 'أدخل Ų¹Ł†ŁˆŲ§Ł† URL لخادم GitLab أو Gitea/Forgejo المستضاف Ų°Ų§ŲŖŁŠŲ§Ł‹', callbackUrl: 'Ų¹Ł†ŁˆŲ§Ł† URL للاستدعاؔ', copy: 'نسخ', copied: 'ŲŖŁ… النسخ!', @@ -479,7 +479,10 @@ export default { oauthClientId: 'معرّف Ų¹Ł…ŁŠŁ„ OAuth', oauthClientSecret: 'Ų³Ų± Ų¹Ł…ŁŠŁ„ OAuth', leaveEmptyToKeep: 'Ų§ŲŖŲ±ŁƒŁ‡ فارغاً للاحتفاظ بالسر Ų§Ł„Ų­Ų§Ł„ŁŠ', - personalAccessToken: 'رمز Ų§Ł„ŁˆŲµŁˆŁ„ Ų§Ł„Ų“Ų®ŲµŁŠ', + accessToken: 'رمز Ų§Ł„ŁˆŲµŁˆŁ„', + accessTokenHelp: 'Ų§Ų³ŲŖŲ®ŲÆŁ… رمز ŁˆŲµŁˆŁ„ ŲØŲ§Ł„Ų£Ų°ŁˆŁ†Ų§ŲŖ Ų§Ł„Ł…Ų·Ł„ŁˆŲØŲ© Ł„Ł…ŁˆŁŲ± الخدمة المحدد.', + gitlabAccessTokenHelp: + 'ŁŠŁ‚ŲØŁ„ GitLab Ų±Ł…ŁˆŲ² Ų§Ł„ŁˆŲµŁˆŁ„ Ų§Ł„Ų“Ų®ŲµŁŠŲ© ŁˆŲ±Ł…ŁˆŲ² Ų§Ł„Ł…Ų“Ų±ŁˆŲ¹ ŁˆŲ§Ł„Ł…Ų¬Ł…ŁˆŲ¹Ų©. ŁŠŁŁŲ¶Ł‘Ł„ Ų§Ų³ŲŖŲ®ŲÆŲ§Ł… رمز Ł…Ų“Ų±ŁˆŲ¹ أو Ł…Ų¬Ł…ŁˆŲ¹Ų© Ł„ŲŖŁƒŲ§Ł…Ł„Ų§ŲŖ Ų§Ł„Ų±ŁˆŲØŁˆŲŖ ŁˆŲ§Ł„Ų®Ų§ŲÆŁ… ؄لى الخادم.', githubAppId: 'معرّف ŲŖŲ·ŲØŁŠŁ‚ GitHub', privateKeyPem: 'المفتاح الخاص (PEM)', orgInstallation: 'تثبيت المؤسسة', diff --git a/frontend/src/lib/locales/de/admin.js b/frontend/src/lib/locales/de/admin.js index 580745a43..186509340 100644 --- a/frontend/src/lib/locales/de/admin.js +++ b/frontend/src/lib/locales/de/admin.js @@ -450,18 +450,18 @@ export default { }, scmProviders: { title: 'SCM-Anbieter', - subtitle: 'GitHub- und Gitea-Integrationen für Repository-Verknüpfung konfigurieren.', + subtitle: 'GitHub-, GitLab- und Gitea-Integrationen für Repository-Verknüpfung konfigurieren.', addProvider: 'Anbieter hinzufügen', connectionSuccessful: 'Verbindung erfolgreich', connectionFailed: 'Verbindung fehlgeschlagen', noProviders: 'Keine SCM-Anbieter', - getStarted: 'Beginnen Sie mit dem Hinzufügen eines GitHub- oder Gitea-Anbieters.', + getStarted: 'Beginnen Sie mit dem Hinzufügen eines GitHub-, GitLab- oder Gitea-Anbieters.', enabled: 'Aktiviert', disabled: 'Deaktiviert', default: 'Standard', restricted: 'EingeschrƤnkt', - patConfigured: 'PAT konfiguriert', - patNotConfigured: 'PAT nicht konfiguriert', + patConfigured: 'Zugriffstoken konfiguriert', + patNotConfigured: 'Zugriffstoken nicht konfiguriert', addSCMProvider: 'SCM-Anbieter hinzufügen', editSCMProvider: 'SCM-Anbieter bearbeiten', failedToLoad: 'SCM-Anbieter konnten nicht geladen werden', @@ -474,7 +474,7 @@ export default { providerType: 'Anbietertyp', authMethod: 'Authentifizierungsmethode', baseUrl: 'Basis-URL', - baseUrlPlaceholder: 'URL Ihrer selbst gehosteten Gitea/Forgejo-Instanz eingeben', + baseUrlPlaceholder: 'URL Ihrer selbst gehosteten GitLab- oder Gitea/Forgejo-Instanz eingeben', callbackUrl: 'Callback-URL', copy: 'Kopieren', copied: 'Kopiert!', @@ -483,7 +483,10 @@ export default { oauthClientId: 'OAuth-Client-ID', oauthClientSecret: 'OAuth-Client-Secret', leaveEmptyToKeep: 'Leer lassen, um bestehendes Secret zu behalten', - personalAccessToken: 'Persƶnliches Zugriffstoken', + accessToken: 'Zugriffstoken', + accessTokenHelp: 'Verwenden Sie ein Zugriffstoken mit den für den ausgewƤhlten Anbieter erforderlichen Berechtigungen.', + gitlabAccessTokenHelp: + 'GitLab akzeptiert persƶnliche, projekt- und gruppenbezogene Zugriffstoken. Für Bot- und Server-zu-Server-Integrationen wird ein Projekt- oder Gruppentoken empfohlen.', githubAppId: 'GitHub-App-ID', privateKeyPem: 'Privater Schlüssel (PEM)', orgInstallation: 'Organisations-Installation', diff --git a/frontend/src/lib/locales/en/admin.js b/frontend/src/lib/locales/en/admin.js index 1ba973647..0eef5bd4d 100644 --- a/frontend/src/lib/locales/en/admin.js +++ b/frontend/src/lib/locales/en/admin.js @@ -435,18 +435,18 @@ export default { // SCM Providers scmProviders: { title: 'SCM Providers', - subtitle: 'Configure GitHub and Gitea integrations for repository linking.', + subtitle: 'Configure GitHub, GitLab, and Gitea integrations for repository linking.', addProvider: 'Add Provider', connectionSuccessful: 'Connection successful', connectionFailed: 'Connection failed', noProviders: 'No SCM providers', - getStarted: 'Get started by adding a GitHub or Gitea provider.', + getStarted: 'Get started by adding a GitHub, GitLab, or Gitea provider.', enabled: 'Enabled', disabled: 'Disabled', default: 'Default', restricted: 'Restricted', - patConfigured: 'PAT Configured', - patNotConfigured: 'PAT Not Configured', + patConfigured: 'Access token configured', + patNotConfigured: 'Access token not configured', addSCMProvider: 'Add SCM Provider', editSCMProvider: 'Edit SCM Provider', failedToLoad: 'Failed to load SCM providers', @@ -459,7 +459,7 @@ export default { providerType: 'Provider Type', authMethod: 'Authentication Method', baseUrl: 'Base URL', - baseUrlPlaceholder: 'Enter your self-hosted Gitea/Forgejo instance URL', + baseUrlPlaceholder: 'Enter your self-hosted GitLab or Gitea/Forgejo instance URL', callbackUrl: 'Callback URL', copy: 'Copy', copied: 'Copied!', @@ -468,7 +468,10 @@ export default { oauthClientId: 'OAuth Client ID', oauthClientSecret: 'OAuth Client Secret', leaveEmptyToKeep: 'Leave empty to keep existing secret', - personalAccessToken: 'Personal Access Token', + accessToken: 'Access Token', + accessTokenHelp: 'Use an access token with the permissions required for the selected provider.', + gitlabAccessTokenHelp: + 'GitLab accepts Personal, Project, and Group Access Tokens. Prefer a Project or Group token for bot and server-to-server integrations.', githubAppId: 'GitHub App ID', privateKeyPem: 'Private Key (PEM)', orgInstallation: 'Organization Installation', diff --git a/frontend/src/lib/locales/en/adminOperations.js b/frontend/src/lib/locales/en/adminOperations.js index 1bdc6ee84..b7ed69eca 100644 --- a/frontend/src/lib/locales/en/adminOperations.js +++ b/frontend/src/lib/locales/en/adminOperations.js @@ -387,6 +387,14 @@ export default { unlinkMessage: 'Unlink {name}?', unlinkedRepository: 'Unlinked {name}', unlinkFailed: 'Failed to unlink repository', + gitlabWebhook: 'GitLab webhook', + webhookHelp: 'Add the callback URL and secret to the GitLab project webhook. Push, tag, merge request, note, and release events are accepted.', + configureWebhook: 'Generate webhook details', + rotateWebhookSecret: 'Rotate secret', + webhookSecretOnce: 'Copy this secret now. It will not be shown again.', + webhookSecretRotated: 'GitLab webhook secret generated', + webhookLoadFailed: 'Failed to load GitLab webhook settings', + webhookRotateFailed: 'Failed to generate GitLab webhook secret', }, workspaceTemplates: { title: 'Work item templates', diff --git a/frontend/src/lib/locales/en/misc.js b/frontend/src/lib/locales/en/misc.js index 53013c781..feff90758 100644 --- a/frontend/src/lib/locales/en/misc.js +++ b/frontend/src/lib/locales/en/misc.js @@ -813,6 +813,7 @@ export default { // CreatePRFromBranchModal createPullRequest: 'Create Pull Request', + createMergeRequest: 'Create Merge Request', createPRFrom: 'Create PR from branch: {branch}', prTitle: 'PR Title', description: 'Description', @@ -820,6 +821,7 @@ export default { baseBranchPRHelp: "Leave empty to use the repository's default branch.", createPR: 'Create PR', prCreatedSuccess: 'Pull request #{prNumber} created successfully', + mrCreatedSuccess: 'Merge request !{prNumber} created successfully', failedToCreatePR: 'Failed to create pull request', noBranchLink: 'No branch link provided', @@ -849,6 +851,7 @@ export default { connect: 'Connect {provider}', noLinksYet: 'No development links yet', pullRequests: 'Pull requests', + mergeRequests: 'Merge requests', branches: 'Branches', commits: 'Commits', smartCommitsTitle: 'Process smart commits', diff --git a/frontend/src/lib/locales/es/admin.js b/frontend/src/lib/locales/es/admin.js index 66e6541c0..eb4dadd0f 100644 --- a/frontend/src/lib/locales/es/admin.js +++ b/frontend/src/lib/locales/es/admin.js @@ -445,18 +445,18 @@ export default { }, scmProviders: { title: 'Proveedores SCM', - subtitle: 'Configurar integraciones de GitHub y Gitea para vincular repositorios.', + subtitle: 'Configurar integraciones de GitHub, GitLab y Gitea para vincular repositorios.', addProvider: 'Agregar proveedor', connectionSuccessful: 'Conexión exitosa', connectionFailed: 'Error de conexión', noProviders: 'No hay proveedores SCM', - getStarted: 'Comience agregando un proveedor de GitHub o Gitea.', + getStarted: 'Comience agregando un proveedor de GitHub, GitLab o Gitea.', enabled: 'Habilitado', disabled: 'Deshabilitado', default: 'Predeterminado', restricted: 'Restringido', - patConfigured: 'PAT configurado', - patNotConfigured: 'PAT no configurado', + patConfigured: 'Token de acceso configurado', + patNotConfigured: 'Token de acceso no configurado', addSCMProvider: 'Agregar proveedor SCM', editSCMProvider: 'Editar proveedor SCM', failedToLoad: 'Error al cargar los proveedores SCM', @@ -469,7 +469,7 @@ export default { providerType: 'Tipo de proveedor', authMethod: 'MĆ©todo de autenticación', baseUrl: 'URL base', - baseUrlPlaceholder: 'Ingrese la URL de su instancia Gitea/Forgejo autoalojada', + baseUrlPlaceholder: 'Ingrese la URL de su instancia GitLab o Gitea/Forgejo autoalojada', callbackUrl: 'URL de callback', copy: 'Copiar', copied: 'Ā”Copiado!', @@ -478,7 +478,10 @@ export default { oauthClientId: 'ID de cliente OAuth', oauthClientSecret: 'Secreto de cliente OAuth', leaveEmptyToKeep: 'Deje vacĆ­o para mantener el secreto existente', - personalAccessToken: 'Token de acceso personal', + accessToken: 'Token de acceso', + accessTokenHelp: 'Utilice un token de acceso con los permisos requeridos por el proveedor seleccionado.', + gitlabAccessTokenHelp: + 'GitLab acepta tokens de acceso personales, de proyecto y de grupo. Se recomienda un token de proyecto o grupo para integraciones de bots y de servidor a servidor.', githubAppId: 'ID de aplicación GitHub', privateKeyPem: 'Clave privada (PEM)', orgInstallation: 'Instalación de organización', diff --git a/frontend/src/lib/locales/fr/admin.js b/frontend/src/lib/locales/fr/admin.js index 9c831325b..1dbf0a2e4 100644 --- a/frontend/src/lib/locales/fr/admin.js +++ b/frontend/src/lib/locales/fr/admin.js @@ -468,7 +468,7 @@ export default { oauthClientId: 'ID client OAuth', oauthClientSecret: 'Secret client OAuth', leaveEmptyToKeep: 'Laissez vide pour conserver le secret actuel', - personalAccessToken: 'Jeton d\'accĆØs personnel (PAT)', + accessToken: 'Jeton d\'accĆØs', githubAppId: 'ID de l\'application GitHub', privateKeyPem: 'ClĆ© privĆ©e (PEM)', orgInstallation: 'Installation d\'organisation', @@ -1109,4 +1109,4 @@ export default { create: 'CrĆ©er', noAccessMessage: 'Vous n\'avez pas l’autorisation d\'accĆ©der Ć  cette page.', }, -}; \ No newline at end of file +}; diff --git a/frontend/src/lib/locales/pt-BR/admin.js b/frontend/src/lib/locales/pt-BR/admin.js index 581f754b0..ce060bb7d 100644 --- a/frontend/src/lib/locales/pt-BR/admin.js +++ b/frontend/src/lib/locales/pt-BR/admin.js @@ -445,18 +445,18 @@ export default { }, scmProviders: { title: 'Provedores SCM', - subtitle: 'Configurar integraƧƵes com GitHub e Gitea para vinculação de repositórios.', + subtitle: 'Configurar integraƧƵes com GitHub, GitLab e Gitea para vinculação de repositórios.', addProvider: 'Adicionar Provedor', connectionSuccessful: 'ConexĆ£o bem-sucedida', connectionFailed: 'Falha na conexĆ£o', noProviders: 'Nenhum provedor SCM', - getStarted: 'Comece adicionando um provedor GitHub ou Gitea.', + getStarted: 'Comece adicionando um provedor GitHub, GitLab ou Gitea.', enabled: 'Ativado', disabled: 'Desativado', default: 'PadrĆ£o', restricted: 'Restrito', - patConfigured: 'PAT Configurado', - patNotConfigured: 'PAT NĆ£o Configurado', + patConfigured: 'Token de acesso configurado', + patNotConfigured: 'Token de acesso nĆ£o configurado', addSCMProvider: 'Adicionar Provedor SCM', editSCMProvider: 'Editar Provedor SCM', failedToLoad: 'Falha ao carregar provedores SCM', @@ -469,7 +469,7 @@ export default { providerType: 'Tipo de Provedor', authMethod: 'MĆ©todo de Autenticação', baseUrl: 'URL Base', - baseUrlPlaceholder: 'Insira a URL da sua instĆ¢ncia Gitea/Forgejo auto-hospedada', + baseUrlPlaceholder: 'Insira a URL da sua instĆ¢ncia GitLab ou Gitea/Forgejo auto-hospedada', callbackUrl: 'URL de Callback', copy: 'Copiar', copied: 'Copiado!', @@ -478,7 +478,10 @@ export default { oauthClientId: 'ID do Cliente OAuth', oauthClientSecret: 'Segredo do Cliente OAuth', leaveEmptyToKeep: 'Deixe vazio para manter o segredo existente', - personalAccessToken: 'Token de Acesso Pessoal', + accessToken: 'Token de acesso', + accessTokenHelp: 'Use um token de acesso com as permissƵes exigidas pelo provedor selecionado.', + gitlabAccessTokenHelp: + 'O GitLab aceita tokens de acesso pessoais, de projeto e de grupo. Prefira um token de projeto ou grupo para integraƧƵes de bots e entre servidores.', githubAppId: 'ID do GitHub App', privateKeyPem: 'Chave Privada (PEM)', orgInstallation: 'Instalação da Organização', diff --git a/frontend/src/lib/locales/ru/admin.js b/frontend/src/lib/locales/ru/admin.js index d65aac990..e87c9617a 100644 --- a/frontend/src/lib/locales/ru/admin.js +++ b/frontend/src/lib/locales/ru/admin.js @@ -481,18 +481,18 @@ export default { scmProviders: { title: 'ŠŸŃ€Š¾Š²Š°Š¹Š“ŠµŃ€Ń‹ SCM', - subtitle: 'ŠŠ°ŃŃ‚Ń€Š¾Š¹Ń‚Šµ интеграции с GitHub Šø Gitea Š“Š»Ń ŃŠ²ŃŠ·Ń‹Š²Š°Š½ŠøŃ репозиториев.', + subtitle: 'ŠŠ°ŃŃ‚Ń€Š¾Š¹Ń‚Šµ интеграции с GitHub, GitLab Šø Gitea Š“Š»Ń ŃŠ²ŃŠ·Ń‹Š²Š°Š½ŠøŃ репозиториев.', addProvider: 'Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ провайГера', connectionSuccessful: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ ŃƒŃŃ‚Š°Š½Š¾Š²Š»ŠµŠ½Š¾', connectionFailed: 'ŠŠµ уГалось ŠæŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒŃŃ', noProviders: 'ŠŠµŃ‚ провайГеров SCM', - getStarted: 'Š”Š¾Š±Š°Š²ŃŒŃ‚Šµ провайГера GitHub или Gitea, чтобы Š½Š°Ń‡Š°Ń‚ŃŒ Ń€Š°Š±Š¾Ń‚Ńƒ.', + getStarted: 'Š”Š¾Š±Š°Š²ŃŒŃ‚Šµ провайГера GitHub, GitLab или Gitea, чтобы Š½Š°Ń‡Š°Ń‚ŃŒ Ń€Š°Š±Š¾Ń‚Ńƒ.', enabled: 'Š’ŠŗŠ»ŃŽŃ‡Ń‘Š½', disabled: 'ŠžŃ‚ŠŗŠ»ŃŽŃ‡Ń‘Š½', default: 'По ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ', restricted: 'ŠžŠ³Ń€Š°Š½ŠøŃ‡ŠµŠ½', - patConfigured: 'PAT настроен', - patNotConfigured: 'PAT не настроен', + patConfigured: 'Токен Š“Š¾ŃŃ‚ŃƒŠæŠ° настроен', + patNotConfigured: 'Токен Š“Š¾ŃŃ‚ŃƒŠæŠ° не настроен', addSCMProvider: 'Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ провайГера SCM', editSCMProvider: 'Š˜Š·Š¼ŠµŠ½ŠøŃ‚ŃŒ провайГера SCM', failedToLoad: 'ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ провайГеров SCM', @@ -505,7 +505,7 @@ export default { providerType: 'Тип провайГера', authMethod: 'Дпособ Š°ŃƒŃ‚ентификации', baseUrl: 'Базовый URL', - baseUrlPlaceholder: 'ВвеГите URL собственного сервера Gitea/Forgejo', + baseUrlPlaceholder: 'ВвеГите URL собственного сервера GitLab или Gitea/Forgejo', callbackUrl: 'URL ŠæŠµŃ€ŠµŠ½Š°ŠæŃ€Š°Š²Š»ŠµŠ½ŠøŃ OAuth', copy: 'ŠšŠ¾ŠæŠøŃ€Š¾Š²Š°Ń‚ŃŒ', copied: 'Дкопировано', @@ -515,7 +515,10 @@ export default { oauthClientId: 'ID клиента OAuth', oauthClientSecret: 'Декрет клиента OAuth', leaveEmptyToKeep: 'ŠžŃŃ‚Š°Š²ŃŒŃ‚Šµ ŠæŃƒŃŃ‚Ń‹Š¼, чтобы ŃŠ¾Ń…Ń€Š°Š½ŠøŃ‚ŃŒ Ń‚ŠµŠŗŃƒŃ‰ŠøŠ¹ секрет', - personalAccessToken: 'ŠŸŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½Ń‹Š¹ токен Š“Š¾ŃŃ‚ŃƒŠæŠ°', + accessToken: 'Токен Š“Š¾ŃŃ‚ŃƒŠæŠ°', + accessTokenHelp: 'Š˜ŃŠæŠ¾Š»ŃŒŠ·ŃƒŠ¹Ń‚Šµ токен Š“Š¾ŃŃ‚ŃƒŠæŠ° с правами, необхоГимыми Š²Ń‹Š±Ń€Š°Š½Š½Š¾Š¼Ńƒ ŠæŃ€Š¾Š²Š°Š¹Š“ŠµŃ€Ńƒ.', + gitlabAccessTokenHelp: + 'GitLab принимает ŠæŠµŃ€ŃŠ¾Š½Š°Š»ŃŒŠ½Ń‹Šµ, проектные Šø Š³Ń€ŃƒŠæŠæŠ¾Š²Ń‹Šµ токены Š“Š¾ŃŃ‚ŃƒŠæŠ°. Š”Š»Ń ботов Šø межсерверных интеграций Ń€ŠµŠŗŠ¾Š¼ŠµŠ½Š“ŃƒŠµŃ‚ŃŃ проектный или Š³Ń€ŃƒŠæŠæŠ¾Š²Š¾Š¹ токен.', githubAppId: 'ID ŠæŃ€ŠøŠ»Š¾Š¶ŠµŠ½ŠøŃ GitHub', privateKeyPem: 'Закрытый ŠŗŠ»ŃŽŃ‡ (PEM)', orgInstallation: 'Установка в организации', diff --git a/frontend/src/lib/locales/ru/adminOperations.js b/frontend/src/lib/locales/ru/adminOperations.js index bea9eb614..31e9528df 100644 --- a/frontend/src/lib/locales/ru/adminOperations.js +++ b/frontend/src/lib/locales/ru/adminOperations.js @@ -397,6 +397,14 @@ export default { unlinkMessage: 'Š£Š“Š°Š»ŠøŃ‚ŃŒ ŃŠ²ŃŠ·ŃŒ с репозиторием {name}?', unlinkedRepository: 'Š”Š²ŃŠ·ŃŒ с {name} уГалена', unlinkFailed: 'ŠŠµ уГалось ŃƒŠ“Š°Š»ŠøŃ‚ŃŒ ŃŠ²ŃŠ·ŃŒ с репозиторием', + gitlabWebhook: 'Webhook GitLab', + webhookHelp: 'Š”Š¾Š±Š°Š²ŃŒŃ‚Šµ URL Šø секрет в webhook проекта GitLab. ŠŸŃ€ŠøŠ½ŠøŠ¼Š°ŃŽŃ‚ŃŃ ŃŠ¾Š±Ń‹Ń‚ŠøŃ push, tag, merge request, note Šø release.', + configureWebhook: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ параметры webhook', + rotateWebhookSecret: 'Š”Š¼ŠµŠ½ŠøŃ‚ŃŒ секрет', + webhookSecretOnce: 'Š”ŠŗŠ¾ŠæŠøŃ€ŃƒŠ¹Ń‚Šµ секрет сейчас — повторно он показан не Š±ŃƒŠ“ет.', + webhookSecretRotated: 'Декрет webhook GitLab созГан', + webhookLoadFailed: 'ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ настройки webhook GitLab', + webhookRotateFailed: 'ŠŠµ уГалось ŃŠ¾Š·Š“Š°Ń‚ŃŒ секрет webhook GitLab', }, workspaceTemplates: { title: 'Шаблоны рабочих ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š²', diff --git a/frontend/src/lib/locales/ru/misc.js b/frontend/src/lib/locales/ru/misc.js index 6c5e5fa4d..6728e9f43 100644 --- a/frontend/src/lib/locales/ru/misc.js +++ b/frontend/src/lib/locales/ru/misc.js @@ -150,9 +150,9 @@ export default { scm: { createBranch: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ Š²ŠµŃ‚ŠŗŃƒ', createBranchFor: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ Š²ŠµŃ‚ŠŗŃƒ Š“Š»Ń {itemKey}', repository: 'Репозиторий', selectRepository: 'Выберите репозиторий…', branchName: 'ŠŠ°Š·Š²Š°Š½ŠøŠµ ветки', baseBranch: 'Š‘Š°Š·Š¾Š²Š°Ń ветка', baseBranchHelp: 'Ветка, от которой ŃŠ¾Š·Š“Š°Ń‘Ń‚ŃŃ Š½Š¾Š²Š°Ń. По ŃƒŠ¼Š¾Š»Ń‡Š°Š½ŠøŃŽ ŠøŃŠæŠ¾Š»ŃŒŠ·ŃƒŠµŃ‚ŃŃ Š¾ŃŠ½Š¾Š²Š½Š°Ń ветка Ń€ŠµŠæŠ¾Š·ŠøŃ‚Š¾Ń€ŠøŃ.', creating: 'ДозГание…', branchCreatedSuccess: 'Ветка созГана', noReposLinked: 'Š” ŃŃ‚ŠøŠ¼ рабочим пространством не ŃŠ²ŃŠ·Š°Š½Ń‹ репозитории', linkReposHelp: 'Š”Š²ŃŠ¶ŠøŃ‚Šµ репозитории в разГеле Ā«ŠŠ°ŃŃ‚Ń€Š¾Š¹ŠŗŠø рабочего пространства → Управление коГом»', fillAllRequired: 'Заполните все Š¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Ń‹Šµ ŠæŠ¾Š»Ń', failedToLoadRepos: 'ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ репозитории', failedToCreateBranch: 'ŠŠµ уГалось ŃŠ¾Š·Š“Š°Ń‚ŃŒ Š²ŠµŃ‚ŠŗŃƒ', - createPullRequest: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ запрос на ŃŠ»ŠøŃŠ½ŠøŠµ', createPRFrom: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ PR ŠøŠ· ветки {branch}', prTitle: 'ŠŠ°Š·Š²Š°Š½ŠøŠµ PR', description: 'ŠžŠæŠøŃŠ°Š½ŠøŠµ', baseBranchPR: 'Š‘Š°Š·Š¾Š²Š°Ń ветка', baseBranchPRHelp: 'ŠžŃŃ‚Š°Š²ŃŒŃ‚Šµ ŠæŃƒŃŃ‚Ń‹Š¼, чтобы ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ Š¾ŃŠ½Š¾Š²Š½ŃƒŃŽ Š²ŠµŃ‚ŠŗŃƒ Ń€ŠµŠæŠ¾Š·ŠøŃ‚Š¾Ń€ŠøŃ.', createPR: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ PR', prCreatedSuccess: 'Запрос на ŃŠ»ŠøŃŠ½ŠøŠµ ā„–{prNumber} созГан', failedToCreatePR: 'ŠŠµ уГалось ŃŠ¾Š·Š“Š°Ń‚ŃŒ запрос на ŃŠ»ŠøŃŠ½ŠøŠµ', noBranchLink: 'Дсылка на Š²ŠµŃ‚ŠŗŃƒ не указана', + createPullRequest: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ запрос на ŃŠ»ŠøŃŠ½ŠøŠµ', createMergeRequest: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ Merge Request', createPRFrom: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ PR ŠøŠ· ветки {branch}', prTitle: 'ŠŠ°Š·Š²Š°Š½ŠøŠµ PR', description: 'ŠžŠæŠøŃŠ°Š½ŠøŠµ', baseBranchPR: 'Š‘Š°Š·Š¾Š²Š°Ń ветка', baseBranchPRHelp: 'ŠžŃŃ‚Š°Š²ŃŒŃ‚Šµ ŠæŃƒŃŃ‚Ń‹Š¼, чтобы ŠøŃŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŃŒ Š¾ŃŠ½Š¾Š²Š½ŃƒŃŽ Š²ŠµŃ‚ŠŗŃƒ Ń€ŠµŠæŠ¾Š·ŠøŃ‚Š¾Ń€ŠøŃ.', createPR: 'Š”Š¾Š·Š“Š°Ń‚ŃŒ PR', prCreatedSuccess: 'Запрос на ŃŠ»ŠøŃŠ½ŠøŠµ ā„–{prNumber} созГан', mrCreatedSuccess: 'Merge Request !{prNumber} созГан', failedToCreatePR: 'ŠŠµ уГалось ŃŠ¾Š·Š“Š°Ń‚ŃŒ запрос на ŃŠ»ŠøŃŠ½ŠøŠµ', noBranchLink: 'Дсылка на Š²ŠµŃ‚ŠŗŃƒ не указана', linkDevResource: 'Š”Š²ŃŠ·Š°Ń‚ŃŒ с разработкой', linkDevResourceDesc: 'Š”Š¾Š±Š°Š²ŃŒŃ‚Šµ ŃŠ²ŃŠ·ŃŒ с PR, веткой или коммитом', type: 'Тип', pr: 'PR', branch: 'Ветка', commit: 'ŠšŠ¾Š¼Š¼ŠøŃ‚', prNumber: 'ŠŠ¾Š¼ŠµŃ€ PR', commitSha: 'SHA коммита', titleOptional: 'ŠŠ°Š·Š²Š°Š½ŠøŠµ (Š½ŠµŠ¾Š±ŃŠ·Š°Ń‚ŠµŠ»ŃŒŠ½Š¾)', linkResource: 'Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃŠ²ŃŠ·ŃŒ', linking: 'ДозГание ŃŠ²ŃŠ·Šøā€¦', failedToCreateLink: 'ŠŠµ уГалось ŃŠ¾Š·Š“Š°Ń‚ŃŒ ŃŠ²ŃŠ·ŃŒ', - development: 'Разработка', linkExisting: 'Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŃŽŃ‰ŃƒŃŽ ŃŠ²ŃŠ·ŃŒ', failedToStartConnection: 'ŠŠµ уГалось Š½Š°Ń‡Š°Ń‚ŃŒ ŠæŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ', failedToLoadLinks: 'ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŃŠ²ŃŠ·Šø', confirmRemoveLink: 'Š£Š“Š°Š»ŠøŃ‚ŃŒ эту ŃŠ²ŃŠ·ŃŒ?', noRepositoriesLinked: 'Š” ŃŃ‚ŠøŠ¼ рабочим пространством не ŃŠ²ŃŠ·Š°Š½Ń‹ репозитории', connectYourAccount: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚Šµ ŃƒŃ‡Ń‘Ń‚Š½ŃƒŃŽ запись {provider}', connectToCreate: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŠµŃŃŒ, чтобы ŃŠ¾Š·Š“Š°Š²Š°Ń‚ŃŒ ветки Šø запросы на ŃŠ»ŠøŃŠ½ŠøŠµ ŠøŠ· рабочих ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š².', connect: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ {provider}', noLinksYet: 'PR, ветки Šø коммиты пока не ŃŠ²ŃŠ·Š°Š½Ń‹', pullRequests: 'Запросы на ŃŠ»ŠøŃŠ½ŠøŠµ', branches: 'Ветки', commits: 'ŠšŠ¾Š¼Š¼ŠøŃ‚Ń‹', smartCommitsTitle: 'Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ команГы ŠøŠ· коммитов', smartCommitsDescription: 'ŠŸŃ€Šø ŃŠ»ŠøŃŠ½ŠøŠø Š²Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ команГы Ā«#comment …» Šø Ā«#Ā» ŠøŠ· Š¾ŠæŠøŃŠ°Š½ŠøŃ PR Šø сообщений коммитов.', smartCommitsWarningTitle: 'АГрес автора коммита невозможно ŠæŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ', smartCommitsWarningBody: 'ŠšŠ¾Š¼Š°Š½Š“Ń‹ ŠøŠ· коммита Š²Ń‹ŠæŠ¾Š»Š½ŃŃŽŃ‚ся от имени ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń, чей аГрес совпаГает с аГресом автора в Git. Git не поГтвержГает ŃŃ‚Š¾Ń‚ аГрес: автор коммита может ŃƒŠŗŠ°Š·Š°Ń‚ŃŒ Š»ŃŽŠ±Š¾Šµ значение. Š’ŠŗŠ»ŃŽŃ‡Š°Š¹Ń‚Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Ń‚Š¾Š»ŃŒŠŗŠ¾ Š“Š»Ń репозиториев, ŃƒŃ‡Š°ŃŃ‚Š½ŠøŠŗŠ°Š¼ которых вы Š“Š¾Š²ŠµŃ€ŃŠµŃ‚Šµ.', smartCommitsUpdateFailed: 'ŠŠµ уГалось Š¾Š±Š½Š¾Š²ŠøŃ‚ŃŒ Š½Š°ŃŃ‚Ń€Š¾Š¹ŠŗŃƒ команГ ŠøŠ· коммитов', + development: 'Разработка', linkExisting: 'Š”Š¾Š±Š°Š²ŠøŃ‚ŃŒ ŃŃƒŃ‰ŠµŃŃ‚Š²ŃƒŃŽŃ‰ŃƒŃŽ ŃŠ²ŃŠ·ŃŒ', failedToStartConnection: 'ŠŠµ уГалось Š½Š°Ń‡Š°Ń‚ŃŒ ŠæŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠµŠ½ŠøŠµ', failedToLoadLinks: 'ŠŠµ уГалось Š·Š°Š³Ń€ŃƒŠ·ŠøŃ‚ŃŒ ŃŠ²ŃŠ·Šø', confirmRemoveLink: 'Š£Š“Š°Š»ŠøŃ‚ŃŒ эту ŃŠ²ŃŠ·ŃŒ?', noRepositoriesLinked: 'Š” ŃŃ‚ŠøŠ¼ рабочим пространством не ŃŠ²ŃŠ·Š°Š½Ń‹ репозитории', connectYourAccount: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚Šµ ŃƒŃ‡Ń‘Ń‚Š½ŃƒŃŽ запись {provider}', connectToCreate: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŠµŃŃŒ, чтобы ŃŠ¾Š·Š“Š°Š²Š°Ń‚ŃŒ ветки Šø запросы на ŃŠ»ŠøŃŠ½ŠøŠµ ŠøŠ· рабочих ŃŠ»ŠµŠ¼ŠµŠ½Ń‚Š¾Š².', connect: 'ŠŸŠ¾Š“ŠŗŠ»ŃŽŃ‡ŠøŃ‚ŃŒ {provider}', noLinksYet: 'PR, ветки Šø коммиты пока не ŃŠ²ŃŠ·Š°Š½Ń‹', pullRequests: 'Запросы на ŃŠ»ŠøŃŠ½ŠøŠµ', mergeRequests: 'Merge Requests', branches: 'Ветки', commits: 'ŠšŠ¾Š¼Š¼ŠøŃ‚Ń‹', smartCommitsTitle: 'Š’Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ команГы ŠøŠ· коммитов', smartCommitsDescription: 'ŠŸŃ€Šø ŃŠ»ŠøŃŠ½ŠøŠø Š²Ń‹ŠæŠ¾Š»Š½ŃŃ‚ŃŒ команГы Ā«#comment …» Šø Ā«#Ā» ŠøŠ· Š¾ŠæŠøŃŠ°Š½ŠøŃ PR Šø сообщений коммитов.', smartCommitsWarningTitle: 'АГрес автора коммита невозможно ŠæŃ€Š¾Š²ŠµŃ€ŠøŃ‚ŃŒ', smartCommitsWarningBody: 'ŠšŠ¾Š¼Š°Š½Š“Ń‹ ŠøŠ· коммита Š²Ń‹ŠæŠ¾Š»Š½ŃŃŽŃ‚ся от имени ŠæŠ¾Š»ŃŒŠ·Š¾Š²Š°Ń‚ŠµŠ»Ń, чей аГрес совпаГает с аГресом автора в Git. Git не поГтвержГает ŃŃ‚Š¾Ń‚ аГрес: автор коммита может ŃƒŠŗŠ°Š·Š°Ń‚ŃŒ Š»ŃŽŠ±Š¾Šµ значение. Š’ŠŗŠ»ŃŽŃ‡Š°Š¹Ń‚Šµ Ń„ŃƒŠ½ŠŗŃ†ŠøŃŽ Ń‚Š¾Š»ŃŒŠŗŠ¾ Š“Š»Ń репозиториев, ŃƒŃ‡Š°ŃŃ‚Š½ŠøŠŗŠ°Š¼ которых вы Š“Š¾Š²ŠµŃ€ŃŠµŃ‚Šµ.', smartCommitsUpdateFailed: 'ŠŠµ уГалось Š¾Š±Š½Š¾Š²ŠøŃ‚ŃŒ Š½Š°ŃŃ‚Ń€Š¾Š¹ŠŗŃƒ команГ ŠøŠ· коммитов', }, organization: { diff --git a/frontend/src/lib/locales/zh-CN/admin.js b/frontend/src/lib/locales/zh-CN/admin.js index df211329d..897ed066a 100644 --- a/frontend/src/lib/locales/zh-CN/admin.js +++ b/frontend/src/lib/locales/zh-CN/admin.js @@ -346,18 +346,18 @@ export default { }, scmProviders: { title: 'SCM ęä¾›å•†', - subtitle: 'é…ē½® GitHub 和 Gitea é›†ęˆä»„čæ›č”Œä»“åŗ“é“¾ęŽ„ć€‚', + subtitle: 'é…ē½® GitHub态GitLab 和 Gitea é›†ęˆä»„čæ›č”Œä»“åŗ“é“¾ęŽ„ć€‚', addProvider: 'ę·»åŠ ęä¾›å•†', connectionSuccessful: 'čæžęŽ„ęˆåŠŸ', connectionFailed: 'čæžęŽ„å¤±č“„', noProviders: 'ꗠ SCM ęä¾›å•†', - getStarted: '添加 GitHub ꈖ Gitea ęä¾›å•†ä»„å¼€å§‹ä½æē”Øć€‚', + getStarted: '添加 GitHub态GitLab ꈖ Gitea ęä¾›å•†ä»„å¼€å§‹ä½æē”Øć€‚', enabled: '已启用', disabled: '已禁用', default: '默认', restricted: '受限', - patConfigured: 'PAT å·²é…ē½®', - patNotConfigured: 'PAT ęœŖé…ē½®', + patConfigured: 'č®æé—®ä»¤ē‰Œå·²é…ē½®', + patNotConfigured: 'č®æé—®ä»¤ē‰ŒęœŖé…ē½®', addSCMProvider: '添加 SCM ęä¾›å•†', editSCMProvider: '编辑 SCM ęä¾›å•†', failedToLoad: '加载 SCM ęä¾›å•†å¤±č“„', @@ -370,7 +370,7 @@ export default { providerType: 'ęä¾›å•†ē±»åž‹', authMethod: 'č®¤čÆę–¹å¼', baseUrl: 'åŸŗē”€ URL', - baseUrlPlaceholder: 'č¾“å…„ę‚Øēš„č‡Ŗę‰˜ē®” Gitea/Forgejo 实例 URL', + baseUrlPlaceholder: 'č¾“å…„ę‚Øēš„č‡Ŗę‰˜ē®” GitLab ꈖ Gitea/Forgejo 实例 URL', callbackUrl: 'å›žč°ƒ URL', copy: '复制', copied: 'å·²å¤åˆ¶ļ¼', @@ -379,7 +379,10 @@ export default { oauthClientId: 'OAuth 客户端 ID', oauthClientSecret: 'OAuth å®¢ęˆ·ē«ÆåÆ†é’„', leaveEmptyToKeep: 'ē•™ē©ŗä»„äæē•™ēŽ°ęœ‰åÆ†é’„', - personalAccessToken: 'äøŖäŗŗč®æé—®ä»¤ē‰Œ', + accessToken: 'č®æé—®ä»¤ē‰Œ', + accessTokenHelp: 'ä½æē”Øå…·ęœ‰ę‰€é€‰ęä¾›å•†ę‰€éœ€ęƒé™ēš„č®æé—®ä»¤ē‰Œć€‚', + gitlabAccessTokenHelp: + 'GitLab ę”ÆęŒäøŖäŗŗć€é”¹ē›®å’Œē¾¤ē»„č®æé—®ä»¤ē‰Œć€‚åÆ¹äŗŽęœŗå™Øäŗŗå’ŒęœåŠ”å™Øåˆ°ęœåŠ”å™Øé›†ęˆļ¼Œå»ŗč®®ä½æē”Øé”¹ē›®ęˆ–ē¾¤ē»„ä»¤ē‰Œć€‚', githubAppId: 'GitHub 应用 ID', privateKeyPem: 'ē§é’„ļ¼ˆPEM)', orgInstallation: '组织安装', diff --git a/frontend/src/lib/settings/SCMProviderManager.svelte b/frontend/src/lib/settings/SCMProviderManager.svelte index 4a539abee..e67f86439 100644 --- a/frontend/src/lib/settings/SCMProviderManager.svelte +++ b/frontend/src/lib/settings/SCMProviderManager.svelte @@ -49,16 +49,17 @@ // Workspace restriction state let allowedWorkspaceIds = $state([]); - // Provider types (only GitHub and Gitea supported) + // Provider types const providerTypes = [ { value: 'github', label: 'GitHub', icon: Github }, + { value: 'gitlab', label: 'GitLab', icon: GitBranch }, { value: 'gitea', label: 'Gitea / Forgejo', icon: GitBranch }, ]; // Auth methods const authMethods = [ { value: 'oauth', label: 'OAuth App', description: 'Users authorize via OAuth flow' }, - { value: 'pat', label: 'Personal Access Token', description: 'Use a PAT for all operations' }, + { value: 'pat', label: 'Access Token', description: 'Use an access token for all operations' }, { value: 'github_app', label: 'GitHub App', description: 'Fine-grained permissions (GitHub only)' }, ]; @@ -67,16 +68,10 @@ m.value !== 'github_app' || formData.provider_type === 'github' )); - // Reset auth method if it becomes invalid for the selected provider - $effect(() => { - if (formData.auth_method === 'github_app' && formData.provider_type !== 'github') { - formData.auth_method = 'oauth'; - } - }); - // Default OAuth scopes per provider type const defaultScopes = { github: 'repo read:user user:email', + gitlab: 'api', gitea: 'read:user read:repository write:repository', }; @@ -108,15 +103,14 @@ let discoveringInstallations = $state(false); let discoveryError = $state(null); - // Update scopes when provider type changes (only if scopes is a default value) - $effect(() => { - if (formData.provider_type) { - const currentIsDefault = Object.values(defaultScopes).includes(formData.scopes); - if (currentIsDefault) { - formData.scopes = defaultScopes[formData.provider_type] || defaultScopes.github; - } + function handleProviderTypeChange(providerType) { + if (formData.auth_method === 'github_app' && providerType !== 'github') { + formData.auth_method = 'oauth'; } - }); + if (Object.values(defaultScopes).includes(formData.scopes)) { + formData.scopes = defaultScopes[providerType] || defaultScopes.github; + } + } onMount(async () => { await loadProviders(); @@ -182,7 +176,7 @@ github_app_private_key: '', github_app_installation_id: provider.github_app_installation_id || '', github_org_id: provider.github_org_id || null, - scopes: provider.scopes || 'repo', + scopes: provider.scopes || defaultScopes[provider.provider_type] || defaultScopes.github, workspace_restriction_mode: provider.workspace_restriction_mode || 'unrestricted', }; formErrors = {}; @@ -226,7 +220,7 @@ } } else if (formData.auth_method === 'pat') { if (!editingProvider && !formData.personal_access_token) { - formErrors.personal_access_token = 'Personal Access Token is required'; + formErrors.personal_access_token = 'Access Token is required'; } } else if (formData.auth_method === 'github_app') { if (!formData.github_app_id) { @@ -381,6 +375,14 @@ return providerType?.label || type; } + function getAccessTokenHelp() { + const helpKey = formData.provider_type === 'gitlab' + ? 'settings.scmProviders.gitlabAccessTokenHelp' + : 'settings.scmProviders.accessTokenHelp'; + const help = t(helpKey); + return editingProvider ? `${help} ${t('settings.scmProviders.leaveEmptyToKeep')}` : help; + } + // Compute OAuth callback URL based on slug const oauthCallbackUrl = $derived(formData.slug ? `${publicBaseURL()}/api/scm/oauth/${formData.slug}/callback` @@ -430,7 +432,7 @@ {:else} - {#each providers as provider} + {#each providers as provider (provider.id)} {@const ProviderIcon = getProviderIcon(provider.provider_type)}
@@ -532,6 +534,7 @@ placeholder="Select provider type" getValue={(item) => item.value} getLabel={(item) => item.label} + onSelect={(item) => handleProviderTypeChange(item.value)} />
@@ -546,12 +549,12 @@
- - {#if formData.provider_type === 'gitea'} + + {#if formData.provider_type === 'gitea' || formData.provider_type === 'gitlab'} {/if} @@ -578,7 +581,7 @@

{t('settings.scmProviders.enterSlugForCallback')}

{/if} - {t('settings.scmProviders.useThisUrl')} {formData.provider_type === 'github' ? 'GitHub' : 'Gitea'} + {t('settings.scmProviders.useThisUrl')} {getProviderLabel(formData.provider_type)} {/snippet} @@ -597,9 +600,9 @@ {/if} - + {#if formData.auth_method === 'pat'} - + {/if} @@ -655,7 +658,7 @@

Select an organization:

- {#each discoveredInstallations as installation} + {#each discoveredInstallations as installation (installation.id)} + {/if} {repo.repository_name} {repo.default_branch} @@ -475,6 +524,33 @@
{/if} + {#if conn.provider_type === 'gitlab' && webhookConfigs[repo.id]} + {@const webhookConfig = webhookConfigs[repo.id]} +
+
+

{t('scmSettings.gitlabWebhook')}

+

{t('scmSettings.webhookHelp')}

+
+ {#if webhookConfig.configured} +
+
+ {webhookConfig.callback_url} + +
+ {#if webhookConfig.secret} +
+ {webhookConfig.secret} + +
+

{t('scmSettings.webhookSecretOnce')}

+ {/if} +
+ {/if} + +
+ {/if} {/each} diff --git a/internal/database/gitlab_schema_test.go b/internal/database/gitlab_schema_test.go new file mode 100644 index 000000000..3a7fadc6d --- /dev/null +++ b/internal/database/gitlab_schema_test.go @@ -0,0 +1,36 @@ +package database + +import ( + "path/filepath" + "testing" +) + +func TestFreshSQLiteSchemaIncludesGitLabReleaseAndWebhookTables(t *testing.T) { + db, err := NewSQLiteDBWithPoolSizes(filepath.Join(t.TempDir(), "windshift.db"), 1, 1) + if err != nil { + t.Fatal(err) + } + defer func() { _ = db.Close() }() + if err := db.Initialize(); err != nil { + t.Fatal(err) + } + + for _, column := range []string{"workspace_repository_id", "tag_url", "release_status", "released_at", "assets_json", "last_synced_at"} { + var count int + if err := db.QueryRow(`SELECT COUNT(*) FROM pragma_table_info('milestone_releases') WHERE name = ?`, column).Scan(&count); err != nil { + t.Fatal(err) + } + if count != 1 { + t.Fatalf("milestone_releases column %q is missing", column) + } + } + for _, table := range []string{"scm_webhooks", "scm_webhook_deliveries"} { + var count int + if err := db.QueryRow(`SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = ?`, table).Scan(&count); err != nil { + t.Fatal(err) + } + if count != 1 { + t.Fatalf("table %q is missing", table) + } + } +} diff --git a/internal/database/migrations.go b/internal/database/migrations.go index f344e2791..71aada290 100644 --- a/internal/database/migrations.go +++ b/internal/database/migrations.go @@ -601,6 +601,96 @@ var Catalog = []Migration{ CREATE UNIQUE INDEX uq_themes_builtin_key ON themes(builtin_key) WHERE builtin_key IS NOT NULL; `, }, + { + Version: "20260831_gitlab_release_metadata", + Name: "Add repository-scoped SCM release metadata", + CheckSQLite: sqliteColumnCheck("milestone_releases", "release_status"), + CheckPostgres: pgColumnCheck("milestone_releases", "release_status"), + SQLite: ` + ALTER TABLE milestone_releases ADD COLUMN workspace_repository_id INTEGER; + ALTER TABLE milestone_releases ADD COLUMN tag_url TEXT; + ALTER TABLE milestone_releases ADD COLUMN release_status TEXT NOT NULL DEFAULT 'tag_only'; + ALTER TABLE milestone_releases ADD COLUMN released_at DATETIME; + ALTER TABLE milestone_releases ADD COLUMN assets_json TEXT NOT NULL DEFAULT '[]'; + ALTER TABLE milestone_releases ADD COLUMN last_synced_at DATETIME; + CREATE UNIQUE INDEX uq_milestone_releases_repository_tag + ON milestone_releases(workspace_repository_id, tag_name) + WHERE workspace_repository_id IS NOT NULL; + `, + Postgres: ` + ALTER TABLE milestone_releases ADD COLUMN workspace_repository_id INTEGER; + ALTER TABLE milestone_releases ADD COLUMN tag_url TEXT; + ALTER TABLE milestone_releases ADD COLUMN release_status TEXT NOT NULL DEFAULT 'tag_only'; + ALTER TABLE milestone_releases ADD COLUMN released_at TIMESTAMPTZ; + ALTER TABLE milestone_releases ADD COLUMN assets_json JSONB NOT NULL DEFAULT '[]'::jsonb; + ALTER TABLE milestone_releases ADD COLUMN last_synced_at TIMESTAMPTZ; + CREATE UNIQUE INDEX uq_milestone_releases_repository_tag + ON milestone_releases(workspace_repository_id, tag_name) + WHERE workspace_repository_id IS NOT NULL; + `, + }, + { + Version: "20260831_scm_webhook_ingress", + Name: "Add manual SCM webhook ingress", + CheckSQLite: "SELECT COUNT(*) FROM sqlite_master WHERE type='table' AND name='scm_webhooks'", + CheckPostgres: "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema=current_schema() AND table_name='scm_webhooks'", + SQLite: ` + CREATE TABLE scm_webhooks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + workspace_repository_id INTEGER NOT NULL UNIQUE REFERENCES workspace_repositories(id) ON DELETE CASCADE, + webhook_key TEXT NOT NULL UNIQUE, + webhook_external_id TEXT, + webhook_secret_encrypted TEXT NOT NULL, + events TEXT NOT NULL DEFAULT '["push","tag_push","merge_request","note","release"]', + is_active BOOLEAN NOT NULL DEFAULT true, + last_delivery_at DATETIME, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TABLE scm_webhook_deliveries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + scm_webhook_id INTEGER NOT NULL REFERENCES scm_webhooks(id) ON DELETE CASCADE, + delivery_id TEXT NOT NULL, + event_type TEXT NOT NULL, + payload_summary TEXT, + status TEXT NOT NULL DEFAULT 'pending', + error_message TEXT, + processing_time_ms INTEGER, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(scm_webhook_id, delivery_id) + ); + CREATE INDEX idx_scm_webhook_deliveries_status ON scm_webhook_deliveries(status, created_at); + `, + Postgres: ` + CREATE TABLE scm_webhooks ( + id SERIAL PRIMARY KEY, + workspace_repository_id INTEGER NOT NULL UNIQUE REFERENCES workspace_repositories(id) ON DELETE CASCADE, + webhook_key TEXT NOT NULL UNIQUE, + webhook_external_id TEXT, + webhook_secret_encrypted TEXT NOT NULL, + events JSONB NOT NULL DEFAULT '["push","tag_push","merge_request","note","release"]'::jsonb, + is_active BOOLEAN NOT NULL DEFAULT true, + last_delivery_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP + ); + CREATE TABLE scm_webhook_deliveries ( + id SERIAL PRIMARY KEY, + scm_webhook_id INTEGER NOT NULL REFERENCES scm_webhooks(id) ON DELETE CASCADE, + delivery_id TEXT NOT NULL, + event_type TEXT NOT NULL, + payload_summary JSONB, + status TEXT NOT NULL DEFAULT 'pending', + error_message TEXT, + processing_time_ms INTEGER, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(scm_webhook_id, delivery_id) + ); + CREATE INDEX idx_scm_webhook_deliveries_status ON scm_webhook_deliveries(status, created_at); + `, + }, { Version: "20260831_object_translations", Name: "Add instance-wide configurable object translations", diff --git a/internal/database/schema/milestones.sql b/internal/database/schema/milestones.sql index 5195f7e18..1350f0725 100644 --- a/internal/database/schema/milestones.sql +++ b/internal/database/schema/milestones.sql @@ -44,6 +44,12 @@ CREATE TABLE IF NOT EXISTS milestone_releases ( is_draft INTEGER NOT NULL DEFAULT 0, is_prerelease INTEGER NOT NULL DEFAULT 0, target_commitish TEXT, + workspace_repository_id INTEGER, + tag_url TEXT, + release_status TEXT NOT NULL DEFAULT 'tag_only', + released_at DATETIME, + assets_json TEXT NOT NULL DEFAULT '[]', + last_synced_at DATETIME, scm_connection_id INTEGER REFERENCES workspace_scm_connections(id) ON DELETE SET NULL, scm_repository TEXT, scm_release_id TEXT, @@ -74,6 +80,9 @@ CREATE INDEX IF NOT EXISTS idx_milestone_releases_milestone_id ON milestone_rele CREATE UNIQUE INDEX IF NOT EXISTS uq_milestone_releases_idempotency ON milestone_releases(milestone_id, idempotency_key) WHERE idempotency_key IS NOT NULL; +CREATE UNIQUE INDEX IF NOT EXISTS uq_milestone_releases_repository_tag + ON milestone_releases(workspace_repository_id, tag_name) + WHERE workspace_repository_id IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_item_milestones_item_id ON item_milestones(item_id); CREATE INDEX IF NOT EXISTS idx_item_milestones_milestone_id ON item_milestones(milestone_id); -- Partial unique index: one external_key per workspace, but NULLs are unconstrained. diff --git a/internal/database/schema/milestones_existing.sql b/internal/database/schema/milestones_existing.sql index 946a3a7e1..8b158c8da 100644 --- a/internal/database/schema/milestones_existing.sql +++ b/internal/database/schema/milestones_existing.sql @@ -43,6 +43,12 @@ CREATE TABLE IF NOT EXISTS milestone_releases ( is_draft INTEGER NOT NULL DEFAULT 0, is_prerelease INTEGER NOT NULL DEFAULT 0, target_commitish TEXT, + workspace_repository_id INTEGER, + tag_url TEXT, + release_status TEXT NOT NULL DEFAULT 'tag_only', + released_at DATETIME, + assets_json TEXT NOT NULL DEFAULT '[]', + last_synced_at DATETIME, scm_connection_id INTEGER REFERENCES workspace_scm_connections(id) ON DELETE SET NULL, scm_repository TEXT, scm_release_id TEXT, diff --git a/internal/database/schema/milestones_existing_postgres.sql b/internal/database/schema/milestones_existing_postgres.sql index 659c4861e..b75a3882f 100644 --- a/internal/database/schema/milestones_existing_postgres.sql +++ b/internal/database/schema/milestones_existing_postgres.sql @@ -44,6 +44,12 @@ CREATE TABLE IF NOT EXISTS milestone_releases ( is_draft BOOLEAN NOT NULL DEFAULT false, is_prerelease BOOLEAN NOT NULL DEFAULT false, target_commitish TEXT, + workspace_repository_id INTEGER, + tag_url TEXT, + release_status TEXT NOT NULL DEFAULT 'tag_only', + released_at TIMESTAMPTZ, + assets_json JSONB NOT NULL DEFAULT '[]'::jsonb, + last_synced_at TIMESTAMPTZ, scm_connection_id INTEGER, scm_repository TEXT, scm_release_id TEXT, diff --git a/internal/database/schema/milestones_postgres.sql b/internal/database/schema/milestones_postgres.sql index c7e126759..d32edf1e6 100644 --- a/internal/database/schema/milestones_postgres.sql +++ b/internal/database/schema/milestones_postgres.sql @@ -43,6 +43,12 @@ CREATE TABLE IF NOT EXISTS milestone_releases ( is_draft BOOLEAN NOT NULL DEFAULT false, is_prerelease BOOLEAN NOT NULL DEFAULT false, target_commitish TEXT, + workspace_repository_id INTEGER, + tag_url TEXT, + release_status TEXT NOT NULL DEFAULT 'tag_only', + released_at TIMESTAMPTZ, + assets_json JSONB NOT NULL DEFAULT '[]'::jsonb, + last_synced_at TIMESTAMPTZ, scm_connection_id INTEGER, -- FK added in scm_postgres.sql (circular dep: items→milestones→scm→items) scm_repository TEXT, scm_release_id TEXT, @@ -73,6 +79,9 @@ CREATE INDEX IF NOT EXISTS idx_milestone_releases_milestone_id ON milestone_rele CREATE UNIQUE INDEX IF NOT EXISTS uq_milestone_releases_idempotency ON milestone_releases(milestone_id, idempotency_key) WHERE idempotency_key IS NOT NULL; +CREATE UNIQUE INDEX IF NOT EXISTS uq_milestone_releases_repository_tag + ON milestone_releases(workspace_repository_id, tag_name) + WHERE workspace_repository_id IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_item_milestones_item_id ON item_milestones(item_id); CREATE INDEX IF NOT EXISTS idx_item_milestones_milestone_id ON item_milestones(milestone_id); -- Partial unique index: one external_key per workspace, but NULLs are unconstrained. diff --git a/internal/database/schema/scm.sql b/internal/database/schema/scm.sql index 42ecb6cd6..e333224ae 100644 --- a/internal/database/schema/scm.sql +++ b/internal/database/schema/scm.sql @@ -1,5 +1,5 @@ -- SCM (Source Control Management) provider integration tables --- Supports GitHub and Gitea/Forgejo +-- Supports GitHub, GitLab, and Gitea/Forgejo -- SCM Providers (system-level configuration) -- Similar pattern to sso_providers table @@ -121,6 +121,35 @@ CREATE INDEX IF NOT EXISTS idx_workspace_repos_connection ON workspace_repositor CREATE INDEX IF NOT EXISTS idx_workspace_repos_name ON workspace_repositories(repository_name); CREATE INDEX IF NOT EXISTS idx_workspace_repos_active ON workspace_repositories(is_active); +CREATE TABLE IF NOT EXISTS scm_webhooks ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + workspace_repository_id INTEGER NOT NULL UNIQUE REFERENCES workspace_repositories(id) ON DELETE CASCADE, + webhook_key TEXT NOT NULL UNIQUE, + webhook_external_id TEXT, + webhook_secret_encrypted TEXT NOT NULL, + events TEXT NOT NULL DEFAULT '["push","tag_push","merge_request","note","release"]', + is_active BOOLEAN NOT NULL DEFAULT true, + last_delivery_at DATETIME, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS scm_webhook_deliveries ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + scm_webhook_id INTEGER NOT NULL REFERENCES scm_webhooks(id) ON DELETE CASCADE, + delivery_id TEXT NOT NULL, + event_type TEXT NOT NULL, + payload_summary TEXT, + status TEXT NOT NULL DEFAULT 'pending', + error_message TEXT, + processing_time_ms INTEGER, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(scm_webhook_id, delivery_id) +); + +CREATE INDEX IF NOT EXISTS idx_scm_webhook_deliveries_status ON scm_webhook_deliveries(status, created_at); + -- Durable health snapshots for scheduled SCM operations. One row per -- connection and operation keeps diagnostics useful without retaining an -- unbounded failure history. diff --git a/internal/database/schema/scm_postgres.sql b/internal/database/schema/scm_postgres.sql index 1b51ceb37..47f66a268 100644 --- a/internal/database/schema/scm_postgres.sql +++ b/internal/database/schema/scm_postgres.sql @@ -1,5 +1,5 @@ -- SCM (Source Control Management) provider integration tables (PostgreSQL) --- Supports GitHub and Gitea/Forgejo +-- Supports GitHub, GitLab, and Gitea/Forgejo -- SCM Providers (system-level configuration) -- Similar pattern to sso_providers table @@ -121,6 +121,35 @@ CREATE INDEX IF NOT EXISTS idx_workspace_repos_connection ON workspace_repositor CREATE INDEX IF NOT EXISTS idx_workspace_repos_name ON workspace_repositories(repository_name); CREATE INDEX IF NOT EXISTS idx_workspace_repos_active ON workspace_repositories(is_active); +CREATE TABLE IF NOT EXISTS scm_webhooks ( + id SERIAL PRIMARY KEY, + workspace_repository_id INTEGER NOT NULL UNIQUE REFERENCES workspace_repositories(id) ON DELETE CASCADE, + webhook_key TEXT NOT NULL UNIQUE, + webhook_external_id TEXT, + webhook_secret_encrypted TEXT NOT NULL, + events JSONB NOT NULL DEFAULT '["push","tag_push","merge_request","note","release"]'::jsonb, + is_active BOOLEAN NOT NULL DEFAULT true, + last_delivery_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS scm_webhook_deliveries ( + id SERIAL PRIMARY KEY, + scm_webhook_id INTEGER NOT NULL REFERENCES scm_webhooks(id) ON DELETE CASCADE, + delivery_id TEXT NOT NULL, + event_type TEXT NOT NULL, + payload_summary JSONB, + status TEXT NOT NULL DEFAULT 'pending', + error_message TEXT, + processing_time_ms INTEGER, + created_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE(scm_webhook_id, delivery_id) +); + +CREATE INDEX IF NOT EXISTS idx_scm_webhook_deliveries_status ON scm_webhook_deliveries(status, created_at); + -- Durable health snapshots for scheduled SCM operations. One row per -- connection and operation keeps diagnostics useful without retaining an -- unbounded failure history. diff --git a/internal/handlers/scm_gitlab_webhooks.go b/internal/handlers/scm_gitlab_webhooks.go new file mode 100644 index 000000000..e1518e032 --- /dev/null +++ b/internal/handlers/scm_gitlab_webhooks.go @@ -0,0 +1,283 @@ +package handlers + +import ( + "context" + "crypto/rand" + "crypto/sha256" + "crypto/subtle" + "encoding/base64" + "encoding/hex" + "encoding/json" + "errors" + "io" + "log/slog" + "net/http" + "strconv" + "strings" + "time" + + "windshift/internal/models" + "windshift/internal/repository" +) + +var gitLabWebhookEvents = []string{"push", "tag_push", "merge_request", "note", "release"} + +type gitLabWebhookConfigResponse struct { + Configured bool `json:"configured"` + CallbackURL string `json:"callback_url,omitempty"` + Secret string `json:"secret,omitempty"` + Events []string `json:"events"` + Active bool `json:"active"` + LastDeliveryAt *time.Time `json:"last_delivery_at,omitempty"` +} + +func (h *SCMItemLinksHandler) webhookRepoAdmin(w http.ResponseWriter, r *http.Request, repoID int) (string, bool) { + user, ok := RequireAuth(w, r) + if !ok { + return "", false + } + access, err := h.webhookRepo.GetRepositoryAccess(r.Context(), repoID) + if errors.Is(err, repository.ErrNotFound) { + respondNotFound(w, r, "workspace_repository") + return "", false + } + if err != nil { + respondInternalError(w, r, err) + return "", false + } + if !RequireWorkspacePermission(w, r, user.ID, access.WorkspaceID, models.PermissionWorkspaceAdmin, h.permissionService) { + return "", false + } + return access.ProviderType, true +} + +func (h *SCMItemLinksHandler) webhookCallbackURL(r *http.Request, key string) string { + base := h.baseURL + if base == "" { + scheme := "https" + if r.TLS == nil { + if forwarded := r.Header.Get("X-Forwarded-Proto"); forwarded != "" { + scheme = forwarded + } else { + scheme = "http" + } + } + host := r.Host + if forwarded := r.Header.Get("X-Forwarded-Host"); forwarded != "" { + host = forwarded + } + base = scheme + "://" + host + } + return strings.TrimRight(base, "/") + "/api/scm/webhooks/gitlab/" + key +} + +// GetGitLabWebhookConfig returns manual setup information without exposing the secret. +func (h *SCMItemLinksHandler) GetGitLabWebhookConfig(w http.ResponseWriter, r *http.Request) { + repoID, ok := requireIDParam(w, r, "repoId") + if !ok { + return + } + providerType, ok := h.webhookRepoAdmin(w, r, repoID) + if !ok { + return + } + if providerType != string(models.SCMProviderTypeGitLab) { + respondBadRequest(w, r, "Webhooks on this endpoint are only available for GitLab repositories") + return + } + config, err := h.webhookRepo.GetConfig(r.Context(), repoID) + if errors.Is(err, repository.ErrNotFound) { + respondJSONOK(w, gitLabWebhookConfigResponse{Configured: false, Events: gitLabWebhookEvents}) + return + } + if err != nil { + respondInternalError(w, r, err) + return + } + response := gitLabWebhookConfigResponse{ + Configured: true, + CallbackURL: h.webhookCallbackURL(r, config.WebhookKey), + Events: gitLabWebhookEvents, + Active: config.Active, + LastDeliveryAt: config.LastDeliveryAt, + } + respondJSONOK(w, response) +} + +func randomWebhookValue(bytesCount int) (string, error) { + raw := make([]byte, bytesCount) + if _, err := rand.Read(raw); err != nil { + return "", err + } + return base64.RawURLEncoding.EncodeToString(raw), nil +} + +// RotateGitLabWebhookSecret creates or rotates the one-time manual setup secret. +func (h *SCMItemLinksHandler) RotateGitLabWebhookSecret(w http.ResponseWriter, r *http.Request) { + repoID, ok := requireIDParam(w, r, "repoId") + if !ok { + return + } + providerType, ok := h.webhookRepoAdmin(w, r, repoID) + if !ok { + return + } + if providerType != string(models.SCMProviderTypeGitLab) { + respondBadRequest(w, r, "Webhooks on this endpoint are only available for GitLab repositories") + return + } + secret, err := randomWebhookValue(32) + if err != nil { + respondInternalError(w, r, err) + return + } + encrypted, err := h.encryption.Encrypt(secret) + if err != nil { + respondInternalError(w, r, err) + return + } + newKey, err := randomWebhookValue(18) + if err != nil { + respondInternalError(w, r, err) + return + } + key, err := h.webhookRepo.RotateConfig( + r.Context(), + repoID, + newKey, + encrypted, + `["push","tag_push","merge_request","note","release"]`, + ) + if err != nil { + respondInternalError(w, r, err) + return + } + respondJSONOK(w, gitLabWebhookConfigResponse{Configured: true, CallbackURL: h.webhookCallbackURL(r, key), Secret: secret, Events: gitLabWebhookEvents, Active: true}) +} + +func (h *SCMItemLinksHandler) DeleteGitLabWebhookConfig(w http.ResponseWriter, r *http.Request) { + repoID, ok := requireIDParam(w, r, "repoId") + if !ok { + return + } + if _, ok := h.webhookRepoAdmin(w, r, repoID); !ok { + return + } + if err := h.webhookRepo.DeleteConfig(r.Context(), repoID); err != nil { + respondInternalError(w, r, err) + return + } + respondJSONOK(w, map[string]bool{"deleted": true}) +} + +type gitLabWebhookPayload struct { + ObjectKind string `json:"object_kind"` + EventName string `json:"event_name"` + ProjectID int64 `json:"project_id"` + Ref string `json:"ref"` + Project struct { + ID int64 `json:"id"` + PathWithNamespace string `json:"path_with_namespace"` + } `json:"project"` + ObjectAttributes struct { + IID int `json:"iid"` + Action string `json:"action"` + Tag string `json:"tag"` + } `json:"object_attributes"` +} + +func normalizeGitLabWebhookKind(payload gitLabWebhookPayload) string { + kind := strings.ToLower(strings.TrimSpace(payload.ObjectKind)) + switch kind { + case "push", "tag_push", "merge_request", "note", "release": + return kind + default: + return "" + } +} + +// ReceiveGitLabWebhook validates and deduplicates a GitLab delivery, then +// schedules a targeted repository sync. Polling remains the recovery path. +func (h *SCMItemLinksHandler) ReceiveGitLabWebhook(w http.ResponseWriter, r *http.Request) { + key := r.PathValue("webhookKey") + target, err := h.webhookRepo.GetTargetByKey(r.Context(), key) + if errors.Is(err, repository.ErrNotFound) { + respondNotFound(w, r, "scm_webhook") + return + } + if err != nil { + respondInternalError(w, r, err) + return + } + if target.ProviderType != string(models.SCMProviderTypeGitLab) { + respondBadRequest(w, r, "Invalid webhook provider") + return + } + secret, err := h.encryption.Decrypt(target.EncryptedSecret) + if err != nil { + respondInternalError(w, r, err) + return + } + provided := r.Header.Get("X-Gitlab-Token") + if len(secret) != len(provided) || subtle.ConstantTimeCompare([]byte(secret), []byte(provided)) != 1 { + respondJSON(w, http.StatusUnauthorized, map[string]string{"error": "invalid webhook token"}) + return + } + + r.Body = http.MaxBytesReader(w, r.Body, 2<<20) + body, err := io.ReadAll(r.Body) + if err != nil { + respondBadRequest(w, r, "Webhook payload is too large or unreadable") + return + } + var payload gitLabWebhookPayload + if err := json.Unmarshal(body, &payload); err != nil { + respondBadRequest(w, r, "Invalid GitLab webhook JSON") + return + } + eventType := normalizeGitLabWebhookKind(payload) + if eventType == "" { + respondJSON(w, http.StatusAccepted, map[string]bool{"ignored": true}) + return + } + projectID := payload.Project.ID + if projectID == 0 { + projectID = payload.ProjectID + } + if strconv.FormatInt(projectID, 10) != target.RepositoryExternalID { + respondJSON(w, http.StatusForbidden, map[string]string{"error": "project mismatch"}) + return + } + deliveryID := strings.TrimSpace(r.Header.Get("X-Gitlab-Event-UUID")) + if deliveryID == "" { + digest := sha256.Sum256(body) + deliveryID = hex.EncodeToString(digest[:]) + } + summary, _ := json.Marshal(map[string]any{"object_kind": eventType, "project_id": projectID, "path": payload.Project.PathWithNamespace, "iid": payload.ObjectAttributes.IID, "action": payload.ObjectAttributes.Action, "ref": payload.Ref, "tag": payload.ObjectAttributes.Tag}) + inserted, err := h.webhookRepo.RecordPendingDelivery(r.Context(), target.ID, deliveryID, eventType, string(summary)) + if err != nil { + respondInternalError(w, r, err) + return + } + respondJSON(w, http.StatusAccepted, map[string]bool{"accepted": true}) + if !inserted { + return + } + + baseCtx := context.WithoutCancel(r.Context()) + go func() { + started := time.Now() + ctx, cancel := context.WithTimeout(baseCtx, 45*time.Second) + defer cancel() + syncErr := h.syncService.SyncRepository(ctx, target.WorkspaceRepositoryID) + status, errorMessage := "processed", "" + if syncErr != nil { + status, errorMessage = "failed", syncErr.Error() + slog.Warn("GitLab webhook sync failed", slog.Int("repository_id", target.WorkspaceRepositoryID), slog.Any("error", syncErr)) + } + updateErr := h.webhookRepo.CompleteDelivery(ctx, target.ID, deliveryID, status, errorMessage, time.Since(started)) + if updateErr != nil { + slog.Warn("GitLab webhook delivery update failed", slog.Any("error", updateErr), slog.String("delivery_id", deliveryID)) + } + }() +} diff --git a/internal/handlers/scm_item_links.go b/internal/handlers/scm_item_links.go index a4ab1ebf6..4604a6e25 100644 --- a/internal/handlers/scm_item_links.go +++ b/internal/handlers/scm_item_links.go @@ -8,6 +8,7 @@ import ( "log/slog" "net/http" "strconv" + "strings" "time" "windshift/internal/database" @@ -25,7 +26,9 @@ type SCMItemLinksHandler struct { db database.Database encryption *sso.SecretEncryption syncService *scm.SyncService + webhookRepo *repository.SCMWebhookRepository permissionService *services.PermissionService + baseURL string } // getItemURL constructs the URL to an item based on the request context @@ -98,12 +101,14 @@ type CreateBranchForItemResponse struct { } // NewSCMItemLinksHandler creates a new item SCM links handler -func NewSCMItemLinksHandler(db database.Database, encryption *sso.SecretEncryption, permissionService *services.PermissionService) *SCMItemLinksHandler { +func NewSCMItemLinksHandler(db database.Database, encryption *sso.SecretEncryption, permissionService *services.PermissionService, baseURL string) *SCMItemLinksHandler { return &SCMItemLinksHandler{ db: db, encryption: encryption, syncService: scm.NewSyncService(db, encryption), + webhookRepo: repository.NewSCMWebhookRepository(db), permissionService: permissionService, + baseURL: strings.TrimRight(baseURL, "/"), } } @@ -492,6 +497,41 @@ func (h *SCMItemLinksHandler) SyncWorkspaceRepository(w http.ResponseWriter, r * }) } +// ListReleaseCandidates returns tags/releases that can be attached to a milestone. +func (h *SCMItemLinksHandler) ListReleaseCandidates(w http.ResponseWriter, r *http.Request) { + repoID, ok := requireIDParam(w, r, "repoId") + if !ok { + return + } + user, ok := RequireAuth(w, r) + if !ok { + return + } + var workspaceID int + err := h.db.QueryRow(` + SELECT wsc.workspace_id FROM workspace_repositories wr + JOIN workspace_scm_connections wsc ON wr.workspace_scm_connection_id = wsc.id + WHERE wr.id = ? + `, repoID).Scan(&workspaceID) + if errors.Is(err, sql.ErrNoRows) { + respondNotFound(w, r, "repository") + return + } + if err != nil { + respondInternalError(w, r, err) + return + } + if !RequireWorkspacePermission(w, r, user.ID, workspaceID, models.PermissionItemView, h.permissionService) { + return + } + candidates, err := h.syncService.ListReleaseCandidates(r.Context(), repoID, user.ID) + if err != nil { + respondBadRequest(w, r, "Failed to load tags and releases: "+err.Error()) + return + } + respondJSONOK(w, candidates) +} + // GetWorkspaceRepositoriesForItem returns repositories available for linking to an item func (h *SCMItemLinksHandler) GetWorkspaceRepositoriesForItem(w http.ResponseWriter, r *http.Request) { itemID, ok := requireIDParam(w, r, "id") diff --git a/internal/handlers/scm_providers.go b/internal/handlers/scm_providers.go index 8a95d0811..82a6f45ec 100644 --- a/internal/handlers/scm_providers.go +++ b/internal/handlers/scm_providers.go @@ -132,10 +132,11 @@ func (h *SCMProviderHandler) CreateProvider(w http.ResponseWriter, r *http.Reque validTypes := map[models.SCMProviderType]bool{ models.SCMProviderTypeGitHub: true, + models.SCMProviderTypeGitLab: true, models.SCMProviderTypeGitea: true, } if !validTypes[req.ProviderType] { - respondBadRequest(w, r, "Invalid provider type. Supported: github, gitea") + respondBadRequest(w, r, "Invalid provider type. Supported: github, gitlab, gitea") return } @@ -264,10 +265,11 @@ func (h *SCMProviderHandler) UpdateProvider(w http.ResponseWriter, r *http.Reque validTypes := map[models.SCMProviderType]bool{ models.SCMProviderTypeGitHub: true, + models.SCMProviderTypeGitLab: true, models.SCMProviderTypeGitea: true, } if req.ProviderType != "" && !validTypes[req.ProviderType] { - respondBadRequest(w, r, "Invalid provider type. Supported: github, gitea") + respondBadRequest(w, r, "Invalid provider type. Supported: github, gitlab, gitea") return } @@ -480,7 +482,7 @@ func (h *SCMProviderHandler) TestProvider(w http.ResponseWriter, r *http.Request } else { respondJSONOK(w, map[string]any{ "success": false, - "error": "Personal Access Token not configured", + "error": "Access token not configured", }) return } diff --git a/internal/handlers/scm_providers_oauth.go b/internal/handlers/scm_providers_oauth.go index 548cbf6aa..94ac79694 100644 --- a/internal/handlers/scm_providers_oauth.go +++ b/internal/handlers/scm_providers_oauth.go @@ -145,6 +145,23 @@ func (h *SCMProviderHandler) StartOAuth(w http.ResponseWriter, r *http.Request) url.QueryEscape(scopes), state, ) + case models.SCMProviderTypeGitLab: + gitlabBaseURL := "https://gitlab.com" + if baseURL.Valid && strings.TrimSpace(baseURL.String) != "" { + gitlabBaseURL = strings.TrimSuffix(strings.TrimSuffix(baseURL.String, "/"), "/api/v4") + } + scopes := oauthScopes.String + if scopes == "" { + scopes = "api" + } + authURL = fmt.Sprintf( + "%s/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s", + gitlabBaseURL, + clientID.String, + url.QueryEscape(redirectURI), + url.QueryEscape(scopes), + state, + ) default: respondBadRequest(w, r, "OAuth not supported for this provider type") return @@ -360,6 +377,24 @@ func (h *SCMProviderHandler) exchangeOAuthCode(ctx context.Context, params oauth expiresAt: tokens.ExpiresAt, }, nil + case models.SCMProviderTypeGitLab: + cfg := scm.ProviderConfig{ + ProviderType: params.providerType, + AuthMethod: models.SCMAuthMethodOAuth, + BaseURL: params.baseURL, + OAuthClientID: params.clientID, + OAuthClientSecret: params.clientSecret, + } + gitlabProvider, err := scm.NewGitLabProvider(cfg) + if err != nil { + return nil, fmt.Errorf("failed to create GitLab provider: %w", err) + } + tokens, err := gitlabProvider.ExchangeCode(ctx, params.code, params.redirectURI) + if err != nil { + return nil, fmt.Errorf("failed to exchange code: %w", err) + } + return &oauthTokenResult{accessToken: tokens.AccessToken, refreshToken: tokens.RefreshToken, expiresAt: tokens.ExpiresAt}, nil + default: return nil, fmt.Errorf("OAuth not supported for provider type: %s", params.providerType) } @@ -445,6 +480,22 @@ func (h *SCMProviderHandler) fetchSCMUserInfo(ctx context.Context, providerType info.username = scmUser.Username info.userID = scmUser.ID info.avatarURL = scmUser.AvatarURL + + case models.SCMProviderTypeGitLab: + cfg := scm.ProviderConfig{ProviderType: providerType, AuthMethod: models.SCMAuthMethodOAuth, BaseURL: baseURL, OAuthAccessToken: accessToken} + gitlabProvider, err := scm.NewGitLabProvider(cfg) + if err != nil { + slog.Warn("failed to create GitLab provider for user info", slog.String("component", "scm"), slog.Any("error", err)) + return info + } + scmUser, err := gitlabProvider.GetCurrentUser(ctx) + if err != nil { + slog.Warn("failed to get GitLab user info", slog.String("component", "scm"), slog.Any("error", err)) + return info + } + info.username = scmUser.Username + info.userID = scmUser.ID + info.avatarURL = scmUser.AvatarURL } if info.username != "" { diff --git a/internal/handlers/scm_workspace.go b/internal/handlers/scm_workspace.go index 212c7e977..6aa287167 100644 --- a/internal/handlers/scm_workspace.go +++ b/internal/handlers/scm_workspace.go @@ -813,6 +813,23 @@ func (h *SCMWorkspaceHandler) StartWorkspaceOAuth(w http.ResponseWriter, r *http url.QueryEscape(scopes), state, ) + case models.SCMProviderTypeGitLab: + gitlabBaseURL := "https://gitlab.com" + if strings.TrimSpace(oauthCfg.BaseURL) != "" { + gitlabBaseURL = strings.TrimSuffix(strings.TrimSuffix(oauthCfg.BaseURL, "/"), "/api/v4") + } + scopes := "api" + if oauthCfg.Scopes != "" { + scopes = oauthCfg.Scopes + } + authURL = fmt.Sprintf( + "%s/oauth/authorize?client_id=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s", + gitlabBaseURL, + oauthCfg.ClientID, + url.QueryEscape(redirectURI), + url.QueryEscape(scopes), + state, + ) default: respondBadRequest(w, r, "OAuth not supported for this provider type") return diff --git a/internal/models/integration.go b/internal/models/integration.go index c52d64f1c..9c740373a 100644 --- a/internal/models/integration.go +++ b/internal/models/integration.go @@ -12,6 +12,7 @@ type SCMProviderType string const ( SCMProviderTypeGitHub SCMProviderType = "github" + SCMProviderTypeGitLab SCMProviderType = "gitlab" SCMProviderTypeGitea SCMProviderType = "gitea" ) @@ -202,6 +203,7 @@ type ItemSCMLinkRequest struct { type SCMWebhook struct { ID int `json:"id"` WorkspaceRepositoryID int `json:"workspace_repository_id"` + WebhookKey string `json:"webhook_key,omitempty"` WebhookExternalID string `json:"webhook_external_id,omitempty"` WebhookSecretEncrypted string `json:"-"` // Never expose Events string `json:"events"` // JSON array @@ -224,6 +226,17 @@ type SCMWebhookDelivery struct { CreatedAt time.Time `json:"created_at"` } +// SCMReleaseAsset is a downloadable source archive or an explicit external +// link associated with an SCM release. +type SCMReleaseAsset struct { + Kind string `json:"kind"` + Name string `json:"name"` + URL string `json:"url"` + DirectURL string `json:"direct_url,omitempty"` + Format string `json:"format,omitempty"` + LinkType string `json:"link_type,omitempty"` +} + // IssueSyncLabelMode represents the label sync mode type IssueSyncLabelMode string diff --git a/internal/models/workspace.go b/internal/models/workspace.go index 1865bcd80..2d98f63ef 100644 --- a/internal/models/workspace.go +++ b/internal/models/workspace.go @@ -128,20 +128,26 @@ type MilestoneCategory struct { // MilestoneRelease represents a release record for a milestone type MilestoneRelease struct { - ID int `json:"id"` - MilestoneID int `json:"milestone_id"` - TagName string `json:"tag_name"` - Name string `json:"name,omitempty"` - Body string `json:"body,omitempty"` - IsDraft bool `json:"is_draft"` - IsPrerelease bool `json:"is_prerelease"` - TargetCommitish string `json:"target_commitish,omitempty"` - SCMConnectionID *int `json:"scm_connection_id,omitempty"` // Visible only to users with connection workspace access - SCMRepository *string `json:"scm_repository,omitempty"` // "owner/repo"; same visibility as SCMConnectionID - SCMReleaseID *string `json:"scm_release_id,omitempty"` - SCMReleaseURL *string `json:"scm_release_url,omitempty"` - CreatedBy *int `json:"created_by,omitempty"` - CreatedAt string `json:"created_at"` + ID int `json:"id"` + MilestoneID int `json:"milestone_id"` + WorkspaceRepositoryID *int `json:"workspace_repository_id,omitempty"` + TagName string `json:"tag_name"` + TagURL *string `json:"tag_url,omitempty"` + ReleaseStatus string `json:"release_status,omitempty"` + ReleasedAt *string `json:"released_at,omitempty"` + Assets []SCMReleaseAsset `json:"assets,omitempty"` + LastSyncedAt *string `json:"last_synced_at,omitempty"` + Name string `json:"name,omitempty"` + Body string `json:"body,omitempty"` + IsDraft bool `json:"is_draft"` + IsPrerelease bool `json:"is_prerelease"` + TargetCommitish string `json:"target_commitish,omitempty"` + SCMConnectionID *int `json:"scm_connection_id,omitempty"` // Visible only to users with connection workspace access + SCMRepository *string `json:"scm_repository,omitempty"` // "owner/repo"; same visibility as SCMConnectionID + SCMReleaseID *string `json:"scm_release_id,omitempty"` + SCMReleaseURL *string `json:"scm_release_url,omitempty"` + CreatedBy *int `json:"created_by,omitempty"` + CreatedAt string `json:"created_at"` } // Milestone represents a project milestone diff --git a/internal/repository/scm_webhook_repository.go b/internal/repository/scm_webhook_repository.go new file mode 100644 index 000000000..e26cf814e --- /dev/null +++ b/internal/repository/scm_webhook_repository.go @@ -0,0 +1,182 @@ +package repository + +import ( + "context" + "database/sql" + "errors" + "fmt" + "time" + + "windshift/internal/database" +) + +// SCMWebhookRepository persists GitLab webhook configuration and deliveries. +type SCMWebhookRepository struct { + db database.Database +} + +// SCMWebhookRepositoryAccess identifies the workspace and provider for a linked repository. +type SCMWebhookRepositoryAccess struct { + WorkspaceID int + ProviderType string +} + +// SCMWebhookConfig is the persisted configuration visible to workspace admins. +type SCMWebhookConfig struct { + WebhookKey string + Active bool + LastDeliveryAt *time.Time +} + +// SCMWebhookTarget contains the trusted data needed to validate an inbound webhook. +type SCMWebhookTarget struct { + ID int + WorkspaceRepositoryID int + EncryptedSecret string + RepositoryExternalID string + ProviderType string +} + +// NewSCMWebhookRepository constructs an SCM webhook repository. +func NewSCMWebhookRepository(db database.Database) *SCMWebhookRepository { + return &SCMWebhookRepository{db: db} +} + +// GetRepositoryAccess returns workspace and provider metadata for a linked repository. +func (r *SCMWebhookRepository) GetRepositoryAccess(ctx context.Context, repoID int) (SCMWebhookRepositoryAccess, error) { + var access SCMWebhookRepositoryAccess + err := r.db.QueryRowContext(ctx, ` + SELECT wsc.workspace_id, sp.provider_type + FROM workspace_repositories wr + JOIN workspace_scm_connections wsc ON wsc.id = wr.workspace_scm_connection_id + JOIN scm_providers sp ON sp.id = wsc.scm_provider_id + WHERE wr.id = ? + `, repoID).Scan(&access.WorkspaceID, &access.ProviderType) + if errors.Is(err, sql.ErrNoRows) { + return SCMWebhookRepositoryAccess{}, ErrNotFound + } + if err != nil { + return SCMWebhookRepositoryAccess{}, fmt.Errorf("load SCM webhook repository access: %w", err) + } + return access, nil +} + +// GetConfig returns the webhook configuration for a linked repository. +func (r *SCMWebhookRepository) GetConfig(ctx context.Context, repoID int) (SCMWebhookConfig, error) { + var config SCMWebhookConfig + var lastDelivery sql.NullTime + err := r.db.QueryRowContext(ctx, ` + SELECT webhook_key, is_active, last_delivery_at + FROM scm_webhooks + WHERE workspace_repository_id = ? + `, repoID).Scan(&config.WebhookKey, &config.Active, &lastDelivery) + if errors.Is(err, sql.ErrNoRows) { + return SCMWebhookConfig{}, ErrNotFound + } + if err != nil { + return SCMWebhookConfig{}, fmt.Errorf("load SCM webhook config: %w", err) + } + if lastDelivery.Valid { + config.LastDeliveryAt = &lastDelivery.Time + } + return config, nil +} + +// RotateConfig creates or rotates a webhook secret while preserving an existing callback key. +func (r *SCMWebhookRepository) RotateConfig(ctx context.Context, repoID int, newKey, encryptedSecret, events string) (string, error) { + var key string + err := r.db.QueryRowContext(ctx, `SELECT webhook_key FROM scm_webhooks WHERE workspace_repository_id = ?`, repoID).Scan(&key) + if errors.Is(err, sql.ErrNoRows) { + key = newKey + _, err = r.db.ExecWriteContext(ctx, ` + INSERT INTO scm_webhooks(workspace_repository_id, webhook_key, webhook_secret_encrypted, events, is_active) + VALUES (?, ?, ?, ?, true) + `, repoID, key, encryptedSecret, events) + } else if err == nil { + _, err = r.db.ExecWriteContext(ctx, ` + UPDATE scm_webhooks + SET webhook_secret_encrypted = ?, is_active = true, updated_at = CURRENT_TIMESTAMP + WHERE workspace_repository_id = ? + `, encryptedSecret, repoID) + } + if err != nil { + return "", fmt.Errorf("rotate SCM webhook config: %w", err) + } + return key, nil +} + +// DeleteConfig removes a linked repository's webhook configuration. +func (r *SCMWebhookRepository) DeleteConfig(ctx context.Context, repoID int) error { + if _, err := r.db.ExecWriteContext(ctx, `DELETE FROM scm_webhooks WHERE workspace_repository_id = ?`, repoID); err != nil { + return fmt.Errorf("delete SCM webhook config: %w", err) + } + return nil +} + +// GetTargetByKey returns an active webhook target and its validation metadata. +func (r *SCMWebhookRepository) GetTargetByKey(ctx context.Context, key string) (SCMWebhookTarget, error) { + var target SCMWebhookTarget + err := r.db.QueryRowContext(ctx, ` + SELECT sw.id, sw.workspace_repository_id, sw.webhook_secret_encrypted, + wr.repository_external_id, sp.provider_type + FROM scm_webhooks sw + JOIN workspace_repositories wr ON wr.id = sw.workspace_repository_id + JOIN workspace_scm_connections wsc ON wsc.id = wr.workspace_scm_connection_id + JOIN scm_providers sp ON sp.id = wsc.scm_provider_id + WHERE sw.webhook_key = ? AND sw.is_active = true AND wr.is_active = true + `, key).Scan( + &target.ID, + &target.WorkspaceRepositoryID, + &target.EncryptedSecret, + &target.RepositoryExternalID, + &target.ProviderType, + ) + if errors.Is(err, sql.ErrNoRows) { + return SCMWebhookTarget{}, ErrNotFound + } + if err != nil { + return SCMWebhookTarget{}, fmt.Errorf("load SCM webhook target: %w", err) + } + return target, nil +} + +// RecordPendingDelivery records a deduplicated delivery and updates webhook activity. +func (r *SCMWebhookRepository) RecordPendingDelivery(ctx context.Context, webhookID int, deliveryID, eventType, summary string) (bool, error) { + result, err := r.db.ExecWriteContext(ctx, ` + INSERT INTO scm_webhook_deliveries(scm_webhook_id, delivery_id, event_type, payload_summary, status) + VALUES (?, ?, ?, ?, 'pending') ON CONFLICT DO NOTHING + `, webhookID, deliveryID, eventType, summary) + if err != nil { + return false, fmt.Errorf("record pending SCM webhook delivery: %w", err) + } + inserted, err := result.RowsAffected() + if err != nil { + return false, fmt.Errorf("read pending SCM webhook delivery result: %w", err) + } + if _, err := r.db.ExecWriteContext(ctx, ` + UPDATE scm_webhooks + SET last_delivery_at = CURRENT_TIMESTAMP, updated_at = CURRENT_TIMESTAMP + WHERE id = ? + `, webhookID); err != nil { + return false, fmt.Errorf("update SCM webhook activity: %w", err) + } + return inserted > 0, nil +} + +// CompleteDelivery records the final delivery outcome. +func (r *SCMWebhookRepository) CompleteDelivery( + ctx context.Context, + webhookID int, + deliveryID, status, errorMessage string, + processingTime time.Duration, +) error { + _, err := r.db.ExecWriteContext(ctx, ` + UPDATE scm_webhook_deliveries + SET status = ?, error_message = ?, processing_time_ms = ?, updated_at = CURRENT_TIMESTAMP + WHERE scm_webhook_id = ? AND delivery_id = ? + `, status, errorMessage, processingTime.Milliseconds(), webhookID, deliveryID) + if err != nil { + return fmt.Errorf("complete SCM webhook delivery: %w", err) + } + return nil +} diff --git a/internal/restapi/v2/planning.go b/internal/restapi/v2/planning.go index 0ee57823e..baf77106a 100644 --- a/internal/restapi/v2/planning.go +++ b/internal/restapi/v2/planning.go @@ -135,6 +135,7 @@ type milestoneReorderResponse struct { } type releaseMilestoneRequest struct { + Mode string `json:"mode"` ConnectionID int `json:"connection_id"` RepositoryID int `json:"repository_id"` Repository string `json:"repository"` @@ -305,7 +306,7 @@ func releaseMilestone(planning planningApplication) jsonOperation[releaseMilesto return models.Milestone{}, err } result, err := planning.ReleaseMilestone(r.Context(), user.ID, auditActor(r, user), id, services.ReleaseMilestoneInput{ - ConnectionID: input.ConnectionID, RepositoryID: input.RepositoryID, Repository: input.Repository, + Mode: input.Mode, ConnectionID: input.ConnectionID, RepositoryID: input.RepositoryID, Repository: input.Repository, IdempotencyKey: r.Header.Get("Idempotency-Key"), TagName: input.TagName, Name: input.Name, Body: input.Body, IsDraft: input.IsDraft, IsPrerelease: input.IsPrerelease, TargetCommitish: input.TargetCommitish, }) @@ -514,12 +515,34 @@ func milestoneModel(result *services.MilestoneResult) models.Milestone { if result.TargetDate != "" { targetDate = &result.TargetDate } - return models.Milestone{ + milestone := models.Milestone{ ID: result.ID, Name: result.Name, Description: result.Description, TargetDate: targetDate, Status: result.Status, CategoryID: result.CategoryID, CategoryName: result.CategoryName, CategoryColor: result.CategoryColor, IsGlobal: result.IsGlobal, WorkspaceID: result.WorkspaceID, WorkspaceName: result.WorkspaceName, ExternalKey: result.ExternalKey, Position: result.Position, CreatedAt: result.CreatedAt, UpdatedAt: result.UpdatedAt, } + if result.LatestRelease != nil { + latest := milestoneReleaseModel(*result.LatestRelease) + milestone.LatestRelease = &latest + } + if len(result.Releases) > 0 { + milestone.Releases = make([]models.MilestoneRelease, len(result.Releases)) + for i := range result.Releases { + milestone.Releases[i] = milestoneReleaseModel(result.Releases[i]) + } + } + return milestone +} + +func milestoneReleaseModel(result services.MilestoneReleaseResult) models.MilestoneRelease { + return models.MilestoneRelease{ + ID: result.ID, MilestoneID: result.MilestoneID, WorkspaceRepositoryID: result.WorkspaceRepositoryID, + TagName: result.TagName, TagURL: result.TagURL, ReleaseStatus: result.ReleaseStatus, + ReleasedAt: result.ReleasedAt, Assets: result.Assets, LastSyncedAt: result.LastSyncedAt, + Name: result.Name, Body: result.Body, IsDraft: result.IsDraft, IsPrerelease: result.IsPrerelease, + TargetCommitish: result.TargetCommitish, SCMReleaseID: result.SCMReleaseID, + SCMReleaseURL: result.SCMReleaseURL, CreatedBy: result.CreatedBy, CreatedAt: result.CreatedAt, + } } func mapMilestones(rows []services.MilestoneResult) []models.Milestone { diff --git a/internal/routes/scm.go b/internal/routes/scm.go index 9074543a5..a3cb085a0 100644 --- a/internal/routes/scm.go +++ b/internal/routes/scm.go @@ -67,6 +67,11 @@ func RegisterSCMRoutes(deps *Deps) { api.HandleH("DELETE /workspaces/{id}/scm-connections/{connId}/auth", auth(wsAdmin(http.HandlerFunc(deps.SCM.Workspace.ClearWorkspaceCredentials)))) api.HandleH("GET /workspaces/{id}/scm-connections/{connId}/auth/status", auth(wsView(http.HandlerFunc(deps.SCM.Workspace.GetWorkspaceConnectionAuthStatus)))) api.HandleH("POST /workspace-repositories/{repoId}/sync", auth(http.HandlerFunc(deps.SCM.ItemLinks.SyncWorkspaceRepository))) + api.HandleH("GET /workspace-repositories/{repoId}/release-candidates", auth(http.HandlerFunc(deps.SCM.ItemLinks.ListReleaseCandidates))) + api.HandleH("GET /workspace-repositories/{repoId}/webhook", auth(http.HandlerFunc(deps.SCM.ItemLinks.GetGitLabWebhookConfig))) + api.HandleH("POST /workspace-repositories/{repoId}/webhook/rotate-secret", auth(http.HandlerFunc(deps.SCM.ItemLinks.RotateGitLabWebhookSecret))) + api.HandleH("DELETE /workspace-repositories/{repoId}/webhook", auth(http.HandlerFunc(deps.SCM.ItemLinks.DeleteGitLabWebhookConfig))) + api.HandleH("POST /scm/webhooks/gitlab/{webhookKey}", deps.WebhookLimiter.Limit(http.HandlerFunc(deps.SCM.ItemLinks.ReceiveGitLabWebhook))) // Item SCM Links endpoints api.HandleH("GET /items/{id}/scm-links", auth(http.HandlerFunc(deps.SCM.ItemLinks.GetItemSCMLinks))) diff --git a/internal/scm/credentials.go b/internal/scm/credentials.go index 641f1a9f9..48f1edd82 100644 --- a/internal/scm/credentials.go +++ b/internal/scm/credentials.go @@ -506,6 +506,19 @@ func (r *CredentialResolver) RefreshOAuthTokenIfNeeded(ctx context.Context, conn var err error switch creds.ProviderType { + case models.SCMProviderTypeGitLab: + var gitlabProvider *GitLabProvider + gitlabProvider, err = NewGitLabProvider(cfg) + if err != nil { + return "", fmt.Errorf("failed to create provider for refresh: %w", err) + } + newTokens, err = gitlabProvider.RefreshToken(ctx, creds.OAuthRefreshToken) + if err != nil { + if errors.Is(err, ErrRefreshTokenInvalid) { + r.invalidateStoredCredentials(ctx, creds, connectionID) + } + return "", fmt.Errorf("failed to refresh token: %w", err) + } case models.SCMProviderTypeGitea: var giteaProvider *GiteaProvider giteaProvider, err = NewGiteaProvider(cfg) diff --git a/internal/scm/gitea.go b/internal/scm/gitea.go index fc62c61f7..96acf0e98 100644 --- a/internal/scm/gitea.go +++ b/internal/scm/gitea.go @@ -454,7 +454,7 @@ func (g *GiteaProvider) ListPullRequestReviewEvents(ctx context.Context, owner, return nil, err } for _, c := range comments { - events = append(events, IssueComment{ID: c.ID, Kind: "review_comment", Body: c.Body, User: c.User.toUser(), Path: c.Path, Line: c.NewPosition, ThreadID: review.ID, CreatedAt: c.CreatedAt, UpdatedAt: c.UpdatedAt}) + events = append(events, IssueComment{ID: c.ID, Kind: "review_comment", Body: c.Body, User: c.User.toUser(), Path: c.Path, Line: c.NewPosition, ThreadID: fmt.Sprintf("%d", review.ID), CreatedAt: c.CreatedAt, UpdatedAt: c.UpdatedAt}) } } if len(reviews) < perPage { @@ -501,7 +501,7 @@ func (g *GiteaProvider) CreateIssueComment(ctx context.Context, owner, repo stri } // UpdateIssueComment edits an existing issue/PR comment by its id. -func (g *GiteaProvider) UpdateIssueComment(ctx context.Context, owner, repo string, commentID int64, commentBody string) error { +func (g *GiteaProvider) UpdateIssueComment(ctx context.Context, owner, repo string, _ int, commentID int64, commentBody string) error { reqURL := g.apiURL(fmt.Sprintf("/repos/%s/%s/issues/comments/%d", url.PathEscape(owner), url.PathEscape(repo), commentID)) @@ -869,16 +869,24 @@ type giteaRelease struct { } func (r giteaRelease) toRelease() Release { + status := "released" + if r.Draft { + status = "draft" + } else if r.Prerelease { + status = "prerelease" + } return Release{ ID: fmt.Sprintf("%d", r.ID), TagName: r.TagName, Name: r.Name, Body: r.Body, URL: r.HTMLURL, + Status: status, IsDraft: r.Draft, IsPrerelease: r.Prerelease, CreatedAt: r.CreatedAt, PublishedAt: r.PublishedAt, + ReleasedAt: r.PublishedAt, } } diff --git a/internal/scm/github.go b/internal/scm/github.go index 33ae70267..8905c1a3a 100644 --- a/internal/scm/github.go +++ b/internal/scm/github.go @@ -1048,7 +1048,7 @@ func (g *GitHubProvider) ListPullRequestReviewEvents(ctx context.Context, owner, events = append(events, IssueComment{ ID: c.ID, Kind: "review_comment", Body: c.Body, User: c.User.toUser(), AuthorAssociation: c.AuthorAssociation, Path: c.Path, Line: line, Side: c.Side, - ThreadID: c.InReplyToID, CreatedAt: c.CreatedAt, UpdatedAt: c.UpdatedAt, + ThreadID: strconv.FormatInt(c.InReplyToID, 10), CreatedAt: c.CreatedAt, UpdatedAt: c.UpdatedAt, }) } if len(comments) < 100 { @@ -1082,7 +1082,7 @@ func (g *GitHubProvider) CanUserWriteRepository(ctx context.Context, owner, repo } // UpdateIssueComment updates an existing comment on an issue -func (g *GitHubProvider) UpdateIssueComment(ctx context.Context, owner, repo string, commentID int64, commentBody string) error { +func (g *GitHubProvider) UpdateIssueComment(ctx context.Context, owner, repo string, _ int, commentID int64, commentBody string) error { if err := g.ensureInstallationToken(ctx); err != nil { return err } @@ -1430,16 +1430,24 @@ type githubRelease struct { } func (r githubRelease) toRelease() Release { + status := "released" + if r.Draft { + status = "draft" + } else if r.Prerelease { + status = "prerelease" + } return Release{ ID: strconv.Itoa(r.ID), TagName: r.TagName, Name: r.Name, Body: r.Body, URL: r.HTMLURL, + Status: status, IsDraft: r.Draft, IsPrerelease: r.Prerelease, CreatedAt: r.CreatedAt, PublishedAt: r.PublishedAt, + ReleasedAt: r.PublishedAt, } } diff --git a/internal/scm/gitlab.go b/internal/scm/gitlab.go new file mode 100644 index 000000000..300c24470 --- /dev/null +++ b/internal/scm/gitlab.go @@ -0,0 +1,808 @@ +package scm + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "net/http" + "net/url" + "strconv" + "strings" + "time" + + "windshift/internal/models" +) + +const gitLabDefaultURL = "https://gitlab.com" + +var ( + _ Provider = (*GitLabProvider)(nil) + _ OAuthProvider = (*GitLabProvider)(nil) + _ TokenRevoker = (*GitLabProvider)(nil) + _ ReleaseProvider = (*GitLabProvider)(nil) + _ CommitProvider = (*GitLabProvider)(nil) + _ RefProvider = (*GitLabProvider)(nil) + _ IssueCommentProvider = (*GitLabProvider)(nil) + _ PullRequestReviewProvider = (*GitLabProvider)(nil) + _ RepositoryPermissionProvider = (*GitLabProvider)(nil) +) + +// GitLabProvider implements GitLab REST API v4 for GitLab.com and +// self-managed installations. +type GitLabProvider struct { + baseProvider + baseURL string + apiBaseURL string + authMethod models.SCMAuthMethod + accessToken string + clientID string + clientSecret string +} + +func NewGitLabProvider(cfg ProviderConfig) (*GitLabProvider, error) { + baseURL := strings.TrimSpace(cfg.BaseURL) + if baseURL == "" { + baseURL = gitLabDefaultURL + } + baseURL = strings.TrimRight(baseURL, "/") + baseURL = strings.TrimSuffix(baseURL, "/api/v4") + if _, err := url.ParseRequestURI(baseURL); err != nil { + return nil, fmt.Errorf("invalid GitLab base URL: %w", err) + } + + accessToken := cfg.PersonalAccessToken + if cfg.AuthMethod == models.SCMAuthMethodOAuth { + accessToken = cfg.OAuthAccessToken + } + p := &GitLabProvider{ + baseURL: baseURL, + apiBaseURL: baseURL + "/api/v4", + authMethod: cfg.AuthMethod, + accessToken: accessToken, + clientID: cfg.OAuthClientID, + clientSecret: cfg.OAuthClientSecret, + } + p.baseProvider = baseProvider{ + httpClient: newSCMHTTPClient(30 * time.Second), + setAuthHeader: p.setAuthHeader, + handleErrorResponse: p.handleErrorResponse, + } + return p, nil +} + +func (g *GitLabProvider) GetType() models.SCMProviderType { return models.SCMProviderTypeGitLab } + +func (g *GitLabProvider) apiURL(path string) string { return g.apiBaseURL + path } + +func (g *GitLabProvider) projectPath(owner, repo string) string { + return url.PathEscape(strings.Trim(owner, "/") + "/" + strings.Trim(repo, "/")) +} + +func (g *GitLabProvider) projectWebURL(owner, repo string) string { + return g.baseURL + "/" + strings.Trim(owner, "/") + "/" + strings.Trim(repo, "/") +} + +func (g *GitLabProvider) projectAPIURL(owner, repo, suffix string) string { + return g.apiURL("/projects/" + g.projectPath(owner, repo) + suffix) +} + +func (g *GitLabProvider) setAuthHeader(req *http.Request) { + if g.accessToken == "" { + return + } + if g.authMethod == models.SCMAuthMethodPAT { + req.Header.Set("PRIVATE-TOKEN", g.accessToken) + } else { + req.Header.Set("Authorization", "Bearer "+g.accessToken) + } + req.Header.Set("Accept", "application/json") +} + +func (g *GitLabProvider) handleErrorResponse(resp *http.Response) error { + body, readErr := io.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if readErr != nil { + return fmt.Errorf("%w: read GitLab response: %v", ErrProviderError, readErr) + } + message := strings.TrimSpace(string(body)) + switch resp.StatusCode { + case http.StatusUnauthorized: + return ErrInvalidCredentials + case http.StatusForbidden: + return fmt.Errorf("%w: %s", ErrForbidden, message) + case http.StatusNotFound: + return ErrNotFound + case http.StatusTooManyRequests: + return ErrRateLimited + case http.StatusConflict: + return ErrAlreadyExists + case http.StatusBadRequest, http.StatusUnprocessableEntity: + if strings.Contains(strings.ToLower(message), "already exists") || strings.Contains(strings.ToLower(message), "another open merge request") { + return ErrAlreadyExists + } + } + return fmt.Errorf("%w: GitLab status %d: %s", ErrProviderError, resp.StatusCode, message) +} + +func (g *GitLabProvider) TestConnection(ctx context.Context) error { + return g.doJSON(ctx, http.MethodGet, g.apiURL("/user"), http.NoBody, http.StatusOK, nil) +} + +func (g *GitLabProvider) ListRepositories(ctx context.Context, opts ListRepositoriesOptions) ([]Repository, error) { + page, perPage := opts.Page, opts.PerPage + if page <= 0 { + page = 1 + } + if perPage <= 0 { + perPage = 50 + } + q := url.Values{ + "membership": {"true"}, "simple": {"true"}, "page": {strconv.Itoa(page)}, + "per_page": {strconv.Itoa(perPage)}, "order_by": {"last_activity_at"}, "sort": {"desc"}, + } + if opts.Visibility != "" && opts.Visibility != "all" { + q.Set("visibility", opts.Visibility) + } + var raw []gitLabProject + if err := g.doJSON(ctx, http.MethodGet, g.apiURL("/projects?"+q.Encode()), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + out := make([]Repository, 0, len(raw)) + for _, project := range raw { + out = append(out, project.toRepository()) + } + return out, nil +} + +func (g *GitLabProvider) GetRepository(ctx context.Context, owner, repo string) (*Repository, error) { + var raw gitLabProject + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, ""), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + result := raw.toRepository() + return &result, nil +} + +func (g *GitLabProvider) ListBranches(ctx context.Context, owner, repo string) ([]Branch, error) { + const perPage, maxBranches = 100, 1000 + var out []Branch + for page := 1; len(out) < maxBranches; page++ { + var raw []gitLabBranch + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/repository/branches?page=%d&per_page=%d", page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, branch := range raw { + out = append(out, branch.toBranch()) + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) ListPullRequests(ctx context.Context, owner, repo string, opts ListPROptions) ([]PullRequest, error) { + page, perPage := opts.Page, opts.PerPage + if page <= 0 { + page = 1 + } + if perPage <= 0 { + perPage = 50 + } + state := opts.State + if state == "" || state == "open" { + state = "opened" + } + q := url.Values{"scope": {"all"}, "state": {state}, "page": {strconv.Itoa(page)}, "per_page": {strconv.Itoa(perPage)}} + if opts.Sort != "" { + orderBy := opts.Sort + if orderBy == "updated" || orderBy == "created" { + orderBy += "_at" + } + q.Set("order_by", orderBy) + } + if opts.Direction != "" { + q.Set("sort", opts.Direction) + } + var raw []gitLabMergeRequest + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, "/merge_requests?"+q.Encode()), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + out := make([]PullRequest, 0, len(raw)) + for _, mr := range raw { + out = append(out, mr.toPullRequest(owner+"/"+repo)) + } + return out, nil +} + +func (g *GitLabProvider) GetPullRequest(ctx context.Context, owner, repo string, number int) (*PullRequest, error) { + var raw gitLabMergeRequest + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, fmt.Sprintf("/merge_requests/%d", number)), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + result := raw.toPullRequest(owner + "/" + repo) + return &result, nil +} + +func (g *GitLabProvider) ListPullRequestCommits(ctx context.Context, owner, repo string, number int) ([]Commit, error) { + const perPage, maxCommits = 100, 500 + var out []Commit + for page := 1; len(out) < maxCommits; page++ { + var raw []gitLabCommit + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/merge_requests/%d/commits?page=%d&per_page=%d", number, page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, commit := range raw { + out = append(out, commit.toCommit()) + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) CreateBranch(ctx context.Context, owner, repo, branchName, baseBranch string) error { + body, err := json.Marshal(map[string]string{"branch": branchName, "ref": baseBranch}) + if err != nil { + return err + } + return g.doJSON(ctx, http.MethodPost, g.projectAPIURL(owner, repo, "/repository/branches"), bytes.NewReader(body), http.StatusCreated, nil) +} + +func (g *GitLabProvider) CreatePullRequest(ctx context.Context, owner, repo string, opts CreatePROptions) (*PullRequest, error) { + title := opts.Title + if opts.Draft && !strings.HasPrefix(strings.ToLower(strings.TrimSpace(title)), "draft:") { + title = "Draft: " + title + } + body, err := json.Marshal(map[string]any{ + "title": title, "description": opts.Body, "source_branch": opts.HeadBranch, + "target_branch": opts.BaseBranch, + }) + if err != nil { + return nil, err + } + var raw gitLabMergeRequest + if err := g.doJSON(ctx, http.MethodPost, g.projectAPIURL(owner, repo, "/merge_requests"), bytes.NewReader(body), http.StatusCreated, &raw); err != nil { + return nil, err + } + result := raw.toPullRequest(owner + "/" + repo) + return &result, nil +} + +func (g *GitLabProvider) GetCommit(ctx context.Context, owner, repo, sha string) (*Commit, error) { + var raw gitLabCommit + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, "/repository/commits/"+url.PathEscape(sha)), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + result := raw.toCommit() + return &result, nil +} + +func (g *GitLabProvider) ListCommits(ctx context.Context, owner, repo string, opts ListCommitsOptions) ([]Commit, error) { + page, perPage := opts.Page, opts.PerPage + if page <= 0 { + page = 1 + } + if perPage <= 0 { + perPage = 50 + } + q := url.Values{"page": {strconv.Itoa(page)}, "per_page": {strconv.Itoa(perPage)}} + if opts.Sha != "" { + q.Set("ref_name", opts.Sha) + } + if opts.Since != nil && !opts.Since.IsZero() { + q.Set("since", opts.Since.Format(time.RFC3339)) + } + var raw []gitLabCommit + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, "/repository/commits?"+q.Encode()), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + out := make([]Commit, 0, len(raw)) + for _, commit := range raw { + out = append(out, commit.toCommit()) + } + return out, nil +} + +func (g *GitLabProvider) ListTags(ctx context.Context, owner, repo string, since time.Time) ([]Tag, error) { + const perPage, maxTags = 100, 500 + var out []Tag + webURL := g.projectWebURL(owner, repo) + for page := 1; len(out) < maxTags; page++ { + var raw []gitLabTag + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/repository/tags?page=%d&per_page=%d", page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, tag := range raw { + created := tag.Commit.CommittedDate + if !since.IsZero() && created.Before(since) { + continue + } + out = append(out, Tag{Name: tag.Name, SHA: tag.Target, URL: webURL + "/-/tags/" + url.PathEscape(tag.Name), CreatedAt: created}) + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) CompareCommits(ctx context.Context, owner, repo, base, head string) ([]Commit, error) { + q := url.Values{"from": {base}, "to": {head}, "straight": {"true"}} + var raw struct { + Commits []gitLabCommit `json:"commits"` + } + if err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, "/repository/compare?"+q.Encode()), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + out := make([]Commit, 0, len(raw.Commits)) + for i, commit := range raw.Commits { + if i >= 500 { + break + } + out = append(out, commit.toCommit()) + } + return out, nil +} + +func (g *GitLabProvider) CreateRelease(ctx context.Context, owner, repo string, opts CreateReleaseOptions) (*Release, error) { + bodyMap := map[string]any{"tag_name": opts.TagName, "name": opts.Name, "description": opts.Body} + if opts.TargetCommitish != "" { + bodyMap["ref"] = opts.TargetCommitish + } + body, err := json.Marshal(bodyMap) + if err != nil { + return nil, err + } + var raw gitLabRelease + if err := g.doJSON(ctx, http.MethodPost, g.projectAPIURL(owner, repo, "/releases"), bytes.NewReader(body), http.StatusCreated, &raw); err != nil { + return nil, err + } + result := raw.toRelease(g.projectWebURL(owner, repo)) + return &result, nil +} + +func (g *GitLabProvider) ListReleases(ctx context.Context, owner, repo string) ([]Release, error) { + const perPage = 100 + var out []Release + webURL := g.projectWebURL(owner, repo) + for page := 1; ; page++ { + var raw []gitLabRelease + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/releases?page=%d&per_page=%d", page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, release := range raw { + out = append(out, release.toRelease(webURL)) + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) ListIssueComments(ctx context.Context, owner, repo string, number int) ([]IssueComment, error) { + const perPage = 100 + var out []IssueComment + for page := 1; ; page++ { + var raw []gitLabNote + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/merge_requests/%d/notes?sort=asc&page=%d&per_page=%d", number, page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, note := range raw { + if note.System || note.Type != "" { + continue + } + out = append(out, note.toIssueComment("issue_comment", "")) + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) ListPullRequestReviewEvents(ctx context.Context, owner, repo string, number int) ([]IssueComment, error) { + const perPage = 100 + var out []IssueComment + for page := 1; ; page++ { + var raw []gitLabDiscussion + reqURL := g.projectAPIURL(owner, repo, fmt.Sprintf("/merge_requests/%d/discussions?page=%d&per_page=%d", number, page, perPage)) + if err := g.doJSON(ctx, http.MethodGet, reqURL, http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + for _, discussion := range raw { + if discussion.IndividualNote { + continue + } + for _, note := range discussion.Notes { + if note.System { + continue + } + kind := "review" + if note.Position.NewPath != "" { + kind = "review_comment" + } + out = append(out, note.toIssueComment(kind, discussion.ID)) + } + } + if len(raw) < perPage { + break + } + } + return out, nil +} + +func (g *GitLabProvider) CreateIssueComment(ctx context.Context, owner, repo string, number int, commentBody string) (int64, error) { + body, err := json.Marshal(map[string]string{"body": commentBody}) + if err != nil { + return 0, err + } + var raw gitLabNote + if err := g.doJSON(ctx, http.MethodPost, g.projectAPIURL(owner, repo, fmt.Sprintf("/merge_requests/%d/notes", number)), bytes.NewReader(body), http.StatusCreated, &raw); err != nil { + return 0, err + } + return raw.ID, nil +} + +func (g *GitLabProvider) UpdateIssueComment(ctx context.Context, owner, repo string, number int, commentID int64, commentBody string) error { + body, err := json.Marshal(map[string]string{"body": commentBody}) + if err != nil { + return err + } + path := fmt.Sprintf("/merge_requests/%d/notes/%d", number, commentID) + return g.doJSON(ctx, http.MethodPut, g.projectAPIURL(owner, repo, path), bytes.NewReader(body), http.StatusOK, nil) +} + +func (g *GitLabProvider) CanUserWriteRepository(ctx context.Context, owner, repo, username string) (bool, error) { + q := url.Values{"username": {username}} + var users []gitLabUser + if err := g.doJSON(ctx, http.MethodGet, g.apiURL("/users?"+q.Encode()), http.NoBody, http.StatusOK, &users); err != nil { + return false, err + } + var userID int64 + for _, user := range users { + if strings.EqualFold(user.Username, username) { + userID = user.ID + break + } + } + if userID == 0 { + return false, nil + } + var member struct { + AccessLevel int `json:"access_level"` + } + err := g.doJSON(ctx, http.MethodGet, g.projectAPIURL(owner, repo, "/members/all/"+strconv.FormatInt(userID, 10)), http.NoBody, http.StatusOK, &member) + if errors.Is(err, ErrNotFound) { + return false, nil + } + if err != nil { + return false, err + } + return member.AccessLevel >= 30, nil +} + +func (g *GitLabProvider) RegisterWebhook(ctx context.Context, owner, repo string, opts WebhookOptions) (*WebhookRegistration, error) { + events := map[string]bool{} + if len(opts.Events) == 0 { + events["push_events"] = true + events["merge_requests_events"] = true + } + for _, event := range opts.Events { + switch event { + case "push": + events["push_events"] = true + case "tag_push": + events["tag_push_events"] = true + case "pull_request", "merge_request": + events["merge_requests_events"] = true + case "note": + events["note_events"] = true + case "release": + events["releases_events"] = true + } + } + bodyMap := map[string]any{"url": opts.URL, "token": opts.Secret, "enable_ssl_verification": true} + for key, enabled := range events { + bodyMap[key] = enabled + } + body, err := json.Marshal(bodyMap) + if err != nil { + return nil, err + } + var raw gitLabHook + if err := g.doJSON(ctx, http.MethodPost, g.projectAPIURL(owner, repo, "/hooks"), bytes.NewReader(body), http.StatusCreated, &raw); err != nil { + return nil, err + } + return &WebhookRegistration{ID: strconv.FormatInt(raw.ID, 10), URL: raw.URL, Events: opts.Events, IsActive: true, CreatedAt: raw.CreatedAt}, nil +} + +func (g *GitLabProvider) DeleteWebhook(ctx context.Context, owner, repo, webhookID string) error { + return g.doJSON(ctx, http.MethodDelete, g.projectAPIURL(owner, repo, "/hooks/"+url.PathEscape(webhookID)), http.NoBody, http.StatusNoContent, nil) +} + +func (g *GitLabProvider) GetOAuthURL(state, redirectURI string) string { + q := url.Values{"client_id": {g.clientID}, "redirect_uri": {redirectURI}, "response_type": {"code"}, "state": {state}, "scope": {"api"}} + return g.baseURL + "/oauth/authorize?" + q.Encode() +} + +func (g *GitLabProvider) performTokenRequest(ctx context.Context, params url.Values) (*OAuthTokens, error) { + req, err := http.NewRequestWithContext(ctx, http.MethodPost, g.baseURL+"/oauth/token", strings.NewReader(params.Encode())) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + req.Header.Set("Accept", "application/json") + resp, err := g.httpClient.Do(req) + if err != nil { + return nil, err + } + defer func() { _ = resp.Body.Close() }() + body, err := io.ReadAll(io.LimitReader(resp.Body, 1<<20)) + if err != nil { + return nil, err + } + if resp.StatusCode != http.StatusOK { + if resp.StatusCode == http.StatusBadRequest && bytes.Contains(body, []byte("invalid_grant")) { + return nil, fmt.Errorf("%w: %s", ErrRefreshTokenInvalid, body) + } + return nil, fmt.Errorf("%w: %s", ErrProviderError, body) + } + var raw struct { + AccessToken string `json:"access_token"` + TokenType string `json:"token_type"` + RefreshToken string `json:"refresh_token"` + ExpiresIn int `json:"expires_in"` + CreatedAt int64 `json:"created_at"` + Scope string `json:"scope"` + } + if err := json.Unmarshal(body, &raw); err != nil { + return nil, err + } + result := &OAuthTokens{AccessToken: raw.AccessToken, TokenType: raw.TokenType, RefreshToken: raw.RefreshToken, Scope: raw.Scope} + if raw.ExpiresIn > 0 { + base := time.Now() + if raw.CreatedAt > 0 { + base = time.Unix(raw.CreatedAt, 0) + } + expires := base.Add(time.Duration(raw.ExpiresIn) * time.Second) + result.ExpiresAt = &expires + } + return result, nil +} + +func (g *GitLabProvider) ExchangeCode(ctx context.Context, code, redirectURI string) (*OAuthTokens, error) { + return g.performTokenRequest(ctx, url.Values{"client_id": {g.clientID}, "client_secret": {g.clientSecret}, "code": {code}, "grant_type": {"authorization_code"}, "redirect_uri": {redirectURI}}) +} + +func (g *GitLabProvider) RefreshToken(ctx context.Context, refreshToken string) (*OAuthTokens, error) { + return g.performTokenRequest(ctx, url.Values{"client_id": {g.clientID}, "client_secret": {g.clientSecret}, "refresh_token": {refreshToken}, "grant_type": {"refresh_token"}}) +} + +func (g *GitLabProvider) RevokeToken(ctx context.Context, accessToken string) error { + params := url.Values{"client_id": {g.clientID}, "client_secret": {g.clientSecret}, "token": {accessToken}} + req, err := http.NewRequestWithContext(ctx, http.MethodPost, g.baseURL+"/oauth/revoke", strings.NewReader(params.Encode())) + if err != nil { + return err + } + req.Header.Set("Content-Type", "application/x-www-form-urlencoded") + resp, err := g.httpClient.Do(req) + if err != nil { + return err + } + defer func() { _ = resp.Body.Close() }() + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusNoContent { + return g.handleErrorResponse(resp) + } + return nil +} + +func (g *GitLabProvider) GetCurrentUser(ctx context.Context) (*User, error) { + var raw gitLabUser + if err := g.doJSON(ctx, http.MethodGet, g.apiURL("/user"), http.NoBody, http.StatusOK, &raw); err != nil { + return nil, err + } + result := raw.toUser() + return &result, nil +} + +type gitLabProject struct { + ID int64 `json:"id"` + Name string `json:"name"` + PathWithNamespace string `json:"path_with_namespace"` + Description string `json:"description"` + WebURL string `json:"web_url"` + HTTPURL string `json:"http_url_to_repo"` + SSHURL string `json:"ssh_url_to_repo"` + DefaultBranch string `json:"default_branch"` + Visibility string `json:"visibility"` + Archived bool `json:"archived"` + CreatedAt time.Time `json:"created_at"` + LastActivityAt time.Time `json:"last_activity_at"` + Namespace struct { + FullPath string `json:"full_path"` + } `json:"namespace"` +} + +func (p gitLabProject) toRepository() Repository { + return Repository{ID: strconv.FormatInt(p.ID, 10), Name: p.Name, FullName: p.PathWithNamespace, Description: p.Description, + URL: p.WebURL, CloneURL: p.HTTPURL, SSHURL: p.SSHURL, DefaultBranch: p.DefaultBranch, IsPrivate: p.Visibility == "private", + IsArchived: p.Archived, Owner: p.Namespace.FullPath, CreatedAt: p.CreatedAt, UpdatedAt: p.LastActivityAt} +} + +type gitLabUser struct { + ID int64 `json:"id"` + Username string `json:"username"` + Name string `json:"name"` + PublicEmail string `json:"public_email"` + Email string `json:"email"` + AvatarURL string `json:"avatar_url"` +} + +func (u gitLabUser) toUser() User { + email := u.Email + if email == "" { + email = u.PublicEmail + } + return User{ID: strconv.FormatInt(u.ID, 10), Username: u.Username, Name: u.Name, Email: email, AvatarURL: u.AvatarURL} +} + +type gitLabCommit struct { + ID string `json:"id"` + Message string `json:"message"` + WebURL string `json:"web_url"` + AuthorName string `json:"author_name"` + AuthorEmail string `json:"author_email"` + AuthoredDate time.Time `json:"authored_date"` + CommitterName string `json:"committer_name"` + CommitterEmail string `json:"committer_email"` + CommittedDate time.Time `json:"committed_date"` +} + +func (c gitLabCommit) toCommit() Commit { + created := c.AuthoredDate + if created.IsZero() { + created = c.CommittedDate + } + return Commit{SHA: c.ID, Message: c.Message, URL: c.WebURL, Author: User{Name: c.AuthorName, Email: c.AuthorEmail}, Committer: User{Name: c.CommitterName, Email: c.CommitterEmail}, CreatedAt: created} +} + +type gitLabBranch struct { + Name string `json:"name"` + Protected bool `json:"protected"` + Default bool `json:"default"` + Commit gitLabCommit `json:"commit"` +} + +func (b gitLabBranch) toBranch() Branch { + return Branch{Name: b.Name, SHA: b.Commit.ID, Protected: b.Protected, IsDefault: b.Default} +} + +type gitLabMergeRequest struct { + ID int64 `json:"id"` + IID int `json:"iid"` + Title string `json:"title"` + Description string `json:"description"` + State string `json:"state"` + WebURL string `json:"web_url"` + SourceBranch string `json:"source_branch"` + TargetBranch string `json:"target_branch"` + SHA string `json:"sha"` + Draft bool `json:"draft"` + WorkInProgress bool `json:"work_in_progress"` + Author gitLabUser `json:"author"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + MergedAt *time.Time `json:"merged_at"` + ClosedAt *time.Time `json:"closed_at"` +} + +func (mr gitLabMergeRequest) toPullRequest(repo string) PullRequest { + state := mr.State + if state == "opened" { + state = "open" + } + merged := state == "merged" || mr.MergedAt != nil + if merged { + state = "merged" + } + return PullRequest{ID: int(mr.ID), Number: mr.IID, Title: mr.Title, Body: mr.Description, State: state, URL: mr.WebURL, HeadBranch: mr.SourceBranch, HeadRepo: repo, HeadSHA: mr.SHA, BaseBranch: mr.TargetBranch, IsMerged: merged, IsDraft: mr.Draft || mr.WorkInProgress, Author: mr.Author.toUser(), CreatedAt: mr.CreatedAt, UpdatedAt: mr.UpdatedAt, MergedAt: mr.MergedAt, ClosedAt: mr.ClosedAt} +} + +type gitLabTag struct { + Name string `json:"name"` + Target string `json:"target"` + Commit gitLabCommit `json:"commit"` +} + +type gitLabRelease struct { + TagName string `json:"tag_name"` + Name string `json:"name"` + Description string `json:"description"` + CreatedAt time.Time `json:"created_at"` + ReleasedAt time.Time `json:"released_at"` + Upcoming bool `json:"upcoming_release"` + Historical bool `json:"historical_release"` + Links struct { + Self string `json:"self"` + } `json:"_links"` + Assets struct { + Sources []struct { + Format string `json:"format"` + URL string `json:"url"` + } `json:"sources"` + Links []struct { + Name string `json:"name"` + URL string `json:"url"` + DirectURL string `json:"direct_asset_url"` + LinkType string `json:"link_type"` + } `json:"links"` + } `json:"assets"` +} + +func (r gitLabRelease) toRelease(projectURL string) Release { + status := "released" + if r.Upcoming { + status = "upcoming" + } else if r.Historical { + status = "historical" + } + assets := make([]models.SCMReleaseAsset, 0, len(r.Assets.Sources)+len(r.Assets.Links)) + for _, source := range r.Assets.Sources { + assets = append(assets, models.SCMReleaseAsset{Kind: "source", Name: source.Format, URL: source.URL, Format: source.Format}) + } + for _, link := range r.Assets.Links { + assets = append(assets, models.SCMReleaseAsset{Kind: "link", Name: link.Name, URL: link.URL, DirectURL: link.DirectURL, LinkType: link.LinkType}) + } + var released *time.Time + if !r.ReleasedAt.IsZero() { + releasedAt := r.ReleasedAt + released = &releasedAt + } + return Release{ID: r.TagName, TagName: r.TagName, TagURL: projectURL + "/-/tags/" + url.PathEscape(r.TagName), Name: r.Name, Body: r.Description, URL: r.Links.Self, Status: status, Assets: assets, CreatedAt: r.CreatedAt, PublishedAt: released, ReleasedAt: released} +} + +type gitLabNote struct { + ID int64 `json:"id"` + Type string `json:"type"` + Body string `json:"body"` + Author gitLabUser `json:"author"` + System bool `json:"system"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Position struct { + NewPath string `json:"new_path"` + NewLine int `json:"new_line"` + OldPath string `json:"old_path"` + OldLine int `json:"old_line"` + PositionType string `json:"position_type"` + } `json:"position"` +} + +func (n gitLabNote) toIssueComment(kind, threadID string) IssueComment { + path, line, side := n.Position.NewPath, n.Position.NewLine, "RIGHT" + if path == "" { + path, line, side = n.Position.OldPath, n.Position.OldLine, "LEFT" + } + return IssueComment{ID: n.ID, Kind: kind, Body: n.Body, User: n.Author.toUser(), Path: path, Line: line, Side: side, ThreadID: threadID, CreatedAt: n.CreatedAt, UpdatedAt: n.UpdatedAt} +} + +type gitLabDiscussion struct { + ID string `json:"id"` + IndividualNote bool `json:"individual_note"` + Notes []gitLabNote `json:"notes"` +} +type gitLabHook struct { + ID int64 `json:"id"` + URL string `json:"url"` + CreatedAt time.Time `json:"created_at"` +} diff --git a/internal/scm/gitlab_test.go b/internal/scm/gitlab_test.go new file mode 100644 index 000000000..e012a9bb2 --- /dev/null +++ b/internal/scm/gitlab_test.go @@ -0,0 +1,120 @@ +package scm + +import ( + "context" + "io" + "net/http" + "strings" + "testing" + "time" + + "windshift/internal/models" +) + +type roundTripFunc func(*http.Request) (*http.Response, error) + +func (f roundTripFunc) RoundTrip(request *http.Request) (*http.Response, error) { return f(request) } + +func jsonResponse(status int, body string) *http.Response { + return &http.Response{StatusCode: status, Header: make(http.Header), Body: io.NopCloser(strings.NewReader(body))} +} + +func TestGitLabProviderNestedProjectAndPAT(t *testing.T) { + t.Parallel() + provider, err := NewGitLabProvider(ProviderConfig{BaseURL: "https://git.example/api/v4", AuthMethod: models.SCMAuthMethodPAT, PersonalAccessToken: "pat-token"}) + if err != nil { + t.Fatal(err) + } + provider.httpClient = &http.Client{Transport: roundTripFunc(func(request *http.Request) (*http.Response, error) { + if request.URL.EscapedPath() != "/api/v4/projects/group%2Fsubgroup%2Fproject" { + t.Fatalf("unexpected path: %s", request.URL.EscapedPath()) + } + if got := request.Header.Get("PRIVATE-TOKEN"); got != "pat-token" { + t.Fatalf("unexpected PAT header: %q", got) + } + return jsonResponse(http.StatusOK, `{ + "id":42,"name":"project","path_with_namespace":"group/subgroup/project", + "web_url":"https://git.example/group/subgroup/project", + "http_url_to_repo":"https://git.example/group/subgroup/project.git", + "ssh_url_to_repo":"git@git.example:group/subgroup/project.git", + "default_branch":"main","visibility":"private", + "namespace":{"full_path":"group/subgroup"} + }`), nil + })} + + repository, err := provider.GetRepository(context.Background(), "group/subgroup", "project") + if err != nil { + t.Fatal(err) + } + if repository.FullName != "group/subgroup/project" || repository.Owner != "group/subgroup" || repository.ID != "42" { + t.Fatalf("unexpected repository mapping: %+v", repository) + } +} + +func TestGitLabProviderReleaseMetadata(t *testing.T) { + t.Parallel() + const releasedAt = "2026-08-30T12:00:00Z" + provider, err := NewGitLabProvider(ProviderConfig{BaseURL: "https://git.example", AuthMethod: models.SCMAuthMethodOAuth, OAuthAccessToken: "oauth-token"}) + if err != nil { + t.Fatal(err) + } + provider.httpClient = &http.Client{Transport: roundTripFunc(func(request *http.Request) (*http.Response, error) { + if got := request.Header.Get("Authorization"); got != "Bearer oauth-token" { + t.Fatalf("unexpected OAuth header: %q", got) + } + return jsonResponse(http.StatusOK, `[{ + "tag_name":"v2.0.0","name":"Version 2","description":"Notes", + "created_at":"2026-08-30T12:00:00Z","released_at":"2026-08-30T12:00:00Z", + "_links":{"self":"https://git.example/group/project/-/releases/v2.0.0"}, + "assets":{ + "sources":[{"format":"zip","url":"https://git.example/source.zip"}], + "links":[{"name":"binary","url":"https://cdn.example/app","direct_asset_url":"/downloads/app","link_type":"package"}] + } + }]`), nil + })} + + releases, err := provider.ListReleases(context.Background(), "group", "project") + if err != nil { + t.Fatal(err) + } + if len(releases) != 1 || releases[0].Status != "released" || releases[0].TagURL != "https://git.example/group/project/-/tags/v2.0.0" { + t.Fatalf("unexpected release mapping: %+v", releases) + } + if len(releases[0].Assets) != 2 || releases[0].Assets[1].DirectURL != "/downloads/app" { + t.Fatalf("unexpected assets: %+v", releases[0].Assets) + } + want, _ := time.Parse(time.RFC3339, releasedAt) + if releases[0].ReleasedAt == nil || !releases[0].ReleasedAt.Equal(want) { + t.Fatalf("unexpected release date: %v", releases[0].ReleasedAt) + } +} + +func TestGitLabProviderRefreshToken(t *testing.T) { + t.Parallel() + provider, err := NewGitLabProvider(ProviderConfig{BaseURL: "https://git.example", AuthMethod: models.SCMAuthMethodOAuth, OAuthClientID: "client", OAuthClientSecret: "secret"}) + if err != nil { + t.Fatal(err) + } + provider.httpClient = &http.Client{Transport: roundTripFunc(func(request *http.Request) (*http.Response, error) { + if request.URL.Path != "/oauth/token" || request.Method != http.MethodPost { + t.Fatalf("unexpected request: %s %s", request.Method, request.URL.Path) + } + body, readErr := io.ReadAll(request.Body) + if readErr != nil { + t.Fatal(readErr) + } + values := string(body) + if !strings.Contains(values, "grant_type=refresh_token") || !strings.Contains(values, "refresh_token=refresh-me") { + t.Fatalf("unexpected form: %s", values) + } + return jsonResponse(http.StatusOK, `{"access_token":"new-token","refresh_token":"next-refresh","token_type":"Bearer","expires_in":7200,"scope":"api"}`), nil + })} + + tokens, err := provider.RefreshToken(context.Background(), "refresh-me") + if err != nil { + t.Fatal(err) + } + if tokens.AccessToken != "new-token" || tokens.RefreshToken != "next-refresh" || tokens.ExpiresAt == nil { + t.Fatalf("unexpected tokens: %+v", tokens) + } +} diff --git a/internal/scm/issue_sync.go b/internal/scm/issue_sync.go index 92e929318..a7eeef2ab 100644 --- a/internal/scm/issue_sync.go +++ b/internal/scm/issue_sync.go @@ -531,17 +531,18 @@ func (s *IssueSyncService) PushCommentToGitHub(ctx context.Context, itemID, comm // PushCommentUpdateToGitHub pushes a Windshift comment edit to the linked GitHub comment. func (s *IssueSyncService) PushCommentUpdateToGitHub(ctx context.Context, commentID, authorID int, newBody string) { var ghCommentID int64 + var issueNumber int var repoName string var connectionID int err := s.db.QueryRowContext(ctx, ` - SELECT isc2.github_comment_id, wr.repository_name, wr.workspace_scm_connection_id + SELECT isc2.github_comment_id, isi.github_issue_number, wr.repository_name, wr.workspace_scm_connection_id FROM issue_sync_comments isc2 JOIN issue_sync_items isi ON isi.id = isc2.issue_sync_item_id JOIN issue_sync_configs isc ON isc.id = isi.issue_sync_config_id JOIN workspace_repositories wr ON wr.id = isc.workspace_repository_id WHERE isc2.comment_id = ? AND isc.sync_enabled = ? AND isc.sync_comments = ? - `, commentID, true, true).Scan(&ghCommentID, &repoName, &connectionID) + `, commentID, true, true).Scan(&ghCommentID, &issueNumber, &repoName, &connectionID) if err != nil { if !errors.Is(err, sql.ErrNoRows) { slog.Error("lookup sync comment for update pushback", "comment_id", commentID, "error", err) @@ -578,7 +579,7 @@ func (s *IssueSyncService) PushCommentUpdateToGitHub(ctx context.Context, commen return } - if err := issueProvider.UpdateIssueComment(ctx, parts[0], parts[1], ghCommentID, newBody); err != nil { + if err := issueProvider.UpdateIssueComment(ctx, parts[0], parts[1], issueNumber, ghCommentID, newBody); err != nil { slog.Error("push comment update to GitHub", "github_comment_id", ghCommentID, "error", err) } } diff --git a/internal/scm/milestone_attach.go b/internal/scm/milestone_attach.go index 6223eb82d..061f2feab 100644 --- a/internal/scm/milestone_attach.go +++ b/internal/scm/milestone_attach.go @@ -6,10 +6,10 @@ import ( "errors" "fmt" "log/slog" - "strings" "windshift/internal/repository" "windshift/internal/services" + "windshift/internal/utils" ) // MilestoneAttacher implements services.MilestoneCommitAttacher by @@ -69,11 +69,10 @@ func (m *MilestoneAttacher) AttachCommitIssues(ctx context.Context, in services. return result, errors.New("provider does not implement RefProvider (CompareCommits)") } - parts := strings.SplitN(repoCtx.repositoryName, "/", 2) - if len(parts) != 2 { + owner, repo, ok := utils.SplitRepositoryPath(repoCtx.repositoryName) + if !ok { return result, fmt.Errorf("invalid repository_name %q", repoCtx.repositoryName) } - owner, repo := parts[0], parts[1] commits, err := rp.CompareCommits(ctx, owner, repo, in.BaseRef, in.HeadRef) if err != nil { diff --git a/internal/scm/pr_review_events.go b/internal/scm/pr_review_events.go index 1907a78c1..5480b0a09 100644 --- a/internal/scm/pr_review_events.go +++ b/internal/scm/pr_review_events.go @@ -226,7 +226,7 @@ func reviewInstruction(event prReviewEvent) string { Path string `json:"path"` Line int `json:"line"` Side string `json:"side"` - ThreadID int64 `json:"thread_id"` + ThreadID string `json:"thread_id"` } if json.Unmarshal([]byte(event.ContextJSON), &reviewContext) != nil { return event.Body @@ -235,7 +235,7 @@ func reviewInstruction(event prReviewEvent) string { if reviewContext.Line > 0 { location += fmt.Sprintf(":%d", reviewContext.Line) } - return fmt.Sprintf("PR %s request at %s (side=%s, thread=%d):\n\n%s", event.Kind, location, reviewContext.Side, reviewContext.ThreadID, event.Body) + return fmt.Sprintf("PR %s request at %s (side=%s, thread=%s):\n\n%s", event.Kind, location, reviewContext.Side, reviewContext.ThreadID, event.Body) } func eventMarker(eventID int64, phase string) string { diff --git a/internal/scm/sync.go b/internal/scm/sync.go index 7bd6efca1..272cc9e60 100644 --- a/internal/scm/sync.go +++ b/internal/scm/sync.go @@ -3,9 +3,11 @@ package scm import ( "context" "database/sql" + "encoding/json" "errors" "fmt" "log/slog" + "net/url" "regexp" "strconv" "strings" @@ -18,6 +20,7 @@ import ( "windshift/internal/repository" "windshift/internal/services" "windshift/internal/sso" + "windshift/internal/utils" ) // Sync pagination/budget constants applied to every per-repo sync. These @@ -472,11 +475,10 @@ func (s *SyncService) SyncRepository(ctx context.Context, repoID int) error { // syncRepository performs the actual sync for a single repository func (s *SyncService) syncRepository(ctx context.Context, provider Provider, repoID int, repositoryName, defaultBranch string, workspaceID int, workspaceKey, itemKeyPattern string, lastSyncedAt time.Time) error { - parts := strings.SplitN(repositoryName, "/", 2) - if len(parts) != 2 { + owner, repo, ok := utils.SplitRepositoryPath(repositoryName) + if !ok { return fmt.Errorf("invalid repository name format: %s", repositoryName) } - owner, repo := parts[0], parts[1] slog.Debug("Syncing repository", slog.String("component", "scm"), slog.String("repository", repositoryName), slog.String("workspace", workspaceKey)) @@ -503,6 +505,9 @@ func (s *SyncService) syncRepository(ctx context.Context, provider Provider, rep if err := s.syncTagsAndReleases(ctx, provider, owner, repo, repoID, workspaceID, baselineRefs); err != nil { syncErrs = append(syncErrs, fmt.Errorf("sync tags: %w", err)) } + if err := s.syncAttachedReleases(ctx, provider, owner, repo, repoID); err != nil { + syncErrs = append(syncErrs, fmt.Errorf("sync attached releases: %w", err)) + } if err := errors.Join(syncErrs...); err != nil { return fmt.Errorf("sync repository %q: %w", repositoryName, err) } @@ -518,6 +523,110 @@ func (s *SyncService) syncRepository(ctx context.Context, provider Provider, rep return nil } +// syncAttachedReleases refreshes milestone release records from current SCM +// truth. Tags and releases are intentionally distinct: deleting a release +// leaves a tag_only record, while deleting both marks the attachment missing. +func (s *SyncService) syncAttachedReleases(ctx context.Context, provider Provider, owner, repo string, repoID int) error { + var attached int + if err := s.db.QueryRowContext(ctx, `SELECT COUNT(*) FROM milestone_releases WHERE workspace_repository_id = ? AND state = 'created'`, repoID).Scan(&attached); err != nil || attached == 0 { + return err + } + releaseProvider, releasesOK := provider.(ReleaseProvider) + refProvider, refsOK := provider.(RefProvider) + if !releasesOK || !refsOK { + return nil + } + releases, err := releaseProvider.ListReleases(ctx, owner, repo) + if err != nil { + return err + } + tags, err := refProvider.ListTags(ctx, owner, repo, time.Time{}) + if err != nil { + return err + } + releaseByTag := make(map[string]Release, len(releases)) + for _, release := range releases { + releaseByTag[release.TagName] = release + } + tagByName := make(map[string]Tag, len(tags)) + for _, tag := range tags { + tagByName[tag.Name] = tag + } + + rows, err := s.db.QueryContext(ctx, `SELECT id, tag_name FROM milestone_releases WHERE workspace_repository_id = ? AND state = 'created'`, repoID) + if err != nil { + return err + } + defer func() { _ = rows.Close() }() + type attachedRelease struct { + id int + tag string + } + var attachedRows []attachedRelease + for rows.Next() { + var row attachedRelease + if err := rows.Scan(&row.id, &row.tag); err != nil { + return err + } + attachedRows = append(attachedRows, row) + } + if err := rows.Err(); err != nil { + return err + } + + for _, row := range attachedRows { + if release, ok := releaseByTag[row.tag]; ok { + assetsJSON, _ := json.Marshal(release.Assets) + releasedAt := release.ReleasedAt + if releasedAt == nil { + releasedAt = release.PublishedAt + } + status := release.Status + if status == "" { + switch { + case release.IsDraft: + status = "draft" + case release.IsPrerelease: + status = "prerelease" + default: + status = "released" + } + } + _, err = s.db.ExecWriteContext(ctx, ` + UPDATE milestone_releases + SET name=?, body=?, is_draft=?, is_prerelease=?, tag_url=?, release_status=?, + released_at=?, assets_json=?, scm_release_id=?, scm_release_url=?, + last_synced_at=CURRENT_TIMESTAMP, updated_at=CURRENT_TIMESTAMP + WHERE id=? + `, release.Name, release.Body, release.IsDraft, release.IsPrerelease, release.TagURL, status, + releasedAt, string(assetsJSON), release.ID, release.URL, row.id) + if err != nil { + return err + } + continue + } + if tag, ok := tagByName[row.tag]; ok { + _, err = s.db.ExecWriteContext(ctx, ` + UPDATE milestone_releases + SET name=NULL, body=NULL, is_draft=false, is_prerelease=false, tag_url=?, + release_status='tag_only', released_at=NULL, assets_json='[]', + scm_release_id=NULL, scm_release_url=NULL, last_synced_at=CURRENT_TIMESTAMP, + updated_at=CURRENT_TIMESTAMP WHERE id=? + `, tag.URL, row.id) + } else { + _, err = s.db.ExecWriteContext(ctx, ` + UPDATE milestone_releases SET release_status='missing', tag_url=NULL, + released_at=NULL, assets_json='[]', scm_release_id=NULL, scm_release_url=NULL, + last_synced_at=CURRENT_TIMESTAMP, updated_at=CURRENT_TIMESTAMP WHERE id=? + `, row.id) + } + if err != nil { + return err + } + } + return nil +} + // syncPullRequests syncs pull requests from a repository. The paginated // fetch is delegated to iteratePullRequests so the loop can be unit-tested // in isolation; the callback below performs the per-PR work. @@ -951,8 +1060,7 @@ func (s *SyncService) syncBranches(ctx context.Context, provider Provider, owner continue // Item doesn't exist in this workspace } - // Construct branch URL (best effort - varies by provider) - branchURL := fmt.Sprintf("https://github.com/%s/%s/tree/%s", owner, repo, branch.Name) + branchURL := branchWebURL(provider, owner, repo, branch.Name) err = s.upsertItemSCMLink(ctx, itemID, repoID, models.SCMLinkTypeBranch, branch.Name, branchURL, branch.Name, "", "", "", string(key.Source)) @@ -965,6 +1073,18 @@ func (s *SyncService) syncBranches(ctx context.Context, provider Provider, owner return nil } +func branchWebURL(provider Provider, owner, repo, branch string) string { + escapedBranch := url.PathEscape(branch) + switch typed := provider.(type) { + case *GitLabProvider: + return typed.projectWebURL(owner, repo) + "/-/tree/" + escapedBranch + case *GiteaProvider: + return typed.baseURL + "/" + owner + "/" + repo + "/src/branch/" + escapedBranch + default: + return "https://github.com/" + owner + "/" + repo + "/tree/" + escapedBranch + } +} + // findItemByKey finds an item by its workspace key and number. Returns 0 // (without error) when no item matches. func (s *SyncService) findItemByKey(_ context.Context, workspaceID int, workspaceKey string, itemNumber int) (int, error) { @@ -1238,11 +1358,10 @@ func (s *SyncService) refreshItemSCMLink(ctx context.Context, linkID int, userID } } - parts := strings.SplitN(repositoryName, "/", 2) - if len(parts) != 2 { + owner, repo, ok := utils.SplitRepositoryPath(repositoryName) + if !ok { return fmt.Errorf("invalid repository name format: %s", repositoryName) } - owner, repo := parts[0], parts[1] return s.updateLinkFromProvider(ctx, provider, owner, repo, linkID, linkType, externalID, externalURL.String) } @@ -1369,11 +1488,10 @@ func (s *SyncService) resolveRepoAndProvider(ctx context.Context, workspaceRepoI } // Parse owner/repo from repository name - parts := strings.SplitN(repositoryName, "/", 2) - if len(parts) != 2 { + owner, repo, ok := utils.SplitRepositoryPath(repositoryName) + if !ok { return nil, fmt.Errorf("invalid repository name format: %s", repositoryName) } - owner, repo := parts[0], parts[1] // Resolve provider credentials credResolver := NewCredentialResolver(s.db, s.encryption) @@ -1409,6 +1527,8 @@ func (s *SyncService) resolveRepoAndProvider(ctx context.Context, workspaceRepoI switch providerType { case models.SCMProviderTypeGitHub: resolvedBaseURL = "https://github.com" + case models.SCMProviderTypeGitLab: + resolvedBaseURL = "https://gitlab.com" case models.SCMProviderTypeGitea: resolvedBaseURL = "https://gitea.com" } @@ -1425,6 +1545,67 @@ func (s *SyncService) resolveRepoAndProvider(ctx context.Context, workspaceRepoI }, nil } +// ListReleaseCandidates returns existing tags, enriched with first-class SCM +// release metadata when the provider exposes a release for the same tag. +func (s *SyncService) ListReleaseCandidates(ctx context.Context, workspaceRepoID, userID int) ([]ReleaseCandidate, error) { + rc, err := s.resolveRepoAndProvider(ctx, workspaceRepoID, userID) + if err != nil { + return nil, err + } + refProvider, ok := rc.Provider.(RefProvider) + if !ok { + return nil, errors.New("SCM provider does not support tags") + } + releaseProvider, ok := rc.Provider.(ReleaseProvider) + if !ok { + return nil, errors.New("SCM provider does not support releases") + } + + tags, err := refProvider.ListTags(ctx, rc.Owner, rc.Repo, time.Time{}) + if err != nil { + return nil, fmt.Errorf("list tags: %w", err) + } + releases, err := releaseProvider.ListReleases(ctx, rc.Owner, rc.Repo) + if err != nil { + return nil, fmt.Errorf("list releases: %w", err) + } + releasesByTag := make(map[string]Release, len(releases)) + for _, release := range releases { + releasesByTag[release.TagName] = release + } + + candidates := make([]ReleaseCandidate, 0, len(tags)+len(releases)) + seen := make(map[string]struct{}, len(tags)) + for _, tag := range tags { + candidate := ReleaseCandidate{TagName: tag.Name, TagURL: tag.URL, SHA: tag.SHA, Status: "tag_only"} + if release, exists := releasesByTag[tag.Name]; exists { + releaseCopy := release + candidate.Release = &releaseCopy + candidate.Status = release.Status + if candidate.Status == "" { + candidate.Status = "released" + } + if release.TagURL != "" { + candidate.TagURL = release.TagURL + } + } + candidates = append(candidates, candidate) + seen[tag.Name] = struct{}{} + } + for _, release := range releases { + if _, exists := seen[release.TagName]; exists { + continue + } + releaseCopy := release + status := release.Status + if status == "" { + status = "released" + } + candidates = append(candidates, ReleaseCandidate{TagName: release.TagName, TagURL: release.TagURL, Status: status, Release: &releaseCopy}) + } + return candidates, nil +} + // CreateBranchForRepository creates a branch in a workspace repository. // This method implements the plugins.SCMService interface. // If userID is provided (> 0), it uses the user's personal OAuth token for OAuth providers. @@ -1452,8 +1633,7 @@ func (s *SyncService) CreateBranchForRepository(ctx context.Context, workspaceRe return "", fmt.Errorf("failed to create branch: %w", err) } - // Both GitHub and Gitea use /tree/ for branch URLs - branchURL := fmt.Sprintf("%s/%s/tree/%s", rc.BaseURL, rc.RepositoryName, branchName) + branchURL := branchWebURL(rc.Provider, rc.Owner, rc.Repo, branchName) slog.Debug("Created branch", slog.String("component", "scm"), slog.String("branch", branchName), slog.String("repository", rc.RepositoryName)) return branchURL, nil @@ -1558,6 +1738,8 @@ func (s *SyncService) CreatePullRequestForRepository(ctx context.Context, worksp switch rc.ProviderType { case models.SCMProviderTypeGitea: prURL = fmt.Sprintf("%s/%s/pulls/%d", rc.BaseURL, rc.RepositoryName, pr.Number) + case models.SCMProviderTypeGitLab: + prURL = fmt.Sprintf("%s/%s/-/merge_requests/%d", rc.BaseURL, rc.RepositoryName, pr.Number) default: prURL = fmt.Sprintf("%s/%s/pull/%d", rc.BaseURL, rc.RepositoryName, pr.Number) } diff --git a/internal/scm/types.go b/internal/scm/types.go index b7895b865..4e8764c14 100644 --- a/internal/scm/types.go +++ b/internal/scm/types.go @@ -1,5 +1,5 @@ // Package scm provides SCM (Source Control Management) provider integration -// for GitHub and Gitea/Forgejo. +// for GitHub, GitLab, and Gitea/Forgejo. package scm import ( @@ -11,7 +11,7 @@ import ( // Provider defines the interface that all SCM providers must implement type Provider interface { - // GetType returns the provider type (github, gitea) + // GetType returns the provider type (github, gitlab, gitea) GetType() models.SCMProviderType // TestConnection tests if the provider connection is working @@ -188,6 +188,7 @@ type Branch struct { type Tag struct { Name string `json:"name"` SHA string `json:"sha"` // target commit SHA + URL string `json:"url,omitempty"` CreatedAt time.Time `json:"created_at"` } @@ -263,15 +264,29 @@ type GitHubAppInstallation struct { // Release represents a release from an SCM provider type Release struct { - ID string `json:"id"` - TagName string `json:"tag_name"` - Name string `json:"name"` - Body string `json:"body"` - URL string `json:"url"` - IsDraft bool `json:"is_draft"` - IsPrerelease bool `json:"is_prerelease"` - CreatedAt time.Time `json:"created_at"` - PublishedAt *time.Time `json:"published_at,omitempty"` + ID string `json:"id"` + TagName string `json:"tag_name"` + TagURL string `json:"tag_url,omitempty"` + Name string `json:"name"` + Body string `json:"body"` + URL string `json:"url"` + Status string `json:"status,omitempty"` + Assets []models.SCMReleaseAsset `json:"assets,omitempty"` + IsDraft bool `json:"is_draft"` + IsPrerelease bool `json:"is_prerelease"` + CreatedAt time.Time `json:"created_at"` + PublishedAt *time.Time `json:"published_at,omitempty"` + ReleasedAt *time.Time `json:"released_at,omitempty"` +} + +// ReleaseCandidate is an existing tag that can be attached to a milestone. +// Release is populated when the provider has a first-class release for it. +type ReleaseCandidate struct { + TagName string `json:"tag_name"` + TagURL string `json:"tag_url,omitempty"` + SHA string `json:"sha,omitempty"` + Status string `json:"status"` + Release *Release `json:"release,omitempty"` } // CreateReleaseOptions contains options for creating a release @@ -334,6 +349,8 @@ func NewProvider(cfg ProviderConfig) (Provider, error) { switch cfg.ProviderType { case models.SCMProviderTypeGitHub: return NewGitHubProvider(cfg) + case models.SCMProviderTypeGitLab: + return NewGitLabProvider(cfg) case models.SCMProviderTypeGitea: return NewGiteaProvider(cfg) default: @@ -351,7 +368,7 @@ type IssueComment struct { Path string `json:"path,omitempty"` Line int `json:"line,omitempty"` Side string `json:"side,omitempty"` - ThreadID int64 `json:"thread_id,omitempty"` + ThreadID string `json:"thread_id,omitempty"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } @@ -371,7 +388,7 @@ type IssueCommentProvider interface { ListIssueComments(ctx context.Context, owner, repo string, number int) ([]IssueComment, error) // UpdateIssueComment updates an existing comment on an issue/PR - UpdateIssueComment(ctx context.Context, owner, repo string, commentID int64, body string) error + UpdateIssueComment(ctx context.Context, owner, repo string, number int, commentID int64, body string) error } // PullRequestReviewProvider exposes the review surfaces that are distinct diff --git a/internal/server/server.go b/internal/server/server.go index adf7fa58c..4cd43862c 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -59,7 +59,10 @@ import ( ) type planningReleaseProviderAdapter struct { - provider scm.ReleaseProvider + provider interface { + scm.ReleaseProvider + ListTags(context.Context, string, string, time.Time) ([]scm.Tag, error) + } } func (a planningReleaseProviderAdapter) CreateRelease(ctx context.Context, owner, repo string, input services.ExternalReleaseOptions) (*services.ExternalRelease, error) { @@ -70,7 +73,7 @@ func (a planningReleaseProviderAdapter) CreateRelease(ctx context.Context, owner if err != nil { return nil, err } - return &services.ExternalRelease{ID: release.ID, URL: release.URL, TagName: release.TagName}, nil + return externalPlanningRelease(release), nil } func (a planningReleaseProviderAdapter) ListReleases(ctx context.Context, owner, repo string) ([]services.ExternalRelease, error) { @@ -80,11 +83,31 @@ func (a planningReleaseProviderAdapter) ListReleases(ctx context.Context, owner, } result := make([]services.ExternalRelease, len(releases)) for i := range releases { - result[i] = services.ExternalRelease{ID: releases[i].ID, URL: releases[i].URL, TagName: releases[i].TagName} + result[i] = *externalPlanningRelease(&releases[i]) + } + return result, nil +} + +func (a planningReleaseProviderAdapter) ListTags(ctx context.Context, owner, repo string) ([]services.ExternalTag, error) { + tags, err := a.provider.ListTags(ctx, owner, repo, time.Time{}) + if err != nil { + return nil, err + } + result := make([]services.ExternalTag, len(tags)) + for i := range tags { + result[i] = services.ExternalTag{Name: tags[i].Name, URL: tags[i].URL} } return result, nil } +func externalPlanningRelease(release *scm.Release) *services.ExternalRelease { + return &services.ExternalRelease{ + ID: release.ID, URL: release.URL, TagName: release.TagName, TagURL: release.TagURL, + Name: release.Name, Body: release.Body, Status: release.Status, Assets: release.Assets, + IsDraft: release.IsDraft, IsPrerelease: release.IsPrerelease, ReleasedAt: release.ReleasedAt, + } +} + // Config is an alias to config.Config — the canonical, fully-resolved runtime // configuration. All resolution of env vars and CLI flags happens in // internal/config/Load; this package only consumes the result. @@ -784,7 +807,7 @@ func (s *Server) initialize() error { s.secretEncryption = scmProviderHandler.GetEncryption() scmWorkspaceRepo := repository.NewSCMWorkspaceRepository(s.db) scmWorkspaceHandler := handlers.NewSCMWorkspaceHandler(scmWorkspaceRepo, scmProviderHandler.GetEncryption(), scmProviderHandler, scm.NewCredentialResolver(s.db, scmProviderHandler.GetEncryption()), permService, baseURL) - scmItemLinksHandler := handlers.NewSCMItemLinksHandler(s.db, scmProviderHandler.GetEncryption(), permService) + scmItemLinksHandler := handlers.NewSCMItemLinksHandler(s.db, scmProviderHandler.GetEncryption(), permService, baseURL) userSCMTokenHandler := handlers.NewUserSCMTokenHandler(repository.NewUserSCMTokenRepository(s.db), scmProviderHandler.GetEncryption()) milestonePlanningService := services.NewPlanningService(s.db) milestonePlanningService.SetSCMWorkspaceRepository(scmWorkspaceRepo) @@ -1648,7 +1671,10 @@ func (s *Server) initialize() error { if err != nil { return nil, err } - releaseProvider, ok := provider.(scm.ReleaseProvider) + releaseProvider, ok := provider.(interface { + scm.ReleaseProvider + ListTags(context.Context, string, string, time.Time) ([]scm.Tag, error) + }) if !ok { return nil, errors.New("SCM provider does not support releases") } diff --git a/internal/services/action_create_milestone.go b/internal/services/action_create_milestone.go index 35543ef06..6c41804ab 100644 --- a/internal/services/action_create_milestone.go +++ b/internal/services/action_create_milestone.go @@ -313,6 +313,12 @@ func (e *CreateMilestoneExecutor) attachRelease(ctx *models.ExecutionContext, mi } sha, _ := ctx.Variables["new_ref.sha"].(string) repoFullName, _ := ctx.Variables["new_repo.full_name"].(string) + var workspaceRepositoryID *int + if rawID, exists := ctx.Variables["new_repo.workspace_repository_id"]; exists { + if id, ok := coerceInt(rawID); ok && id > 0 { + workspaceRepositoryID = &id + } + } var repoPtr *string if repoFullName != "" { @@ -321,9 +327,10 @@ func (e *CreateMilestoneExecutor) attachRelease(ctx *models.ExecutionContext, mi } return e.planning.AttachRelease(ReleaseMilestoneParams{ - ID: milestoneID, - TagName: tagName, - TargetCommitish: sha, - SCMRepository: repoPtr, + ID: milestoneID, + WorkspaceRepositoryID: workspaceRepositoryID, + TagName: tagName, + TargetCommitish: sha, + SCMRepository: repoPtr, }) } diff --git a/internal/services/agent_pr_service.go b/internal/services/agent_pr_service.go index 7d9e153c3..963ee7fe8 100644 --- a/internal/services/agent_pr_service.go +++ b/internal/services/agent_pr_service.go @@ -613,12 +613,8 @@ func boundPRNote(s string) string { return strings.TrimSpace(s[:cut]) + "\n\n…(truncated)" } -// splitRepoSlug splits "owner/repo" into its parts. Returns ok=false -// when the input doesn't have exactly one slash separator. +// splitRepoSlug splits "namespace/project" at the final slash so GitLab +// subgroup paths remain part of the namespace. func splitRepoSlug(slug string) (owner, repo string, ok bool) { - parts := strings.SplitN(slug, "/", 3) - if len(parts) != 2 || parts[0] == "" || parts[1] == "" { - return "", "", false - } - return parts[0], parts[1], true + return splitRepositoryPath(slug) } diff --git a/internal/services/binding_service.go b/internal/services/binding_service.go index 11d4a8c09..e4a72f2b4 100644 --- a/internal/services/binding_service.go +++ b/internal/services/binding_service.go @@ -34,13 +34,31 @@ var ErrBindingRepoNeedsSCMConnection = errors.New("binding service: repo_slug re // ErrBindingInvalidRepoSlug is returned when a binding's RepoSlug is // not of the canonical owner/repo shape (no path traversal, no // schemes, no leading slashes). -var ErrBindingInvalidRepoSlug = errors.New("binding service: repo_slug must be owner/repo, alphanumerics + . _ - only") +var ErrBindingInvalidRepoSlug = errors.New("binding service: repo_slug must be namespace/project, alphanumerics + . _ - only") -// validRepoSlug is the canonical owner/repo shape. Two segments -// separated by a single /. No "..", no leading slashes, no schemes — -// the regex on its own rejects all of those because none of the -// allowed characters can produce them. -var validRepoSlug = regexp.MustCompile(`^[A-Za-z0-9._-]+/[A-Za-z0-9._-]+$`) +// validRepoSlug accepts a namespace with one or more segments followed by a +// project. No traversal segments, leading slashes, or schemes are allowed. +var validRepoSlug = regexp.MustCompile(`^[A-Za-z0-9._-]+(?:/[A-Za-z0-9._-]+)+$`) + +func isValidRepoSlug(slug string) bool { + if !validRepoSlug.MatchString(slug) { + return false + } + for _, segment := range strings.Split(slug, "/") { + if segment == "." || segment == ".." { + return false + } + } + return true +} + +func splitRepositoryPath(slug string) (namespace, project string, ok bool) { + if !isValidRepoSlug(slug) { + return "", "", false + } + separator := strings.LastIndex(slug, "/") + return slug[:separator], slug[separator+1:], true +} const codingAgentVisionPromptSuffix = ` @@ -517,7 +535,7 @@ func normalizeRepoInputs(inputs []RepoInput) ([]models.BindingRepo, error) { seen := make(map[string]bool, len(inputs)) primaries := 0 for i, in := range inputs { - if !validRepoSlug.MatchString(in.RepoSlug) { + if !isValidRepoSlug(in.RepoSlug) { return nil, ErrBindingInvalidRepoSlug } if in.SCMConnectionID == nil { @@ -1797,7 +1815,7 @@ func applyLLMModelEnv(env map[string]string, cfg *llm.ConnectionRuntimeConfig) { // deriveCloneURL builds a credential-free HTTPS remote from trusted SCM data. func deriveCloneURL(providerType, baseURL, slug string) (string, error) { - if !validRepoSlug.MatchString(slug) { + if !isValidRepoSlug(slug) { return "", ErrBindingInvalidRepoSlug } host := "" @@ -1820,6 +1838,18 @@ func deriveCloneURL(providerType, baseURL, slug string) (string, error) { return "", fmt.Errorf("gitea base url: %w", err) } host = h + case "gitlab": + if baseURL == "" { + baseURL = "https://gitlab.com" + } + u, err := url.Parse(strings.TrimSuffix(strings.TrimSuffix(baseURL, "/"), "/api/v4")) + if err != nil { + return "", fmt.Errorf("gitlab base url: %w", err) + } + if u.Host == "" { + return "", fmt.Errorf("gitlab base url %q has no host", baseURL) + } + return strings.TrimSuffix(u.String(), "/") + "/" + slug + ".git", nil default: return "", fmt.Errorf("unsupported scm provider type %q", providerType) } diff --git a/internal/services/planning_application_service.go b/internal/services/planning_application_service.go index b10ce4171..144222e1c 100644 --- a/internal/services/planning_application_service.go +++ b/internal/services/planning_application_service.go @@ -7,9 +7,11 @@ import ( "errors" "fmt" "strings" + "time" "windshift/internal/models" "windshift/internal/sanitize" + "windshift/internal/utils" ) var ErrPlanningForbidden = errors.New("planning object forbidden") @@ -25,14 +27,28 @@ type ExternalReleaseOptions struct { } type ExternalRelease struct { - ID string - URL string - TagName string + ID string + URL string + TagName string + TagURL string + Name string + Body string + Status string + Assets []models.SCMReleaseAsset + IsDraft bool + IsPrerelease bool + ReleasedAt *time.Time +} + +type ExternalTag struct { + Name string + URL string } type PlanningReleaseProvider interface { CreateRelease(context.Context, string, string, ExternalReleaseOptions) (*ExternalRelease, error) ListReleases(context.Context, string, string) ([]ExternalRelease, error) + ListTags(context.Context, string, string) ([]ExternalTag, error) } type PlanningReleaseResolver func(context.Context, int, int) (PlanningReleaseProvider, error) @@ -75,6 +91,10 @@ func (s *PlanningApplicationService) GetMilestone(userID, id int) (*MilestoneRes if err := s.requireRead(userID, result.IsGlobal, result.WorkspaceID); err != nil { return nil, err } + result.Releases, err = s.planning.ListMilestoneReleases(id) + if err != nil { + return nil, err + } return result, nil } @@ -152,6 +172,7 @@ func (s *PlanningApplicationService) GetMilestoneTestStatisticsBatch(userID int, } type ReleaseMilestoneInput struct { + Mode string ConnectionID int RepositoryID int Repository string @@ -175,11 +196,19 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI if strings.TrimSpace(input.TagName) == "" { return nil, planningValidationError("tag_name", "tag_name is required") } + input.Mode = strings.ToLower(strings.TrimSpace(input.Mode)) + if input.Mode == "" { + input.Mode = "create" + } + if input.Mode != "create" && input.Mode != "attach" { + return nil, planningValidationError("mode", "mode must be 'create' or 'attach'") + } if len(input.IdempotencyKey) > 200 { return nil, planningValidationError("idempotency_key", "Idempotency-Key must be at most 200 characters") } var connectionID *int + var workspaceRepositoryID *int var repositoryName *string var provider PlanningReleaseProvider var owner, repo string @@ -199,12 +228,13 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI if err != nil { return nil, err } - parts := strings.SplitN(linked.RepositoryName, "/", 2) - if len(parts) != 2 { - return nil, planningValidationError("repository", "repository must be in owner/repo format") + var ok bool + owner, repo, ok = utils.SplitRepositoryPath(linked.RepositoryName) + if !ok { + return nil, planningValidationError("repository", "repository must be in namespace/project format") } - owner, repo = parts[0], parts[1] connectionID = &input.ConnectionID + workspaceRepositoryID = &linked.ID repositoryName = &linked.RepositoryName if s.releases != nil { provider, err = s.releases(ctx, input.ConnectionID, userID) @@ -213,6 +243,37 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI } } } + var existingRelease *ExternalRelease + if input.Mode == "attach" { + if provider == nil { + return nil, planningValidationError("connection_id", "attach mode requires an SCM connection and linked repository") + } + releases, err := provider.ListReleases(ctx, owner, repo) + if err != nil { + return nil, err + } + for i := range releases { + if releases[i].TagName == input.TagName { + existingRelease = &releases[i] + break + } + } + if existingRelease == nil { + tags, err := provider.ListTags(ctx, owner, repo) + if err != nil { + return nil, err + } + for _, tag := range tags { + if tag.Name == input.TagName { + existingRelease = &ExternalRelease{TagName: tag.Name, TagURL: tag.URL, Status: "tag_only"} + break + } + } + } + if existingRelease == nil { + return nil, planningValidationError("tag_name", "the selected tag or release no longer exists in the SCM repository") + } + } key := strings.TrimSpace(input.IdempotencyKey) if key == "" { key = planningReleaseFallbackKey(id, userID, input, repositoryName) @@ -221,7 +282,8 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI params := ReleaseMilestoneParams{ ID: id, IdempotencyKey: key, TagName: input.TagName, Name: input.Name, Body: input.Body, IsDraft: input.IsDraft, IsPrerelease: input.IsPrerelease, TargetCommitish: input.TargetCommitish, - SCMConnectionID: connectionID, SCMRepository: repositoryName, CreatedBy: &createdBy, + SCMConnectionID: connectionID, WorkspaceRepositoryID: workspaceRepositoryID, + SCMRepository: repositoryName, CreatedBy: &createdBy, } attempt, err := s.planning.BeginMilestoneRelease(ctx, params) if err != nil { @@ -231,7 +293,7 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI return s.planning.GetMilestone(id) } if provider != nil { - var release *ExternalRelease + release := existingRelease if attempt.NeedsReconcile { releases, err := provider.ListReleases(ctx, owner, repo) if err != nil { @@ -245,7 +307,7 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI } } } - if release == nil { + if release == nil && input.Mode == "create" { release, err = provider.CreateRelease(ctx, owner, repo, ExternalReleaseOptions{ TagName: input.TagName, TargetCommitish: input.TargetCommitish, Name: input.Name, Body: input.Body, IsDraft: input.IsDraft, IsPrerelease: input.IsPrerelease, @@ -255,7 +317,25 @@ func (s *PlanningApplicationService) ReleaseMilestone(ctx context.Context, userI return nil, err } } - params.SCMReleaseID, params.SCMReleaseURL = &release.ID, &release.URL + if release.ID != "" { + params.SCMReleaseID = &release.ID + } + if release.URL != "" { + params.SCMReleaseURL = &release.URL + } + params.Name = release.Name + params.Body = release.Body + params.IsDraft = release.IsDraft + params.IsPrerelease = release.IsPrerelease + if release.TagURL != "" { + params.TagURL = &release.TagURL + } + params.ReleaseStatus = release.Status + params.Assets = release.Assets + if release.ReleasedAt != nil { + releasedAt := release.ReleasedAt.UTC().Format(time.RFC3339) + params.ReleasedAt = &releasedAt + } } result, err := s.planning.CompleteMilestoneRelease(ctx, attempt.ID, attempt.LeaseToken, params) if err != nil { @@ -271,7 +351,7 @@ func planningReleaseFallbackKey(id, userID int, input ReleaseMilestoneInput, rep if repositoryName != nil { repo = *repositoryName } - sum := sha256.Sum256([]byte(fmt.Sprintf("%d\n%d\n%d\n%s\n%s\n%s\n%s\n%t\n%t\n%s", id, userID, input.ConnectionID, repo, input.TagName, input.Name, input.Body, input.IsDraft, input.IsPrerelease, input.TargetCommitish))) + sum := sha256.Sum256([]byte(fmt.Sprintf("%d\n%d\n%s\n%d\n%s\n%s\n%s\n%s\n%t\n%t\n%s", id, userID, input.Mode, input.ConnectionID, repo, input.TagName, input.Name, input.Body, input.IsDraft, input.IsPrerelease, input.TargetCommitish))) return "auto-" + hex.EncodeToString(sum[:]) } diff --git a/internal/services/planning_list_query.go b/internal/services/planning_list_query.go index b54d1deb4..8be4c46d0 100644 --- a/internal/services/planning_list_query.go +++ b/internal/services/planning_list_query.go @@ -17,7 +17,9 @@ const milestoneSelectQuery = ` m.is_global, m.workspace_id, w.name as workspace_name, m.external_key, m.position, mr.id, mr.tag_name, mr.name, mr.body, mr.is_draft, mr.is_prerelease, - mr.target_commitish, mr.scm_connection_id, mr.scm_repository, + mr.target_commitish, mr.workspace_repository_id, mr.tag_url, mr.release_status, + CAST(mr.released_at AS TEXT), CAST(mr.assets_json AS TEXT), CAST(mr.last_synced_at AS TEXT), + mr.scm_connection_id, mr.scm_repository, mr.scm_release_id, mr.scm_release_url, mr.created_by, mr.created_at, m.created_at, m.updated_at FROM milestones m diff --git a/internal/services/planning_milestones.go b/internal/services/planning_milestones.go index 8a5750ace..bc724acf8 100644 --- a/internal/services/planning_milestones.go +++ b/internal/services/planning_milestones.go @@ -5,6 +5,7 @@ import ( "crypto/rand" "database/sql" "encoding/hex" + "encoding/json" "errors" "fmt" "log/slog" @@ -100,9 +101,10 @@ func scanMilestoneRow(sc milestoneScanner) (MilestoneResult, error) { var description, targetDate, categoryName, categoryColor, workspaceName, externalKey sql.NullString var categoryID, workspaceID sql.NullInt64 // Release columns - var mrID, mrCreatedBy, mrSCMConnectionID sql.NullInt64 - var mrTagName, mrName, mrBody, mrTargetCommitish sql.NullString + var mrID, mrCreatedBy, mrSCMConnectionID, mrWorkspaceRepositoryID sql.NullInt64 + var mrTagName, mrName, mrBody, mrTargetCommitish, mrTagURL sql.NullString var mrSCMRepository, mrSCMReleaseID, mrSCMReleaseURL sql.NullString + var mrReleaseStatus, mrReleasedAt, mrAssetsJSON, mrLastSyncedAt sql.NullString var mrIsDraft, mrIsPrerelease sql.NullBool var mrCreatedAt sql.NullString @@ -110,7 +112,8 @@ func scanMilestoneRow(sc milestoneScanner) (MilestoneResult, error) { &categoryName, &categoryColor, &m.IsGlobal, &workspaceID, &workspaceName, &externalKey, &m.Position, &mrID, &mrTagName, &mrName, &mrBody, &mrIsDraft, &mrIsPrerelease, - &mrTargetCommitish, &mrSCMConnectionID, &mrSCMRepository, + &mrTargetCommitish, &mrWorkspaceRepositoryID, &mrTagURL, &mrReleaseStatus, + &mrReleasedAt, &mrAssetsJSON, &mrLastSyncedAt, &mrSCMConnectionID, &mrSCMRepository, &mrSCMReleaseID, &mrSCMReleaseURL, &mrCreatedBy, &mrCreatedAt, &m.CreatedAt, &m.UpdatedAt) if err != nil { @@ -135,8 +138,9 @@ func scanMilestoneRow(sc milestoneScanner) (MilestoneResult, error) { m.WorkspaceID = &id } m.LatestRelease = hydrateMilestoneRelease(m.ID, - mrID, mrCreatedBy, mrSCMConnectionID, + mrID, mrCreatedBy, mrSCMConnectionID, mrWorkspaceRepositoryID, mrTagName, mrName, mrBody, mrTargetCommitish, + mrTagURL, mrReleaseStatus, mrReleasedAt, mrAssetsJSON, mrLastSyncedAt, mrSCMRepository, mrSCMReleaseID, mrSCMReleaseURL, mrIsDraft, mrIsPrerelease, mrCreatedAt, ) @@ -162,20 +166,26 @@ func scanMilestones(rows *sql.Rows) ([]MilestoneResult, error) { //nolint:unpara // MilestoneReleaseResult represents a release record for a milestone. type MilestoneReleaseResult struct { - ID int - MilestoneID int - TagName string - Name string - Body string - IsDraft bool - IsPrerelease bool - TargetCommitish string - SCMConnectionID *int - SCMRepository *string - SCMReleaseID *string - SCMReleaseURL *string - CreatedBy *int - CreatedAt string + ID int + MilestoneID int + WorkspaceRepositoryID *int + TagName string + TagURL *string + ReleaseStatus string + ReleasedAt *string + Assets []models.SCMReleaseAsset + LastSyncedAt *string + Name string + Body string + IsDraft bool + IsPrerelease bool + TargetCommitish string + SCMConnectionID *int + SCMRepository *string + SCMReleaseID *string + SCMReleaseURL *string + CreatedBy *int + CreatedAt string } var ErrSCMRepositoryNotLinked = errors.New("SCM repository is not linked to the selected connection") @@ -206,6 +216,7 @@ type MilestoneResult struct { ExternalKey *string Position int LatestRelease *MilestoneReleaseResult + Releases []MilestoneReleaseResult CreatedAt time.Time UpdatedAt time.Time } @@ -299,8 +310,9 @@ func (s *PlanningService) GetMilestone(id int) (*MilestoneResult, error) { // Returns nil if mrID is not valid (no release row). func hydrateMilestoneRelease( milestoneID int, - mrID, mrCreatedBy, mrSCMConnectionID sql.NullInt64, + mrID, mrCreatedBy, mrSCMConnectionID, mrWorkspaceRepositoryID sql.NullInt64, mrTagName, mrName, mrBody, mrTargetCommitish sql.NullString, + mrTagURL, mrReleaseStatus, mrReleasedAt, mrAssetsJSON, mrLastSyncedAt sql.NullString, mrSCMRepository, mrSCMReleaseID, mrSCMReleaseURL sql.NullString, mrIsDraft, mrIsPrerelease sql.NullBool, mrCreatedAt sql.NullString, @@ -317,6 +329,23 @@ func hydrateMilestoneRelease( CreatedAt: mrCreatedAt.String, TargetCommitish: mrTargetCommitish.String, } + if mrWorkspaceRepositoryID.Valid { + id := int(mrWorkspaceRepositoryID.Int64) + rel.WorkspaceRepositoryID = &id + } + if mrTagURL.Valid { + rel.TagURL = &mrTagURL.String + } + rel.ReleaseStatus = mrReleaseStatus.String + if mrReleasedAt.Valid { + rel.ReleasedAt = &mrReleasedAt.String + } + if mrLastSyncedAt.Valid { + rel.LastSyncedAt = &mrLastSyncedAt.String + } + if mrAssetsJSON.Valid && mrAssetsJSON.String != "" { + _ = json.Unmarshal([]byte(mrAssetsJSON.String), &rel.Assets) + } if mrIsDraft.Valid { rel.IsDraft = mrIsDraft.Bool } @@ -521,14 +550,18 @@ func (s *PlanningService) SetMilestoneStatus(milestoneID, workspaceID int, statu // control (e.g. "tag promotes branch milestone to in-progress, not // completed"). func (s *PlanningService) AttachRelease(params ReleaseMilestoneParams) error { + assetsJSON := releaseAssetsJSON(params.Assets) _, err := s.db.ExecWrite(` INSERT INTO milestone_releases ( milestone_id, tag_name, name, body, is_draft, is_prerelease, - target_commitish, scm_connection_id, scm_repository, scm_release_id, + target_commitish, workspace_repository_id, tag_url, release_status, released_at, assets_json, + scm_connection_id, scm_repository, scm_release_id, scm_release_url, created_by - ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ON CONFLICT DO NOTHING `, params.ID, params.TagName, params.Name, params.Body, params.IsDraft, params.IsPrerelease, - params.TargetCommitish, params.SCMConnectionID, params.SCMRepository, params.SCMReleaseID, + params.TargetCommitish, params.WorkspaceRepositoryID, params.TagURL, releaseStatusOrDefault(params.ReleaseStatus), params.ReleasedAt, assetsJSON, + params.SCMConnectionID, params.SCMRepository, params.SCMReleaseID, params.SCMReleaseURL, params.CreatedBy) if err != nil { return fmt.Errorf("failed to insert milestone release: %w", err) @@ -609,7 +642,9 @@ func (s *PlanningService) UpdateMilestone(params UpdateMilestoneParams) (*Milest func (s *PlanningService) ListMilestoneReleases(milestoneID int) ([]MilestoneReleaseResult, error) { rows, err := s.db.Query(` SELECT id, milestone_id, tag_name, name, body, is_draft, is_prerelease, - target_commitish, scm_connection_id, scm_repository, + target_commitish, workspace_repository_id, tag_url, release_status, + CAST(released_at AS TEXT), CAST(assets_json AS TEXT), CAST(last_synced_at AS TEXT), + scm_connection_id, scm_repository, scm_release_id, scm_release_url, created_by, created_at FROM milestone_releases WHERE milestone_id = ? AND state = 'created' @@ -624,12 +659,14 @@ func (s *PlanningService) ListMilestoneReleases(milestoneID int) ([]MilestoneRel for rows.Next() { var r MilestoneReleaseResult var name, body, targetCommitish sql.NullString - var scmConnectionID, createdBy sql.NullInt64 - var scmRepository, scmReleaseID, scmReleaseURL sql.NullString + var scmConnectionID, createdBy, workspaceRepositoryID sql.NullInt64 + var scmRepository, scmReleaseID, scmReleaseURL, tagURL sql.NullString + var releaseStatus, releasedAt, assetsJSON, lastSyncedAt sql.NullString var isDraft, isPrerelease sql.NullBool if err := rows.Scan(&r.ID, &r.MilestoneID, &r.TagName, &name, &body, - &isDraft, &isPrerelease, &targetCommitish, &scmConnectionID, &scmRepository, + &isDraft, &isPrerelease, &targetCommitish, &workspaceRepositoryID, &tagURL, + &releaseStatus, &releasedAt, &assetsJSON, &lastSyncedAt, &scmConnectionID, &scmRepository, &scmReleaseID, &scmReleaseURL, &createdBy, &r.CreatedAt); err != nil { return nil, fmt.Errorf("failed to scan milestone release: %w", err) } @@ -637,6 +674,23 @@ func (s *PlanningService) ListMilestoneReleases(milestoneID int) ([]MilestoneRel r.Name = name.String r.Body = body.String r.TargetCommitish = targetCommitish.String + if workspaceRepositoryID.Valid { + id := int(workspaceRepositoryID.Int64) + r.WorkspaceRepositoryID = &id + } + if tagURL.Valid { + r.TagURL = &tagURL.String + } + r.ReleaseStatus = releaseStatus.String + if releasedAt.Valid { + r.ReleasedAt = &releasedAt.String + } + if lastSyncedAt.Valid { + r.LastSyncedAt = &lastSyncedAt.String + } + if assetsJSON.Valid && assetsJSON.String != "" { + _ = json.Unmarshal([]byte(assetsJSON.String), &r.Assets) + } if isDraft.Valid { r.IsDraft = isDraft.Bool } @@ -672,19 +726,24 @@ func (s *PlanningService) ListMilestoneReleases(milestoneID int) ([]MilestoneRel // ReleaseMilestoneParams contains parameters for releasing a milestone. type ReleaseMilestoneParams struct { - ID int - IdempotencyKey string - TagName string - Name string - Body string - IsDraft bool - IsPrerelease bool - TargetCommitish string - SCMConnectionID *int - SCMRepository *string - SCMReleaseID *string - SCMReleaseURL *string - CreatedBy *int + ID int + IdempotencyKey string + WorkspaceRepositoryID *int + TagName string + TagURL *string + ReleaseStatus string + ReleasedAt *string + Assets []models.SCMReleaseAsset + Name string + Body string + IsDraft bool + IsPrerelease bool + TargetCommitish string + SCMConnectionID *int + SCMRepository *string + SCMReleaseID *string + SCMReleaseURL *string + CreatedBy *int } // MilestoneReleaseAttempt is a durable claim for one idempotent release @@ -699,15 +758,16 @@ type MilestoneReleaseAttempt struct { } type storedMilestoneReleaseRequest struct { - TagName string - Name sql.NullString - Body sql.NullString - IsDraft bool - IsPrerelease bool - TargetCommitish sql.NullString - SCMConnectionID sql.NullInt64 - SCMRepository sql.NullString - CreatedBy sql.NullInt64 + TagName string + Name sql.NullString + Body sql.NullString + IsDraft bool + IsPrerelease bool + TargetCommitish sql.NullString + WorkspaceRepositoryID sql.NullInt64 + SCMConnectionID sql.NullInt64 + SCMRepository sql.NullString + CreatedBy sql.NullInt64 } func milestoneReleaseRequestMatches(params ReleaseMilestoneParams, stored storedMilestoneReleaseRequest) bool { @@ -718,6 +778,7 @@ func milestoneReleaseRequestMatches(params ReleaseMilestoneParams, stored stored params.IsPrerelease == stored.IsPrerelease && stored.TargetCommitish.Valid && params.TargetCommitish == stored.TargetCommitish.String && nullableIntMatches(params.SCMConnectionID, stored.SCMConnectionID) && + nullableIntMatches(params.WorkspaceRepositoryID, stored.WorkspaceRepositoryID) && nullableStringMatches(params.SCMRepository, stored.SCMRepository) && nullableIntMatches(params.CreatedBy, stored.CreatedBy) } @@ -758,16 +819,19 @@ func (s *PlanningService) BeginMilestoneRelease(ctx context.Context, params Rele leaseExpiresAt := time.Now().UTC().Add(5 * time.Minute) return database.WithTxResult(s.db, func(tx database.Tx) (*MilestoneReleaseAttempt, error) { + assetsJSON := releaseAssetsJSON(params.Assets) result, err := tx.ExecWriteContext(ctx, ` INSERT INTO milestone_releases ( milestone_id, idempotency_key, state, lease_token, lease_expires_at, tag_name, name, body, is_draft, is_prerelease, target_commitish, + workspace_repository_id, tag_url, release_status, released_at, assets_json, scm_connection_id, scm_repository, created_by - ) VALUES (?, ?, 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, 'pending', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) ON CONFLICT DO NOTHING `, params.ID, params.IdempotencyKey, leaseToken, leaseExpiresAt, params.TagName, params.Name, params.Body, params.IsDraft, params.IsPrerelease, - params.TargetCommitish, params.SCMConnectionID, params.SCMRepository, params.CreatedBy) + params.TargetCommitish, params.WorkspaceRepositoryID, params.TagURL, releaseStatusOrDefault(params.ReleaseStatus), params.ReleasedAt, assetsJSON, + params.SCMConnectionID, params.SCMRepository, params.CreatedBy) if err != nil { return nil, fmt.Errorf("failed to persist pending milestone release: %w", err) } @@ -781,7 +845,7 @@ func (s *PlanningService) BeginMilestoneRelease(ctx context.Context, params Rele var storedRequest storedMilestoneReleaseRequest if err := tx.QueryRowContext(ctx, ` SELECT id, state, tag_name, name, body, is_draft, is_prerelease, - target_commitish, scm_connection_id, scm_repository, created_by + target_commitish, workspace_repository_id, scm_connection_id, scm_repository, created_by FROM milestone_releases WHERE milestone_id = ? AND idempotency_key = ? `, params.ID, params.IdempotencyKey).Scan( @@ -793,6 +857,7 @@ func (s *PlanningService) BeginMilestoneRelease(ctx context.Context, params Rele &storedRequest.IsDraft, &storedRequest.IsPrerelease, &storedRequest.TargetCommitish, + &storedRequest.WorkspaceRepositoryID, &storedRequest.SCMConnectionID, &storedRequest.SCMRepository, &storedRequest.CreatedBy, @@ -858,14 +923,18 @@ func (s *PlanningService) MarkMilestoneReleaseUncertain(ctx context.Context, att // CompleteMilestoneRelease atomically records the remote identity and marks // the milestone completed. Either both local effects commit or neither does. func (s *PlanningService) CompleteMilestoneRelease(ctx context.Context, attemptID int, leaseToken string, params ReleaseMilestoneParams) (*MilestoneResult, error) { + assetsJSON := releaseAssetsJSON(params.Assets) err := database.WithTx(s.db, func(tx database.Tx) error { result, err := tx.ExecWriteContext(ctx, ` UPDATE milestone_releases - SET state = 'created', scm_release_id = ?, scm_release_url = ?, + SET state = 'created', name = ?, body = ?, is_draft = ?, is_prerelease = ?, + scm_release_id = ?, scm_release_url = ?, tag_url = ?, + release_status = ?, released_at = ?, assets_json = ?, last_synced_at = CURRENT_TIMESTAMP, last_error = NULL, lease_token = NULL, lease_expires_at = NULL, updated_at = CURRENT_TIMESTAMP WHERE id = ? AND lease_token = ? AND state = 'pending' - `, params.SCMReleaseID, params.SCMReleaseURL, attemptID, leaseToken) + `, params.Name, params.Body, params.IsDraft, params.IsPrerelease, + params.SCMReleaseID, params.SCMReleaseURL, params.TagURL, releaseStatusOrDefault(params.ReleaseStatus), params.ReleasedAt, assetsJSON, attemptID, leaseToken) if err != nil { return fmt.Errorf("failed to finalize milestone release: %w", err) } @@ -902,15 +971,18 @@ func (s *PlanningService) CompleteMilestoneRelease(ctx context.Context, attemptI // release metadata. Its local insert and milestone status transition are // transactional. func (s *PlanningService) ReleaseMilestone(params ReleaseMilestoneParams) (*MilestoneResult, error) { + assetsJSON := releaseAssetsJSON(params.Assets) err := database.WithTx(s.db, func(tx database.Tx) error { _, err := tx.ExecWrite(` INSERT INTO milestone_releases ( milestone_id, idempotency_key, state, tag_name, name, body, - is_draft, is_prerelease, target_commitish, scm_connection_id, + is_draft, is_prerelease, target_commitish, workspace_repository_id, + tag_url, release_status, released_at, assets_json, scm_connection_id, scm_repository, scm_release_id, scm_release_url, created_by - ) VALUES (?, ?, 'created', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) + ) VALUES (?, ?, 'created', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) `, params.ID, nullablePlanningString(params.IdempotencyKey), params.TagName, params.Name, params.Body, params.IsDraft, params.IsPrerelease, params.TargetCommitish, + params.WorkspaceRepositoryID, params.TagURL, releaseStatusOrDefault(params.ReleaseStatus), params.ReleasedAt, assetsJSON, params.SCMConnectionID, params.SCMRepository, params.SCMReleaseID, params.SCMReleaseURL, params.CreatedBy) if err != nil { @@ -938,6 +1010,24 @@ func nullablePlanningString(value string) any { return value } +func releaseStatusOrDefault(status string) string { + if strings.TrimSpace(status) == "" { + return "tag_only" + } + return status +} + +func releaseAssetsJSON(assets []models.SCMReleaseAsset) string { + if len(assets) == 0 { + return "[]" + } + raw, err := json.Marshal(assets) + if err != nil { + return "[]" + } + return string(raw) +} + // DeleteMilestone deletes a milestone. HTTP adapters may supply an audit actor; // internal automation/import callers omit it and rely on their own execution // trail instead of manufacturing a user-driven audit event. diff --git a/internal/services/planning_milestones_release_test.go b/internal/services/planning_milestones_release_test.go new file mode 100644 index 000000000..676201100 --- /dev/null +++ b/internal/services/planning_milestones_release_test.go @@ -0,0 +1,78 @@ +package services + +import ( + "context" + "path/filepath" + "testing" + + "windshift/internal/database" + "windshift/internal/models" +) + +func newMilestoneReleaseTestService(t *testing.T) (*PlanningService, database.Database) { + t.Helper() + db, err := database.NewSQLiteDBWithPoolSizes(filepath.Join(t.TempDir(), "windshift.db"), 1, 1) + if err != nil { + t.Fatal(err) + } + if err := db.Initialize(); err != nil { + _ = db.Close() + t.Fatal(err) + } + return NewPlanningService(db), db +} + +func insertGlobalMilestone(t *testing.T, db database.Database, name string) int { + t.Helper() + var id int + if err := db.QueryRow(`INSERT INTO milestones(name, description, status, is_global) VALUES (?, '', 'planning', true) RETURNING id`, name).Scan(&id); err != nil { + t.Fatal(err) + } + return id +} + +func TestAttachReleaseStoresExtendedMetadata(t *testing.T) { + service, db := newMilestoneReleaseTestService(t) + defer func() { _ = db.Close() }() + milestoneID := insertGlobalMilestone(t, db, "Attached release") + tagURL := "https://git.example/group/project/-/tags/v1.0.0" + releasedAt := "2026-08-30T12:00:00Z" + + err := service.AttachRelease(ReleaseMilestoneParams{ + ID: milestoneID, TagName: "v1.0.0", TagURL: &tagURL, ReleaseStatus: "released", ReleasedAt: &releasedAt, + Assets: []models.SCMReleaseAsset{{Kind: "link", Name: "binary", URL: "https://cdn.example/app"}}, + }) + if err != nil { + t.Fatal(err) + } + releases, err := service.ListMilestoneReleases(milestoneID) + if err != nil { + t.Fatal(err) + } + if len(releases) != 1 || releases[0].ReleaseStatus != "released" || len(releases[0].Assets) != 1 || releases[0].TagURL == nil || *releases[0].TagURL != tagURL { + t.Fatalf("unexpected stored release: %+v", releases) + } +} + +func TestBeginAndCompleteMilestoneReleaseStoresProviderTruth(t *testing.T) { + service, db := newMilestoneReleaseTestService(t) + defer func() { _ = db.Close() }() + milestoneID := insertGlobalMilestone(t, db, "Created release") + + params := ReleaseMilestoneParams{ID: milestoneID, IdempotencyKey: "release-key", TagName: "v2.0.0", Name: "requested name", Body: "requested body"} + attempt, err := service.BeginMilestoneRelease(context.Background(), params) + if err != nil { + t.Fatal(err) + } + params.Name = "GitLab release" + params.Body = "GitLab notes" + params.ReleaseStatus = "released" + params.Assets = []models.SCMReleaseAsset{{Kind: "source", Name: "zip", URL: "https://git.example/source.zip"}} + result, err := service.CompleteMilestoneRelease(context.Background(), attempt.ID, attempt.LeaseToken, params) + if err != nil { + t.Fatal(err) + } + if result.Status != "completed" || result.LatestRelease == nil || result.LatestRelease.Name != "GitLab release" || len(result.LatestRelease.Assets) != 1 { + t.Fatalf("unexpected completed milestone: %+v", result) + } +} diff --git a/internal/utils/repository_path.go b/internal/utils/repository_path.go new file mode 100644 index 000000000..180de0092 --- /dev/null +++ b/internal/utils/repository_path.go @@ -0,0 +1,14 @@ +package utils + +import "strings" + +// SplitRepositoryPath splits namespace/project at the final slash so nested +// GitLab namespaces remain intact in the namespace portion. +func SplitRepositoryPath(fullName string) (namespace, project string, ok bool) { + fullName = strings.TrimSpace(fullName) + separator := strings.LastIndex(fullName, "/") + if separator <= 0 || separator == len(fullName)-1 { + return "", "", false + } + return fullName[:separator], fullName[separator+1:], true +} diff --git a/internal/utils/repository_path_test.go b/internal/utils/repository_path_test.go new file mode 100644 index 000000000..89e4d8092 --- /dev/null +++ b/internal/utils/repository_path_test.go @@ -0,0 +1,29 @@ +package utils + +import "testing" + +func TestSplitRepositoryPath(t *testing.T) { + t.Parallel() + tests := []struct { + path string + namespace string + project string + ok bool + }{ + {path: "owner/project", namespace: "owner", project: "project", ok: true}, + {path: "group/subgroup/project", namespace: "group/subgroup", project: "project", ok: true}, + {path: " group/subgroup/project ", namespace: "group/subgroup", project: "project", ok: true}, + {path: "project", ok: false}, + {path: "/project", ok: false}, + {path: "group/", ok: false}, + } + for _, test := range tests { + test := test + t.Run(test.path, func(t *testing.T) { + namespace, project, ok := SplitRepositoryPath(test.path) + if namespace != test.namespace || project != test.project || ok != test.ok { + t.Fatalf("SplitRepositoryPath(%q) = %q, %q, %v", test.path, namespace, project, ok) + } + }) + } +}